camstack 1.2.62 → 1.2.65

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.
@@ -23633,9 +23633,9 @@ var require_zod = __commonJS({
23633
23633
  }
23634
23634
  });
23635
23635
 
23636
- // ../system/dist/dist-CDgIzo82.js
23637
- var require_dist_CDgIzo82 = __commonJS({
23638
- "../system/dist/dist-CDgIzo82.js"(exports) {
23636
+ // ../system/dist/dist-Ck2jkBZk.js
23637
+ var require_dist_Ck2jkBZk = __commonJS({
23638
+ "../system/dist/dist-Ck2jkBZk.js"(exports) {
23639
23639
  "use strict";
23640
23640
  var zod = require_zod();
23641
23641
  var EventCategory = /* @__PURE__ */ (function(EventCategory2) {
@@ -25997,6 +25997,40 @@ var require_dist_CDgIzo82 = __commonJS({
25997
25997
  /** Unix ms when the group was composed server-side. */
25998
25998
  fetchedAt: zod.z.number()
25999
25999
  });
26000
+ var REDACTED_SECRET = "__camstack_redacted__";
26001
+ function collectSecretConfigKeys(schema) {
26002
+ const keys = /* @__PURE__ */ new Set();
26003
+ for (const section of sectionsOf(schema)) for (const field of fieldsOf(section)) walkField(field, keys);
26004
+ return keys;
26005
+ }
26006
+ function isRecord$2(value) {
26007
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26008
+ }
26009
+ function sectionsOf(schema) {
26010
+ if (!isRecord$2(schema)) return [];
26011
+ const sections = schema["sections"];
26012
+ return Array.isArray(sections) ? sections : [];
26013
+ }
26014
+ function fieldsOf(node) {
26015
+ if (!isRecord$2(node)) return [];
26016
+ const fields = node["fields"];
26017
+ return Array.isArray(fields) ? fields : [];
26018
+ }
26019
+ function walkField(field, out) {
26020
+ if (!isRecord$2(field)) return;
26021
+ const type = field["type"];
26022
+ const key = field["key"];
26023
+ if ((type === "password" || field["secret"] === true) && typeof key === "string" && key.length > 0) out.add(key);
26024
+ if (type === "group") {
26025
+ for (const child of fieldsOf(field)) walkField(child, out);
26026
+ return;
26027
+ }
26028
+ if (type === "sub-tabs") {
26029
+ const tabs = field["tabs"];
26030
+ if (!Array.isArray(tabs)) return;
26031
+ for (const tab of tabs) for (const child of fieldsOf(tab)) walkField(child, out);
26032
+ }
26033
+ }
26000
26034
  var STREAM_QUALITY_LABELS = {
26001
26035
  high: "High",
26002
26036
  mid: "Mid",
@@ -26313,13 +26347,29 @@ var require_dist_CDgIzo82 = __commonJS({
26313
26347
  "recorder",
26314
26348
  "analytics"
26315
26349
  ]);
26350
+ var StorageMigrationMoveProgressSchema = zod.z.object({
26351
+ filesMoved: zod.z.number().int().nonnegative(),
26352
+ /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
26353
+ filesTotal: zod.z.number().int().nonnegative().nullable(),
26354
+ bytesMoved: zod.z.number().int().nonnegative(),
26355
+ /** The MOVER's start, not the migration's: a drain restarted after an addon
26356
+ * crash gets a new mover, and a rate computed from the migration's start
26357
+ * would silently average in the time nothing was running. */
26358
+ startedAt: zod.z.number(),
26359
+ /** When the coordinator last read these numbers. Paired with `startedAt` it
26360
+ * is the only honest rate: both clocks are the hub's, so a UI never has to
26361
+ * subtract its own. */
26362
+ observedAt: zod.z.number()
26363
+ });
26316
26364
  var StorageMigrationMoveSchema = zod.z.object({
26317
26365
  storageClass: StorageMigrationClassSchema,
26318
26366
  fromLocationId: zod.z.string(),
26319
26367
  toLocationId: zod.z.string(),
26320
26368
  moverJobId: zod.z.string().nullable(),
26321
26369
  state: RelocateJobStateSchema.nullable(),
26322
- error: zod.z.string().nullable()
26370
+ error: zod.z.string().nullable(),
26371
+ /** Last observed mover counters; `null` until the mover has been polled once. */
26372
+ progress: StorageMigrationMoveProgressSchema.nullable()
26323
26373
  });
26324
26374
  var StorageMigrationJobSchema = zod.z.object({
26325
26375
  jobId: zod.z.string(),
@@ -26365,6 +26415,52 @@ var require_dist_CDgIzo82 = __commonJS({
26365
26415
  })),
26366
26416
  findings: zod.z.array(StorageMigrationFindingSchema)
26367
26417
  });
26418
+ var StorageMigrationLaneSchema = zod.z.enum(["footage", "media"]);
26419
+ var StorageMigrationMoverSchema = zod.z.object({
26420
+ lane: StorageMigrationLaneSchema,
26421
+ job: RelocateJobSchema,
26422
+ /** The coordinator job that armed this mover, or `null` for a mover armed
26423
+ * directly against the owning addon. */
26424
+ migrationJobId: zod.z.string().nullable(),
26425
+ /** When the hub read these counters. Stamped here so a rate is `bytesMoved`
26426
+ * over (`observedAt` − `job.startedAt`) with BOTH ends on the hub's clock —
26427
+ * a browser subtracting its own `Date.now()` from a server `startedAt` is a
26428
+ * rate made of two different clocks. */
26429
+ observedAt: zod.z.number()
26430
+ });
26431
+ var StorageMigrationResidueSchema = zod.z.object({
26432
+ storageClass: StorageMigrationClassSchema,
26433
+ /** The location still holding the data. `'*'` for the media lane, whose rows
26434
+ * move from wherever they are rather than from one named source. */
26435
+ fromLocationId: zod.z.string(),
26436
+ /** Where a drain would move it — the class's CURRENT default. */
26437
+ toLocationId: zod.z.string(),
26438
+ /** Segments (footage lane) or rows (media lane) still on the source. */
26439
+ items: zod.z.number().int().nonnegative().nullable(),
26440
+ /** Bytes on the source; `null` when the lane counts rows rather than bytes. */
26441
+ bytes: zod.z.number().int().nonnegative().nullable()
26442
+ });
26443
+ var StorageMigrationDrainInputSchema = zod.z.object({
26444
+ /** The classes to drain. Each must appear in `storageMigration.residue`, so
26445
+ * a class whose source is already empty is refused rather than started. */
26446
+ classes: zod.z.array(StorageMigrationClassSchema).min(1),
26447
+ throttleMbps: zod.z.number().min(1).max(1e3).optional()
26448
+ });
26449
+ var RelocateResidueInputSchema = zod.z.object({
26450
+ fromLocationId: zod.z.string().min(1),
26451
+ /** Narrow to one logical class; omit for every profile on the location. */
26452
+ footageClass: RelocateFootageClassSchema.optional()
26453
+ });
26454
+ var RelocateResidueSchema = zod.z.object({
26455
+ segments: zod.z.number().int().nonnegative(),
26456
+ bytes: zod.z.number().int().nonnegative()
26457
+ }).nullable();
26458
+ var RelocatableMediaCountSchema = zod.z.object({ rows: zod.z.number().int().nonnegative() }).nullable();
26459
+ var RelocatableMediaCountInputSchema = zod.z.object({
26460
+ toLocationId: zod.z.string().min(1),
26461
+ /** Omitted = `move`. */
26462
+ mode: MediaRelocateModeSchema.optional()
26463
+ });
26368
26464
  var StorageLocationTypeSchema = zod.z.string().regex(/^[a-z][a-zA-Z0-9-]*$/);
26369
26465
  var StorageLocationSchema = zod.z.object({
26370
26466
  id: zod.z.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -26408,6 +26504,8 @@ var require_dist_CDgIzo82 = __commonJS({
26408
26504
  updatedAt: zod.z.number()
26409
26505
  });
26410
26506
  var StorageLocationRefSchema = zod.z.union([StorageLocationTypeSchema, zod.z.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
26507
+ var StorageAccessSchema = zod.z.enum(["local-path", "cap-mediated"]);
26508
+ var STORAGE_ACCESS_FALLBACK = "local-path";
26411
26509
  var StorageLocationDeclarationSchema = zod.z.object({
26412
26510
  /**
26413
26511
  * Global location identifier, e.g. `recordings` or `recordingsLow`.
@@ -26427,6 +26525,19 @@ var require_dist_CDgIzo82 = __commonJS({
26427
26525
  */
26428
26526
  cardinality: zod.z.enum(["single", "multi"]),
26429
26527
  /**
26528
+ * HOW the declaring service reaches the bytes — and therefore WHICH
26529
+ * providers may back a location of this kind. See {@link StorageAccessSchema}
26530
+ * and {@link STORAGE_ACCESS_FALLBACK}.
26531
+ *
26532
+ * Absent means `'local-path'`. That default is FAIL-CLOSED on purpose: it
26533
+ * can only over-restrict (refuse a remote provider for a kind that might
26534
+ * have coped) and never under-restrict. Declaring `'cap-mediated'` is the
26535
+ * permissive direction and is therefore never inferred — a repo guard
26536
+ * (`scripts/check-storage-access-declarations.ts`) refuses to let it be
26537
+ * reached by omission.
26538
+ */
26539
+ access: StorageAccessSchema.optional(),
26540
+ /**
26430
26541
  * When set, the default instance for this location inherits its resolved
26431
26542
  * root from the named location's default instance. Useful for derivative
26432
26543
  * slots (e.g. `recordingsLow` → `recordings`) so operators only need to
@@ -36385,8 +36496,10 @@ var require_dist_CDgIzo82 = __commonJS({
36385
36496
  lastSeen: zod.z.number(),
36386
36497
  /** Frame-rate position history (subject to maxPositionHistory cap). */
36387
36498
  positions: zod.z.array(TrackPositionSchema).readonly(),
36388
- /** Periodic snapshots at snapshotIntervalMs cadence (subject to
36389
- * saveThumbnails policy). */
36499
+ /** Periodic snapshots at snapshotIntervalMs cadence DEBUG media, produced
36500
+ * only while `MediaSettings.debugMediaEnabled` is on for the camera (D299;
36501
+ * the retired `saveThumbnails` used to gate this and the rolling
36502
+ * `lastFrame` together). Empty is the healthy default, not a capture gap. */
36390
36503
  snapshots: zod.z.array(TrackSnapshotSchema).readonly(),
36391
36504
  /** Deduplicated zones the track has entered at least once. Zone IDS. */
36392
36505
  zonesVisited: zod.z.array(zod.z.string()).readonly(),
@@ -37369,6 +37482,21 @@ var require_dist_CDgIzo82 = __commonJS({
37369
37482
  * it to zero.
37370
37483
  */
37371
37484
  countUnstampedEventMedia: method(zod.z.object({}), UnstampedEventMediaCountSchema, { auth: "admin" }),
37485
+ /**
37486
+ * How many rows a pass would STILL act on against `toLocationId`.
37487
+ *
37488
+ * One derivation, two consumers: it is the media lane's denominator (the
37489
+ * **M** the footage lane gets from the ledger census — D295) and it is the
37490
+ * residue behind "drain remaining". Deriving them separately is how "N of M"
37491
+ * ends up comparing two different populations.
37492
+ *
37493
+ * `null` means the count could not be taken; it is never zero-filled,
37494
+ * because a zero here reads as "nothing left to move".
37495
+ */
37496
+ countRelocatableMedia: method(RelocatableMediaCountInputSchema, RelocatableMediaCountSchema, {
37497
+ kind: "query",
37498
+ auth: "admin"
37499
+ }),
37372
37500
  /** Every relocate job this addon knows about, newest first (in RAM: the
37373
37501
  * move is resumable, so a lost list costs nothing but the display). */
37374
37502
  listRelocateMediaJobs: method(zod.z.object({}), zod.z.array(RelocateJobSchema).readonly(), {
@@ -39909,6 +40037,35 @@ var require_dist_CDgIzo82 = __commonJS({
39909
40037
  cancel: method(zod.z.object({ jobId: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
39910
40038
  kind: "mutation",
39911
40039
  auth: "admin"
40040
+ }),
40041
+ /**
40042
+ * Every mover running RIGHT NOW, in both lanes, with its counters.
40043
+ *
40044
+ * `status` covers a migration's own moves — the coordinator folds their
40045
+ * progress onto the durable job record it is already polling. This covers
40046
+ * the other case, and it is not hypothetical: a drain armed straight against
40047
+ * `recording.relocateFootage` (the only path that existed before
40048
+ * {@link drain}) has no job to fold into and would otherwise be invisible.
40049
+ */
40050
+ movers: method(zod.z.object({}), zod.z.array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }),
40051
+ /**
40052
+ * What each class's SOURCE still holds, from the archive — never from the
40053
+ * resident index (D295). Only classes with something left (or something
40054
+ * unknown) are listed, so an empty list means there is nothing to drain and
40055
+ * the UI has no honest button to offer.
40056
+ */
40057
+ residue: method(zod.z.object({}), zod.z.array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }),
40058
+ /**
40059
+ * Run the drain half alone, on a class whose default has ALREADY moved.
40060
+ *
40061
+ * It never repoints anything, which is what lets `start` keep refusing a
40062
+ * destination that is already the default: the two verbs cannot be confused
40063
+ * for one another, and no operator can re-repoint a migrated class through
40064
+ * this door.
40065
+ */
40066
+ drain: method(StorageMigrationDrainInputSchema, zod.z.object({ jobId: zod.z.string() }), {
40067
+ kind: "mutation",
40068
+ auth: "admin"
39912
40069
  })
39913
40070
  }
39914
40071
  };
@@ -40418,7 +40575,20 @@ var require_dist_CDgIzo82 = __commonJS({
40418
40575
  */
40419
40576
  scanned: zod.z.number(),
40420
40577
  /** True when the backend could not consider every row that passed the filter. */
40421
- truncated: zod.z.boolean()
40578
+ truncated: zod.z.boolean(),
40579
+ /**
40580
+ * The `topK` the backend actually ran with.
40581
+ *
40582
+ * Every backend has a ceiling — sqlite-vec's is 4,096 — and a caller asking
40583
+ * past it used to learn nothing but a boolean, from a WARN in the provider's
40584
+ * own log rather than in its answer. That is how an audit asking for 20,000
40585
+ * consumed 4,096 and reported `examined: 4096` as if it had walked the index,
40586
+ * for weeks. `truncated` says THAT the answer was short; this says BY HOW
40587
+ * MUCH, in the return value, where the caller cannot fail to see it.
40588
+ *
40589
+ * Equals the requested `topK` whenever nothing was lowered.
40590
+ */
40591
+ effectiveTopK: zod.z.number().int().positive()
40422
40592
  });
40423
40593
  var VectorDeleteInputSchema = zod.z.object({
40424
40594
  index: zod.z.string(),
@@ -40437,6 +40607,35 @@ var require_dist_CDgIzo82 = __commonJS({
40437
40607
  id: zod.z.string(),
40438
40608
  metadata: VectorMetadataSchema
40439
40609
  })) });
40610
+ var VectorFetchInputSchema = zod.z.object({
40611
+ index: zod.z.string(),
40612
+ ids: zod.z.array(zod.z.string())
40613
+ });
40614
+ var VectorFetchResultSchema = zod.z.object({ items: zod.z.array(zod.z.object({
40615
+ id: zod.z.string(),
40616
+ /** base64 Float32LE — the same wire form `upsert` accepts. */
40617
+ vector: zod.z.string(),
40618
+ metadata: VectorMetadataSchema
40619
+ })) });
40620
+ var VectorScanInputSchema = zod.z.object({
40621
+ index: zod.z.string(),
40622
+ /** Opaque resume point. `0` starts at the top; pass back `nextCursor`. */
40623
+ cursor: zod.z.number().int().nonnegative().default(0),
40624
+ limit: zod.z.number().int().positive()
40625
+ });
40626
+ var VectorScanResultSchema = zod.z.object({
40627
+ items: zod.z.array(zod.z.object({
40628
+ id: zod.z.string(),
40629
+ metadata: VectorMetadataSchema
40630
+ })),
40631
+ /**
40632
+ * Where the next page starts, or `null` when the walk reached the end.
40633
+ *
40634
+ * `null` is the ONLY end-of-index signal. A caller must not infer the end
40635
+ * from a short page: a backend is free to return fewer rows than asked.
40636
+ */
40637
+ nextCursor: zod.z.number().int().nonnegative().nullable()
40638
+ });
40440
40639
  var VectorStatsInputSchema = zod.z.object({ index: zod.z.string() });
40441
40640
  var VectorStatsResultSchema = zod.z.object({
40442
40641
  /** Provider id, so an operator can tell brute force from an ANN index. */
@@ -40467,6 +40666,10 @@ var require_dist_CDgIzo82 = __commonJS({
40467
40666
  query: method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }),
40468
40667
  /** Metadata by id, no vectors — see {@link VectorGetResultSchema}. */
40469
40668
  getByIds: method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }),
40669
+ /** Metadata AND vectors, by named id — see {@link VectorFetchInputSchema}. */
40670
+ fetchByIds: method(VectorFetchInputSchema, VectorFetchResultSchema, { auth: "admin" }),
40671
+ /** One page of the whole index, unranked — see {@link VectorScanInputSchema}. */
40672
+ scan: method(VectorScanInputSchema, VectorScanResultSchema, { auth: "admin" }),
40470
40673
  deleteByIds: method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
40471
40674
  kind: "mutation",
40472
40675
  auth: "admin"
@@ -46928,6 +47131,20 @@ var require_dist_CDgIzo82 = __commonJS({
46928
47131
  kind: "query",
46929
47132
  auth: "admin"
46930
47133
  }),
47134
+ /**
47135
+ * What a location STILL holds, asked of the durable hour ledger.
47136
+ *
47137
+ * The number behind "drain remaining": segments and bytes that would still
47138
+ * have to move off `fromLocationId`. It is a ledger aggregate — the archive
47139
+ * — because the resident index is not the archive (D295), and a drain sized
47140
+ * off the index is exactly what reported `done` over 80.3 GB on 2026-08-29.
47141
+ * `null` means the archive could not be asked (no ledger on this node, or
47142
+ * the aggregate failed) and is never conflated with an empty source.
47143
+ */
47144
+ getRelocateResidue: method(RelocateResidueInputSchema, RelocateResidueSchema, {
47145
+ kind: "query",
47146
+ auth: "admin"
47147
+ }),
46931
47148
  /** Cancel a running or queued relocate job. A queued job never runs. */
46932
47149
  cancelRelocateJob: method(zod.z.object({ jobId: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
46933
47150
  kind: "mutation",
@@ -52932,6 +53149,12 @@ var require_dist_CDgIzo82 = __commonJS({
52932
53149
  addonId: null,
52933
53150
  access: "create"
52934
53151
  },
53152
+ "pipelineAnalytics.countRelocatableMedia": {
53153
+ capName: "pipeline-analytics",
53154
+ capScope: "device",
53155
+ addonId: null,
53156
+ access: "view"
53157
+ },
52935
53158
  "pipelineAnalytics.countUnstampedEventMedia": {
52936
53159
  capName: "pipeline-analytics",
52937
53160
  capScope: "device",
@@ -54096,6 +54319,12 @@ var require_dist_CDgIzo82 = __commonJS({
54096
54319
  addonId: null,
54097
54320
  access: "view"
54098
54321
  },
54322
+ "recording.getRelocateResidue": {
54323
+ capName: "recording",
54324
+ capScope: "system",
54325
+ addonId: null,
54326
+ access: "view"
54327
+ },
54099
54328
  "recording.getStorageMigrationMoveStatus": {
54100
54329
  capName: "recording",
54101
54330
  capScope: "system",
@@ -54642,12 +54871,30 @@ var require_dist_CDgIzo82 = __commonJS({
54642
54871
  addonId: null,
54643
54872
  access: "create"
54644
54873
  },
54874
+ "storageMigration.drain": {
54875
+ capName: "storage-migration",
54876
+ capScope: "system",
54877
+ addonId: null,
54878
+ access: "create"
54879
+ },
54880
+ "storageMigration.movers": {
54881
+ capName: "storage-migration",
54882
+ capScope: "system",
54883
+ addonId: null,
54884
+ access: "view"
54885
+ },
54645
54886
  "storageMigration.plan": {
54646
54887
  capName: "storage-migration",
54647
54888
  capScope: "system",
54648
54889
  addonId: null,
54649
54890
  access: "view"
54650
54891
  },
54892
+ "storageMigration.residue": {
54893
+ capName: "storage-migration",
54894
+ capScope: "system",
54895
+ addonId: null,
54896
+ access: "view"
54897
+ },
54651
54898
  "storageMigration.start": {
54652
54899
  capName: "storage-migration",
54653
54900
  capScope: "system",
@@ -55482,6 +55729,12 @@ var require_dist_CDgIzo82 = __commonJS({
55482
55729
  addonId: null,
55483
55730
  access: "delete"
55484
55731
  },
55732
+ "vectorStore.fetchByIds": {
55733
+ capName: "vector-store",
55734
+ capScope: "system",
55735
+ addonId: null,
55736
+ access: "view"
55737
+ },
55485
55738
  "vectorStore.getByIds": {
55486
55739
  capName: "vector-store",
55487
55740
  capScope: "system",
@@ -55494,6 +55747,12 @@ var require_dist_CDgIzo82 = __commonJS({
55494
55747
  addonId: null,
55495
55748
  access: "view"
55496
55749
  },
55750
+ "vectorStore.scan": {
55751
+ capName: "vector-store",
55752
+ capScope: "system",
55753
+ addonId: null,
55754
+ access: "view"
55755
+ },
55497
55756
  "vectorStore.stats": {
55498
55757
  capName: "vector-store",
55499
55758
  capScope: "system",
@@ -58249,6 +58508,12 @@ var require_dist_CDgIzo82 = __commonJS({
58249
58508
  return METHOD_ACCESS_MAP;
58250
58509
  }
58251
58510
  });
58511
+ Object.defineProperty(exports, "REDACTED_SECRET", {
58512
+ enumerable: true,
58513
+ get: function() {
58514
+ return REDACTED_SECRET;
58515
+ }
58516
+ });
58252
58517
  Object.defineProperty(exports, "RUNTIME_DEFAULTS", {
58253
58518
  enumerable: true,
58254
58519
  get: function() {
@@ -58279,6 +58544,12 @@ var require_dist_CDgIzo82 = __commonJS({
58279
58544
  return SOURCE_DEVICE_TYPES;
58280
58545
  }
58281
58546
  });
58547
+ Object.defineProperty(exports, "STORAGE_ACCESS_FALLBACK", {
58548
+ enumerable: true,
58549
+ get: function() {
58550
+ return STORAGE_ACCESS_FALLBACK;
58551
+ }
58552
+ });
58282
58553
  Object.defineProperty(exports, "STREAM_PROFILE_META", {
58283
58554
  enumerable: true,
58284
58555
  get: function() {
@@ -58387,6 +58658,12 @@ var require_dist_CDgIzo82 = __commonJS({
58387
58658
  return buildStreamParamsConfigSchema;
58388
58659
  }
58389
58660
  });
58661
+ Object.defineProperty(exports, "collectSecretConfigKeys", {
58662
+ enumerable: true,
58663
+ get: function() {
58664
+ return collectSecretConfigKeys;
58665
+ }
58666
+ });
58390
58667
  Object.defineProperty(exports, "coreBlockAddonId", {
58391
58668
  enumerable: true,
58392
58669
  get: function() {
@@ -58789,7 +59066,7 @@ var require_alerts_addon = __commonJS({
58789
59066
  [Symbol.toStringTag]: { value: "Module" }
58790
59067
  });
58791
59068
  require_chunk_Cek0wNdY();
58792
- var require_dist10 = require_dist_CDgIzo82();
59069
+ var require_dist10 = require_dist_Ck2jkBZk();
58793
59070
  function selectExpired(alerts, cutoffMs) {
58794
59071
  return alerts.filter((a) => a.createdAt < cutoffMs).sort((a, b) => a.createdAt - b.createdAt).map((a) => a.id);
58795
59072
  }
@@ -59608,7 +59885,7 @@ var require_console_logging = __commonJS({
59608
59885
  [Symbol.toStringTag]: { value: "Module" }
59609
59886
  });
59610
59887
  require_chunk_Cek0wNdY();
59611
- var require_dist10 = require_dist_CDgIzo82();
59888
+ var require_dist10 = require_dist_Ck2jkBZk();
59612
59889
  var require_formatter = require_formatter_DqAKDlvN();
59613
59890
  var LEVEL_RANK = {
59614
59891
  debug: 0,
@@ -59702,7 +59979,7 @@ var require_core_blocks_addon = __commonJS({
59702
59979
  "use strict";
59703
59980
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
59704
59981
  var require_chunk = require_chunk_Cek0wNdY();
59705
- var require_dist10 = require_dist_CDgIzo82();
59982
+ var require_dist10 = require_dist_Ck2jkBZk();
59706
59983
  var node_crypto = __require("crypto");
59707
59984
  var node_fs_promises = __require("fs/promises");
59708
59985
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -60599,11 +60876,11 @@ var require_core_blocks = __commonJS({
60599
60876
  }
60600
60877
  });
60601
60878
 
60602
- // ../system/dist/retired-settings-keys-BfAzWvPC.js
60603
- var require_retired_settings_keys_BfAzWvPC = __commonJS({
60604
- "../system/dist/retired-settings-keys-BfAzWvPC.js"(exports) {
60879
+ // ../system/dist/retired-settings-keys-Dp_CyuCW.js
60880
+ var require_retired_settings_keys_Dp_CyuCW = __commonJS({
60881
+ "../system/dist/retired-settings-keys-Dp_CyuCW.js"(exports) {
60605
60882
  "use strict";
60606
- var require_dist10 = require_dist_CDgIzo82();
60883
+ var require_dist10 = require_dist_Ck2jkBZk();
60607
60884
  function settingsStoreIsAuthoritativeHere(env) {
60608
60885
  const raw = (env["CAMSTACK_ROLE"] ?? "").trim().toLowerCase();
60609
60886
  return raw === "" || raw === "hub";
@@ -62817,8 +63094,8 @@ var require_device_manager_addon = __commonJS({
62817
63094
  [Symbol.toStringTag]: { value: "Module" }
62818
63095
  });
62819
63096
  require_chunk_Cek0wNdY();
62820
- var require_dist10 = require_dist_CDgIzo82();
62821
- var require_retired_settings_keys = require_retired_settings_keys_BfAzWvPC();
63097
+ var require_dist10 = require_dist_Ck2jkBZk();
63098
+ var require_retired_settings_keys = require_retired_settings_keys_Dp_CyuCW();
62822
63099
  var node_crypto = __require("crypto");
62823
63100
  var _camstack_types_node = require_node();
62824
63101
  var JOB_HISTORY = 20;
@@ -67567,7 +67844,7 @@ var require_hub_forwarder = __commonJS({
67567
67844
  [Symbol.toStringTag]: { value: "Module" }
67568
67845
  });
67569
67846
  require_chunk_Cek0wNdY();
67570
- var require_dist10 = require_dist_CDgIzo82();
67847
+ var require_dist10 = require_dist_Ck2jkBZk();
67571
67848
  var require_formatter = require_formatter_DqAKDlvN();
67572
67849
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
67573
67850
  var HubForwarderDestination = class {
@@ -67704,7 +67981,7 @@ var require_liveness_monitor_addon = __commonJS({
67704
67981
  "use strict";
67705
67982
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
67706
67983
  require_chunk_Cek0wNdY();
67707
- var require_dist10 = require_dist_CDgIzo82();
67984
+ var require_dist10 = require_dist_Ck2jkBZk();
67708
67985
  var NO_DEVICES = "liveness:no-devices";
67709
67986
  var ALL_OFFLINE = "liveness:all-devices-offline";
67710
67987
  var NO_FOOTAGE_PREFIX = "liveness:no-footage:";
@@ -67894,7 +68171,7 @@ var require_local_auth_addon = __commonJS({
67894
68171
  [Symbol.toStringTag]: { value: "Module" }
67895
68172
  });
67896
68173
  var require_chunk = require_chunk_Cek0wNdY();
67897
- var require_dist10 = require_dist_CDgIzo82();
68174
+ var require_dist10 = require_dist_Ck2jkBZk();
67898
68175
  var node_crypto = __require("crypto");
67899
68176
  node_crypto = require_chunk.__toESM(node_crypto);
67900
68177
  var crypto$1 = __require("crypto");
@@ -75707,7 +75984,7 @@ var require_loki_logging = __commonJS({
75707
75984
  [Symbol.toStringTag]: { value: "Module" }
75708
75985
  });
75709
75986
  require_chunk_Cek0wNdY();
75710
- var require_dist10 = require_dist_CDgIzo82();
75987
+ var require_dist10 = require_dist_Ck2jkBZk();
75711
75988
  function sanitizeLabelName(raw) {
75712
75989
  const replaced = raw.replaceAll(/[^a-zA-Z0-9_]/g, "_");
75713
75990
  return /^[a-zA-Z_]/.test(replaced) ? replaced : `_${replaced}`;
@@ -76272,7 +76549,7 @@ var require_native_metrics_addon = __commonJS({
76272
76549
  [Symbol.toStringTag]: { value: "Module" }
76273
76550
  });
76274
76551
  var require_chunk = require_chunk_Cek0wNdY();
76275
- var require_dist10 = require_dist_CDgIzo82();
76552
+ var require_dist10 = require_dist_Ck2jkBZk();
76276
76553
  var node_fs_promises = __require("fs/promises");
76277
76554
  var node_child_process = __require("child_process");
76278
76555
  var node_util = __require("util");
@@ -78894,7 +79171,7 @@ var require_filesystem_storage_addon = __commonJS({
78894
79171
  [Symbol.toStringTag]: { value: "Module" }
78895
79172
  });
78896
79173
  var require_chunk = require_chunk_Cek0wNdY();
78897
- var require_dist10 = require_dist_CDgIzo82();
79174
+ var require_dist10 = require_dist_Ck2jkBZk();
78898
79175
  var node_crypto = __require("crypto");
78899
79176
  var node_fs_promises = __require("fs/promises");
78900
79177
  var node_path = __require("path");
@@ -80010,8 +80287,8 @@ var require_sqlite_settings_addon = __commonJS({
80010
80287
  [Symbol.toStringTag]: { value: "Module" }
80011
80288
  });
80012
80289
  var require_chunk = require_chunk_Cek0wNdY();
80013
- var require_dist10 = require_dist_CDgIzo82();
80014
- var require_retired_settings_keys = require_retired_settings_keys_BfAzWvPC();
80290
+ var require_dist10 = require_dist_Ck2jkBZk();
80291
+ var require_retired_settings_keys = require_retired_settings_keys_Dp_CyuCW();
80015
80292
  var node_crypto = __require("crypto");
80016
80293
  var node_fs = __require("fs");
80017
80294
  var node_module = __require("module");
@@ -81773,7 +82050,88 @@ var require_sqlite_settings_addon = __commonJS({
81773
82050
  return {
81774
82051
  matches,
81775
82052
  scanned: rows.length,
81776
- truncated: k < params.topK && rows.length >= k
82053
+ truncated: k < params.topK && rows.length >= k,
82054
+ effectiveTopK: k
82055
+ };
82056
+ }
82057
+ /**
82058
+ * Ids read back WITH their vectors.
82059
+ *
82060
+ * `vec0` returns a vector column as the packed Float32 blob it stores, which
82061
+ * is byte-for-byte what `upsert` was given — so the round trip is a base64
82062
+ * encode and nothing else. No re-normalisation, no float re-ordering: a
82063
+ * gallery loaded through here ranks identically to one loaded from the JSON
82064
+ * column it replaced.
82065
+ */
82066
+ async fetchByIds(index, ids) {
82067
+ this.specOf(index);
82068
+ if (ids.length === 0) return [];
82069
+ const placeholders = ids.map(() => "?").join(",");
82070
+ const rows = this.measured({
82071
+ op: "vectorFetch",
82072
+ collection: tableFor(index)
82073
+ }, () => this.db.prepare(`SELECT id, embedding, deviceId, timestamp, className, modelId, extra
82074
+ FROM ${tableFor(index)} WHERE id IN (${placeholders})`).all(...ids));
82075
+ const out = [];
82076
+ for (const raw of rows) {
82077
+ if (typeof raw !== "object" || raw === null) continue;
82078
+ const row = raw;
82079
+ const id = asText(row["id"]);
82080
+ if (id === null) continue;
82081
+ const blob = row["embedding"];
82082
+ if (!Buffer.isBuffer(blob)) {
82083
+ this.logger.warn("sqlite-vec: row has no readable vector \u2014 skipped", { meta: {
82084
+ index,
82085
+ id
82086
+ } });
82087
+ continue;
82088
+ }
82089
+ out.push({
82090
+ id,
82091
+ vector: blob.toString("base64"),
82092
+ metadata: rebuild(row)
82093
+ });
82094
+ }
82095
+ return out;
82096
+ }
82097
+ /**
82098
+ * One page of the whole index, unranked.
82099
+ *
82100
+ * `LIMIT ? OFFSET ?` over the `vec0` table with NO `MATCH` clause: a plain
82101
+ * scan, so the extension's KNN `k` ceiling ({@link VEC_KNN_MAX_K}) does not
82102
+ * apply and no distance is computed at all. Ordered by `id` so a cursor means
82103
+ * the same thing across calls — `rowid` order is not stable under the
82104
+ * DELETE-then-INSERT upsert this class performs.
82105
+ *
82106
+ * The cursor is an OFFSET, so rows deleted behind the walk shift the window.
82107
+ * That is acceptable and deliberate for the one caller: a reconcile that
82108
+ * misses a row this pass sees it next pass, and the alternative — a keyset
82109
+ * cursor on a virtual table whose ordering the extension owns — buys nothing
82110
+ * for a walk that is idempotent by construction.
82111
+ */
82112
+ async scan(index, cursor, limit) {
82113
+ this.specOf(index);
82114
+ const offset = Math.max(0, Math.floor(cursor));
82115
+ const take = Math.max(1, Math.floor(limit));
82116
+ const rows = this.measured({
82117
+ op: "vectorScan",
82118
+ collection: tableFor(index)
82119
+ }, () => this.db.prepare(`SELECT id, deviceId, timestamp, className, modelId, extra
82120
+ FROM ${tableFor(index)} ORDER BY id LIMIT ? OFFSET ?`).all(BigInt(take), BigInt(offset)));
82121
+ const items = [];
82122
+ for (const raw of rows) {
82123
+ if (typeof raw !== "object" || raw === null) continue;
82124
+ const row = raw;
82125
+ const id = asText(row["id"]);
82126
+ if (id === null) continue;
82127
+ items.push({
82128
+ id,
82129
+ metadata: rebuild(row)
82130
+ });
82131
+ }
82132
+ return {
82133
+ items,
82134
+ nextCursor: rows.length < take ? null : offset + rows.length
81777
82135
  };
81778
82136
  }
81779
82137
  async getByIds(index, ids) {
@@ -82111,6 +82469,8 @@ var require_sqlite_settings_addon = __commonJS({
82111
82469
  ...input.filter !== void 0 ? { filter: input.filter } : {}
82112
82470
  }),
82113
82471
  getByIds: async (input) => ({ items: await vectorIndex.getByIds(input.index, input.ids) }),
82472
+ fetchByIds: async (input) => ({ items: await vectorIndex.fetchByIds(input.index, input.ids) }),
82473
+ scan: async (input) => vectorIndex.scan(input.index, input.cursor, input.limit),
82114
82474
  deleteByIds: async (input) => ({ deleted: await vectorIndex.deleteByIds(input.index, input.ids) }),
82115
82475
  deleteByFilter: async (input) => ({ deleted: await vectorIndex.deleteByFilter(input.index, input.filter) }),
82116
82476
  stats: async (input) => vectorIndex.stats(input.index)
@@ -82290,7 +82650,7 @@ var require_storage_orchestrator_addon = __commonJS({
82290
82650
  [Symbol.toStringTag]: { value: "Module" }
82291
82651
  });
82292
82652
  var require_chunk = require_chunk_Cek0wNdY();
82293
- var require_dist10 = require_dist_CDgIzo82();
82653
+ var require_dist10 = require_dist_Ck2jkBZk();
82294
82654
  var node_crypto = __require("crypto");
82295
82655
  var node_fs_promises = __require("fs/promises");
82296
82656
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -82526,7 +82886,8 @@ var require_storage_orchestrator_addon = __commonJS({
82526
82886
  toLocationId: target.id,
82527
82887
  moverJobId: null,
82528
82888
  state: null,
82529
- error: null
82889
+ error: null,
82890
+ progress: null
82530
82891
  });
82531
82892
  if (BLOCKING_ONLY_CLASSES.includes(storageClass)) findings.push({
82532
82893
  code: "blockingOnly",
@@ -82624,7 +82985,8 @@ var require_storage_orchestrator_addon = __commonJS({
82624
82985
  ...move,
82625
82986
  moverJobId: null,
82626
82987
  state: null,
82627
- error: null
82988
+ error: null,
82989
+ progress: null
82628
82990
  })),
82629
82991
  pauseLeaseId: null,
82630
82992
  pausedParticipants: [],
@@ -82635,8 +82997,8 @@ var require_storage_orchestrator_addon = __commonJS({
82635
82997
  finishedAt: null,
82636
82998
  error: null
82637
82999
  };
82638
- this.active = job;
82639
83000
  await this.persist(job);
83001
+ this.active = job;
82640
83002
  this.runPromise = this.run(job);
82641
83003
  this.runPromise;
82642
83004
  return job.jobId;
@@ -82658,6 +83020,177 @@ var require_storage_orchestrator_addon = __commonJS({
82658
83020
  await Promise.all(job.moves.filter((move) => move.moverJobId !== null).map((move) => this.cancelMove(move)));
82659
83021
  return true;
82660
83022
  }
83023
+ /**
83024
+ * Every mover running right now, in both lanes — including the ones no
83025
+ * migration armed.
83026
+ *
83027
+ * `status` already carries a migration's own progress (the coordinator folds
83028
+ * it onto each move from the poll it is already doing). This exists for the
83029
+ * other half: `recording.relocateFootage` and `pipelineAnalytics.relocateMedia`
83030
+ * are operator-callable, and until {@link drain} existed that was the only way
83031
+ * to run a drain at all. Such a mover has no job to fold into, so without this
83032
+ * read a five-hour operation is invisible in the UI.
83033
+ *
83034
+ * `migrationJobId` is best-effort by construction: the coordinator keeps ONE
83035
+ * durable job, so a mover armed by an older, since-overwritten migration
83036
+ * reports `null`. That is the honest answer — nothing here can still claim it.
83037
+ */
83038
+ async movers() {
83039
+ const job = await this.status();
83040
+ const owned = /* @__PURE__ */ new Map();
83041
+ for (const move of job?.moves ?? []) if (move.moverJobId !== null) owned.set(move.moverJobId, job?.jobId ?? "");
83042
+ const [footage, media] = await Promise.all([this.deps.participants.recorder.listMovers(), this.deps.participants.analytics.listMovers()]);
83043
+ const observedAt = this.deps.now();
83044
+ const label = (lane, jobs) => jobs.map((mover) => ({
83045
+ lane,
83046
+ job: mover,
83047
+ migrationJobId: owned.get(mover.jobId) ?? null,
83048
+ observedAt
83049
+ }));
83050
+ return [...label("footage", footage), ...label("media", media)];
83051
+ }
83052
+ /**
83053
+ * What every class's source STILL holds — the census behind a "drain
83054
+ * remaining" action.
83055
+ *
83056
+ * A class appears here only when something is (or might be) left on a
83057
+ * location that is not its default. An empty result therefore means exactly
83058
+ * "there is nothing to drain", which is what lets the UI offer the action
83059
+ * only when it is true, and what lets {@link drain} refuse rather than start
83060
+ * a job that would move nothing and report `done` — the failure mode D295
83061
+ * exists to end.
83062
+ *
83063
+ * `items: null` is "the archive could not be asked" and is still listed. A
83064
+ * residue nobody could measure is the case an operator most needs to see;
83065
+ * dropping it because the read failed would be the quiet success again.
83066
+ */
83067
+ async residue() {
83068
+ const out = [];
83069
+ for (const storageClass of STORAGE_CLASSES) {
83070
+ if (!MOVER_CLASSES.includes(storageClass)) continue;
83071
+ const target = this.deps.locations.getDefaultLocation(storageClass);
83072
+ if (!target) continue;
83073
+ if (laneOf(storageClass) === "media") {
83074
+ const count = await unanswerable(this.deps.participants.analytics.residue({
83075
+ toLocationId: target.id,
83076
+ mode: storageClass === "galleryMedia" ? "gallery" : "move"
83077
+ }));
83078
+ if (count !== null && count.rows === 0) continue;
83079
+ out.push({
83080
+ storageClass,
83081
+ fromLocationId: "*",
83082
+ toLocationId: target.id,
83083
+ items: count?.rows ?? null,
83084
+ bytes: null
83085
+ });
83086
+ continue;
83087
+ }
83088
+ for (const source of this.deps.locations.listLocations({ type: storageClass })) {
83089
+ if (source.id === target.id) continue;
83090
+ const census = await unanswerable(this.deps.participants.recorder.residue({
83091
+ fromLocationId: source.id,
83092
+ footageClass: storageClass === "recordingsLow" ? "recordingsLow" : "recordings"
83093
+ }));
83094
+ if (census !== null && census.segments === 0) continue;
83095
+ out.push({
83096
+ storageClass,
83097
+ fromLocationId: source.id,
83098
+ toLocationId: target.id,
83099
+ items: census?.segments ?? null,
83100
+ bytes: census?.bytes ?? null
83101
+ });
83102
+ }
83103
+ }
83104
+ return out;
83105
+ }
83106
+ /**
83107
+ * Run the DRAIN half alone, against classes whose default has already moved.
83108
+ *
83109
+ * ## Why this is a second verb rather than a looser `start`
83110
+ *
83111
+ * `start` refuses a destination that is already the class's default
83112
+ * (`"recordingsLow:ssd" is already the "recordingsLow" default`). That refusal
83113
+ * is correct and it is load-bearing: there is genuinely nothing left to
83114
+ * repoint, and an operator must never be able to re-repoint a migrated class
83115
+ * by accident. Making `start` idempotent — "an already-repointed class
83116
+ * proceeds straight to draining" — would delete that protection AND make the
83117
+ * verb mean two different things depending on state, so the confirmation an
83118
+ * operator reads ("pauses the writers…") would be a lie half the time.
83119
+ *
83120
+ * `drain` instead cannot repoint AT ALL: it never touches
83121
+ * `setDefaultLocations`, and its job starts in `draining` with `repointed`
83122
+ * already true, so the `repointing` / `refreshing` / `resuming` blocks of
83123
+ * {@link run} are behind it and unreachable. The two verbs are disjoint, and
83124
+ * `start`'s refusal keeps meaning exactly what it meant.
83125
+ *
83126
+ * ## Why it re-derives the work instead of resuming the old job
83127
+ *
83128
+ * The finished job is the audit of what happened; re-opening it destroys
83129
+ * that. And a drain is needed in cases where no migration job ever existed
83130
+ * (a mover armed by hand, footage stranded on a location an operator added
83131
+ * and then un-defaulted). One job = one operation, and the work list comes
83132
+ * from {@link residue} — the archive — not from what a previous job believed.
83133
+ */
83134
+ async drain(input) {
83135
+ if (this.startReserved) throw new Error("storage migration is already active");
83136
+ this.startReserved = true;
83137
+ try {
83138
+ const existing = await this.status();
83139
+ if (existing && isTerminal(existing) && existing.pausedParticipants.length > 0) {
83140
+ await this.releaseAfterTerminal(existing);
83141
+ await this.persist(existing);
83142
+ if (existing.pausedParticipants.length > 0) throw new Error(`storage migration ${existing.jobId} still holds maintenance leases`);
83143
+ }
83144
+ if (existing && !isTerminal(existing)) throw new Error(`storage migration is already active (${existing.jobId})`);
83145
+ for (const storageClass of input.classes) {
83146
+ if (MOVER_CLASSES.includes(storageClass)) continue;
83147
+ throw new Error(`No mover owns "${storageClass}" \u2014 there is nothing that can drain it. Move it by hand.`);
83148
+ }
83149
+ const residue = await this.residue();
83150
+ const moves = [];
83151
+ const destinations = {};
83152
+ for (const storageClass of input.classes) {
83153
+ const remaining = residue.filter((entry) => entry.storageClass === storageClass);
83154
+ if (remaining.length === 0) throw new Error(`"${storageClass}" has nothing left outside its default location \u2014 there is nothing to drain. To CHANGE where it writes, use storageMigration.start with a new destination.`);
83155
+ for (const entry of remaining) {
83156
+ moves.push({
83157
+ storageClass,
83158
+ fromLocationId: entry.fromLocationId,
83159
+ toLocationId: entry.toLocationId,
83160
+ moverJobId: null,
83161
+ state: null,
83162
+ error: null,
83163
+ progress: null
83164
+ });
83165
+ destinations[storageClass] = entry.toLocationId;
83166
+ }
83167
+ }
83168
+ const now = this.deps.now();
83169
+ const job = {
83170
+ jobId: this.deps.newId(),
83171
+ phase: "draining",
83172
+ mode: "nonBlocking",
83173
+ destinations,
83174
+ throttleMbps: input.throttleMbps ?? 40,
83175
+ moves,
83176
+ pauseLeaseId: null,
83177
+ pausedParticipants: [],
83178
+ repointed: true,
83179
+ cancelRequested: false,
83180
+ startedAt: now,
83181
+ updatedAt: now,
83182
+ finishedAt: null,
83183
+ error: null
83184
+ };
83185
+ await this.persist(job);
83186
+ this.active = job;
83187
+ this.runPromise = this.run(job);
83188
+ this.runPromise;
83189
+ return job.jobId;
83190
+ } finally {
83191
+ this.startReserved = false;
83192
+ }
83193
+ }
82661
83194
  /** Boot recovery resumes a durable unfinished state. A missing in-memory
82662
83195
  * child mover is recreated from the same copy-if-absent input. */
82663
83196
  async recover() {
@@ -82867,6 +83400,13 @@ var require_storage_orchestrator_addon = __commonJS({
82867
83400
  }
82868
83401
  move.state = status.state;
82869
83402
  move.error = status.error;
83403
+ move.progress = {
83404
+ filesMoved: status.filesMoved,
83405
+ filesTotal: status.filesTotal,
83406
+ bytesMoved: status.bytesMoved,
83407
+ startedAt: status.startedAt,
83408
+ observedAt: this.deps.now()
83409
+ };
82870
83410
  if (status.state === "failed") throw new Error(move.error ?? `${move.storageClass} move failed`);
82871
83411
  if (status.state === "cancelled") {
82872
83412
  job.cancelRequested = true;
@@ -82986,6 +83526,13 @@ var require_storage_orchestrator_addon = __commonJS({
82986
83526
  await this.deps.state.set(job);
82987
83527
  }
82988
83528
  };
83529
+ async function unanswerable(read) {
83530
+ try {
83531
+ return await read;
83532
+ } catch {
83533
+ return null;
83534
+ }
83535
+ }
82989
83536
  function requireLease(job) {
82990
83537
  if (job.pauseLeaseId === null) throw new Error("storage migration has no maintenance lease");
82991
83538
  return job.pauseLeaseId;
@@ -83006,6 +83553,9 @@ var require_storage_orchestrator_addon = __commonJS({
83006
83553
  const existing = map.get(declaration.id);
83007
83554
  if (existing !== void 0) {
83008
83555
  if (existing.cardinality !== declaration.cardinality) throw new Error(`Storage location cardinality conflict for id "${declaration.id}": "${existing.cardinality}" (first declarer) vs "${declaration.cardinality}" (later declarer). All addons declaring the same storage location id must agree on cardinality.`);
83556
+ const existingAccess = existing.access ?? "local-path";
83557
+ const declaredAccess = declaration.access ?? "local-path";
83558
+ if (existingAccess !== declaredAccess) throw new Error(`Storage location access conflict for id "${declaration.id}": "${existingAccess}" (first declarer) vs "${declaredAccess}" (later declarer). All addons declaring the same storage location id must agree on access \u2014 a later declaration must never widen what an earlier one restricted.`);
83009
83559
  continue;
83010
83560
  }
83011
83561
  map.set(declaration.id, declaration);
@@ -83021,11 +83571,23 @@ var require_storage_orchestrator_addon = __commonJS({
83021
83571
  cardinalityOf(id) {
83022
83572
  return map.get(id)?.cardinality ?? null;
83023
83573
  },
83574
+ accessOf(id) {
83575
+ const declaration = map.get(id);
83576
+ if (declaration === void 0) return null;
83577
+ return declaration.access ?? "local-path";
83578
+ },
83024
83579
  list() {
83025
83580
  return frozen;
83026
83581
  }
83027
83582
  };
83028
83583
  }
83584
+ function resolveRefusalFor(location, locality) {
83585
+ if (locality !== false) return null;
83586
+ return `storage.resolve is a request for a path this node can open with node:fs, and location "${location.id}" is served by the remote provider "${location.providerId}" (nodeLocal: false) \u2014 the path it would return exists on the remote host, not here. Read and write this location through the storage cap (read/write, or beginUpload/writeChunk/finalizeUpload) instead.`;
83587
+ }
83588
+ function canProbeOccupancyLocally(locality) {
83589
+ return locality === true;
83590
+ }
83029
83591
  function resolveEngine(getEngines) {
83030
83592
  const engines = getEngines();
83031
83593
  if (engines.length === 0) throw new Error("settings-store: no data-store-provider engine is registered \u2014 the data door has nothing behind it");
@@ -83053,6 +83615,47 @@ var require_storage_orchestrator_addon = __commonJS({
83053
83615
  declareCollection: async (input) => (await engine()).declareCollection(input)
83054
83616
  };
83055
83617
  }
83618
+ var EMPTY_SECRET_KEYS = /* @__PURE__ */ new Set();
83619
+ function secretKeysOfProviderInfo(info) {
83620
+ return require_dist10.collectSecretConfigKeys(info.configSchema);
83621
+ }
83622
+ function redactLocationConfig(config, secretKeys) {
83623
+ if (secretKeys.size === 0) return config;
83624
+ let touched = false;
83625
+ const out = {};
83626
+ for (const [key, value] of Object.entries(config)) {
83627
+ if (secretKeys.has(key) && value !== void 0 && value !== null && value !== "") {
83628
+ out[key] = require_dist10.REDACTED_SECRET;
83629
+ touched = true;
83630
+ continue;
83631
+ }
83632
+ out[key] = value;
83633
+ }
83634
+ return touched ? out : config;
83635
+ }
83636
+ function redactLocation(location, secretKeys) {
83637
+ const config = redactLocationConfig(location.config, secretKeys);
83638
+ if (config === location.config) return location;
83639
+ return {
83640
+ ...location,
83641
+ config
83642
+ };
83643
+ }
83644
+ function restoreRedactedSecrets(incoming, stored, secretKeys) {
83645
+ if (secretKeys.size === 0) return incoming;
83646
+ let touched = false;
83647
+ const out = {};
83648
+ for (const [key, value] of Object.entries(incoming)) {
83649
+ if (value !== "__camstack_redacted__" || !secretKeys.has(key)) {
83650
+ out[key] = value;
83651
+ continue;
83652
+ }
83653
+ touched = true;
83654
+ const previous = stored?.[key];
83655
+ if (previous !== void 0) out[key] = previous;
83656
+ }
83657
+ return touched ? out : incoming;
83658
+ }
83056
83659
  async function collectProviderInfos(providers, onError) {
83057
83660
  const out = [];
83058
83661
  for (const [index, p] of providers.entries()) try {
@@ -83374,6 +83977,66 @@ var require_storage_orchestrator_addon = __commonJS({
83374
83977
  * implicitly-demoted siblings are persisted before the in-memory map
83375
83978
  * mutation returns. Persistence errors propagate to the caller.
83376
83979
  */
83980
+ /**
83981
+ * Refuse a `(location kind, provider)` pair the kind cannot use.
83982
+ *
83983
+ * The rule, in one line: a `'local-path'` kind requires a provider whose
83984
+ * `getProviderInfo().nodeLocal` is `true`.
83985
+ *
83986
+ * `nodeLocal` is the honest name for "this provider's `resolve` returns a
83987
+ * path on the filesystem of the node that resolved it". The
83988
+ * `storage-provider` cap's own discriminated union already forces every
83989
+ * provider to declare it, and all four remote providers declare `false`, so
83990
+ * no new cap surface is needed to ask the question.
83991
+ *
83992
+ * Three-valued on purpose. Only a POSITIVE `false` refuses:
83993
+ * - `true` → node-local, always fine.
83994
+ * - `false` → the provider is known and known to be remote. REFUSE.
83995
+ * - `undefined` → the provider has not registered yet (early boot, an addon
83996
+ * still loading). That is "unknown", not "remote", and a read that could
83997
+ * not be made must never destroy work (D49) — the system seed runs
83998
+ * through this path before any provider registers. Allowed, and logged,
83999
+ * so the allowance is never silent.
84000
+ *
84001
+ * The DECLARATION side is read the same way. A kind the registry does not
84002
+ * know is `local-path` (fail-closed: an unknown kind is not a permissive
84003
+ * one), but NO REGISTRY AT ALL is a different statement — nothing has been
84004
+ * loaded, so nothing can be concluded about any kind. The addon injects the
84005
+ * registry inside `onInitialize`, before the `storage` cap is mounted, so
84006
+ * there is no window in which an operator upsert sees this branch; a service
84007
+ * constructed without one is the in-memory/early-boot path.
84008
+ */
84009
+ refuseIncompatibleProvider(input) {
84010
+ const registry = this.registry;
84011
+ if (registry === null) {
84012
+ this.logger.debug("storage-orchestrator: no location declarations loaded \u2014 access constraint not evaluated", { meta: {
84013
+ id: input.id,
84014
+ type: input.type,
84015
+ providerId: input.providerId
84016
+ } });
84017
+ return;
84018
+ }
84019
+ const access = registry.accessOf(input.type) ?? "local-path";
84020
+ if (access !== "local-path") return;
84021
+ const nodeLocal = this.nodeLocalResolver?.(input.providerId);
84022
+ if (nodeLocal === true) return;
84023
+ if (nodeLocal === void 0) {
84024
+ this.logger.debug("storage-orchestrator: provider not yet classified \u2014 allowing a local-path upsert", { meta: {
84025
+ id: input.id,
84026
+ type: input.type,
84027
+ providerId: input.providerId,
84028
+ access
84029
+ } });
84030
+ return;
84031
+ }
84032
+ this.logger.warn("storage-orchestrator: REFUSED a remote provider for a local-path kind", { meta: {
84033
+ id: input.id,
84034
+ type: input.type,
84035
+ providerId: input.providerId,
84036
+ access
84037
+ } });
84038
+ throw new Error(`Storage kind "${input.type}" is declared access "local-path": the service that owns it reads and writes its bytes with node:fs on the path "storage.resolve" returns, so it can only be backed by a node-local provider. Provider "${input.providerId}" is remote (nodeLocal: false) and its resolved paths do not exist on this node. Refusing location "${input.id}".`);
84039
+ }
83377
84040
  upsertLocation(input) {
83378
84041
  const now = Date.now();
83379
84042
  const existing = this.locations.get(input.id);
@@ -83383,6 +84046,7 @@ var require_storage_orchestrator_addon = __commonJS({
83383
84046
  if (already) throw new Error(`Storage type "${input.type}" is single \u2014 only one location allowed (existing: "${already.id}"). Edit it instead of adding a new one.`);
83384
84047
  }
83385
84048
  }
84049
+ this.refuseIncompatibleProvider(input);
83386
84050
  if (this.nodeLocalResolver?.(input.providerId) === true && !input.nodeId) input = {
83387
84051
  ...input,
83388
84052
  nodeId: "hub"
@@ -83853,6 +84517,19 @@ var require_storage_orchestrator_addon = __commonJS({
83853
84517
  */
83854
84518
  nodeLocalByProvider = /* @__PURE__ */ new Map();
83855
84519
  /**
84520
+ * Cached `providerId → secret config keys`, derived from each provider's own
84521
+ * `configSchema` in the SAME refresh as `nodeLocalByProvider` — one
84522
+ * `getProviderInfo()` round trip answers both questions.
84523
+ *
84524
+ * An absent providerId yields an EMPTY set, which redacts nothing. That is
84525
+ * the one direction this cache can be wrong in, so it is worth saying why it
84526
+ * is acceptable: the entry is populated at the same moment the provider
84527
+ * becomes resolvable at all, so a location whose provider is unknown here
84528
+ * cannot be dispatched to either — there is no window in which a credential
84529
+ * is readable through a provider the orchestrator can otherwise use.
84530
+ */
84531
+ secretKeysByProvider = /* @__PURE__ */ new Map();
84532
+ /**
83856
84533
  * Disposers run on `onShutdown` — currently the eventBus subscription
83857
84534
  * for `capability:provider-registered` events used by the lazy seed
83858
84535
  * fallback. Stored separately from the `BaseAddon` disposer chain so
@@ -83887,13 +84564,24 @@ var require_storage_orchestrator_addon = __commonJS({
83887
84564
  listLocations: async ({ type }) => {
83888
84565
  const rows = type !== void 0 ? service.listLocations({ type }) : service.listLocations();
83889
84566
  return Promise.all(rows.map(async (loc) => ({
83890
- ...loc,
84567
+ ...this.redacted(loc),
83891
84568
  capacity: await this.localCapacityOf(loc)
83892
84569
  })));
83893
84570
  },
83894
- getDefaultLocation: async ({ type }) => service.getDefaultLocation(type),
84571
+ getDefaultLocation: async ({ type }) => {
84572
+ const loc = service.getDefaultLocation(type);
84573
+ return loc === null ? null : this.redacted(loc);
84574
+ },
83895
84575
  listLocationDeclarations: async () => service.listDeclarations(),
83896
- upsertLocation: async (input) => service.upsertLocation(input),
84576
+ upsertLocation: async (input) => {
84577
+ const stored = service.getLocationById(input.id);
84578
+ const config = restoreRedactedSecrets(input.config, stored?.config, this.secretKeysFor(input.providerId));
84579
+ const saved = service.upsertLocation(config === input.config ? input : {
84580
+ ...input,
84581
+ config
84582
+ });
84583
+ return this.redacted(saved);
84584
+ },
83897
84585
  deleteLocation: async ({ id, force }) => {
83898
84586
  await service.deleteLocation(id, { force: force === true });
83899
84587
  },
@@ -83938,6 +84626,7 @@ var require_storage_orchestrator_addon = __commonJS({
83938
84626
  },
83939
84627
  resolve: async ({ location, relativePath }) => {
83940
84628
  const loc = service.resolveRef(location);
84629
+ this.refuseRemoteResolve(loc);
83941
84630
  return (await service.getProviderFor(loc)).resolve({
83942
84631
  location: loc,
83943
84632
  relativePath
@@ -84060,6 +84749,8 @@ var require_storage_orchestrator_addon = __commonJS({
84060
84749
  startMove: (input) => this.ctx.api.recording.startStorageMigrationMove.mutate(input),
84061
84750
  startDrain: (input) => this.ctx.api.recording.relocateFootage.mutate(input),
84062
84751
  getMove: (jobId) => this.ctx.api.recording.getStorageMigrationMoveStatus.query({ jobId }),
84752
+ listMovers: () => this.ctx.api.recording.listRelocateJobs.query({}),
84753
+ residue: (input) => this.ctx.api.recording.getRelocateResidue.query(input),
84063
84754
  cancelMove: async (jobId) => (await this.ctx.api.recording.cancelStorageMigrationMove.mutate({ jobId })).cancelled,
84064
84755
  refresh: async (leaseId) => {
84065
84756
  await this.ctx.api.recording.refreshStorageLocationsForMigration.mutate({ leaseId });
@@ -84076,6 +84767,8 @@ var require_storage_orchestrator_addon = __commonJS({
84076
84767
  startDrain: (input) => this.ctx.api.pipelineAnalytics.relocateMedia.mutate(input),
84077
84768
  countUnstamped: () => this.ctx.api.pipelineAnalytics.countUnstampedEventMedia.query({}),
84078
84769
  getMove: (jobId) => this.ctx.api.pipelineAnalytics.getStorageMigrationMoveStatus.query({ jobId }),
84770
+ listMovers: () => this.ctx.api.pipelineAnalytics.listRelocateMediaJobs.query({}),
84771
+ residue: (input) => this.ctx.api.pipelineAnalytics.countRelocatableMedia.query(input),
84079
84772
  cancelMove: async (jobId) => (await this.ctx.api.pipelineAnalytics.cancelStorageMigrationMove.mutate({ jobId })).cancelled,
84080
84773
  refresh: async (leaseId) => {
84081
84774
  await this.ctx.api.pipelineAnalytics.refreshStorageLocationsForMigration.mutate({ leaseId });
@@ -84091,7 +84784,10 @@ var require_storage_orchestrator_addon = __commonJS({
84091
84784
  plan: (input) => migration.plan(input),
84092
84785
  start: async (input) => ({ jobId: await migration.start(input) }),
84093
84786
  status: ({ jobId }) => migration.status(jobId),
84094
- cancel: async ({ jobId }) => ({ cancelled: await migration.cancel(jobId) })
84787
+ cancel: async ({ jobId }) => ({ cancelled: await migration.cancel(jobId) }),
84788
+ movers: () => migration.movers(),
84789
+ residue: () => migration.residue(),
84790
+ drain: async (input) => ({ jobId: await migration.drain(input) })
84095
84791
  };
84096
84792
  await this.seedFromDeclarations();
84097
84793
  const eventBus = this.ctx.eventBus;
@@ -84236,6 +84932,34 @@ var require_storage_orchestrator_addon = __commonJS({
84236
84932
  }
84237
84933
  return out;
84238
84934
  }
84935
+ /** Declared secret config keys for a provider; empty when unknown. */
84936
+ secretKeysFor(providerId) {
84937
+ return this.secretKeysByProvider.get(providerId) ?? EMPTY_SECRET_KEYS;
84938
+ }
84939
+ /** A location with its provider's declared secrets replaced by the sentinel. */
84940
+ redacted(location) {
84941
+ return redactLocation(location, this.secretKeysFor(location.providerId));
84942
+ }
84943
+ /**
84944
+ * Is this location backed by a provider that serves a genuine local
84945
+ * filesystem? `true` / `false` / `undefined` — see
84946
+ * `StorageOrchestratorService.refuseIncompatibleProvider` for why the
84947
+ * unknown case is kept distinct rather than folded into either answer.
84948
+ */
84949
+ providerIsNodeLocal(location) {
84950
+ return this.nodeLocalByProvider.get(location.providerId);
84951
+ }
84952
+ /** See the call site in the `resolve` dispatch, and `access-guards.ts`. */
84953
+ refuseRemoteResolve(location) {
84954
+ const refusal = resolveRefusalFor(location, this.providerIsNodeLocal(location));
84955
+ if (refusal === null) return;
84956
+ this.ctx.logger.warn("storage-orchestrator: REFUSED resolve() on a remote-backed location", { meta: {
84957
+ id: location.id,
84958
+ type: location.type,
84959
+ providerId: location.providerId
84960
+ } });
84961
+ throw new Error(refusal);
84962
+ }
84239
84963
  /** statfs capacity of a location's basePath, walking up to the nearest
84240
84964
  * existing ancestor. Null for remote-node locations or unstattable paths. */
84241
84965
  async localCapacityOf(loc) {
@@ -84323,6 +85047,13 @@ var require_storage_orchestrator_addon = __commonJS({
84323
85047
  * errno — `EACCES`, `EIO`, a stale NFS handle — is `unknown` and refuses.
84324
85048
  */
84325
85049
  async locationOccupancy(location) {
85050
+ if (!canProbeOccupancyLocally(this.providerIsNodeLocal(location))) {
85051
+ this.ctx.logger.debug("storage-orchestrator: occupancy unknown \u2014 location is not backed by a local filesystem", { meta: {
85052
+ id: location.id,
85053
+ providerId: location.providerId
85054
+ } });
85055
+ return "unknown";
85056
+ }
84326
85057
  if ((location.nodeId === void 0 || location.nodeId === "" ? HUB_NODE_ID : location.nodeId) !== (this.service?.getLocalNodeId() ?? HUB_NODE_ID)) return "unknown";
84327
85058
  const basePath = this.locationBasePath(location.id);
84328
85059
  if (basePath === null) return "unknown";
@@ -84405,7 +85136,10 @@ var require_storage_orchestrator_addon = __commonJS({
84405
85136
  error: err instanceof Error ? err.message : String(err)
84406
85137
  } });
84407
85138
  });
84408
- for (const info of infos) this.nodeLocalByProvider.set(info.providerId, info.nodeLocal);
85139
+ for (const info of infos) {
85140
+ this.nodeLocalByProvider.set(info.providerId, info.nodeLocal);
85141
+ this.secretKeysByProvider.set(info.providerId, secretKeysOfProviderInfo(info));
85142
+ }
84409
85143
  }
84410
85144
  };
84411
85145
  exports.SqliteLocationStore = SqliteLocationStore;
@@ -84444,7 +85178,7 @@ var require_system_config_addon = __commonJS({
84444
85178
  [Symbol.toStringTag]: { value: "Module" }
84445
85179
  });
84446
85180
  require_chunk_Cek0wNdY();
84447
- var require_dist10 = require_dist_CDgIzo82();
85181
+ var require_dist10 = require_dist_Ck2jkBZk();
84448
85182
  var SECTION_TITLES = {
84449
85183
  server: "Server",
84450
85184
  auth: "Authentication"
@@ -102505,7 +103239,7 @@ var require_winston_logging = __commonJS({
102505
103239
  [Symbol.toStringTag]: { value: "Module" }
102506
103240
  });
102507
103241
  var require_chunk = require_chunk_Cek0wNdY();
102508
- var require_dist10 = require_dist_CDgIzo82();
103242
+ var require_dist10 = require_dist_Ck2jkBZk();
102509
103243
  var require_formatter = require_formatter_DqAKDlvN();
102510
103244
  var node_path = __require("path");
102511
103245
  node_path = require_chunk.__toESM(node_path);
@@ -104448,9 +105182,9 @@ var require_event_category_BaEgqJNv = __commonJS({
104448
105182
  }
104449
105183
  });
104450
105184
 
104451
- // ../types/dist/sleep-CJrvRDlD.js
104452
- var require_sleep_CJrvRDlD = __commonJS({
104453
- "../types/dist/sleep-CJrvRDlD.js"(exports) {
105185
+ // ../types/dist/sleep-CWWLTM6W.js
105186
+ var require_sleep_CWWLTM6W = __commonJS({
105187
+ "../types/dist/sleep-CWWLTM6W.js"(exports) {
104454
105188
  "use strict";
104455
105189
  var require_event_category = require_event_category_BaEgqJNv();
104456
105190
  var zod = require_zod();
@@ -107151,6 +107885,7 @@ var require_sleep_CJrvRDlD = __commonJS({
107151
107885
  cancelStorageMigrationMove: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "cancelStorageMigrationMove", "mutation", input),
107152
107886
  relocateMedia: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "relocateMedia", "mutation", input),
107153
107887
  countUnstampedEventMedia: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "countUnstampedEventMedia", "query", input),
107888
+ countRelocatableMedia: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "countRelocatableMedia", "query", input),
107154
107889
  listRelocateMediaJobs: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listRelocateMediaJobs", "query", input),
107155
107890
  cancelRelocateMedia: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "cancelRelocateMedia", "mutation", input),
107156
107891
  listOpsLog: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "listOpsLog", "query", input),
@@ -108115,7 +108850,7 @@ var require_addon = __commonJS({
108115
108850
  "use strict";
108116
108851
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
108117
108852
  var require_event_category = require_event_category_BaEgqJNv();
108118
- var require_sleep = require_sleep_CJrvRDlD();
108853
+ var require_sleep = require_sleep_CWWLTM6W();
108119
108854
  var require_err_msg = require_err_msg_COpsHMw2();
108120
108855
  var CAP_INPUT_DEFAULTS = Object.freeze({
108121
108856
  "addons": { "getLogs": { "limit": 100 } },
@@ -108335,7 +109070,10 @@ var require_addon = __commonJS({
108335
109070
  "createApiKey": { "isAdmin": false },
108336
109071
  "createUser": { "isAdmin": false }
108337
109072
  },
108338
- "vector-store": { "declareIndex": { "metric": "cosine" } },
109073
+ "vector-store": {
109074
+ "declareIndex": { "metric": "cosine" },
109075
+ "scan": { "cursor": 0 }
109076
+ },
108339
109077
  "zones": {
108340
109078
  "addZone": { "zone": { "__nested__": {
108341
109079
  "kind": "polygon",
@@ -114994,12 +115732,12 @@ var require_dist2 = __commonJS({
114994
115732
  }
114995
115733
  });
114996
115734
 
114997
- // ../system/dist/manifest-python-deps-DVODn-qc.js
114998
- var require_manifest_python_deps_DVODn_qc = __commonJS({
114999
- "../system/dist/manifest-python-deps-DVODn-qc.js"(exports) {
115735
+ // ../system/dist/manifest-system-deps-8boi90D9.js
115736
+ var require_manifest_system_deps_8boi90D9 = __commonJS({
115737
+ "../system/dist/manifest-system-deps-8boi90D9.js"(exports) {
115000
115738
  "use strict";
115001
115739
  var require_chunk = require_chunk_Cek0wNdY();
115002
- require_dist_CDgIzo82();
115740
+ require_dist_Ck2jkBZk();
115003
115741
  var node_crypto = __require("crypto");
115004
115742
  node_crypto = require_chunk.__toESM(node_crypto);
115005
115743
  var _camstack_types_node = require_node();
@@ -115702,14 +116440,14 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
115702
116440
  dispose
115703
116441
  };
115704
116442
  }
115705
- var execFileAsync$1 = (0, node_util.promisify)(node_child_process.execFile);
116443
+ var execFileAsync$2 = (0, node_util.promisify)(node_child_process.execFile);
115706
116444
  var DEFAULT_REGISTRY = "https://registry.npmjs.org";
115707
116445
  function bootstrappedCliPath(cacheDir) {
115708
116446
  return node_path.join(cacheDir, "package", "bin", "npm-cli.js");
115709
116447
  }
115710
116448
  async function defaultProbeSystemNpm() {
115711
116449
  try {
115712
- await execFileAsync$1("npm", ["--version"], { timeout: 15e3 });
116450
+ await execFileAsync$2("npm", ["--version"], { timeout: 15e3 });
115713
116451
  return true;
115714
116452
  } catch {
115715
116453
  return false;
@@ -115727,7 +116465,7 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
115727
116465
  await node_fs.promises.writeFile(destTgz, bytes);
115728
116466
  }
115729
116467
  async function defaultExtractTarball(tgzPath, destDir) {
115730
- await execFileAsync$1("tar", [
116468
+ await execFileAsync$2("tar", [
115731
116469
  "-xzf",
115732
116470
  tgzPath,
115733
116471
  "-C",
@@ -115755,7 +116493,7 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
115755
116493
  registry: options.registry,
115756
116494
  logger: options.logger
115757
116495
  });
115758
- return execFileAsync$1(invocation.command, [...invocation.argsPrefix, ...args], {
116496
+ return execFileAsync$2(invocation.command, [...invocation.argsPrefix, ...args], {
115759
116497
  ...options.cwd !== void 0 ? { cwd: options.cwd } : {},
115760
116498
  timeout: options.timeout ?? 3e5
115761
116499
  });
@@ -115813,7 +116551,7 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
115813
116551
  const namedAddon = Object.values(mod).find(isAddonConstructor);
115814
116552
  if (namedAddon) return namedAddon;
115815
116553
  }
115816
- var execFileAsync = (0, node_util.promisify)(node_child_process.execFile);
116554
+ var execFileAsync$1 = (0, node_util.promisify)(node_child_process.execFile);
115817
116555
  function defaultNpmCacheDir() {
115818
116556
  return node_path.join(node_os.tmpdir(), "camstack-npm-bootstrap");
115819
116557
  }
@@ -116041,7 +116779,7 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
116041
116779
  return;
116042
116780
  }
116043
116781
  logger.warn("@electron/rebuild not available \u2014 falling back to npx", { meta: { addonDir } });
116044
- await execFileAsync("npx", [
116782
+ await execFileAsync$1("npx", [
116045
116783
  "--yes",
116046
116784
  "electron-rebuild",
116047
116785
  "-m",
@@ -117244,11 +117982,11 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
117244
117982
  });
117245
117983
  }
117246
117984
  };
117247
- const PROBE_TIMEOUT_MS = 3e4;
117985
+ const PROBE_TIMEOUT_MS2 = 3e4;
117248
117986
  const runProbe = async () => {
117249
117987
  if (typeof lifecycleHost.onProbe !== "function") return;
117250
117988
  try {
117251
- await Promise.race([lifecycleHost.onProbe(), new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error(`onProbe timeout after ${PROBE_TIMEOUT_MS}ms`)), PROBE_TIMEOUT_MS))]);
117989
+ await Promise.race([lifecycleHost.onProbe(), new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error(`onProbe timeout after ${PROBE_TIMEOUT_MS2}ms`)), PROBE_TIMEOUT_MS2))]);
117252
117990
  } catch (err) {
117253
117991
  opts.logger.warn("device.onProbe() threw or timed out \u2014 continuing with stale flags (slice subscription will reconcile if probe lands later)", {
117254
117992
  tags: {
@@ -122158,6 +122896,156 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
122158
122896
  }
122159
122897
  await deps.installPythonRequirements(reqAbs);
122160
122898
  }
122899
+ var execFileAsync = (0, node_util.promisify)(node_child_process.execFile);
122900
+ var INSTALL_TIMEOUT_MS = 300 * 1e3;
122901
+ var PROBE_TIMEOUT_MS = 1e4;
122902
+ async function installManifestSystemDeps(declaration, logger, options = {}) {
122903
+ const deps = declaration.systemDependencies;
122904
+ if (!deps || deps.length === 0) return;
122905
+ const hasBinary = options.hasBinary ?? defaultHasBinary;
122906
+ const detectManager = options.detectManager ?? defaultDetectManager;
122907
+ const run = options.run ?? defaultRun;
122908
+ const platform = options.platform ?? process.platform;
122909
+ for (const dep of deps) try {
122910
+ await satisfyOne(dep, declaration.id, {
122911
+ hasBinary,
122912
+ detectManager,
122913
+ run,
122914
+ platform
122915
+ }, logger);
122916
+ } catch (err) {
122917
+ logger.warn("system dependency step failed", { meta: {
122918
+ addonId: declaration.id,
122919
+ binary: dep.binary,
122920
+ error: err instanceof Error ? err.message : String(err)
122921
+ } });
122922
+ }
122923
+ }
122924
+ async function satisfyOne(dep, addonId, rt, logger) {
122925
+ if (await rt.hasBinary(dep.binary)) {
122926
+ logger.debug("system dependency already present", { meta: {
122927
+ addonId,
122928
+ binary: dep.binary
122929
+ } });
122930
+ return;
122931
+ }
122932
+ const manager = await rt.detectManager();
122933
+ if (manager === null) {
122934
+ logger.warn("system dependency missing and no supported package manager on this host", { meta: {
122935
+ addonId,
122936
+ binary: dep.binary,
122937
+ platform: rt.platform,
122938
+ ...dep.reason !== void 0 ? { reason: dep.reason } : {}
122939
+ } });
122940
+ return;
122941
+ }
122942
+ const packageName = dep.packages[manager];
122943
+ if (packageName === void 0 || packageName.length === 0) {
122944
+ logger.warn("system dependency missing and the addon declares no package for this manager", { meta: {
122945
+ addonId,
122946
+ binary: dep.binary,
122947
+ manager,
122948
+ ...dep.reason !== void 0 ? { reason: dep.reason } : {}
122949
+ } });
122950
+ return;
122951
+ }
122952
+ const plan = planFor(manager, packageName);
122953
+ logger.info("installing system dependency", { meta: {
122954
+ addonId,
122955
+ binary: dep.binary,
122956
+ manager,
122957
+ package: packageName
122958
+ } });
122959
+ try {
122960
+ for (const [command, args] of plan.steps) await rt.run(command, args);
122961
+ } catch (err) {
122962
+ logger.warn("system dependency install failed \u2014 the addon loads, its capability must refuse", { meta: {
122963
+ addonId,
122964
+ binary: dep.binary,
122965
+ manager,
122966
+ package: packageName,
122967
+ error: err instanceof Error ? err.message : String(err),
122968
+ ...dep.reason !== void 0 ? { reason: dep.reason } : {}
122969
+ } });
122970
+ return;
122971
+ }
122972
+ if (!await rt.hasBinary(dep.binary)) {
122973
+ logger.warn("system dependency installed but the binary still does not resolve", { meta: {
122974
+ addonId,
122975
+ binary: dep.binary,
122976
+ manager,
122977
+ package: packageName
122978
+ } });
122979
+ return;
122980
+ }
122981
+ logger.info("system dependency installed", { meta: {
122982
+ addonId,
122983
+ binary: dep.binary,
122984
+ manager,
122985
+ package: packageName
122986
+ } });
122987
+ }
122988
+ function planFor(manager, packageName) {
122989
+ switch (manager) {
122990
+ case "apt":
122991
+ return {
122992
+ manager,
122993
+ steps: [["apt-get", ["update"]], ["apt-get", [
122994
+ "install",
122995
+ "-y",
122996
+ "--no-install-recommends",
122997
+ packageName
122998
+ ]]]
122999
+ };
123000
+ case "apk":
123001
+ return {
123002
+ manager,
123003
+ steps: [["apk", [
123004
+ "add",
123005
+ "--no-cache",
123006
+ packageName
123007
+ ]]]
123008
+ };
123009
+ case "dnf":
123010
+ return {
123011
+ manager,
123012
+ steps: [["dnf", [
123013
+ "install",
123014
+ "-y",
123015
+ packageName
123016
+ ]]]
123017
+ };
123018
+ case "brew":
123019
+ return {
123020
+ manager,
123021
+ steps: [["brew", ["install", packageName]]]
123022
+ };
123023
+ }
123024
+ }
123025
+ async function defaultHasBinary(binary) {
123026
+ try {
123027
+ await execFileAsync("command", ["-v", binary], {
123028
+ timeout: PROBE_TIMEOUT_MS,
123029
+ shell: process.platform === "win32" ? false : "/bin/sh"
123030
+ });
123031
+ return true;
123032
+ } catch {
123033
+ return false;
123034
+ }
123035
+ }
123036
+ async function defaultDetectManager() {
123037
+ const candidates = node_os.platform() === "darwin" ? ["brew"] : [
123038
+ "apt",
123039
+ "apk",
123040
+ "dnf",
123041
+ "brew"
123042
+ ];
123043
+ for (const candidate of candidates) if (await defaultHasBinary(candidate === "apt" ? "apt-get" : candidate)) return candidate;
123044
+ return null;
123045
+ }
123046
+ async function defaultRun(command, args) {
123047
+ await execFileAsync(command, [...args], { timeout: INSTALL_TIMEOUT_MS });
123048
+ }
122161
123049
  Object.defineProperty(exports, "AGENT_CAP_FWD_ACTION", {
122162
123050
  enumerable: true,
122163
123051
  get: function() {
@@ -122752,6 +123640,12 @@ var require_manifest_python_deps_DVODn_qc = __commonJS({
122752
123640
  return installManifestPythonDeps;
122753
123641
  }
122754
123642
  });
123643
+ Object.defineProperty(exports, "installManifestSystemDeps", {
123644
+ enumerable: true,
123645
+ get: function() {
123646
+ return installManifestSystemDeps;
123647
+ }
123648
+ });
122755
123649
  Object.defineProperty(exports, "ipcParentLink", {
122756
123650
  enumerable: true,
122757
123651
  get: function() {
@@ -126740,7 +127634,7 @@ var require_dist3 = __commonJS({
126740
127634
  "use strict";
126741
127635
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
126742
127636
  var require_chunk = require_chunk_Cek0wNdY();
126743
- var require_dist10 = require_dist_CDgIzo82();
127637
+ var require_dist10 = require_dist_Ck2jkBZk();
126744
127638
  var require_builtins_alerts_alerts_addon = require_alerts_addon();
126745
127639
  require_alerts();
126746
127640
  var require_formatter = require_formatter_DqAKDlvN();
@@ -126766,7 +127660,7 @@ var require_dist3 = __commonJS({
126766
127660
  var require_builtins_winston_logging_index = require_winston_logging();
126767
127661
  var require_file_data_plane = require_file_data_plane_DO8KbxCe();
126768
127662
  var require_tls$1 = require_tls_BxQlomxd();
126769
- var require_manifest_python_deps = require_manifest_python_deps_DVODn_qc();
127663
+ var require_manifest_system_deps = require_manifest_system_deps_8boi90D9();
126770
127664
  var require_resource_monitor = require_resource_monitor_CdnzxBLP();
126771
127665
  var require_custom_action_registry = require_custom_action_registry_jY0NOZK8();
126772
127666
  var zod = require_zod();
@@ -129235,7 +130129,7 @@ var require_dist3 = __commonJS({
129235
130129
  if (!node_fs.existsSync(entryPath)) throw new Error(`Entry not found: ${entryPath}`);
129236
130130
  const modUnknown = await importAddonModuleFresh(entryPath);
129237
130131
  const mod = isRecord$2(modUnknown) ? modUnknown : {};
129238
- const AddonClass = require_manifest_python_deps.resolveAddonClass(mod);
130132
+ const AddonClass = require_manifest_system_deps.resolveAddonClass(mod);
129239
130133
  if (!AddonClass) throw new Error(`No addon class in ${entryPath}`);
129240
130134
  this.addons.set(declaration.id, {
129241
130135
  declaration,
@@ -129251,7 +130145,7 @@ var require_dist3 = __commonJS({
129251
130145
  async loadFromPath(addonId, modulePath, packageName, declaration, packageVersion = "0.0.0") {
129252
130146
  const modUnknown = await importAddonModuleFresh(modulePath);
129253
130147
  const mod = isRecord$2(modUnknown) ? modUnknown : {};
129254
- const AddonClass = require_manifest_python_deps.resolveAddonClass(mod);
130148
+ const AddonClass = require_manifest_system_deps.resolveAddonClass(mod);
129255
130149
  if (!AddonClass) throw new Error(`Module ${modulePath} has no default export`);
129256
130150
  this.addons.set(addonId, {
129257
130151
  module: mod,
@@ -130154,7 +131048,7 @@ var require_dist3 = __commonJS({
130154
131048
  await node_fs.promises.writeFile(node_path.join(targetDir, "package.json"), JSON.stringify(stripBundledDeps(pkgData), null, 2));
130155
131049
  await copyDirRecursive(distDir, node_path.join(targetDir, "dist"));
130156
131050
  await copyExtraFileDirs(pkgData, sourceDir, targetDir);
130157
- require_manifest_python_deps.copyBundledNativeModules(sourceDir, targetDir, this.logger);
131051
+ require_manifest_system_deps.copyBundledNativeModules(sourceDir, targetDir, this.logger);
130158
131052
  await node_fs.promises.writeFile(node_path.join(targetDir, ".install-source"), "local");
130159
131053
  const localPkgVersion = require_dist10.asString(pkgData.version, "0.0.0");
130160
131054
  this.manifest.upsert(packageName, {
@@ -130163,7 +131057,7 @@ var require_dist3 = __commonJS({
130163
131057
  });
130164
131058
  const strippedDeps = stripBundledDeps(pkgData);
130165
131059
  if (strippedDeps["dependencies"] && typeof strippedDeps["dependencies"] === "object" && Object.keys(strippedDeps["dependencies"]).length > 0) try {
130166
- await require_manifest_python_deps.runNpm([
131060
+ await require_manifest_system_deps.runNpm([
130167
131061
  "install",
130168
131062
  "--omit=dev",
130169
131063
  "--ignore-scripts=false"
@@ -130172,7 +131066,7 @@ var require_dist3 = __commonJS({
130172
131066
  this.logger.warn(`${packageName} \u2014 npm install failed (continuing)`, { meta: { error: require_dist10.errMsg(err) } });
130173
131067
  }
130174
131068
  try {
130175
- await require_manifest_python_deps.installManifestNativeDeps(targetDir, pkgData, this.logger, this.registry, this.npmCacheDir);
131069
+ await require_manifest_system_deps.installManifestNativeDeps(targetDir, pkgData, this.logger, this.registry, this.npmCacheDir);
130176
131070
  } catch (err) {
130177
131071
  this.logger.warn(`${packageName} \u2014 native deps install failed (continuing)`, { meta: { error: require_dist10.errMsg(err) } });
130178
131072
  }
@@ -130208,7 +131102,7 @@ var require_dist3 = __commonJS({
130208
131102
  tmpDir
130209
131103
  ];
130210
131104
  if (this.registry) args.push("--registry", this.registry);
130211
- const { stdout } = await require_manifest_python_deps.runNpm(args, this.npmRunOptions(tmpDir, 12e4));
131105
+ const { stdout } = await require_manifest_system_deps.runNpm(args, this.npmRunOptions(tmpDir, 12e4));
130212
131106
  const tgzFiles = node_fs.readdirSync(tmpDir).filter((f) => f.endsWith(".tgz"));
130213
131107
  if (tgzFiles.length === 0) throw new Error(`npm pack produced no tgz. stdout: ${stdout.trim()}`);
130214
131108
  return node_path.join(tmpDir, tgzFiles[0]);
@@ -130412,7 +131306,7 @@ var require_dist3 = __commonJS({
130412
131306
  dependencies: depNames
130413
131307
  } });
130414
131308
  try {
130415
- await require_manifest_python_deps.runNpm([
131309
+ await require_manifest_system_deps.runNpm([
130416
131310
  "install",
130417
131311
  "--omit=dev",
130418
131312
  "--omit=peer",
@@ -130472,7 +131366,7 @@ var require_dist3 = __commonJS({
130472
131366
  return;
130473
131367
  }
130474
131368
  try {
130475
- await require_manifest_python_deps.installManifestNativeDeps(pkgDir, pkgView.raw, this.logger, this.registry, this.npmCacheDir);
131369
+ await require_manifest_system_deps.installManifestNativeDeps(pkgDir, pkgView.raw, this.logger, this.registry, this.npmCacheDir);
130476
131370
  } catch (nativeErr) {
130477
131371
  this.logger.error(`${packageName} \u2014 native dependency install FAILED; install ABORTED (a swapped-in copy would fail every load at the binding)`, { meta: {
130478
131372
  pkgDir,
@@ -131016,7 +131910,7 @@ var require_dist3 = __commonJS({
131016
131910
  if (!(!node_fs.existsSync(distDir) || this.isDistIncomplete(pkgData, sourceDir))) return;
131017
131911
  this.logger.info(`${packageName} \u2014 building (dist/ missing or incomplete)`);
131018
131912
  try {
131019
- await require_manifest_python_deps.runNpm(["run", "build"], this.npmRunOptions(sourceDir, 18e4));
131913
+ await require_manifest_system_deps.runNpm(["run", "build"], this.npmRunOptions(sourceDir, 18e4));
131020
131914
  } catch (err) {
131021
131915
  const msg = require_dist10.errMsg(err);
131022
131916
  this.logger.warn(`${packageName} auto-build failed`, { meta: { error: msg } });
@@ -135428,20 +136322,63 @@ var require_dist3 = __commonJS({
135428
136322
  if (this.settingsStore === null) return;
135429
136323
  this.settingsStore.clearDeviceRuntimeState(deviceId);
135430
136324
  }
136325
+ /**
136326
+ * The addon's `ctx.settings`.
136327
+ *
136328
+ * The backend is chosen on EVERY call, never frozen when the view is built.
136329
+ * That is not a nicety: `settings-store` is owned by `storage-orchestrator`,
136330
+ * so the door is wired by `registerProvider` STRICTLY AFTER that addon's
136331
+ * context — and therefore its settings view — already exists. A view bound at
136332
+ * construction handed the door's own owner the sync-store backend, whose
136333
+ * writes throw for the whole life of the process once `sqlite-settings` runs
136334
+ * isolated (D181: no sync `ISettingsStore` reaches hub-main, only the async
136335
+ * door). Reads were worse than the writes: they answered `{}` in silence.
136336
+ * That is what made `storageMigration.start` fail on its first durable write
136337
+ * while every other addon's persistence worked. See D294.
136338
+ */
135431
136339
  createSettingsView(addonId) {
135432
- if (this.settingsStore === null && this.settingsDoor !== null) {
136340
+ const storeBacked = this.createStoreSettingsView(addonId);
136341
+ let doorBacked = null;
136342
+ let doorBackedSource = null;
136343
+ const active = () => {
136344
+ if (this.settingsStore !== null) return storeBacked;
135433
136345
  const door = this.settingsDoor;
135434
- return createDoorSettingsView(addonId, door, {
135435
- getSection: (section) => this.getSection(section),
135436
- setSection: async (section, patch) => {
135437
- for (const [key, value] of Object.entries(patch)) await door.set({
135438
- collection: "system-settings",
135439
- key: `${section}.${key}`,
135440
- value
135441
- });
135442
- }
135443
- });
135444
- }
136346
+ if (door === null) return storeBacked;
136347
+ if (doorBacked === null || doorBackedSource !== door) {
136348
+ doorBackedSource = door;
136349
+ doorBacked = this.createDoorBackedSettingsView(addonId, door);
136350
+ }
136351
+ return doorBacked;
136352
+ };
136353
+ return {
136354
+ readAddonStore: () => active().readAddonStore(),
136355
+ writeAddonStore: (patch) => active().writeAddonStore(patch),
136356
+ readDeviceStore: (deviceId) => active().readDeviceStore(deviceId),
136357
+ readDeviceStoreBatch: (deviceIds) => active().readDeviceStoreBatch(deviceIds),
136358
+ writeDeviceStore: (deviceId, patch) => active().writeDeviceStore(deviceId, patch),
136359
+ clearDeviceStore: (deviceId) => active().clearDeviceStore(deviceId),
136360
+ getSection: (section) => active().getSection(section),
136361
+ setSection: (section, patch) => active().setSection(section, patch),
136362
+ readDeviceRuntimeState: (deviceId) => active().readDeviceRuntimeState(deviceId),
136363
+ writeDeviceRuntimeState: (deviceId, data) => active().writeDeviceRuntimeState(deviceId, data),
136364
+ clearDeviceRuntimeState: (deviceId) => active().clearDeviceRuntimeState(deviceId)
136365
+ };
136366
+ }
136367
+ /** The async-door backend of {@link createSettingsView}. */
136368
+ createDoorBackedSettingsView(addonId, door) {
136369
+ return createDoorSettingsView(addonId, door, {
136370
+ getSection: (section) => this.getSection(section),
136371
+ setSection: async (section, patch) => {
136372
+ for (const [key, value] of Object.entries(patch)) await door.set({
136373
+ collection: "system-settings",
136374
+ key: `${section}.${key}`,
136375
+ value
136376
+ });
136377
+ }
136378
+ });
136379
+ }
136380
+ /** The sync-`ISettingsStore` backend of {@link createSettingsView}. */
136381
+ createStoreSettingsView(addonId) {
135445
136382
  const cm = this;
135446
136383
  return {
135447
136384
  async readAddonStore() {
@@ -135457,6 +136394,15 @@ var require_dist3 = __commonJS({
135457
136394
  async readDeviceStore(deviceId) {
135458
136395
  return cm.getAddonDevice(addonId, String(deviceId));
135459
136396
  },
136397
+ async readDeviceStoreBatch(deviceIds) {
136398
+ const out = /* @__PURE__ */ new Map();
136399
+ for (const deviceId of deviceIds) try {
136400
+ out.set(deviceId, cm.getAddonDevice(addonId, String(deviceId)));
136401
+ } catch {
136402
+ out.set(deviceId, {});
136403
+ }
136404
+ return out;
136405
+ },
135460
136406
  async writeDeviceStore(deviceId, patch) {
135461
136407
  const key = String(deviceId);
135462
136408
  const existing = cm.getAddonDevice(addonId, key);
@@ -205566,7 +206512,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
205566
206512
  function createCoreCapService(options) {
205567
206513
  const actions = {};
205568
206514
  for (const { actionName, invoke } of options.actions) actions[actionName] = { handler: async (ctx) => {
205569
- const raw = require_manifest_python_deps.deserializeTypedArrays(ctx.params);
206515
+ const raw = require_manifest_system_deps.deserializeTypedArrays(ctx.params);
205570
206516
  return invoke(raw !== null && typeof raw === "object" && Object.keys(raw).length === 0 ? void 0 : raw, readOrigin(ctx));
205571
206517
  } };
205572
206518
  return {
@@ -206347,7 +207293,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
206347
207293
  }
206348
207294
  function emitRunnerEvent(category, sourceId, data) {
206349
207295
  if (!capturedBroker) return;
206350
- require_manifest_python_deps.getBrokerEventBus(capturedBroker).emit(require_dist10.createEvent(category, {
207296
+ require_manifest_system_deps.getBrokerEventBus(capturedBroker).emit(require_dist10.createEvent(category, {
206351
207297
  type: "core",
206352
207298
  id: sourceId,
206353
207299
  nodeId: parentNodeId
@@ -206371,8 +207317,8 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
206371
207317
  ...applyRunnerNativeAllocator(process.env),
206372
207318
  ...env
206373
207319
  };
206374
- if (rssBudgetMb === void 0) delete childEnv[require_manifest_python_deps.RUNNER_RSS_BUDGET_ENV];
206375
- else childEnv[require_manifest_python_deps.RUNNER_RSS_BUDGET_ENV] = String(rssBudgetMb);
207320
+ if (rssBudgetMb === void 0) delete childEnv[require_manifest_system_deps.RUNNER_RSS_BUDGET_ENV];
207321
+ else childEnv[require_manifest_system_deps.RUNNER_RSS_BUDGET_ENV] = String(rssBudgetMb);
206376
207322
  const heapFlags = runnerHeapFlags(addons);
206377
207323
  capturedBroker?.logger.info(`[${runnerId}] heap profile: ${heavy ? "heavy" : "light"} flags=[${heapFlags.join(" ")}] arenas=${childEnv["MALLOC_ARENA_MAX"] ?? "glibc-default"} vips=${childEnv["VIPS_CONCURRENCY"] ?? "sharp-default"}`);
206378
207324
  const child = spawnFn(process.execPath, [...heapFlags, runnerPath], {
@@ -207105,12 +208051,12 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207105
208051
  return finalJob;
207106
208052
  }
207107
208053
  };
207108
- exports.AGENT_CAP_FWD_ACTION = require_manifest_python_deps.AGENT_CAP_FWD_ACTION;
207109
- exports.AGENT_CAP_FWD_SERVICE = require_manifest_python_deps.AGENT_CAP_FWD_SERVICE;
208054
+ exports.AGENT_CAP_FWD_ACTION = require_manifest_system_deps.AGENT_CAP_FWD_ACTION;
208055
+ exports.AGENT_CAP_FWD_SERVICE = require_manifest_system_deps.AGENT_CAP_FWD_SERVICE;
207110
208056
  exports.AGENT_READINESS_SERVICE_NAME = AGENT_READINESS_SERVICE_NAME;
207111
208057
  exports.ALL_CAPABILITY_DEFINITIONS = require_dist10.ALL_CAPABILITY_DEFINITIONS;
207112
208058
  exports.AddonApiFactory = AddonApiFactory;
207113
- exports.AddonDepsManager = require_manifest_python_deps.AddonDepsManager;
208059
+ exports.AddonDepsManager = require_manifest_system_deps.AddonDepsManager;
207114
208060
  exports.AddonEngineManager = AddonEngineManager;
207115
208061
  exports.AddonHealthMonitor = AddonHealthMonitor;
207116
208062
  exports.AddonInstaller = AddonInstaller;
@@ -207125,19 +208071,19 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207125
208071
  exports.CLUSTER_SECRET_MISMATCH_TYPE = CLUSTER_SECRET_MISMATCH_TYPE;
207126
208072
  exports.CLUSTER_SECRET_REJECTED_EXIT_CODE = CLUSTER_SECRET_REJECTED_EXIT_CODE;
207127
208073
  exports.CORE_CAP_SERVICE_NAME = CORE_CAP_SERVICE_NAME;
207128
- exports.CapRouteError = require_manifest_python_deps.CapRouteError;
207129
- exports.CapRouteResolver = require_manifest_python_deps.CapRouteResolver;
207130
- exports.CapUsageRegistry = require_manifest_python_deps.CapUsageRegistry;
207131
- exports.CapabilityHandle = require_manifest_python_deps.CapabilityHandle;
208074
+ exports.CapRouteError = require_manifest_system_deps.CapRouteError;
208075
+ exports.CapRouteResolver = require_manifest_system_deps.CapRouteResolver;
208076
+ exports.CapUsageRegistry = require_manifest_system_deps.CapUsageRegistry;
208077
+ exports.CapabilityHandle = require_manifest_system_deps.CapabilityHandle;
207132
208078
  exports.CapabilityRegistry = CapabilityRegistry;
207133
- exports.CapabilityUnavailableError = require_manifest_python_deps.CapabilityUnavailableError;
208079
+ exports.CapabilityUnavailableError = require_manifest_system_deps.CapabilityUnavailableError;
207134
208080
  exports.ConfigManager = ConfigManager;
207135
208081
  exports.ConfigStore = require_builtins_sqlite_storage_index.ConfigStore$1;
207136
208082
  exports.ConsoleDestination = require_builtins_console_logging_index.ConsoleDestination$1;
207137
208083
  exports.ConsoleLoggingAddon = require_builtins_console_logging_index.ConsoleLoggingAddon$1;
207138
208084
  exports.CoreBlocksAddon = require_builtins_core_blocks_core_blocks_addon.CoreBlocksAddon;
207139
208085
  exports.CustomActionRegistry = require_custom_action_registry.CustomActionRegistry;
207140
- exports.DECISIVE_HEAP_SPACES = require_manifest_python_deps.DECISIVE_HEAP_SPACES;
208086
+ exports.DECISIVE_HEAP_SPACES = require_manifest_system_deps.DECISIVE_HEAP_SPACES;
207141
208087
  exports.DEFAULT_DATA_PATH = DEFAULT_DATA_PATH;
207142
208088
  exports.DEFAULT_LAN_HTTP_PORT = require_tls$1.DEFAULT_LAN_HTTP_PORT;
207143
208089
  exports.DEFAULT_LOG_LEVEL = DEFAULT_LOG_LEVEL;
@@ -207145,33 +208091,33 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207145
208091
  exports.DEVICE_STATUS_METHOD = require_dist10.DEVICE_STATUS_METHOD;
207146
208092
  exports.DataPlaneRegistry = DataPlaneRegistry;
207147
208093
  exports.DeviceManagerAddon = require_builtins_device_manager_device_manager_addon.DeviceManagerAddon;
207148
- exports.DeviceRegistry = require_manifest_python_deps.DeviceRegistry;
208094
+ exports.DeviceRegistry = require_manifest_system_deps.DeviceRegistry;
207149
208095
  exports.DeviceStore = require_builtins_sqlite_storage_index.DeviceStore$1;
207150
- exports.EMPTY_SOCKET_DIRECTION = require_manifest_python_deps.EMPTY_SOCKET_DIRECTION;
207151
- exports.EMPTY_SOCKET_PLANE_BASELINE = require_manifest_python_deps.EMPTY_SOCKET_PLANE_BASELINE;
207152
- exports.EVENT_PLANE_TOP_N = require_manifest_python_deps.EVENT_PLANE_TOP_N;
207153
- exports.EVENT_TOPIC_PREFIX = require_manifest_python_deps.EVENT_TOPIC_PREFIX;
208096
+ exports.EMPTY_SOCKET_DIRECTION = require_manifest_system_deps.EMPTY_SOCKET_DIRECTION;
208097
+ exports.EMPTY_SOCKET_PLANE_BASELINE = require_manifest_system_deps.EMPTY_SOCKET_PLANE_BASELINE;
208098
+ exports.EVENT_PLANE_TOP_N = require_manifest_system_deps.EVENT_PLANE_TOP_N;
208099
+ exports.EVENT_TOPIC_PREFIX = require_manifest_system_deps.EVENT_TOPIC_PREFIX;
207154
208100
  exports.EngineManagerResolver = EngineManagerResolver;
207155
208101
  exports.EventBus = EventBus;
207156
208102
  exports.FeatureManager = FeatureManager;
207157
208103
  exports.FilesystemStorageAddon = require_builtins_sqlite_storage_filesystem_storage_addon.FilesystemStorageAddon;
207158
208104
  exports.FilesystemStorageProvider = require_builtins_sqlite_storage_filesystem_storage_addon.FilesystemStorageProvider;
207159
- exports.FrameDecoder = require_manifest_python_deps.FrameDecoder;
208105
+ exports.FrameDecoder = require_manifest_system_deps.FrameDecoder;
207160
208106
  exports.FsStorageBackend = FsStorageBackend;
207161
208107
  exports.HEALTH_MONITOR_GRACE_PERIOD_MS = HEALTH_MONITOR_GRACE_PERIOD_MS;
207162
208108
  exports.HEALTH_MONITOR_RETRY_INTERVALS_MS = HEALTH_MONITOR_RETRY_INTERVALS_MS;
207163
208109
  exports.HEALTH_MONITOR_TICK_MS = HEALTH_MONITOR_TICK_MS;
207164
- exports.HEAP_RECLAIM_MIN_INTERVAL_MS = require_manifest_python_deps.HEAP_RECLAIM_MIN_INTERVAL_MS;
207165
- exports.HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS = require_manifest_python_deps.HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS;
207166
- exports.HEAP_RECLAIM_TRIGGER_MB = require_manifest_python_deps.HEAP_RECLAIM_TRIGGER_MB;
207167
- exports.HEAP_SPACE_REPORT_MIN_MB = require_manifest_python_deps.HEAP_SPACE_REPORT_MIN_MB;
207168
- exports.HEAP_WATCH_INTERVAL_MS = require_manifest_python_deps.HEAP_WATCH_INTERVAL_MS;
207169
- exports.HEAP_WATCH_WARN_RATIO = require_manifest_python_deps.HEAP_WATCH_WARN_RATIO;
207170
- exports.HUB_CAP_FWD_ACTION = require_manifest_python_deps.HUB_CAP_FWD_ACTION;
207171
- exports.HUB_CAP_FWD_SERVICE = require_manifest_python_deps.HUB_CAP_FWD_SERVICE;
207172
- exports.HUB_MAIN_HEAP_WATCH_LABEL = require_manifest_python_deps.HUB_MAIN_HEAP_WATCH_LABEL;
207173
- exports.HUB_MAIN_RSS_BUDGET_MB = require_manifest_python_deps.HUB_MAIN_RSS_BUDGET_MB;
207174
- exports.HUB_RSS_BUDGET_ENV = require_manifest_python_deps.HUB_RSS_BUDGET_ENV;
208110
+ exports.HEAP_RECLAIM_MIN_INTERVAL_MS = require_manifest_system_deps.HEAP_RECLAIM_MIN_INTERVAL_MS;
208111
+ exports.HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS = require_manifest_system_deps.HEAP_RECLAIM_STEADY_STATE_INTERVAL_MS;
208112
+ exports.HEAP_RECLAIM_TRIGGER_MB = require_manifest_system_deps.HEAP_RECLAIM_TRIGGER_MB;
208113
+ exports.HEAP_SPACE_REPORT_MIN_MB = require_manifest_system_deps.HEAP_SPACE_REPORT_MIN_MB;
208114
+ exports.HEAP_WATCH_INTERVAL_MS = require_manifest_system_deps.HEAP_WATCH_INTERVAL_MS;
208115
+ exports.HEAP_WATCH_WARN_RATIO = require_manifest_system_deps.HEAP_WATCH_WARN_RATIO;
208116
+ exports.HUB_CAP_FWD_ACTION = require_manifest_system_deps.HUB_CAP_FWD_ACTION;
208117
+ exports.HUB_CAP_FWD_SERVICE = require_manifest_system_deps.HUB_CAP_FWD_SERVICE;
208118
+ exports.HUB_MAIN_HEAP_WATCH_LABEL = require_manifest_system_deps.HUB_MAIN_HEAP_WATCH_LABEL;
208119
+ exports.HUB_MAIN_RSS_BUDGET_MB = require_manifest_system_deps.HUB_MAIN_RSS_BUDGET_MB;
208120
+ exports.HUB_RSS_BUDGET_ENV = require_manifest_system_deps.HUB_RSS_BUDGET_ENV;
207175
208121
  exports.HubForwarderAddon = require_builtins_hub_forwarder_index.HubForwarderAddon$1;
207176
208122
  exports.HubForwarderDestination = require_builtins_hub_forwarder_index.HubForwarderDestination$1;
207177
208123
  exports.HubLogForwarder = HubLogForwarder;
@@ -207184,8 +208130,8 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207184
208130
  exports.LifecycleStateMachine = LifecycleStateMachine;
207185
208131
  exports.LivenessMonitorAddon = require_builtins_liveness_monitor_liveness_monitor_addon.LivenessMonitorAddon;
207186
208132
  exports.LocalAuthAddon = require_builtins_local_auth_local_auth_addon.LocalAuthAddon;
207187
- exports.LocalChildClient = require_manifest_python_deps.LocalChildClient;
207188
- exports.LocalChildRegistry = require_manifest_python_deps.LocalChildRegistry;
208133
+ exports.LocalChildClient = require_manifest_system_deps.LocalChildClient;
208134
+ exports.LocalChildRegistry = require_manifest_system_deps.LocalChildRegistry;
207189
208135
  exports.LogManager = LogManager;
207190
208136
  exports.LogRingBuffer = LogRingBuffer;
207191
208137
  exports.LoggingGate = LoggingGate;
@@ -207194,7 +208140,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207194
208140
  exports.MAX_LEAF_VALIDITY_DAYS = require_tls$1.MAX_LEAF_VALIDITY_DAYS;
207195
208141
  exports.METHOD_ACCESS_MAP = require_dist10.METHOD_ACCESS_MAP;
207196
208142
  exports.ModelDownloadService = require_file_data_plane.ModelDownloadService;
207197
- exports.NATIVE_PROVIDER_SERVICE_INFIX = require_manifest_python_deps.NATIVE_PROVIDER_SERVICE_INFIX;
208143
+ exports.NATIVE_PROVIDER_SERVICE_INFIX = require_manifest_system_deps.NATIVE_PROVIDER_SERVICE_INFIX;
207198
208144
  exports.NATIVE_SCAN_DEPTH = NATIVE_SCAN_DEPTH;
207199
208145
  exports.NativeMetricsAddon = require_builtins_native_metrics_native_metrics_addon.default;
207200
208146
  exports.NativeMetricsProvider = require_builtins_native_metrics_native_metrics_addon.NativeMetricsProvider;
@@ -207211,21 +208157,21 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207211
208157
  exports.PythonEnvManager = PythonEnvManager;
207212
208158
  exports.QUARANTINE_DIRNAME = QUARANTINE_DIRNAME;
207213
208159
  exports.RESTART_MARKER_FILE = RESTART_MARKER_FILE;
207214
- exports.RSS_BUDGET_REANNOUNCE_MIN_MS = require_manifest_python_deps.RSS_BUDGET_REANNOUNCE_MIN_MS;
207215
- exports.RSS_BUDGET_RELEASE_RATIO = require_manifest_python_deps.RSS_BUDGET_RELEASE_RATIO;
207216
- exports.RUNNER_HEAP_SNAPSHOT_ENV = require_manifest_python_deps.RUNNER_HEAP_SNAPSHOT_ENV;
207217
- exports.RUNNER_HEAP_WATCH_INTERVAL_MS = require_manifest_python_deps.RUNNER_HEAP_WATCH_INTERVAL_MS;
207218
- exports.RUNNER_RSS_BUDGET_ENV = require_manifest_python_deps.RUNNER_RSS_BUDGET_ENV;
208160
+ exports.RSS_BUDGET_REANNOUNCE_MIN_MS = require_manifest_system_deps.RSS_BUDGET_REANNOUNCE_MIN_MS;
208161
+ exports.RSS_BUDGET_RELEASE_RATIO = require_manifest_system_deps.RSS_BUDGET_RELEASE_RATIO;
208162
+ exports.RUNNER_HEAP_SNAPSHOT_ENV = require_manifest_system_deps.RUNNER_HEAP_SNAPSHOT_ENV;
208163
+ exports.RUNNER_HEAP_WATCH_INTERVAL_MS = require_manifest_system_deps.RUNNER_HEAP_WATCH_INTERVAL_MS;
208164
+ exports.RUNNER_RSS_BUDGET_ENV = require_manifest_system_deps.RUNNER_RSS_BUDGET_ENV;
207219
208165
  exports.RUNTIME_DEFAULTS = require_dist10.RUNTIME_DEFAULTS;
207220
208166
  exports.ReadinessRegistry = require_dist10.ReadinessRegistry;
207221
208167
  exports.ReadinessTimeoutError = require_dist10.ReadinessTimeoutError;
207222
208168
  exports.ReplEngine = ReplEngine;
207223
208169
  exports.RingBuffer = RingBuffer;
207224
208170
  exports.SERVER_AUTH_OID = require_tls$1.SERVER_AUTH_OID;
207225
- exports.SOCKET_PLANE_TOP_N = require_manifest_python_deps.SOCKET_PLANE_TOP_N;
208171
+ exports.SOCKET_PLANE_TOP_N = require_manifest_system_deps.SOCKET_PLANE_TOP_N;
207226
208172
  exports.ScopedLogger = ScopedLogger;
207227
208173
  exports.ScopedTokenManager = require_builtins_local_auth_local_auth_addon.ScopedTokenManager;
207228
- exports.SocketChannel = require_manifest_python_deps.SocketChannel;
208174
+ exports.SocketChannel = require_manifest_system_deps.SocketChannel;
207229
208175
  exports.SqliteSettingsAddon = require_builtins_sqlite_storage_sqlite_settings_addon.SqliteSettingsAddon;
207230
208176
  exports.SqliteSettingsBackend = require_builtins_sqlite_storage_sqlite_settings_addon.SqliteSettingsBackend;
207231
208177
  exports.StagingArea = StagingArea;
@@ -207237,23 +208183,23 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207237
208183
  exports.SystemEventBus = SystemEventBus;
207238
208184
  exports.TRADITIONAL_NATIVE_PACKAGES = TRADITIONAL_NATIVE_PACKAGES;
207239
208185
  exports.ToastService = ToastService;
207240
- exports.UDS_NO_ROUTE_PREFIX = require_manifest_python_deps.UDS_NO_ROUTE_PREFIX;
207241
- exports.UdsLocalTransportClient = require_manifest_python_deps.UdsLocalTransportClient;
207242
- exports.UdsLocalTransportServer = require_manifest_python_deps.UdsLocalTransportServer;
208186
+ exports.UDS_NO_ROUTE_PREFIX = require_manifest_system_deps.UDS_NO_ROUTE_PREFIX;
208187
+ exports.UdsLocalTransportClient = require_manifest_system_deps.UdsLocalTransportClient;
208188
+ exports.UdsLocalTransportServer = require_manifest_system_deps.UdsLocalTransportServer;
207243
208189
  exports.UserManager = require_builtins_local_auth_local_auth_addon.UserManager;
207244
208190
  exports.WinstonDestination = require_builtins_winston_logging_index.WinstonDestination$1;
207245
208191
  exports.WinstonLoggingAddon = require_builtins_winston_logging_index.WinstonLoggingAddon$1;
207246
- exports.ZERO_LOOP_DELAY = require_manifest_python_deps.ZERO_LOOP_DELAY;
207247
- exports.__resetCapUsageRegistryForTests = require_manifest_python_deps.__resetCapUsageRegistryForTests;
208192
+ exports.ZERO_LOOP_DELAY = require_manifest_system_deps.ZERO_LOOP_DELAY;
208193
+ exports.__resetCapUsageRegistryForTests = require_manifest_system_deps.__resetCapUsageRegistryForTests;
207248
208194
  exports.__resetLoggingGateForTests = __resetLoggingGateForTests;
207249
- exports.adaptBrokerToCluster = require_manifest_python_deps.adaptBrokerToCluster;
208195
+ exports.adaptBrokerToCluster = require_manifest_system_deps.adaptBrokerToCluster;
207250
208196
  exports.addonSettingsCapability = require_dist10.addonSettingsCapability;
207251
208197
  exports.allFamiliesListenHost = require_tls$1.allFamiliesListenHost;
207252
208198
  exports.applyLanHttp = require_tls$1.applyLanHttp;
207253
208199
  exports.bindPendingLanHttp = require_tls$1.bindPendingLanHttp;
207254
208200
  exports.bootstrapSchema = bootstrapSchema;
207255
- exports.brokerCallForCap = require_manifest_python_deps.brokerCallForCap;
207256
- exports.brokerTransportLink = require_manifest_python_deps.brokerTransportLink;
208201
+ exports.brokerCallForCap = require_manifest_system_deps.brokerCallForCap;
208202
+ exports.brokerTransportLink = require_manifest_system_deps.brokerTransportLink;
207257
208203
  Object.defineProperty(exports, "buildBinaryPath", {
207258
208204
  enumerable: true,
207259
208205
  get: function() {
@@ -207261,70 +208207,70 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207261
208207
  }
207262
208208
  });
207263
208209
  exports.buildCapRouters = buildCapRouters;
207264
- exports.buildHeapSample = require_manifest_python_deps.buildHeapSample;
207265
- exports.buildLinkChain = require_manifest_python_deps.buildLinkChain;
207266
- exports.buildNativeCapProxy = require_manifest_python_deps.buildNativeCapProxy;
208210
+ exports.buildHeapSample = require_manifest_system_deps.buildHeapSample;
208211
+ exports.buildLinkChain = require_manifest_system_deps.buildLinkChain;
208212
+ exports.buildNativeCapProxy = require_manifest_system_deps.buildNativeCapProxy;
207267
208213
  exports.buildNodeManifest = buildNodeManifest;
207268
208214
  exports.buildStorageLocationRegistry = require_builtins_storage_orchestrator_storage_orchestrator_addon.buildStorageLocationRegistry;
207269
- exports.buildUdsNativeCapProxy = require_manifest_python_deps.buildUdsNativeCapProxy;
208215
+ exports.buildUdsNativeCapProxy = require_manifest_system_deps.buildUdsNativeCapProxy;
207270
208216
  exports.builderMountedCapNames = builderMountedCapNames;
207271
208217
  exports.callRegisterNodeWithRetry = callRegisterNodeWithRetry;
207272
- exports.callWithServiceDiscovery = require_manifest_python_deps.callWithServiceDiscovery;
208218
+ exports.callWithServiceDiscovery = require_manifest_system_deps.callWithServiceDiscovery;
207273
208219
  exports.canServeDataPlane = canServeDataPlane;
207274
- exports.capActionName = require_manifest_python_deps.capActionName;
207275
- exports.capActionSuffix = require_manifest_python_deps.capActionSuffix;
207276
- exports.capBareAction = require_manifest_python_deps.capBareAction;
207277
- exports.capServiceName = require_manifest_python_deps.capServiceName;
208220
+ exports.capActionName = require_manifest_system_deps.capActionName;
208221
+ exports.capActionSuffix = require_manifest_system_deps.capActionSuffix;
208222
+ exports.capBareAction = require_manifest_system_deps.capBareAction;
208223
+ exports.capServiceName = require_manifest_system_deps.capServiceName;
207278
208224
  exports.classifyAddonDir = classifyAddonDir;
207279
- exports.classifyCapRoute = require_manifest_python_deps.classifyCapRoute;
208225
+ exports.classifyCapRoute = require_manifest_system_deps.classifyCapRoute;
207280
208226
  exports.clearPendingRestart = clearPendingRestart;
207281
208227
  exports.closeLanHttp = require_tls$1.closeLanHttp;
207282
- exports.clusterEventTopic = require_manifest_python_deps.clusterEventTopic;
208228
+ exports.clusterEventTopic = require_manifest_system_deps.clusterEventTopic;
207283
208229
  exports.clusterSecretMatches = clusterSecretMatches;
207284
208230
  exports.collectCertIdentity = require_tls$1.collectCertIdentity;
207285
208231
  exports.collectModelFiles = require_file_data_plane.collectModelFiles;
207286
208232
  exports.contentTypeFor = require_file_data_plane.contentTypeFor;
207287
208233
  exports.copyDirRecursive = copyDirRecursive;
207288
208234
  exports.copyExtraFileDirs = copyExtraFileDirs;
207289
- exports.createAddonContext = require_manifest_python_deps.createAddonContext;
207290
- exports.createAddonDataPlaneFacility = require_manifest_python_deps.createAddonDataPlaneFacility;
207291
- exports.createAddonService = require_manifest_python_deps.createAddonService;
208235
+ exports.createAddonContext = require_manifest_system_deps.createAddonContext;
208236
+ exports.createAddonDataPlaneFacility = require_manifest_system_deps.createAddonDataPlaneFacility;
208237
+ exports.createAddonService = require_manifest_system_deps.createAddonService;
207292
208238
  exports.createAuthenticatedFileServer = require_file_data_plane.createAuthenticatedFileServer;
207293
208239
  exports.createBroker = createBroker2;
207294
- exports.createBrokerDeviceManagerApi = require_manifest_python_deps.createBrokerDeviceManagerApi;
208240
+ exports.createBrokerDeviceManagerApi = require_manifest_system_deps.createBrokerDeviceManagerApi;
207295
208241
  exports.createCoreCapService = createCoreCapService;
207296
- exports.createDeferredHeapWatchSink = require_manifest_python_deps.createDeferredHeapWatchSink;
208242
+ exports.createDeferredHeapWatchSink = require_manifest_system_deps.createDeferredHeapWatchSink;
207297
208243
  exports.createDoorSettingsView = createDoorSettingsView;
207298
- exports.createEventPlaneMeter = require_manifest_python_deps.createEventPlaneMeter;
207299
- exports.createEventPlaneReader = require_manifest_python_deps.createEventPlaneReader;
208244
+ exports.createEventPlaneMeter = require_manifest_system_deps.createEventPlaneMeter;
208245
+ exports.createEventPlaneReader = require_manifest_system_deps.createEventPlaneReader;
207300
208246
  exports.createFileDataPlaneHandler = require_file_data_plane.createFileDataPlaneHandler;
207301
- exports.createHubCapForwardService = require_manifest_python_deps.createHubCapForwardService;
208247
+ exports.createHubCapForwardService = require_manifest_system_deps.createHubCapForwardService;
207302
208248
  exports.createHubService = createHubService;
207303
- exports.createKernelHwAccel = require_manifest_python_deps.createKernelHwAccel;
207304
- exports.createLocalTransport = require_manifest_python_deps.createLocalTransport;
207305
- exports.createLoopDelayMeter = require_manifest_python_deps.createLoopDelayMeter;
207306
- exports.createParentUnownedCallHandler = require_manifest_python_deps.createParentUnownedCallHandler;
208249
+ exports.createKernelHwAccel = require_manifest_system_deps.createKernelHwAccel;
208250
+ exports.createLocalTransport = require_manifest_system_deps.createLocalTransport;
208251
+ exports.createLoopDelayMeter = require_manifest_system_deps.createLoopDelayMeter;
208252
+ exports.createParentUnownedCallHandler = require_manifest_system_deps.createParentUnownedCallHandler;
207307
208253
  exports.createProcessService = createProcessService;
207308
208254
  exports.createReadinessService = createReadinessService;
207309
208255
  exports.createReadinessServiceForRegistry = createReadinessServiceForRegistry;
207310
208256
  exports.createScopedProcessManager = createScopedProcessManager;
207311
- exports.createSocketDirectionCounters = require_manifest_python_deps.createSocketDirectionCounters;
207312
- exports.createSocketPlaneMeter = require_manifest_python_deps.createSocketPlaneMeter;
207313
- exports.createSocketPlaneReader = require_manifest_python_deps.createSocketPlaneReader;
208257
+ exports.createSocketDirectionCounters = require_manifest_system_deps.createSocketDirectionCounters;
208258
+ exports.createSocketPlaneMeter = require_manifest_system_deps.createSocketPlaneMeter;
208259
+ exports.createSocketPlaneReader = require_manifest_system_deps.createSocketPlaneReader;
207314
208260
  exports.createStreamProbeBrokerService = createStreamProbeBrokerService;
207315
- exports.createUdsAddonContext = require_manifest_python_deps.createUdsAddonContext;
207316
- exports.createUdsEventBridge = require_manifest_python_deps.createUdsEventBridge;
207317
- exports.createUdsEventBus = require_manifest_python_deps.createUdsEventBus;
207318
- exports.createUdsLogger = require_manifest_python_deps.createUdsLogger;
207319
- exports.createUdsLoggerWithControl = require_manifest_python_deps.createUdsLoggerWithControl;
207320
- exports.createV8Reclaimer = require_manifest_python_deps.createV8Reclaimer;
208261
+ exports.createUdsAddonContext = require_manifest_system_deps.createUdsAddonContext;
208262
+ exports.createUdsEventBridge = require_manifest_system_deps.createUdsEventBridge;
208263
+ exports.createUdsEventBus = require_manifest_system_deps.createUdsEventBus;
208264
+ exports.createUdsLogger = require_manifest_system_deps.createUdsLogger;
208265
+ exports.createUdsLoggerWithControl = require_manifest_system_deps.createUdsLoggerWithControl;
208266
+ exports.createV8Reclaimer = require_manifest_system_deps.createV8Reclaimer;
207321
208267
  exports.deleteModelFromDisk = require_file_data_plane.deleteModelFromDisk;
207322
208268
  exports.deriveAgentListenPort = deriveAgentListenPort;
207323
208269
  exports.describeProviderKindDrift = describeProviderKindDrift;
207324
- exports.describeRss = require_manifest_python_deps.describeRss;
208270
+ exports.describeRss = require_manifest_system_deps.describeRss;
207325
208271
  exports.detectWorkspacePackagesDir = detectWorkspacePackagesDir;
207326
- exports.diffEventPlane = require_manifest_python_deps.diffEventPlane;
207327
- exports.diffSocketPlane = require_manifest_python_deps.diffSocketPlane;
208272
+ exports.diffEventPlane = require_manifest_system_deps.diffEventPlane;
208273
+ exports.diffSocketPlane = require_manifest_system_deps.diffSocketPlane;
207328
208274
  Object.defineProperty(exports, "downloadBinary", {
207329
208275
  enumerable: true,
207330
208276
  get: function() {
@@ -207334,8 +208280,8 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207334
208280
  exports.downloadFile = require_file_data_plane.downloadFile;
207335
208281
  exports.downloadModel = require_file_data_plane.downloadModel;
207336
208282
  exports.emitDownForOwnedCaps = require_dist10.emitDownForOwnedCaps;
207337
- exports.emitHeapDiagnosticReport = require_manifest_python_deps.emitHeapDiagnosticReport;
207338
- exports.encodeFrame = require_manifest_python_deps.encodeFrame;
208283
+ exports.emitHeapDiagnosticReport = require_manifest_system_deps.emitHeapDiagnosticReport;
208284
+ exports.encodeFrame = require_manifest_system_deps.encodeFrame;
207339
208285
  exports.ensureAddonNativePrebuilds = ensureAddonNativePrebuilds;
207340
208286
  Object.defineProperty(exports, "ensureBinary", {
207341
208287
  enumerable: true,
@@ -207369,12 +208315,12 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207369
208315
  return _camstack_types_node.findInPath;
207370
208316
  }
207371
208317
  });
207372
- exports.formatEventPlane = require_manifest_python_deps.formatEventPlane;
207373
- exports.formatHeapSpaces = require_manifest_python_deps.formatHeapSpaces;
208318
+ exports.formatEventPlane = require_manifest_system_deps.formatEventPlane;
208319
+ exports.formatHeapSpaces = require_manifest_system_deps.formatHeapSpaces;
207374
208320
  exports.formatLogLine = require_formatter.formatLogLine;
207375
- exports.formatSocketPlane = require_manifest_python_deps.formatSocketPlane;
207376
- exports.getBrokerEventBus = require_manifest_python_deps.getBrokerEventBus;
207377
- exports.getCapUsageRegistry = require_manifest_python_deps.getCapUsageRegistry;
208321
+ exports.formatSocketPlane = require_manifest_system_deps.formatSocketPlane;
208322
+ exports.getBrokerEventBus = require_manifest_system_deps.getBrokerEventBus;
208323
+ exports.getCapUsageRegistry = require_manifest_system_deps.getCapUsageRegistry;
207378
208324
  Object.defineProperty(exports, "getFfmpegDownloadUrl", {
207379
208325
  enumerable: true,
207380
208326
  get: function() {
@@ -207383,9 +208329,9 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207383
208329
  });
207384
208330
  exports.getLoggingGate = getLoggingGate;
207385
208331
  exports.getModelFilePath = require_file_data_plane.getModelFilePath;
207386
- exports.getMoleculerEventStats = require_manifest_python_deps.getMoleculerEventStats;
207387
- exports.getOrInitReadinessRegistry = require_manifest_python_deps.getOrInitReadinessRegistry;
207388
- exports.getOrInitReadinessRegistryForClient = require_manifest_python_deps.getOrInitReadinessRegistryForClient;
208332
+ exports.getMoleculerEventStats = require_manifest_system_deps.getMoleculerEventStats;
208333
+ exports.getOrInitReadinessRegistry = require_manifest_system_deps.getOrInitReadinessRegistry;
208334
+ exports.getOrInitReadinessRegistryForClient = require_manifest_system_deps.getOrInitReadinessRegistryForClient;
207389
208335
  exports.getPidStats = require_resource_monitor.getPidStats;
207390
208336
  Object.defineProperty(exports, "getPlatformInfo", {
207391
208337
  enumerable: true,
@@ -207401,14 +208347,15 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207401
208347
  });
207402
208348
  exports.getRestartMarkerPath = getRestartMarkerPath;
207403
208349
  exports.getSinglePidStats = require_resource_monitor.getSinglePidStats;
207404
- exports.getWorkerDeviceRegistry = require_manifest_python_deps.getWorkerDeviceRegistry;
208350
+ exports.getWorkerDeviceRegistry = require_manifest_system_deps.getWorkerDeviceRegistry;
207405
208351
  exports.hasDotNode = hasDotNode;
207406
208352
  exports.hashClusterSecret = hashClusterSecret;
207407
- exports.heapSnapshotAuthorised = require_manifest_python_deps.heapSnapshotAuthorised;
207408
- exports.heapSpaceField = require_manifest_python_deps.heapSpaceField;
207409
- exports.hubMainRssBudget = require_manifest_python_deps.hubMainRssBudget;
207410
- exports.installManifestNativeDeps = require_manifest_python_deps.installManifestNativeDeps;
207411
- exports.installManifestPythonDeps = require_manifest_python_deps.installManifestPythonDeps;
208353
+ exports.heapSnapshotAuthorised = require_manifest_system_deps.heapSnapshotAuthorised;
208354
+ exports.heapSpaceField = require_manifest_system_deps.heapSpaceField;
208355
+ exports.hubMainRssBudget = require_manifest_system_deps.hubMainRssBudget;
208356
+ exports.installManifestNativeDeps = require_manifest_system_deps.installManifestNativeDeps;
208357
+ exports.installManifestPythonDeps = require_manifest_system_deps.installManifestPythonDeps;
208358
+ exports.installManifestSystemDeps = require_manifest_system_deps.installManifestSystemDeps;
207412
208359
  exports.installPackageFromNpm = installPackageFromNpm;
207413
208360
  Object.defineProperty(exports, "installPythonPackages", {
207414
208361
  enumerable: true,
@@ -207422,7 +208369,7 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207422
208369
  return _camstack_types_node.installPythonRequirements;
207423
208370
  }
207424
208371
  });
207425
- exports.ipcParentLink = require_manifest_python_deps.ipcParentLink;
208372
+ exports.ipcParentLink = require_manifest_system_deps.ipcParentLink;
207426
208373
  exports.isAddonDeploySource = isAddonDeploySource;
207427
208374
  exports.isArrayOutputSchema = require_dist10.isArrayOutputSchema;
207428
208375
  exports.isClusterSecretMismatchError = isClusterSecretMismatchError;
@@ -207432,55 +208379,55 @@ globstar while`, t, d, e, f, m), this.matchOne(t.slice(d), e.slice(f), s)) retur
207432
208379
  exports.isSourceNewer = isSourceNewer;
207433
208380
  exports.isolatedBuiltinPhase = isolatedBuiltinPhase;
207434
208381
  exports.loadTlsCert = require_tls$1.loadTlsCert;
207435
- exports.localEndpointPath = require_manifest_python_deps.localEndpointPath;
207436
- exports.localProviderLink = require_manifest_python_deps.localProviderLink;
207437
- exports.mountNativeCapService = require_manifest_python_deps.mountNativeCapService;
207438
- exports.nextRssBudgetState = require_manifest_python_deps.nextRssBudgetState;
207439
- exports.parseCapAction = require_manifest_python_deps.parseCapAction;
208382
+ exports.localEndpointPath = require_manifest_system_deps.localEndpointPath;
208383
+ exports.localProviderLink = require_manifest_system_deps.localProviderLink;
208384
+ exports.mountNativeCapService = require_manifest_system_deps.mountNativeCapService;
208385
+ exports.nextRssBudgetState = require_manifest_system_deps.nextRssBudgetState;
208386
+ exports.parseCapAction = require_manifest_system_deps.parseCapAction;
207440
208387
  exports.parseRangeHeader = require_file_data_plane.parseRangeHeader;
207441
- exports.parseRssBudgetMb = require_manifest_python_deps.parseRssBudgetMb;
208388
+ exports.parseRssBudgetMb = require_manifest_system_deps.parseRssBudgetMb;
207442
208389
  exports.parseTokenizedUrl = require_file_data_plane.parseTokenizedUrl;
207443
208390
  exports.partitionIsolatedBuiltinIds = partitionIsolatedBuiltinIds;
207444
208391
  exports.proxyToUpstream = proxyToUpstream;
207445
208392
  exports.quarantineAddonResidue = quarantineAddonResidue;
207446
208393
  exports.readExtraSans = require_tls$1.readExtraSans;
207447
- exports.readHeapSpaces = require_manifest_python_deps.readHeapSpaces;
208394
+ exports.readHeapSpaces = require_manifest_system_deps.readHeapSpaces;
207448
208395
  exports.readLanHttpState = require_tls$1.readLanHttpState;
207449
- exports.readMoleculerFanoutMode = require_manifest_python_deps.readMoleculerFanoutMode;
208396
+ exports.readMoleculerFanoutMode = require_manifest_system_deps.readMoleculerFanoutMode;
207450
208397
  exports.readPendingRestart = readPendingRestart;
207451
208398
  exports.readTlsAccessStatus = require_tls$1.readTlsAccessStatus;
207452
208399
  exports.readTlsMode = require_tls$1.readTlsMode;
207453
208400
  exports.readinessKey = require_dist10.readinessKey;
207454
- exports.reclaimIntervalMs = require_manifest_python_deps.reclaimIntervalMs;
207455
- exports.recordSocketFrame = require_manifest_python_deps.recordSocketFrame;
207456
- exports.registerEventBusService = require_manifest_python_deps.registerEventBusService;
208401
+ exports.reclaimIntervalMs = require_manifest_system_deps.reclaimIntervalMs;
208402
+ exports.recordSocketFrame = require_manifest_system_deps.recordSocketFrame;
208403
+ exports.registerEventBusService = require_manifest_system_deps.registerEventBusService;
207457
208404
  exports.registerLanHttpHandler = require_tls$1.registerLanHttpHandler;
207458
208405
  exports.reissueTlsLeaf = require_tls$1.reissueTlsLeaf;
207459
208406
  exports.resolveFilePath = require_file_data_plane.resolveFilePath;
207460
- exports.resolveHwAccel = require_manifest_python_deps.resolveHwAccel;
207461
- exports.resolveNpmInvocation = require_manifest_python_deps.resolveNpmInvocation;
208407
+ exports.resolveHwAccel = require_manifest_system_deps.resolveHwAccel;
208408
+ exports.resolveNpmInvocation = require_manifest_system_deps.resolveNpmInvocation;
207462
208409
  exports.runHubAddonBoot = runHubAddonBoot;
207463
- exports.runNpm = require_manifest_python_deps.runNpm;
207464
- exports.sampleSocketDirection = require_manifest_python_deps.sampleSocketDirection;
208410
+ exports.runNpm = require_manifest_system_deps.runNpm;
208411
+ exports.sampleSocketDirection = require_manifest_system_deps.sampleSocketDirection;
207465
208412
  exports.scheduleSelfRestart = scheduleSelfRestart;
207466
208413
  exports.scopeKey = require_dist10.scopeKey;
207467
208414
  exports.scopesAllowAddon = require_dist10.scopesAllowAddon;
207468
208415
  exports.scopesAllowDeviceCap = require_dist10.scopesAllowDeviceCap;
207469
208416
  exports.selectAddonResidue = selectAddonResidue;
207470
- exports.selectReportedSpaces = require_manifest_python_deps.selectReportedSpaces;
207471
- exports.serializeTypedArrays = require_manifest_python_deps.serializeTypedArrays;
207472
- exports.setHubConnected = require_manifest_python_deps.setHubConnected;
207473
- exports.setNodeEventInterest = require_manifest_python_deps.setNodeEventInterest;
207474
- exports.shouldReclaim = require_manifest_python_deps.shouldReclaim;
207475
- exports.socketDirectionBytes = require_manifest_python_deps.socketDirectionBytes;
207476
- exports.socketDirectionMessages = require_manifest_python_deps.socketDirectionMessages;
207477
- exports.startHeapWatch = require_manifest_python_deps.startHeapWatch;
207478
- exports.startRunnerHeapWatch = require_manifest_python_deps.startRunnerHeapWatch;
207479
- exports.strandedMb = require_manifest_python_deps.strandedMb;
208417
+ exports.selectReportedSpaces = require_manifest_system_deps.selectReportedSpaces;
208418
+ exports.serializeTypedArrays = require_manifest_system_deps.serializeTypedArrays;
208419
+ exports.setHubConnected = require_manifest_system_deps.setHubConnected;
208420
+ exports.setNodeEventInterest = require_manifest_system_deps.setNodeEventInterest;
208421
+ exports.shouldReclaim = require_manifest_system_deps.shouldReclaim;
208422
+ exports.socketDirectionBytes = require_manifest_system_deps.socketDirectionBytes;
208423
+ exports.socketDirectionMessages = require_manifest_system_deps.socketDirectionMessages;
208424
+ exports.startHeapWatch = require_manifest_system_deps.startHeapWatch;
208425
+ exports.startRunnerHeapWatch = require_manifest_system_deps.startRunnerHeapWatch;
208426
+ exports.strandedMb = require_manifest_system_deps.strandedMb;
207480
208427
  exports.stripCamstackDeps = stripCamstackDeps;
207481
- exports.subscribePassthrough = require_manifest_python_deps.subscribePassthrough;
207482
- exports.udsChildLogToWorkerEntry = require_manifest_python_deps.udsChildLogToWorkerEntry;
207483
- exports.validateProviderRegistrations = require_manifest_python_deps.validateProviderRegistrations;
208428
+ exports.subscribePassthrough = require_manifest_system_deps.subscribePassthrough;
208429
+ exports.udsChildLogToWorkerEntry = require_manifest_system_deps.udsChildLogToWorkerEntry;
208430
+ exports.validateProviderRegistrations = require_manifest_system_deps.validateProviderRegistrations;
207484
208431
  exports.validateUploadedTls = require_tls$1.validateUploadedTls;
207485
208432
  exports.waitUntilReady = waitUntilReady;
207486
208433
  exports.writeExtraSans = require_tls$1.writeExtraSans;
@@ -207515,7 +208462,7 @@ var require_dist4 = __commonJS({
207515
208462
  "use strict";
207516
208463
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
207517
208464
  var require_event_category = require_event_category_BaEgqJNv();
207518
- var require_sleep = require_sleep_CJrvRDlD();
208465
+ var require_sleep = require_sleep_CWWLTM6W();
207519
208466
  var require_canonical_hash = require_canonical_hash_DNV8S5ET();
207520
208467
  var require_enums2 = require_enums();
207521
208468
  var require_err_msg = require_err_msg_COpsHMw2();
@@ -208225,6 +209172,48 @@ var require_dist4 = __commonJS({
208225
209172
  unreadable
208226
209173
  };
208227
209174
  }
209175
+ var REDACTED_SECRET = "__camstack_redacted__";
209176
+ function isSecretConfigField(field) {
209177
+ if (field.type === "password") return true;
209178
+ return "secret" in field && field.secret === true;
209179
+ }
209180
+ function collectSecretConfigKeys(schema) {
209181
+ const keys = /* @__PURE__ */ new Set();
209182
+ for (const section of sectionsOf(schema)) for (const field of fieldsOf(section)) walkField(field, keys);
209183
+ return keys;
209184
+ }
209185
+ function schemaDeclaresAnyField(schema) {
209186
+ for (const section of sectionsOf(schema)) if (fieldsOf(section).length > 0) return true;
209187
+ return false;
209188
+ }
209189
+ function isRecord$2(value) {
209190
+ return typeof value === "object" && value !== null && !Array.isArray(value);
209191
+ }
209192
+ function sectionsOf(schema) {
209193
+ if (!isRecord$2(schema)) return [];
209194
+ const sections = schema["sections"];
209195
+ return Array.isArray(sections) ? sections : [];
209196
+ }
209197
+ function fieldsOf(node) {
209198
+ if (!isRecord$2(node)) return [];
209199
+ const fields = node["fields"];
209200
+ return Array.isArray(fields) ? fields : [];
209201
+ }
209202
+ function walkField(field, out) {
209203
+ if (!isRecord$2(field)) return;
209204
+ const type = field["type"];
209205
+ const key = field["key"];
209206
+ if ((type === "password" || field["secret"] === true) && typeof key === "string" && key.length > 0) out.add(key);
209207
+ if (type === "group") {
209208
+ for (const child of fieldsOf(field)) walkField(child, out);
209209
+ return;
209210
+ }
209211
+ if (type === "sub-tabs") {
209212
+ const tabs = field["tabs"];
209213
+ if (!Array.isArray(tabs)) return;
209214
+ for (const tab of tabs) for (const child of fieldsOf(tab)) walkField(child, out);
209215
+ }
209216
+ }
208228
209217
  var STREAM_QUALITY_LABELS = {
208229
209218
  high: "High",
208230
209219
  mid: "Mid",
@@ -208893,13 +209882,29 @@ var require_dist4 = __commonJS({
208893
209882
  "recorder",
208894
209883
  "analytics"
208895
209884
  ]);
209885
+ var StorageMigrationMoveProgressSchema = zod.z.object({
209886
+ filesMoved: zod.z.number().int().nonnegative(),
209887
+ /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
209888
+ filesTotal: zod.z.number().int().nonnegative().nullable(),
209889
+ bytesMoved: zod.z.number().int().nonnegative(),
209890
+ /** The MOVER's start, not the migration's: a drain restarted after an addon
209891
+ * crash gets a new mover, and a rate computed from the migration's start
209892
+ * would silently average in the time nothing was running. */
209893
+ startedAt: zod.z.number(),
209894
+ /** When the coordinator last read these numbers. Paired with `startedAt` it
209895
+ * is the only honest rate: both clocks are the hub's, so a UI never has to
209896
+ * subtract its own. */
209897
+ observedAt: zod.z.number()
209898
+ });
208896
209899
  var StorageMigrationMoveSchema = zod.z.object({
208897
209900
  storageClass: StorageMigrationClassSchema,
208898
209901
  fromLocationId: zod.z.string(),
208899
209902
  toLocationId: zod.z.string(),
208900
209903
  moverJobId: zod.z.string().nullable(),
208901
209904
  state: RelocateJobStateSchema.nullable(),
208902
- error: zod.z.string().nullable()
209905
+ error: zod.z.string().nullable(),
209906
+ /** Last observed mover counters; `null` until the mover has been polled once. */
209907
+ progress: StorageMigrationMoveProgressSchema.nullable()
208903
209908
  });
208904
209909
  var StorageMigrationJobSchema = zod.z.object({
208905
209910
  jobId: zod.z.string(),
@@ -208945,6 +209950,52 @@ var require_dist4 = __commonJS({
208945
209950
  })),
208946
209951
  findings: zod.z.array(StorageMigrationFindingSchema)
208947
209952
  });
209953
+ var StorageMigrationLaneSchema = zod.z.enum(["footage", "media"]);
209954
+ var StorageMigrationMoverSchema = zod.z.object({
209955
+ lane: StorageMigrationLaneSchema,
209956
+ job: RelocateJobSchema,
209957
+ /** The coordinator job that armed this mover, or `null` for a mover armed
209958
+ * directly against the owning addon. */
209959
+ migrationJobId: zod.z.string().nullable(),
209960
+ /** When the hub read these counters. Stamped here so a rate is `bytesMoved`
209961
+ * over (`observedAt` − `job.startedAt`) with BOTH ends on the hub's clock —
209962
+ * a browser subtracting its own `Date.now()` from a server `startedAt` is a
209963
+ * rate made of two different clocks. */
209964
+ observedAt: zod.z.number()
209965
+ });
209966
+ var StorageMigrationResidueSchema = zod.z.object({
209967
+ storageClass: StorageMigrationClassSchema,
209968
+ /** The location still holding the data. `'*'` for the media lane, whose rows
209969
+ * move from wherever they are rather than from one named source. */
209970
+ fromLocationId: zod.z.string(),
209971
+ /** Where a drain would move it — the class's CURRENT default. */
209972
+ toLocationId: zod.z.string(),
209973
+ /** Segments (footage lane) or rows (media lane) still on the source. */
209974
+ items: zod.z.number().int().nonnegative().nullable(),
209975
+ /** Bytes on the source; `null` when the lane counts rows rather than bytes. */
209976
+ bytes: zod.z.number().int().nonnegative().nullable()
209977
+ });
209978
+ var StorageMigrationDrainInputSchema = zod.z.object({
209979
+ /** The classes to drain. Each must appear in `storageMigration.residue`, so
209980
+ * a class whose source is already empty is refused rather than started. */
209981
+ classes: zod.z.array(StorageMigrationClassSchema).min(1),
209982
+ throttleMbps: zod.z.number().min(1).max(1e3).optional()
209983
+ });
209984
+ var RelocateResidueInputSchema = zod.z.object({
209985
+ fromLocationId: zod.z.string().min(1),
209986
+ /** Narrow to one logical class; omit for every profile on the location. */
209987
+ footageClass: RelocateFootageClassSchema.optional()
209988
+ });
209989
+ var RelocateResidueSchema = zod.z.object({
209990
+ segments: zod.z.number().int().nonnegative(),
209991
+ bytes: zod.z.number().int().nonnegative()
209992
+ }).nullable();
209993
+ var RelocatableMediaCountSchema = zod.z.object({ rows: zod.z.number().int().nonnegative() }).nullable();
209994
+ var RelocatableMediaCountInputSchema = zod.z.object({
209995
+ toLocationId: zod.z.string().min(1),
209996
+ /** Omitted = `move`. */
209997
+ mode: MediaRelocateModeSchema.optional()
209998
+ });
208948
209999
  var SUB_DETECTION_TYPES = ["face", "plate"];
208949
210000
  var RECOGNITION_TYPES = [
208950
210001
  "face",
@@ -208995,6 +210046,8 @@ var require_dist4 = __commonJS({
208995
210046
  updatedAt: zod.z.number()
208996
210047
  });
208997
210048
  var StorageLocationRefSchema = zod.z.union([StorageLocationTypeSchema, zod.z.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
210049
+ var StorageAccessSchema = zod.z.enum(["local-path", "cap-mediated"]);
210050
+ var STORAGE_ACCESS_FALLBACK = "local-path";
208998
210051
  var StorageLocationDeclarationSchema = zod.z.object({
208999
210052
  /**
209000
210053
  * Global location identifier, e.g. `recordings` or `recordingsLow`.
@@ -209014,6 +210067,19 @@ var require_dist4 = __commonJS({
209014
210067
  */
209015
210068
  cardinality: zod.z.enum(["single", "multi"]),
209016
210069
  /**
210070
+ * HOW the declaring service reaches the bytes — and therefore WHICH
210071
+ * providers may back a location of this kind. See {@link StorageAccessSchema}
210072
+ * and {@link STORAGE_ACCESS_FALLBACK}.
210073
+ *
210074
+ * Absent means `'local-path'`. That default is FAIL-CLOSED on purpose: it
210075
+ * can only over-restrict (refuse a remote provider for a kind that might
210076
+ * have coped) and never under-restrict. Declaring `'cap-mediated'` is the
210077
+ * permissive direction and is therefore never inferred — a repo guard
210078
+ * (`scripts/check-storage-access-declarations.ts`) refuses to let it be
210079
+ * reached by omission.
210080
+ */
210081
+ access: StorageAccessSchema.optional(),
210082
+ /**
209017
210083
  * When set, the default instance for this location inherits its resolved
209018
210084
  * root from the named location's default instance. Useful for derivative
209019
210085
  * slots (e.g. `recordingsLow` → `recordings`) so operators only need to
@@ -220946,8 +222012,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
220946
222012
  lastSeen: zod.z.number(),
220947
222013
  /** Frame-rate position history (subject to maxPositionHistory cap). */
220948
222014
  positions: zod.z.array(TrackPositionSchema).readonly(),
220949
- /** Periodic snapshots at snapshotIntervalMs cadence (subject to
220950
- * saveThumbnails policy). */
222015
+ /** Periodic snapshots at snapshotIntervalMs cadence DEBUG media, produced
222016
+ * only while `MediaSettings.debugMediaEnabled` is on for the camera (D299;
222017
+ * the retired `saveThumbnails` used to gate this and the rolling
222018
+ * `lastFrame` together). Empty is the healthy default, not a capture gap. */
220951
222019
  snapshots: zod.z.array(TrackSnapshotSchema).readonly(),
220952
222020
  /** Deduplicated zones the track has entered at least once. Zone IDS. */
220953
222021
  zonesVisited: zod.z.array(zod.z.string()).readonly(),
@@ -221930,6 +222998,21 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
221930
222998
  * it to zero.
221931
222999
  */
221932
223000
  countUnstampedEventMedia: require_sleep.method(zod.z.object({}), UnstampedEventMediaCountSchema, { auth: "admin" }),
223001
+ /**
223002
+ * How many rows a pass would STILL act on against `toLocationId`.
223003
+ *
223004
+ * One derivation, two consumers: it is the media lane's denominator (the
223005
+ * **M** the footage lane gets from the ledger census — D295) and it is the
223006
+ * residue behind "drain remaining". Deriving them separately is how "N of M"
223007
+ * ends up comparing two different populations.
223008
+ *
223009
+ * `null` means the count could not be taken; it is never zero-filled,
223010
+ * because a zero here reads as "nothing left to move".
223011
+ */
223012
+ countRelocatableMedia: require_sleep.method(RelocatableMediaCountInputSchema, RelocatableMediaCountSchema, {
223013
+ kind: "query",
223014
+ auth: "admin"
223015
+ }),
221933
223016
  /** Every relocate job this addon knows about, newest first (in RAM: the
221934
223017
  * move is resumable, so a lost list costs nothing but the display). */
221935
223018
  listRelocateMediaJobs: require_sleep.method(zod.z.object({}), zod.z.array(RelocateJobSchema).readonly(), {
@@ -224634,6 +225717,35 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
224634
225717
  cancel: require_sleep.method(zod.z.object({ jobId: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
224635
225718
  kind: "mutation",
224636
225719
  auth: "admin"
225720
+ }),
225721
+ /**
225722
+ * Every mover running RIGHT NOW, in both lanes, with its counters.
225723
+ *
225724
+ * `status` covers a migration's own moves — the coordinator folds their
225725
+ * progress onto the durable job record it is already polling. This covers
225726
+ * the other case, and it is not hypothetical: a drain armed straight against
225727
+ * `recording.relocateFootage` (the only path that existed before
225728
+ * {@link drain}) has no job to fold into and would otherwise be invisible.
225729
+ */
225730
+ movers: require_sleep.method(zod.z.object({}), zod.z.array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }),
225731
+ /**
225732
+ * What each class's SOURCE still holds, from the archive — never from the
225733
+ * resident index (D295). Only classes with something left (or something
225734
+ * unknown) are listed, so an empty list means there is nothing to drain and
225735
+ * the UI has no honest button to offer.
225736
+ */
225737
+ residue: require_sleep.method(zod.z.object({}), zod.z.array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }),
225738
+ /**
225739
+ * Run the drain half alone, on a class whose default has ALREADY moved.
225740
+ *
225741
+ * It never repoints anything, which is what lets `start` keep refusing a
225742
+ * destination that is already the default: the two verbs cannot be confused
225743
+ * for one another, and no operator can re-repoint a migrated class through
225744
+ * this door.
225745
+ */
225746
+ drain: require_sleep.method(StorageMigrationDrainInputSchema, zod.z.object({ jobId: zod.z.string() }), {
225747
+ kind: "mutation",
225748
+ auth: "admin"
224637
225749
  })
224638
225750
  }
224639
225751
  };
@@ -225143,7 +226255,20 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225143
226255
  */
225144
226256
  scanned: zod.z.number(),
225145
226257
  /** True when the backend could not consider every row that passed the filter. */
225146
- truncated: zod.z.boolean()
226258
+ truncated: zod.z.boolean(),
226259
+ /**
226260
+ * The `topK` the backend actually ran with.
226261
+ *
226262
+ * Every backend has a ceiling — sqlite-vec's is 4,096 — and a caller asking
226263
+ * past it used to learn nothing but a boolean, from a WARN in the provider's
226264
+ * own log rather than in its answer. That is how an audit asking for 20,000
226265
+ * consumed 4,096 and reported `examined: 4096` as if it had walked the index,
226266
+ * for weeks. `truncated` says THAT the answer was short; this says BY HOW
226267
+ * MUCH, in the return value, where the caller cannot fail to see it.
226268
+ *
226269
+ * Equals the requested `topK` whenever nothing was lowered.
226270
+ */
226271
+ effectiveTopK: zod.z.number().int().positive()
225147
226272
  });
225148
226273
  var VectorDeleteInputSchema = zod.z.object({
225149
226274
  index: zod.z.string(),
@@ -225162,6 +226287,35 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225162
226287
  id: zod.z.string(),
225163
226288
  metadata: VectorMetadataSchema
225164
226289
  })) });
226290
+ var VectorFetchInputSchema = zod.z.object({
226291
+ index: zod.z.string(),
226292
+ ids: zod.z.array(zod.z.string())
226293
+ });
226294
+ var VectorFetchResultSchema = zod.z.object({ items: zod.z.array(zod.z.object({
226295
+ id: zod.z.string(),
226296
+ /** base64 Float32LE — the same wire form `upsert` accepts. */
226297
+ vector: zod.z.string(),
226298
+ metadata: VectorMetadataSchema
226299
+ })) });
226300
+ var VectorScanInputSchema = zod.z.object({
226301
+ index: zod.z.string(),
226302
+ /** Opaque resume point. `0` starts at the top; pass back `nextCursor`. */
226303
+ cursor: zod.z.number().int().nonnegative().default(0),
226304
+ limit: zod.z.number().int().positive()
226305
+ });
226306
+ var VectorScanResultSchema = zod.z.object({
226307
+ items: zod.z.array(zod.z.object({
226308
+ id: zod.z.string(),
226309
+ metadata: VectorMetadataSchema
226310
+ })),
226311
+ /**
226312
+ * Where the next page starts, or `null` when the walk reached the end.
226313
+ *
226314
+ * `null` is the ONLY end-of-index signal. A caller must not infer the end
226315
+ * from a short page: a backend is free to return fewer rows than asked.
226316
+ */
226317
+ nextCursor: zod.z.number().int().nonnegative().nullable()
226318
+ });
225165
226319
  var VectorStatsInputSchema = zod.z.object({ index: zod.z.string() });
225166
226320
  var VectorStatsResultSchema = zod.z.object({
225167
226321
  /** Provider id, so an operator can tell brute force from an ANN index. */
@@ -225192,6 +226346,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
225192
226346
  query: require_sleep.method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }),
225193
226347
  /** Metadata by id, no vectors — see {@link VectorGetResultSchema}. */
225194
226348
  getByIds: require_sleep.method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }),
226349
+ /** Metadata AND vectors, by named id — see {@link VectorFetchInputSchema}. */
226350
+ fetchByIds: require_sleep.method(VectorFetchInputSchema, VectorFetchResultSchema, { auth: "admin" }),
226351
+ /** One page of the whole index, unranked — see {@link VectorScanInputSchema}. */
226352
+ scan: require_sleep.method(VectorScanInputSchema, VectorScanResultSchema, { auth: "admin" }),
225195
226353
  deleteByIds: require_sleep.method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
225196
226354
  kind: "mutation",
225197
226355
  auth: "admin"
@@ -231662,6 +232820,20 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
231662
232820
  kind: "query",
231663
232821
  auth: "admin"
231664
232822
  }),
232823
+ /**
232824
+ * What a location STILL holds, asked of the durable hour ledger.
232825
+ *
232826
+ * The number behind "drain remaining": segments and bytes that would still
232827
+ * have to move off `fromLocationId`. It is a ledger aggregate — the archive
232828
+ * — because the resident index is not the archive (D295), and a drain sized
232829
+ * off the index is exactly what reported `done` over 80.3 GB on 2026-08-29.
232830
+ * `null` means the archive could not be asked (no ledger on this node, or
232831
+ * the aggregate failed) and is never conflated with an empty source.
232832
+ */
232833
+ getRelocateResidue: require_sleep.method(RelocateResidueInputSchema, RelocateResidueSchema, {
232834
+ kind: "query",
232835
+ auth: "admin"
232836
+ }),
231665
232837
  /** Cancel a running or queued relocate job. A queued job never runs. */
231666
232838
  cancelRelocateJob: require_sleep.method(zod.z.object({ jobId: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
231667
232839
  kind: "mutation",
@@ -240602,6 +241774,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
240602
241774
  addonId: null,
240603
241775
  access: "create"
240604
241776
  },
241777
+ "pipelineAnalytics.countRelocatableMedia": {
241778
+ capName: "pipeline-analytics",
241779
+ capScope: "device",
241780
+ addonId: null,
241781
+ access: "view"
241782
+ },
240605
241783
  "pipelineAnalytics.countUnstampedEventMedia": {
240606
241784
  capName: "pipeline-analytics",
240607
241785
  capScope: "device",
@@ -241766,6 +242944,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
241766
242944
  addonId: null,
241767
242945
  access: "view"
241768
242946
  },
242947
+ "recording.getRelocateResidue": {
242948
+ capName: "recording",
242949
+ capScope: "system",
242950
+ addonId: null,
242951
+ access: "view"
242952
+ },
241769
242953
  "recording.getStorageMigrationMoveStatus": {
241770
242954
  capName: "recording",
241771
242955
  capScope: "system",
@@ -242312,12 +243496,30 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
242312
243496
  addonId: null,
242313
243497
  access: "create"
242314
243498
  },
243499
+ "storageMigration.drain": {
243500
+ capName: "storage-migration",
243501
+ capScope: "system",
243502
+ addonId: null,
243503
+ access: "create"
243504
+ },
243505
+ "storageMigration.movers": {
243506
+ capName: "storage-migration",
243507
+ capScope: "system",
243508
+ addonId: null,
243509
+ access: "view"
243510
+ },
242315
243511
  "storageMigration.plan": {
242316
243512
  capName: "storage-migration",
242317
243513
  capScope: "system",
242318
243514
  addonId: null,
242319
243515
  access: "view"
242320
243516
  },
243517
+ "storageMigration.residue": {
243518
+ capName: "storage-migration",
243519
+ capScope: "system",
243520
+ addonId: null,
243521
+ access: "view"
243522
+ },
242321
243523
  "storageMigration.start": {
242322
243524
  capName: "storage-migration",
242323
243525
  capScope: "system",
@@ -243152,6 +244354,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
243152
244354
  addonId: null,
243153
244355
  access: "delete"
243154
244356
  },
244357
+ "vectorStore.fetchByIds": {
244358
+ capName: "vector-store",
244359
+ capScope: "system",
244360
+ addonId: null,
244361
+ access: "view"
244362
+ },
243155
244363
  "vectorStore.getByIds": {
243156
244364
  capName: "vector-store",
243157
244365
  capScope: "system",
@@ -243164,6 +244372,12 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
243164
244372
  addonId: null,
243165
244373
  access: "view"
243166
244374
  },
244375
+ "vectorStore.scan": {
244376
+ capName: "vector-store",
244377
+ capScope: "system",
244378
+ addonId: null,
244379
+ access: "view"
244380
+ },
243167
244381
  "vectorStore.stats": {
243168
244382
  capName: "vector-store",
243169
244383
  capScope: "system",
@@ -246338,6 +247552,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
246338
247552
  cancelStorageMigrationMove: (input) => dispatch("recording", "cancelStorageMigrationMove", "mutation", input),
246339
247553
  relocateFootage: (input) => dispatch("recording", "relocateFootage", "mutation", input),
246340
247554
  listRelocateJobs: (input) => dispatch("recording", "listRelocateJobs", "query", input),
247555
+ getRelocateResidue: (input) => dispatch("recording", "getRelocateResidue", "query", input),
246341
247556
  cancelRelocateJob: (input) => dispatch("recording", "cancelRelocateJob", "mutation", input),
246342
247557
  planStorageRebalance: (input) => dispatch("recording", "planStorageRebalance", "query", input),
246343
247558
  startStorageRebalance: (input) => dispatch("recording", "startStorageRebalance", "mutation", input)
@@ -246401,7 +247616,10 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
246401
247616
  plan: (input) => dispatch("storageMigration", "plan", "query", input),
246402
247617
  start: (input) => dispatch("storageMigration", "start", "mutation", input),
246403
247618
  status: (input) => dispatch("storageMigration", "status", "query", input),
246404
- cancel: (input) => dispatch("storageMigration", "cancel", "mutation", input)
247619
+ cancel: (input) => dispatch("storageMigration", "cancel", "mutation", input),
247620
+ movers: (input) => dispatch("storageMigration", "movers", "query", input),
247621
+ residue: (input) => dispatch("storageMigration", "residue", "query", input),
247622
+ drain: (input) => dispatch("storageMigration", "drain", "mutation", input)
246405
247623
  },
246406
247624
  streamBroker: {
246407
247625
  fetchEventMedia: (input) => dispatch("streamBroker", "fetchEventMedia", "mutation", input),
@@ -249855,6 +251073,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
249855
251073
  exports.REACHABILITY_PROBE_TIMEOUT_MS = REACHABILITY_PROBE_TIMEOUT_MS;
249856
251074
  exports.RECOGNITION_TYPES = RECOGNITION_TYPES;
249857
251075
  exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
251076
+ exports.REDACTED_SECRET = REDACTED_SECRET;
249858
251077
  exports.RESERVED_BINDING_NAMES = RESERVED_BINDING_NAMES;
249859
251078
  exports.RESTORED_CAP_NAMES = RESTORED_CAP_NAMES;
249860
251079
  exports.ROOT_BUCKET_KEY = ROOT_BUCKET_KEY;
@@ -249893,11 +251112,15 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
249893
251112
  exports.RecordingTriggersSchema = RecordingTriggersSchema;
249894
251113
  exports.RecordingWeekdaySchema = RecordingWeekdaySchema;
249895
251114
  exports.RedirectLoginMethodSchema = RedirectLoginMethodSchema;
251115
+ exports.RelocatableMediaCountInputSchema = RelocatableMediaCountInputSchema;
251116
+ exports.RelocatableMediaCountSchema = RelocatableMediaCountSchema;
249896
251117
  exports.RelocateFootageClassSchema = RelocateFootageClassSchema;
249897
251118
  exports.RelocateFootageInputSchema = RelocateFootageInputSchema;
249898
251119
  exports.RelocateJobSchema = RelocateJobSchema;
249899
251120
  exports.RelocateJobStateSchema = RelocateJobStateSchema;
249900
251121
  exports.RelocateMediaInputSchema = RelocateMediaInputSchema;
251122
+ exports.RelocateResidueInputSchema = RelocateResidueInputSchema;
251123
+ exports.RelocateResidueSchema = RelocateResidueSchema;
249901
251124
  exports.RenderedAsSchema = RenderedAsSchema;
249902
251125
  exports.ReportMotionInputSchema = ReportMotionInputSchema;
249903
251126
  exports.ReportedFailureContributionSchema = ReportedFailureContributionSchema;
@@ -249948,6 +251171,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
249948
251171
  exports.SOURCE_CAP_CHANGED_AT_FIELD = SOURCE_CAP_CHANGED_AT_FIELD;
249949
251172
  exports.SOURCE_DEVICE_TYPES = SOURCE_DEVICE_TYPES;
249950
251173
  exports.SOURCE_INFO_METADATA_KEY = SOURCE_INFO_METADATA_KEY;
251174
+ exports.STORAGE_ACCESS_FALLBACK = STORAGE_ACCESS_FALLBACK;
249951
251175
  exports.STREAM_PROFILE_META = STREAM_PROFILE_META;
249952
251176
  exports.STREAM_QUALITY_LABELS = STREAM_QUALITY_LABELS;
249953
251177
  exports.SUB_DETECTION_TYPES = SUB_DETECTION_TYPES;
@@ -249997,6 +251221,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
249997
251221
  exports.StartEmbeddedInputSchema = StartEmbeddedInputSchema;
249998
251222
  exports.StationaryObjectSchema = StationaryObjectSchema;
249999
251223
  exports.StorageAbortUploadInputSchema = AbortUploadInputSchema;
251224
+ exports.StorageAccessSchema = StorageAccessSchema;
250000
251225
  exports.StorageBeginDownloadInputSchema = BeginDownloadInputSchema;
250001
251226
  exports.StorageBeginDownloadResultSchema = BeginDownloadResultSchema;
250002
251227
  exports.StorageBeginUploadInputSchema = BeginUploadInputSchema;
@@ -250009,18 +251234,23 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
250009
251234
  exports.StorageLocationTypeSchema = StorageLocationTypeSchema;
250010
251235
  exports.StorageMigrationClassSchema = StorageMigrationClassSchema;
250011
251236
  exports.StorageMigrationDestinationsSchema = StorageMigrationDestinationsSchema;
251237
+ exports.StorageMigrationDrainInputSchema = StorageMigrationDrainInputSchema;
250012
251238
  exports.StorageMigrationFindingCodeSchema = StorageMigrationFindingCodeSchema;
250013
251239
  exports.StorageMigrationFindingSchema = StorageMigrationFindingSchema;
250014
251240
  exports.StorageMigrationFootageMoveInputSchema = StorageMigrationFootageMoveInputSchema;
250015
251241
  exports.StorageMigrationInputSchema = StorageMigrationInputSchema;
250016
251242
  exports.StorageMigrationJobSchema = StorageMigrationJobSchema;
251243
+ exports.StorageMigrationLaneSchema = StorageMigrationLaneSchema;
250017
251244
  exports.StorageMigrationLeaseInputSchema = StorageMigrationLeaseInputSchema;
250018
251245
  exports.StorageMigrationMediaMoveInputSchema = StorageMigrationMediaMoveInputSchema;
250019
251246
  exports.StorageMigrationModeSchema = StorageMigrationModeSchema;
251247
+ exports.StorageMigrationMoveProgressSchema = StorageMigrationMoveProgressSchema;
250020
251248
  exports.StorageMigrationMoveSchema = StorageMigrationMoveSchema;
251249
+ exports.StorageMigrationMoverSchema = StorageMigrationMoverSchema;
250021
251250
  exports.StorageMigrationParticipantSchema = StorageMigrationParticipantSchema;
250022
251251
  exports.StorageMigrationPhaseSchema = StorageMigrationPhaseSchema;
250023
251252
  exports.StorageMigrationPlanSchema = StorageMigrationPlanSchema;
251253
+ exports.StorageMigrationResidueSchema = StorageMigrationResidueSchema;
250024
251254
  exports.StorageProviderInfoSchema = ProviderInfoSchema;
250025
251255
  exports.StorageReadChunkInputSchema = ReadChunkInputSchema;
250026
251256
  exports.StorageTestLocationResultSchema = TestLocationResultSchema;
@@ -250214,6 +251444,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
250214
251444
  exports.clusterStepSettingKey = clusterStepSettingKey;
250215
251445
  exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
250216
251446
  exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
251447
+ exports.collectSecretConfigKeys = collectSecretConfigKeys;
250217
251448
  exports.colorCapability = colorCapability;
250218
251449
  exports.colorForKind = colorForKind;
250219
251450
  exports.commitWatchdogRestart = commitWatchdogRestart;
@@ -250354,6 +251585,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
250354
251585
  exports.isRestoredCap = isRestoredCap;
250355
251586
  exports.isSameAddonId = isSameAddonId;
250356
251587
  exports.isScheduleActive = isScheduleActive;
251588
+ exports.isSecretConfigField = isSecretConfigField;
250357
251589
  exports.isSoftwareDecode = require_canonical_hash.isSoftwareDecode;
250358
251590
  exports.isSourceCap = isSourceCap;
250359
251591
  exports.isSystemDelivery = isSystemDelivery;
@@ -250501,6 +251733,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
250501
251733
  exports.runtimeDevices = runtimeDevices;
250502
251734
  exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
250503
251735
  exports.sceneMonitorCapability = sceneMonitorCapability;
251736
+ exports.schemaDeclaresAnyField = schemaDeclaresAnyField;
250504
251737
  exports.scopeInherits = scopeInherits;
250505
251738
  exports.scopeKey = require_sleep.scopeKey;
250506
251739
  exports.scopesAllowAddon = scopesAllowAddon;