camstack 1.2.175 → 1.2.176

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.
@@ -14681,7 +14681,7 @@ function date4(params) {
14681
14681
  // ../../node_modules/zod/v4/classic/external.js
14682
14682
  config(en_default());
14683
14683
 
14684
- // ../types/dist/sleep-C-v96WpE.mjs
14684
+ // ../types/dist/sleep-gU6hqv4_.mjs
14685
14685
  var AUDIO_CHUNK_FORMATS = [
14686
14686
  "f32le",
14687
14687
  "pcmu",
@@ -16775,6 +16775,81 @@ var ArchivedDebugNoteQueryInputSchema = external_exports.object({
16775
16775
  /** Max rows returned, newest-first. */
16776
16776
  limit: external_exports.number().int().min(1).max(1e3).optional()
16777
16777
  });
16778
+ var TrackRelationKindSchema = external_exports.enum(["same-subject", "different-subjects"]);
16779
+ var TrackSideSchema = external_exports.enum(["before", "after"]);
16780
+ var TrackPurityValueSchema = external_exports.enum(["mixed", "not-a-subject"]);
16781
+ var TrackRelationSchema = external_exports.object({
16782
+ id: external_exports.string(),
16783
+ deviceId: external_exports.number().int(),
16784
+ leftTrackId: external_exports.string(),
16785
+ rightTrackId: external_exports.string(),
16786
+ leftSide: TrackSideSchema.nullable(),
16787
+ rightSide: TrackSideSchema.nullable(),
16788
+ relation: TrackRelationKindSchema,
16789
+ presence: external_exports.literal("continuous").nullable(),
16790
+ leftStartedAt: external_exports.number().int().nullable(),
16791
+ rightStartedAt: external_exports.number().int().nullable(),
16792
+ createdAt: external_exports.number().int(),
16793
+ updatedAt: external_exports.number().int(),
16794
+ author: external_exports.string().nullable()
16795
+ });
16796
+ var TrackPuritySchema = external_exports.object({
16797
+ id: external_exports.string(),
16798
+ deviceId: external_exports.number().int(),
16799
+ sourceTrackId: external_exports.string(),
16800
+ purity: TrackPurityValueSchema,
16801
+ switchAtMs: external_exports.number().int().nullable(),
16802
+ startedAt: external_exports.number().int().nullable(),
16803
+ createdAt: external_exports.number().int(),
16804
+ updatedAt: external_exports.number().int(),
16805
+ author: external_exports.string().nullable()
16806
+ });
16807
+ var SetTrackRelationInputSchema = external_exports.object({
16808
+ deviceId: external_exports.number().int(),
16809
+ trackId: external_exports.string().min(1),
16810
+ otherTrackId: external_exports.string().min(1),
16811
+ relation: TrackRelationKindSchema,
16812
+ presence: external_exports.literal("continuous").optional(),
16813
+ trackSide: TrackSideSchema.optional(),
16814
+ otherSide: TrackSideSchema.optional()
16815
+ });
16816
+ var ClearTrackRelationInputSchema = external_exports.object({
16817
+ deviceId: external_exports.number().int(),
16818
+ trackId: external_exports.string().min(1),
16819
+ otherTrackId: external_exports.string().min(1)
16820
+ });
16821
+ var ClearTrackRelationResultSchema = external_exports.object({ cleared: external_exports.boolean() });
16822
+ var SetTrackPurityInputSchema = external_exports.object({
16823
+ deviceId: external_exports.number().int(),
16824
+ trackId: external_exports.string().min(1),
16825
+ purity: external_exports.enum([
16826
+ "pure",
16827
+ "mixed",
16828
+ "not-a-subject"
16829
+ ]),
16830
+ switchAtMs: external_exports.number().int().optional()
16831
+ });
16832
+ var SetTrackPurityResultSchema = external_exports.object({ purity: TrackPuritySchema.nullable() });
16833
+ var ListTrackRelationsInputSchema = external_exports.object({
16834
+ deviceId: external_exports.number().int(),
16835
+ trackId: external_exports.string().optional(),
16836
+ since: external_exports.number().int().optional(),
16837
+ until: external_exports.number().int().optional(),
16838
+ limit: external_exports.number().int().min(1).max(5e3).optional()
16839
+ });
16840
+ var ListTrackRelationsResultSchema = external_exports.object({
16841
+ relations: external_exports.array(TrackRelationSchema).readonly(),
16842
+ purities: external_exports.array(TrackPuritySchema).readonly(),
16843
+ truncated: external_exports.boolean()
16844
+ });
16845
+ var TrackRelationRefusalSchema = external_exports.enum([
16846
+ "unknown-track",
16847
+ "cross-device",
16848
+ "self-relation",
16849
+ "contradiction",
16850
+ "switch-outside-track",
16851
+ "switch-needs-mixed"
16852
+ ]);
16778
16853
  var OpsLogDomainSchema = external_exports.enum(["recording", "events"]);
16779
16854
  var OpsLogOpSchema = external_exports.enum([
16780
16855
  "prune",
@@ -18757,6 +18832,63 @@ var authProviderCapability = {
18757
18832
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
18758
18833
  mount: { kind: "skip" }
18759
18834
  };
18835
+ var DATABASE_SNAPSHOT_TIMEOUT_MS = 30 * 6e4;
18836
+ var DatabaseSnapshotTargetsSchema = external_exports.object({ databases: external_exports.array(external_exports.object({ livePath: external_exports.string() })) });
18837
+ var DatabaseSnapshotTableSchema = external_exports.object({
18838
+ name: external_exports.string(),
18839
+ rows: external_exports.number().int().nonnegative()
18840
+ });
18841
+ var DatabaseSnapshotResultSchema = external_exports.object({
18842
+ /** The live database the snapshot copies. Never to be copied as a file. */
18843
+ livePath: external_exports.string(),
18844
+ /** The verified copy: `<livePath>` + {@link DATABASE_SNAPSHOT_SUFFIX}. */
18845
+ snapshotPath: external_exports.string(),
18846
+ sizeBytes: external_exports.number().int().nonnegative(),
18847
+ pageCount: external_exports.number().int().nonnegative(),
18848
+ pageSize: external_exports.number().int().positive(),
18849
+ /**
18850
+ * Every b-tree table with its row count. Read inside the SAME read
18851
+ * transaction the copy was taken from, and found EQUAL on the copy — so
18852
+ * this is the content of the snapshot, not an estimate of the source.
18853
+ */
18854
+ tables: external_exports.array(DatabaseSnapshotTableSchema),
18855
+ /** Wall time of the pinned copy (row counts included). */
18856
+ copyMs: external_exports.number().nonnegative(),
18857
+ /** Wall time of the checks on the copy (`integrity_check`, row counts). */
18858
+ verifyMs: external_exports.number().nonnegative(),
18859
+ /** When the pinned read transaction began (ms epoch) — the snapshot's instant. */
18860
+ takenAt: external_exports.number()
18861
+ });
18862
+ var ArchiveSqliteSnapshotSchema = DatabaseSnapshotResultSchema.extend({
18863
+ /** Archive-relative path of the live database the archive does NOT carry. */
18864
+ livePath: external_exports.string(),
18865
+ /** Archive-relative path of the verified copy it carries in its place. */
18866
+ snapshotPath: external_exports.string()
18867
+ });
18868
+ var databaseSnapshotCapability = {
18869
+ name: "database-snapshot",
18870
+ scope: "system",
18871
+ mode: "singleton",
18872
+ internal: true,
18873
+ methods: {
18874
+ /**
18875
+ * Which databases this owner snapshots. Answered from memory — no file is
18876
+ * touched — so a backup can ask it before deciding anything.
18877
+ */
18878
+ listDatabases: method(external_exports.object({}), DatabaseSnapshotTargetsSchema, { auth: "admin" }),
18879
+ /**
18880
+ * Write `<db>.backup-snapshot` and return what it holds. Throws — and
18881
+ * leaves no file under the final name — when the copy fails
18882
+ * `integrity_check` or its row counts differ from the pinned source's.
18883
+ * A second call while one is running joins it.
18884
+ */
18885
+ writeSnapshot: method(external_exports.object({}), DatabaseSnapshotResultSchema, {
18886
+ kind: "mutation",
18887
+ auth: "admin",
18888
+ timeoutMs: DATABASE_SNAPSHOT_TIMEOUT_MS
18889
+ })
18890
+ }
18891
+ };
18760
18892
  var BackupDestinationInfoSchema = external_exports.object({
18761
18893
  /**
18762
18894
  * Sub-id within this addon. Convention `default` for single-
@@ -18848,7 +18980,12 @@ var ArchiveManifestSchema = external_exports.object({
18848
18980
  locations: external_exports.array(external_exports.string()),
18849
18981
  entries: external_exports.array(ArchiveEntrySchema),
18850
18982
  totalBytes: external_exports.number(),
18851
- totalFiles: external_exports.number()
18983
+ totalFiles: external_exports.number(),
18984
+ /**
18985
+ * Live SQLite databases this archive carries as their OWNER's verified
18986
+ * snapshot instead of as files (D693). Absent on archives made before.
18987
+ */
18988
+ sqliteSnapshots: external_exports.array(ArchiveSqliteSnapshotSchema).optional()
18852
18989
  });
18853
18990
  var LocationStatSchema = external_exports.object({
18854
18991
  name: external_exports.string(),
@@ -20604,6 +20741,123 @@ var CompositionBlockStateSchema = external_exports.object({
20604
20741
  reason: external_exports.string().optional(),
20605
20742
  fields: external_exports.array(CompositionFieldStateSchema)
20606
20743
  });
20744
+ var ComposerBlockSchema = external_exports.object({
20745
+ id: external_exports.string().min(1),
20746
+ name: external_exports.string().min(1).max(120),
20747
+ enabled: external_exports.boolean(),
20748
+ updatedAt: external_exports.number(),
20749
+ composition: CompositionSchema
20750
+ });
20751
+ var ComposerUnreadableBlockSchema = external_exports.object({
20752
+ id: external_exports.string().min(1),
20753
+ /** The row's stored name column; null when even that is unreadable (the device keeps the name it has). */
20754
+ name: external_exports.string().nullable(),
20755
+ /** The parse error, in the operator's words. */
20756
+ error: external_exports.string()
20757
+ });
20758
+ var ComposerApplyInputSchema = external_exports.object({
20759
+ /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
20760
+ integrationId: external_exports.string().nullable(),
20761
+ /** False when the `core_blocks` read failed: then nothing may be withdrawn (D49). */
20762
+ storeLoaded: external_exports.boolean(),
20763
+ blocks: external_exports.array(ComposerBlockSchema),
20764
+ /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
20765
+ restartBlockIds: external_exports.array(external_exports.string()),
20766
+ /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
20767
+ unreadableBlocks: external_exports.array(ComposerUnreadableBlockSchema)
20768
+ });
20769
+ var ComposerBlockVerdictSchema = external_exports.object({
20770
+ blockId: external_exports.string(),
20771
+ status: CompositionRunStatusSchema,
20772
+ reason: external_exports.string().optional()
20773
+ });
20774
+ var ComposerApplyResultSchema = external_exports.object({
20775
+ blocks: external_exports.array(ComposerBlockVerdictSchema),
20776
+ /**
20777
+ * False when the composer declared and withdrew NOTHING (store not loaded,
20778
+ * integration unknown, its own rows unread or read empty once). An empty
20779
+ * apply the caller owes is paid off only by one the composer acted on (D49).
20780
+ */
20781
+ acted: external_exports.boolean()
20782
+ });
20783
+ var composerCapability = {
20784
+ name: "composer",
20785
+ scope: "system",
20786
+ mode: "singleton",
20787
+ internal: true,
20788
+ methods: {
20789
+ /**
20790
+ * Not `apply`: tRPC reserves `apply`, `call` and `then` as router keys, and
20791
+ * `router({})` throws on one — every cap router is built at boot.
20792
+ */
20793
+ applyBlocks: method(ComposerApplyInputSchema, ComposerApplyResultSchema, {
20794
+ kind: "mutation",
20795
+ auth: "admin"
20796
+ }),
20797
+ getStates: method(external_exports.object({ blockIds: external_exports.array(external_exports.string()) }), external_exports.object({ states: external_exports.array(CompositionBlockStateSchema) }), { auth: "admin" })
20798
+ }
20799
+ };
20800
+ var NUMBER = {
20801
+ kind: "fixed",
20802
+ result: ["number"]
20803
+ };
20804
+ var BOOLEAN = {
20805
+ kind: "fixed",
20806
+ result: ["boolean"]
20807
+ };
20808
+ var BUILTIN_RESULT_KINDS = Object.freeze({
20809
+ min: NUMBER,
20810
+ max: NUMBER,
20811
+ abs: NUMBER,
20812
+ floor: NUMBER,
20813
+ ceil: NUMBER,
20814
+ sqrt: NUMBER,
20815
+ round: NUMBER,
20816
+ pow: NUMBER,
20817
+ clamp: NUMBER,
20818
+ avg: NUMBER,
20819
+ sum: NUMBER,
20820
+ age: NUMBER,
20821
+ convert: NUMBER,
20822
+ coalesce: { kind: "coalesce" },
20823
+ any: BOOLEAN,
20824
+ all: BOOLEAN,
20825
+ within: BOOLEAN,
20826
+ latest: {
20827
+ kind: "fixed",
20828
+ result: ["number", "null"]
20829
+ },
20830
+ number: {
20831
+ kind: "fixed",
20832
+ result: ["number", "null"]
20833
+ },
20834
+ rose: {
20835
+ kind: "fixed",
20836
+ result: ["number", "null"]
20837
+ },
20838
+ count: NUMBER
20839
+ });
20840
+ var PENDING_SELF = {
20841
+ addonId: COMPOSER_ADDON_ID,
20842
+ stableId: `${COMPOSED_DEVICE_STABLE_ID_PREFIX}(unsaved)`
20843
+ };
20844
+ var ComposableFieldSchema = external_exports.object({
20845
+ path: external_exports.string(),
20846
+ kind: CompositionFieldKindSchema,
20847
+ nullable: external_exports.boolean(),
20848
+ required: external_exports.boolean(),
20849
+ enumValues: external_exports.array(external_exports.string()).optional()
20850
+ });
20851
+ var ComposableCapabilitySchema = external_exports.object({
20852
+ cap: external_exports.string(),
20853
+ fields: external_exports.array(ComposableFieldSchema),
20854
+ /** Present for an item-array cap (`consumables.items`). */
20855
+ itemArray: external_exports.object({
20856
+ path: external_exports.string(),
20857
+ keyField: external_exports.string()
20858
+ }).optional()
20859
+ });
20860
+ var ComposableCapabilitiesSchema = external_exports.object({ caps: external_exports.array(ComposableCapabilitySchema) });
20607
20861
  var CoreBlockPlacementSchema = external_exports.union([external_exports.literal("hub"), external_exports.string().min(1)]);
20608
20862
  var CoreBlockStatusSchema = external_exports.enum([
20609
20863
  "stopped",
@@ -20804,6 +21058,14 @@ var coreBlocksCapability = {
20804
21058
  stableId: external_exports.string().min(1)
20805
21059
  }), CompositionCustomizationReadSchema, { auth: "admin" }),
20806
21060
  /**
21061
+ * The capabilities a composition may BUILD on a device of `deviceType`
21062
+ * (a new device, or added to an existing one), with their fields — the
21063
+ * editor's feature list and the presets' availability (G2, D676). Built
21064
+ * from the validator's own blockers; a replace of a BOUND cap is not
21065
+ * listed here (the device's bindings say what it has).
21066
+ */
21067
+ listComposableCaps: method(external_exports.object({ deviceType: external_exports.enum(DeviceType) }), ComposableCapabilitiesSchema, { auth: "admin" }),
21068
+ /**
20807
21069
  * Validate without saving — the same verdict the save reaches. A mutation
20808
21070
  * for its body size; it writes nothing, so its access is `view`.
20809
21071
  */
@@ -20817,62 +21079,6 @@ var coreBlocksCapability = {
20817
21079
  })
20818
21080
  }
20819
21081
  };
20820
- var ComposerBlockSchema = external_exports.object({
20821
- id: external_exports.string().min(1),
20822
- name: external_exports.string().min(1).max(120),
20823
- enabled: external_exports.boolean(),
20824
- updatedAt: external_exports.number(),
20825
- composition: CompositionSchema
20826
- });
20827
- var ComposerUnreadableBlockSchema = external_exports.object({
20828
- id: external_exports.string().min(1),
20829
- /** The row's stored name column; null when even that is unreadable (the device keeps the name it has). */
20830
- name: external_exports.string().nullable(),
20831
- /** The parse error, in the operator's words. */
20832
- error: external_exports.string()
20833
- });
20834
- var ComposerApplyInputSchema = external_exports.object({
20835
- /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
20836
- integrationId: external_exports.string().nullable(),
20837
- /** False when the `core_blocks` read failed: then nothing may be withdrawn (D49). */
20838
- storeLoaded: external_exports.boolean(),
20839
- blocks: external_exports.array(ComposerBlockSchema),
20840
- /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
20841
- restartBlockIds: external_exports.array(external_exports.string()),
20842
- /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
20843
- unreadableBlocks: external_exports.array(ComposerUnreadableBlockSchema)
20844
- });
20845
- var ComposerBlockVerdictSchema = external_exports.object({
20846
- blockId: external_exports.string(),
20847
- status: CompositionRunStatusSchema,
20848
- reason: external_exports.string().optional()
20849
- });
20850
- var ComposerApplyResultSchema = external_exports.object({
20851
- blocks: external_exports.array(ComposerBlockVerdictSchema),
20852
- /**
20853
- * False when the composer declared and withdrew NOTHING (store not loaded,
20854
- * integration unknown, its own rows unread or read empty once). An empty
20855
- * apply the caller owes is paid off only by one the composer acted on (D49).
20856
- */
20857
- acted: external_exports.boolean()
20858
- });
20859
- var composerCapability = {
20860
- name: "composer",
20861
- scope: "system",
20862
- mode: "singleton",
20863
- internal: true,
20864
- methods: {
20865
- /**
20866
- * Not `apply`: tRPC reserves `apply`, `call` and `then` as router keys, and
20867
- * `router({})` throws on one — every cap router is built at boot.
20868
- */
20869
- applyBlocks: method(ComposerApplyInputSchema, ComposerApplyResultSchema, {
20870
- kind: "mutation",
20871
- auth: "admin"
20872
- }),
20873
- getStates: method(external_exports.object({ blockIds: external_exports.array(external_exports.string()) }), external_exports.object({ states: external_exports.array(CompositionBlockStateSchema) }), { auth: "admin" })
20874
- }
20875
- };
20876
21082
  var CustomModelDescriptorSchema = external_exports.object({
20877
21083
  stepId: external_exports.string(),
20878
21084
  entry: ModelCatalogEntrySchema
@@ -23359,6 +23565,208 @@ var deviceManagerCapability = {
23359
23565
  }), external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.unknown().nullable())))
23360
23566
  }
23361
23567
  };
23568
+ var DoorbellStatusSchema = external_exports.object({
23569
+ /** Ms epoch of the last press. null = never observed since this provider started. */
23570
+ lastPressedAt: external_exports.number().nullable(),
23571
+ /** Counter since provider start. Resets on reboot. Useful for metrics/debug. */
23572
+ pressCountSinceStart: external_exports.number()
23573
+ });
23574
+ var DoorbellPressEventSchema = external_exports.object({
23575
+ deviceId: external_exports.number(),
23576
+ timestamp: external_exports.number()
23577
+ });
23578
+ var DoorbellSourceSlotValueSchema = external_exports.object({ deviceIds: external_exports.array(external_exports.number().int().positive()) });
23579
+ var DOORBELL_SOURCE_SLOT = {
23580
+ id: "doorbell-source",
23581
+ label: "Doorbell trigger devices",
23582
+ description: "Any of these becoming active rings this camera's virtual doorbell: a binary sensor when it goes active, a switch when it turns on.",
23583
+ shape: "association",
23584
+ hostDeviceTypes: [DeviceType.Camera],
23585
+ sourceCaps: SOURCE_CAPS,
23586
+ cardinality: "many",
23587
+ value: DoorbellSourceSlotValueSchema
23588
+ };
23589
+ var doorbellCapability = {
23590
+ name: "doorbell",
23591
+ scope: "device",
23592
+ deviceNative: true,
23593
+ mode: "singleton",
23594
+ kind: "wrapper",
23595
+ defaultActive: false,
23596
+ deviceTypes: [DeviceType.Button, DeviceType.Camera],
23597
+ extensionSlots: [DOORBELL_SOURCE_SLOT],
23598
+ methods: {},
23599
+ events: {
23600
+ /**
23601
+ * Fires once per physical press. Reolink delivers via Baichuan
23602
+ * push (`ReolinkSimpleEvent.type === 'doorbell'`). There is no
23603
+ * release/duration — it's a pulse.
23604
+ */
23605
+ onPressed: {
23606
+ data: DoorbellPressEventSchema,
23607
+ fromState: {
23608
+ field: "lastPressedAt",
23609
+ on: "advance"
23610
+ }
23611
+ }
23612
+ },
23613
+ status: {
23614
+ schema: DoorbellStatusSchema,
23615
+ kind: "push"
23616
+ },
23617
+ /**
23618
+ * Runtime-state slice — last press timestamp + lifetime press count.
23619
+ * Mirrored by the kernel and readable via
23620
+ * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
23621
+ * without subscribing.
23622
+ */
23623
+ runtimeState: DoorbellStatusSchema,
23624
+ /**
23625
+ * Runtime-state durability: **restored** — a monotonic accumulator: the slice IS the record. `lastPressedAt` is content here, not a clock, so it is deliberately NOT volatile.
23626
+ *
23627
+ * See `RuntimeStateDurability`. Enforced by
23628
+ * `scripts/check-runtime-state-durability.ts`.
23629
+ */
23630
+ durability: "restored"
23631
+ };
23632
+ var EXTENSION_SLOT_IDS = ["doorbell-source", "linked-devices"];
23633
+ var ExtensionSlotIdSchema = external_exports.enum(EXTENSION_SLOT_IDS);
23634
+ var EXTENSION_SLOTS = {
23635
+ "doorbell-source": {
23636
+ descriptor: DOORBELL_SOURCE_SLOT,
23637
+ declaringCap: "doorbell",
23638
+ hostDeviceTypes: [DeviceType.Camera]
23639
+ },
23640
+ "linked-devices": {
23641
+ descriptor: LINKED_DEVICES_SLOT,
23642
+ declaringCap: "device-manager",
23643
+ hostDeviceTypes: [DeviceType.Camera]
23644
+ }
23645
+ };
23646
+ var ExtensionSlotValueSchema = external_exports.discriminatedUnion("slot", [DoorbellSourceSlotValueSchema.extend({ slot: external_exports.literal("doorbell-source") }), LinkedDevicesSlotValueSchema.extend({ slot: external_exports.literal("linked-devices") })]);
23647
+ var EXTENSION_HOST_DEVICE_TYPES = [DeviceType.Camera];
23648
+ var ExtensionSourceAvailabilitySchema = external_exports.discriminatedUnion("state", [external_exports.object({ state: external_exports.literal("ok") }), external_exports.object({
23649
+ state: external_exports.literal("unreachable"),
23650
+ reason: external_exports.string()
23651
+ })]);
23652
+ var ExtensionSourceSchema = external_exports.object({
23653
+ /** The routing prefix of every `slotRef` this provider serves. */
23654
+ source: external_exports.string(),
23655
+ label: external_exports.string(),
23656
+ /** Stamped by the dispatcher from the registry (D557). */
23657
+ addonId: external_exports.string().optional(),
23658
+ availability: ExtensionSourceAvailabilitySchema
23659
+ });
23660
+ var ExtensionSourceHealthSchema = external_exports.enum([
23661
+ "ok",
23662
+ "missing",
23663
+ "foreign",
23664
+ "unavailable"
23665
+ ]);
23666
+ var ExtensionSlotSourceSchema = external_exports.object({
23667
+ deviceId: external_exports.number().int(),
23668
+ /** The device's name, or null when it could not be resolved (`missing`). */
23669
+ name: external_exports.string().nullable(),
23670
+ health: ExtensionSourceHealthSchema,
23671
+ detail: external_exports.string().optional()
23672
+ });
23673
+ var ExtensionSlotActivationSchema = external_exports.object({
23674
+ state: external_exports.enum([
23675
+ "active",
23676
+ "inactive",
23677
+ "unknown"
23678
+ ]),
23679
+ authority: external_exports.string(),
23680
+ detail: external_exports.string().optional()
23681
+ });
23682
+ var ExtensionSlotStateSchema = external_exports.object({
23683
+ state: external_exports.literal("ok"),
23684
+ /** `<source>:<slotId>` — the routing key for `listCandidates` / `setSlot`. */
23685
+ slotRef: external_exports.string(),
23686
+ slot: ExtensionSlotIdSchema,
23687
+ /** Names the store written (D62), e.g. `virtual-doorbell:doorbellSources`. */
23688
+ authority: external_exports.string(),
23689
+ activation: ExtensionSlotActivationSchema.nullable(),
23690
+ value: ExtensionSlotValueSchema,
23691
+ sources: external_exports.array(ExtensionSlotSourceSchema),
23692
+ /**
23693
+ * Devices the owner links to the host ON ITS OWN, by structure, and that
23694
+ * are therefore not in `value` (D655): a camera's device-tree children, and
23695
+ * the child a picked container stands for (D356 — a container is never a
23696
+ * pick, its children are). Read-only; the editor shows them and may offer
23697
+ * per-device options on them (the linked-devices tracked-event opt-in).
23698
+ * Absent when the owner links nothing beyond the picks, and from an owner
23699
+ * older than D655.
23700
+ */
23701
+ impliedSources: external_exports.array(ExtensionSlotSourceSchema).optional()
23702
+ });
23703
+ var ExtensionSlotUnreachableSchema = external_exports.object({
23704
+ state: external_exports.literal("unreachable"),
23705
+ addonId: external_exports.string(),
23706
+ reason: external_exports.string()
23707
+ });
23708
+ var ExtensionSlotRowSchema = external_exports.discriminatedUnion("state", [ExtensionSlotStateSchema, ExtensionSlotUnreachableSchema]);
23709
+ var ExtensionCandidateSchema = external_exports.object({
23710
+ deviceId: external_exports.number().int(),
23711
+ name: external_exports.string(),
23712
+ type: external_exports.string(),
23713
+ location: external_exports.string().nullable(),
23714
+ /** The container a child belongs to — "Spotlight 2" alone does not say which. */
23715
+ parentName: external_exports.string().nullable(),
23716
+ /** Pre-marked by the owner's suggestion rule. NEVER saved on its own (D356). */
23717
+ suggested: external_exports.boolean(),
23718
+ /** Why it is suggested ("same location"), null when it is not. */
23719
+ reason: external_exports.string().nullable()
23720
+ });
23721
+ var ExtensionCandidatesSchema = external_exports.object({ candidates: external_exports.array(ExtensionCandidateSchema) });
23722
+ var ExtensionSetResultSchema = external_exports.object({
23723
+ applied: external_exports.literal(true),
23724
+ reload: external_exports.enum([
23725
+ "none",
23726
+ "host",
23727
+ "parent"
23728
+ ])
23729
+ });
23730
+ var ExtensionSlotRefInputSchema = external_exports.object({
23731
+ deviceId: external_exports.number().int(),
23732
+ slotRef: external_exports.string().min(1)
23733
+ });
23734
+ var ExtensionSetSlotInputSchema = ExtensionSlotRefInputSchema.extend({ value: ExtensionSlotValueSchema });
23735
+ var deviceExtensionCapability = {
23736
+ name: "device-extension",
23737
+ scope: "device",
23738
+ mode: "collection",
23739
+ kind: "wrapper",
23740
+ defaultActive: true,
23741
+ deviceTypes: EXTENSION_HOST_DEVICE_TYPES,
23742
+ deviceConfig: { ui: {
23743
+ kind: "widget",
23744
+ widgetId: "host/extensions-panel",
23745
+ tab: "general",
23746
+ label: "Extensions",
23747
+ order: 72
23748
+ } },
23749
+ methods: {
23750
+ /** One row per slot owner — the D554 source listing `slotRef` routes by. */
23751
+ listSources: method(external_exports.object({ deviceId: external_exports.number().int() }), external_exports.array(ExtensionSourceSchema)),
23752
+ /**
23753
+ * Every slot this device is offered, read by each owner from its own
23754
+ * store. A provider that throws is ONE `unreachable` row (D554.4).
23755
+ */
23756
+ listSlots: method(external_exports.object({ deviceId: external_exports.number().int() }), external_exports.array(ExtensionSlotRowSchema)),
23757
+ /** The devices the slot's editor may offer, suggestions pre-marked (D356). */
23758
+ listCandidates: method(ExtensionSlotRefInputSchema, ExtensionCandidatesSchema),
23759
+ /**
23760
+ * Write one slot through its owner's EXISTING write path. The owner
23761
+ * validates (a container is never a linked device, a camera is never its
23762
+ * own source) and refuses by name before persisting.
23763
+ */
23764
+ setSlot: method(ExtensionSetSlotInputSchema, ExtensionSetResultSchema, {
23765
+ kind: "mutation",
23766
+ auth: "admin"
23767
+ })
23768
+ }
23769
+ };
23362
23770
  var FieldClaimModeSchema = external_exports.enum(["replace", "add"]);
23363
23771
  var ClaimOutcomeSchema = external_exports.discriminatedUnion("ok", [external_exports.object({
23364
23772
  ok: external_exports.literal(true),
@@ -26155,9 +26563,11 @@ var NcScheduleSchema = external_exports.object({
26155
26563
  invert: external_exports.boolean().optional()
26156
26564
  });
26157
26565
  var NcSystemEventDeliveryModeSchema = external_exports.enum(["instant", "summary"]);
26566
+ var NcStateSummarySplitSchema = external_exports.enum(["rule", "section"]);
26158
26567
  var NcSystemEventDeliverySchema = external_exports.discriminatedUnion("mode", [external_exports.object({ mode: external_exports.literal("instant") }), external_exports.object({
26159
26568
  mode: external_exports.literal("summary"),
26160
- schedule: NcScheduleSchema
26569
+ schedule: NcScheduleSchema,
26570
+ split: NcStateSummarySplitSchema.optional()
26161
26571
  })]);
26162
26572
  var NcPlateMatcherSchema = external_exports.object({
26163
26573
  /**
@@ -26213,8 +26623,14 @@ var NcCrossingSchema = external_exports.enum([
26213
26623
  var NcSensorTransitionSchema = external_exports.enum(["raised", "cleared"]);
26214
26624
  var NcZoneConditionSchema = external_exports.object({
26215
26625
  ids: external_exports.array(external_exports.string().min(1)).min(1),
26216
- /** Quantifier over `ids` — at least one / every one visited. */
26217
- match: external_exports.enum(["any", "all"]).default("any")
26626
+ /**
26627
+ * LEGACY quantifier over `ids`. Absent = `any` (at least one visited), which
26628
+ * is what both editors mean and all they write since D690: "all of" was
26629
+ * removed from the editors because on an immediate rule it asked one
26630
+ * detection to stand in every zone at once. Still ACCEPTED, and `all` still
26631
+ * evaluated, so a stored rule keeps parsing and meaning what it meant.
26632
+ */
26633
+ match: external_exports.enum(["any", "all"]).optional()
26218
26634
  });
26219
26635
  var NcRuleActionSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
26220
26636
  kind: external_exports.literal("wait"),
@@ -26583,8 +26999,11 @@ var NcThrottleSchema = external_exports.object({
26583
26999
  /**
26584
27000
  * Class granularity of the cooldown key. Optional rather than defaulted:
26585
27001
  * a Zod default does NOT run on the addon→addon cap path, so a persisted
26586
- * rule authored before this field simply carries none — and the engine
26587
- * reads absent as `shared`, the pre-existing behaviour.
27002
+ * rule authored before this field simply carries none. The engine used to
27003
+ * read absent as `shared` (D36); since 2026-10-01 it reads absent as
27004
+ * `per-class` — the operator's default — and only an explicit `shared`
27005
+ * still means `shared`. See `cooldownKey` / `keysPerClass` in the rule
27006
+ * engine, and D36's dated note.
26588
27007
  */
26589
27008
  granularity: NcThrottleGranularitySchema.optional()
26590
27009
  });
@@ -26867,13 +27286,22 @@ var NcStateSummaryPreviewSectionSchema = external_exports.object({
26867
27286
  items: external_exports.number().int().nonnegative(),
26868
27287
  reason: external_exports.string().optional()
26869
27288
  });
27289
+ var NcStateSummaryPreviewRowSchema = external_exports.object({
27290
+ section: external_exports.string().optional(),
27291
+ /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
27292
+ title: external_exports.string(),
27293
+ text: external_exports.string(),
27294
+ count: external_exports.number().int().nonnegative()
27295
+ });
26870
27296
  var NcStateSummaryPreviewSchema = external_exports.object({
26871
27297
  empty: external_exports.boolean(),
26872
27298
  count: external_exports.number().int().nonnegative(),
26873
27299
  text: external_exports.string(),
26874
27300
  sections: external_exports.array(NcStateSummaryPreviewSectionSchema),
26875
27301
  dropped: external_exports.record(external_exports.string(), external_exports.number().int().nonnegative()),
26876
- excludedGroups: external_exports.array(external_exports.string())
27302
+ excludedGroups: external_exports.array(external_exports.string()),
27303
+ split: NcStateSummarySplitSchema.optional(),
27304
+ rows: external_exports.array(NcStateSummaryPreviewRowSchema).optional()
26877
27305
  });
26878
27306
  var NcTestResultSchema = external_exports.object({
26879
27307
  recordId: external_exports.string(),
@@ -29361,13 +29789,19 @@ var pipelineAnalyticsCapability = {
29361
29789
  *
29362
29790
  * Operator-driven from the DI Events page (batch delete). Routes through
29363
29791
  * the same widened track-deletion cascade (design §5.2).
29792
+ *
29793
+ * `sparedMediaIds` (D683 Task 14): media rows the cascade LEFT because a
29794
+ * live stationary entry vouches for them (its key frame, owned by a track
29795
+ * that moved and was kept). Released when the entry retires. Optional:
29796
+ * absent from a provider that predates it.
29364
29797
  */
29365
29798
  deleteTracks: method(external_exports.object({
29366
29799
  deviceId: external_exports.number(),
29367
29800
  trackIds: external_exports.array(external_exports.string()).min(1)
29368
29801
  }), external_exports.object({
29369
29802
  deleted: external_exports.number().int(),
29370
- failed: external_exports.array(external_exports.string()).readonly()
29803
+ failed: external_exports.array(external_exports.string()).readonly(),
29804
+ sparedMediaIds: external_exports.array(external_exports.number().int()).readonly().optional()
29371
29805
  }), {
29372
29806
  kind: "mutation",
29373
29807
  auth: "admin"
@@ -29450,6 +29884,25 @@ var pipelineAnalyticsCapability = {
29450
29884
  */
29451
29885
  listArchivedDebugNotes: method(ArchivedDebugNoteQueryInputSchema, external_exports.array(ArchivedDebugNoteSchema).readonly(), { kind: "query" }),
29452
29886
  /**
29887
+ * Tracking-bench ground truth (D681): "this track and that one are the
29888
+ * same subject" / "different subjects". One row per unordered pair —
29889
+ * re-marking replaces it — and a mark that contradicts an existing chain
29890
+ * is REFUSED with the chain named. Writing a mark also sets `debug` on
29891
+ * both tracks. `protected`, matching `setTrackFlags`: marking is done from
29892
+ * the viewer's track detail by an authenticated non-admin session.
29893
+ */
29894
+ setTrackRelation: method(SetTrackRelationInputSchema, TrackRelationSchema, { kind: "mutation" }),
29895
+ /** Remove the mark between two tracks. */
29896
+ clearTrackRelation: method(ClearTrackRelationInputSchema, ClearTrackRelationResultSchema, { kind: "mutation" }),
29897
+ /**
29898
+ * A track that is not ONE subject: `mixed` (two subjects, optionally
29899
+ * switching at `switchAtMs`) or `not-a-subject`. `pure` clears the mark
29900
+ * and answers `{ purity: null }` (D681).
29901
+ */
29902
+ setTrackPurity: method(SetTrackPurityInputSchema, SetTrackPurityResultSchema, { kind: "mutation" }),
29903
+ /** A camera's marks, optionally one track's, windowed by track start. */
29904
+ listTrackRelations: method(ListTrackRelationsInputSchema, ListTrackRelationsResultSchema, { kind: "query" }),
29905
+ /**
29453
29906
  * Birth decisions — one row per resolved confirmation-gate verdict (D409).
29454
29907
  *
29455
29908
  * The READ half of a measurement, and only that: it gates nothing and no
@@ -32214,6 +32667,32 @@ var NodeInferenceDevicesSchema = external_exports.object({
32214
32667
  reachable: external_exports.boolean(),
32215
32668
  devices: external_exports.array(NodeInferenceDeviceSchema).readonly()
32216
32669
  });
32670
+ var SetCameraSensorsInputSchema = external_exports.object({
32671
+ deviceId: external_exports.number().int().nonnegative(),
32672
+ /** `null` removes the attachment: the camera goes back to `not-configured`. */
32673
+ config: CameraSensorsConfigSchema.nullable()
32674
+ });
32675
+ var OccupancyLookRefusalSchema = external_exports.enum([
32676
+ "unknown-camera",
32677
+ "out-of-range",
32678
+ "no-burst-producer",
32679
+ "already-looked"
32680
+ ]);
32681
+ var OccupancyLookRequestSchema = external_exports.object({
32682
+ deviceId: external_exports.number().int().nonnegative(),
32683
+ /** How long from NOW until the pending flip's sustain window ends. RELATIVE,
32684
+ * so the caller's clock and the orchestrator's never have to agree. */
32685
+ afterMs: external_exports.number().finite(),
32686
+ /** Why, for the log. */
32687
+ reason: external_exports.string()
32688
+ });
32689
+ var OccupancyLookAnswerSchema = external_exports.object({
32690
+ scheduled: external_exports.boolean(),
32691
+ /** When `scheduled`: how long until the burst is dialled. */
32692
+ dueInMs: external_exports.number().optional(),
32693
+ /** When not `scheduled`: why. */
32694
+ refusedBecause: OccupancyLookRefusalSchema.optional()
32695
+ });
32217
32696
  var pipelineOrchestratorCapability = {
32218
32697
  name: "pipeline-orchestrator",
32219
32698
  scope: "system",
@@ -32221,6 +32700,19 @@ var pipelineOrchestratorCapability = {
32221
32700
  nodeIdMode: "data",
32222
32701
  exposesDeviceSettings: true,
32223
32702
  methods: {
32703
+ /**
32704
+ * D691 — an occupancy flip is pending on this camera and can commit
32705
+ * `afterMs` from now: dial ONE occupancy burst at the end of its sustain
32706
+ * window instead of leaving the commit to the 300 s parked-object cadence.
32707
+ * Called by the notification centre, the only component that knows a flip
32708
+ * is pending; the dial is the recheck's own (attach on the last session
32709
+ * node, `requestOccupancyBurst`, detach). One pending look per camera; a
32710
+ * session open at the due time is the look, and no burst is dialled.
32711
+ */
32712
+ requestOccupancyLook: method(OccupancyLookRequestSchema, OccupancyLookAnswerSchema, {
32713
+ kind: "mutation",
32714
+ auth: "admin"
32715
+ }),
32224
32716
  /** Internal storage-migration participant lease. While held, dispatch
32225
32717
  * requests are accepted as pending but no new runner attachment starts. */
32226
32718
  pauseForStorageMigration: method(StorageMigrationLeaseInputSchema, external_exports.object({ paused: external_exports.literal(true) }), {
@@ -32679,6 +33171,18 @@ var pipelineOrchestratorCapability = {
32679
33171
  */
32680
33172
  getCameraStatuses: method(external_exports.object({ deviceIds: external_exports.array(external_exports.number()).optional() }), external_exports.array(CameraStatusSchema).readonly()),
32681
33173
  /**
33174
+ * Attach sensors to a camera, or detach them with `config: null` (D672
33175
+ * configuration, G5/D676). Written to the orchestrator's per-device store
33176
+ * under the same key `applyDeviceSettingsPatch` writes, and announced as a
33177
+ * settings change so the camera-sensors bridge refreshes. Refused by name
33178
+ * — nothing written — for a device that cannot be read, does not exist,
33179
+ * is not a camera, or names itself as its own sensor.
33180
+ */
33181
+ setCameraSensors: method(SetCameraSensorsInputSchema, external_exports.object({ success: external_exports.literal(true) }), {
33182
+ kind: "mutation",
33183
+ auth: "admin"
33184
+ }),
33185
+ /**
32682
33186
  * Disk-wins fleet reconcile after a recordings wipe. Starts the walk in
32683
33187
  * the addon process and returns immediately with the job snapshot — the
32684
33188
  * work outlives the tRPC/UDS 60s timeout. Poll `getReconcileFromDiskStatus`.
@@ -34981,208 +35485,6 @@ var videoclipsCapability = {
34981
35485
  })
34982
35486
  }
34983
35487
  };
34984
- var DoorbellStatusSchema = external_exports.object({
34985
- /** Ms epoch of the last press. null = never observed since this provider started. */
34986
- lastPressedAt: external_exports.number().nullable(),
34987
- /** Counter since provider start. Resets on reboot. Useful for metrics/debug. */
34988
- pressCountSinceStart: external_exports.number()
34989
- });
34990
- var DoorbellPressEventSchema = external_exports.object({
34991
- deviceId: external_exports.number(),
34992
- timestamp: external_exports.number()
34993
- });
34994
- var DoorbellSourceSlotValueSchema = external_exports.object({ deviceIds: external_exports.array(external_exports.number().int().positive()) });
34995
- var DOORBELL_SOURCE_SLOT = {
34996
- id: "doorbell-source",
34997
- label: "Doorbell trigger devices",
34998
- description: "Any of these becoming active rings this camera's virtual doorbell: a binary sensor when it goes active, a switch when it turns on.",
34999
- shape: "association",
35000
- hostDeviceTypes: [DeviceType.Camera],
35001
- sourceCaps: SOURCE_CAPS,
35002
- cardinality: "many",
35003
- value: DoorbellSourceSlotValueSchema
35004
- };
35005
- var doorbellCapability = {
35006
- name: "doorbell",
35007
- scope: "device",
35008
- deviceNative: true,
35009
- mode: "singleton",
35010
- kind: "wrapper",
35011
- defaultActive: false,
35012
- deviceTypes: [DeviceType.Button, DeviceType.Camera],
35013
- extensionSlots: [DOORBELL_SOURCE_SLOT],
35014
- methods: {},
35015
- events: {
35016
- /**
35017
- * Fires once per physical press. Reolink delivers via Baichuan
35018
- * push (`ReolinkSimpleEvent.type === 'doorbell'`). There is no
35019
- * release/duration — it's a pulse.
35020
- */
35021
- onPressed: {
35022
- data: DoorbellPressEventSchema,
35023
- fromState: {
35024
- field: "lastPressedAt",
35025
- on: "advance"
35026
- }
35027
- }
35028
- },
35029
- status: {
35030
- schema: DoorbellStatusSchema,
35031
- kind: "push"
35032
- },
35033
- /**
35034
- * Runtime-state slice — last press timestamp + lifetime press count.
35035
- * Mirrored by the kernel and readable via
35036
- * `device.state.doorbell.value`. UIs can show "last ring 5m ago"
35037
- * without subscribing.
35038
- */
35039
- runtimeState: DoorbellStatusSchema,
35040
- /**
35041
- * Runtime-state durability: **restored** — a monotonic accumulator: the slice IS the record. `lastPressedAt` is content here, not a clock, so it is deliberately NOT volatile.
35042
- *
35043
- * See `RuntimeStateDurability`. Enforced by
35044
- * `scripts/check-runtime-state-durability.ts`.
35045
- */
35046
- durability: "restored"
35047
- };
35048
- var EXTENSION_SLOT_IDS = ["doorbell-source", "linked-devices"];
35049
- var ExtensionSlotIdSchema = external_exports.enum(EXTENSION_SLOT_IDS);
35050
- var EXTENSION_SLOTS = {
35051
- "doorbell-source": {
35052
- descriptor: DOORBELL_SOURCE_SLOT,
35053
- declaringCap: "doorbell",
35054
- hostDeviceTypes: [DeviceType.Camera]
35055
- },
35056
- "linked-devices": {
35057
- descriptor: LINKED_DEVICES_SLOT,
35058
- declaringCap: "device-manager",
35059
- hostDeviceTypes: [DeviceType.Camera]
35060
- }
35061
- };
35062
- var ExtensionSlotValueSchema = external_exports.discriminatedUnion("slot", [DoorbellSourceSlotValueSchema.extend({ slot: external_exports.literal("doorbell-source") }), LinkedDevicesSlotValueSchema.extend({ slot: external_exports.literal("linked-devices") })]);
35063
- var EXTENSION_HOST_DEVICE_TYPES = [DeviceType.Camera];
35064
- var ExtensionSourceAvailabilitySchema = external_exports.discriminatedUnion("state", [external_exports.object({ state: external_exports.literal("ok") }), external_exports.object({
35065
- state: external_exports.literal("unreachable"),
35066
- reason: external_exports.string()
35067
- })]);
35068
- var ExtensionSourceSchema = external_exports.object({
35069
- /** The routing prefix of every `slotRef` this provider serves. */
35070
- source: external_exports.string(),
35071
- label: external_exports.string(),
35072
- /** Stamped by the dispatcher from the registry (D557). */
35073
- addonId: external_exports.string().optional(),
35074
- availability: ExtensionSourceAvailabilitySchema
35075
- });
35076
- var ExtensionSourceHealthSchema = external_exports.enum([
35077
- "ok",
35078
- "missing",
35079
- "foreign",
35080
- "unavailable"
35081
- ]);
35082
- var ExtensionSlotSourceSchema = external_exports.object({
35083
- deviceId: external_exports.number().int(),
35084
- /** The device's name, or null when it could not be resolved (`missing`). */
35085
- name: external_exports.string().nullable(),
35086
- health: ExtensionSourceHealthSchema,
35087
- detail: external_exports.string().optional()
35088
- });
35089
- var ExtensionSlotActivationSchema = external_exports.object({
35090
- state: external_exports.enum([
35091
- "active",
35092
- "inactive",
35093
- "unknown"
35094
- ]),
35095
- authority: external_exports.string(),
35096
- detail: external_exports.string().optional()
35097
- });
35098
- var ExtensionSlotStateSchema = external_exports.object({
35099
- state: external_exports.literal("ok"),
35100
- /** `<source>:<slotId>` — the routing key for `listCandidates` / `setSlot`. */
35101
- slotRef: external_exports.string(),
35102
- slot: ExtensionSlotIdSchema,
35103
- /** Names the store written (D62), e.g. `virtual-doorbell:doorbellSources`. */
35104
- authority: external_exports.string(),
35105
- activation: ExtensionSlotActivationSchema.nullable(),
35106
- value: ExtensionSlotValueSchema,
35107
- sources: external_exports.array(ExtensionSlotSourceSchema),
35108
- /**
35109
- * Devices the owner links to the host ON ITS OWN, by structure, and that
35110
- * are therefore not in `value` (D655): a camera's device-tree children, and
35111
- * the child a picked container stands for (D356 — a container is never a
35112
- * pick, its children are). Read-only; the editor shows them and may offer
35113
- * per-device options on them (the linked-devices tracked-event opt-in).
35114
- * Absent when the owner links nothing beyond the picks, and from an owner
35115
- * older than D655.
35116
- */
35117
- impliedSources: external_exports.array(ExtensionSlotSourceSchema).optional()
35118
- });
35119
- var ExtensionSlotUnreachableSchema = external_exports.object({
35120
- state: external_exports.literal("unreachable"),
35121
- addonId: external_exports.string(),
35122
- reason: external_exports.string()
35123
- });
35124
- var ExtensionSlotRowSchema = external_exports.discriminatedUnion("state", [ExtensionSlotStateSchema, ExtensionSlotUnreachableSchema]);
35125
- var ExtensionCandidateSchema = external_exports.object({
35126
- deviceId: external_exports.number().int(),
35127
- name: external_exports.string(),
35128
- type: external_exports.string(),
35129
- location: external_exports.string().nullable(),
35130
- /** The container a child belongs to — "Spotlight 2" alone does not say which. */
35131
- parentName: external_exports.string().nullable(),
35132
- /** Pre-marked by the owner's suggestion rule. NEVER saved on its own (D356). */
35133
- suggested: external_exports.boolean(),
35134
- /** Why it is suggested ("same location"), null when it is not. */
35135
- reason: external_exports.string().nullable()
35136
- });
35137
- var ExtensionCandidatesSchema = external_exports.object({ candidates: external_exports.array(ExtensionCandidateSchema) });
35138
- var ExtensionSetResultSchema = external_exports.object({
35139
- applied: external_exports.literal(true),
35140
- reload: external_exports.enum([
35141
- "none",
35142
- "host",
35143
- "parent"
35144
- ])
35145
- });
35146
- var ExtensionSlotRefInputSchema = external_exports.object({
35147
- deviceId: external_exports.number().int(),
35148
- slotRef: external_exports.string().min(1)
35149
- });
35150
- var ExtensionSetSlotInputSchema = ExtensionSlotRefInputSchema.extend({ value: ExtensionSlotValueSchema });
35151
- var deviceExtensionCapability = {
35152
- name: "device-extension",
35153
- scope: "device",
35154
- mode: "collection",
35155
- kind: "wrapper",
35156
- defaultActive: true,
35157
- deviceTypes: EXTENSION_HOST_DEVICE_TYPES,
35158
- deviceConfig: { ui: {
35159
- kind: "widget",
35160
- widgetId: "host/extensions-panel",
35161
- tab: "general",
35162
- label: "Extensions",
35163
- order: 72
35164
- } },
35165
- methods: {
35166
- /** One row per slot owner — the D554 source listing `slotRef` routes by. */
35167
- listSources: method(external_exports.object({ deviceId: external_exports.number().int() }), external_exports.array(ExtensionSourceSchema)),
35168
- /**
35169
- * Every slot this device is offered, read by each owner from its own
35170
- * store. A provider that throws is ONE `unreachable` row (D554.4).
35171
- */
35172
- listSlots: method(external_exports.object({ deviceId: external_exports.number().int() }), external_exports.array(ExtensionSlotRowSchema)),
35173
- /** The devices the slot's editor may offer, suggestions pre-marked (D356). */
35174
- listCandidates: method(ExtensionSlotRefInputSchema, ExtensionCandidatesSchema),
35175
- /**
35176
- * Write one slot through its owner's EXISTING write path. The owner
35177
- * validates (a container is never a linked device, a camera is never its
35178
- * own source) and refuses by name before persisting.
35179
- */
35180
- setSlot: method(ExtensionSetSlotInputSchema, ExtensionSetResultSchema, {
35181
- kind: "mutation",
35182
- auth: "admin"
35183
- })
35184
- }
35185
- };
35186
35488
  var webrtcClientHintsSchema = external_exports.object({
35187
35489
  viewportWidth: external_exports.number().int().positive().optional(),
35188
35490
  viewportHeight: external_exports.number().int().positive().optional(),
@@ -45352,49 +45654,232 @@ var PIPELINE_OWNER_CAPABILITY_NAMES = [
45352
45654
  "pipeline-orchestrator",
45353
45655
  "pipeline-runner"
45354
45656
  ];
45355
- var NUMBER = {
45356
- kind: "fixed",
45357
- result: ["number"]
45358
- };
45359
- var BOOLEAN = {
45360
- kind: "fixed",
45361
- result: ["boolean"]
45362
- };
45363
- var BUILTIN_RESULT_KINDS = Object.freeze({
45364
- min: NUMBER,
45365
- max: NUMBER,
45366
- abs: NUMBER,
45367
- floor: NUMBER,
45368
- ceil: NUMBER,
45369
- sqrt: NUMBER,
45370
- round: NUMBER,
45371
- pow: NUMBER,
45372
- clamp: NUMBER,
45373
- avg: NUMBER,
45374
- sum: NUMBER,
45375
- age: NUMBER,
45376
- convert: NUMBER,
45377
- coalesce: { kind: "coalesce" },
45378
- any: BOOLEAN,
45379
- all: BOOLEAN,
45380
- within: BOOLEAN,
45381
- latest: {
45382
- kind: "fixed",
45383
- result: ["number", "null"]
45657
+ var UNIT_TABLE = {
45658
+ "\xB0C": {
45659
+ dimension: "temperature",
45660
+ factor: 1,
45661
+ offset: 0
45384
45662
  },
45385
- number: {
45386
- kind: "fixed",
45387
- result: ["number", "null"]
45663
+ "\xB0F": {
45664
+ dimension: "temperature",
45665
+ factor: 5 / 9,
45666
+ offset: -160 / 9
45388
45667
  },
45389
- rose: {
45390
- kind: "fixed",
45391
- result: ["number", "null"]
45668
+ K: {
45669
+ dimension: "temperature",
45670
+ factor: 1,
45671
+ offset: -273.15
45392
45672
  },
45393
- count: NUMBER
45394
- });
45395
- var PENDING_SELF = {
45396
- addonId: COMPOSER_ADDON_ID,
45397
- stableId: `${COMPOSED_DEVICE_STABLE_ID_PREFIX}(unsaved)`
45673
+ hPa: {
45674
+ dimension: "pressure",
45675
+ factor: 1,
45676
+ offset: 0
45677
+ },
45678
+ kPa: {
45679
+ dimension: "pressure",
45680
+ factor: 10,
45681
+ offset: 0
45682
+ },
45683
+ Pa: {
45684
+ dimension: "pressure",
45685
+ factor: 0.01,
45686
+ offset: 0
45687
+ },
45688
+ mbar: {
45689
+ dimension: "pressure",
45690
+ factor: 1,
45691
+ offset: 0
45692
+ },
45693
+ bar: {
45694
+ dimension: "pressure",
45695
+ factor: 1e3,
45696
+ offset: 0
45697
+ },
45698
+ inHg: {
45699
+ dimension: "pressure",
45700
+ factor: 33.8639,
45701
+ offset: 0
45702
+ },
45703
+ mmHg: {
45704
+ dimension: "pressure",
45705
+ factor: 1.33322,
45706
+ offset: 0
45707
+ },
45708
+ psi: {
45709
+ dimension: "pressure",
45710
+ factor: 68.9476,
45711
+ offset: 0
45712
+ },
45713
+ "m/s": {
45714
+ dimension: "speed",
45715
+ factor: 1,
45716
+ offset: 0
45717
+ },
45718
+ "km/h": {
45719
+ dimension: "speed",
45720
+ factor: 1 / 3.6,
45721
+ offset: 0
45722
+ },
45723
+ mph: {
45724
+ dimension: "speed",
45725
+ factor: 0.44704,
45726
+ offset: 0
45727
+ },
45728
+ kn: {
45729
+ dimension: "speed",
45730
+ factor: 0.514444,
45731
+ offset: 0
45732
+ },
45733
+ "mm/h": {
45734
+ dimension: "precipitation-rate",
45735
+ factor: 1,
45736
+ offset: 0
45737
+ },
45738
+ "in/h": {
45739
+ dimension: "precipitation-rate",
45740
+ factor: 25.4,
45741
+ offset: 0
45742
+ },
45743
+ m: {
45744
+ dimension: "length",
45745
+ factor: 1,
45746
+ offset: 0
45747
+ },
45748
+ mm: {
45749
+ dimension: "length",
45750
+ factor: 1e-3,
45751
+ offset: 0
45752
+ },
45753
+ cm: {
45754
+ dimension: "length",
45755
+ factor: 0.01,
45756
+ offset: 0
45757
+ },
45758
+ km: {
45759
+ dimension: "length",
45760
+ factor: 1e3,
45761
+ offset: 0
45762
+ },
45763
+ in: {
45764
+ dimension: "length",
45765
+ factor: 0.0254,
45766
+ offset: 0
45767
+ },
45768
+ ft: {
45769
+ dimension: "length",
45770
+ factor: 0.3048,
45771
+ offset: 0
45772
+ },
45773
+ mi: {
45774
+ dimension: "length",
45775
+ factor: 1609.344,
45776
+ offset: 0
45777
+ },
45778
+ lx: {
45779
+ dimension: "illuminance",
45780
+ factor: 1,
45781
+ offset: 0
45782
+ },
45783
+ "W/m\xB2": {
45784
+ dimension: "irradiance",
45785
+ factor: 1,
45786
+ offset: 0
45787
+ },
45788
+ W: {
45789
+ dimension: "power",
45790
+ factor: 1,
45791
+ offset: 0
45792
+ },
45793
+ kW: {
45794
+ dimension: "power",
45795
+ factor: 1e3,
45796
+ offset: 0
45797
+ },
45798
+ VA: {
45799
+ dimension: "apparent-power",
45800
+ factor: 1,
45801
+ offset: 0
45802
+ },
45803
+ Wh: {
45804
+ dimension: "energy",
45805
+ factor: 1,
45806
+ offset: 0
45807
+ },
45808
+ kWh: {
45809
+ dimension: "energy",
45810
+ factor: 1e3,
45811
+ offset: 0
45812
+ },
45813
+ MWh: {
45814
+ dimension: "energy",
45815
+ factor: 1e6,
45816
+ offset: 0
45817
+ },
45818
+ V: {
45819
+ dimension: "voltage",
45820
+ factor: 1,
45821
+ offset: 0
45822
+ },
45823
+ mV: {
45824
+ dimension: "voltage",
45825
+ factor: 1e-3,
45826
+ offset: 0
45827
+ },
45828
+ A: {
45829
+ dimension: "current",
45830
+ factor: 1,
45831
+ offset: 0
45832
+ },
45833
+ mA: {
45834
+ dimension: "current",
45835
+ factor: 1e-3,
45836
+ offset: 0
45837
+ },
45838
+ ppm: {
45839
+ dimension: "concentration-volume",
45840
+ factor: 1,
45841
+ offset: 0
45842
+ },
45843
+ ppb: {
45844
+ dimension: "concentration-volume",
45845
+ factor: 1e-3,
45846
+ offset: 0
45847
+ },
45848
+ "\xB5g/m\xB3": {
45849
+ dimension: "concentration-mass",
45850
+ factor: 1,
45851
+ offset: 0
45852
+ },
45853
+ "mg/m\xB3": {
45854
+ dimension: "concentration-mass",
45855
+ factor: 1e3,
45856
+ offset: 0
45857
+ },
45858
+ kg: {
45859
+ dimension: "mass",
45860
+ factor: 1,
45861
+ offset: 0
45862
+ },
45863
+ g: {
45864
+ dimension: "mass",
45865
+ factor: 1e-3,
45866
+ offset: 0
45867
+ },
45868
+ lb: {
45869
+ dimension: "mass",
45870
+ factor: 0.453592,
45871
+ offset: 0
45872
+ },
45873
+ oz: {
45874
+ dimension: "mass",
45875
+ factor: 0.0283495,
45876
+ offset: 0
45877
+ },
45878
+ "%": {
45879
+ dimension: "percentage",
45880
+ factor: 1,
45881
+ offset: 0
45882
+ }
45398
45883
  };
45399
45884
  var HF_REPO = "camstack/camstack-models";
45400
45885
  var HF_BASE_URL = `https://huggingface.co/${HF_REPO}/resolve/main`;
@@ -47837,6 +48322,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
47837
48322
  addonId: null,
47838
48323
  access: "view"
47839
48324
  },
48325
+ "coreBlocks.listComposableCaps": {
48326
+ capName: "core-blocks",
48327
+ capScope: "system",
48328
+ addonId: null,
48329
+ access: "view"
48330
+ },
47840
48331
  "coreBlocks.listCompositions": {
47841
48332
  capName: "core-blocks",
47842
48333
  capScope: "system",
@@ -47915,6 +48406,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
47915
48406
  addonId: null,
47916
48407
  access: "view"
47917
48408
  },
48409
+ "databaseSnapshot.listDatabases": {
48410
+ capName: "database-snapshot",
48411
+ capScope: "system",
48412
+ addonId: null,
48413
+ access: "view"
48414
+ },
48415
+ "databaseSnapshot.writeSnapshot": {
48416
+ capName: "database-snapshot",
48417
+ capScope: "system",
48418
+ addonId: null,
48419
+ access: "create"
48420
+ },
47918
48421
  "dataStoreProvider.aggregate": {
47919
48422
  capName: "data-store-provider",
47920
48423
  capScope: "system",
@@ -50651,6 +51154,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50651
51154
  addonId: null,
50652
51155
  access: "create"
50653
51156
  },
51157
+ "pipelineAnalytics.clearTrackRelation": {
51158
+ capName: "pipeline-analytics",
51159
+ capScope: "device",
51160
+ addonId: null,
51161
+ access: "delete"
51162
+ },
50654
51163
  "pipelineAnalytics.clearTracks": {
50655
51164
  capName: "pipeline-analytics",
50656
51165
  capScope: "device",
@@ -50903,6 +51412,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50903
51412
  addonId: null,
50904
51413
  access: "view"
50905
51414
  },
51415
+ "pipelineAnalytics.listTrackRelations": {
51416
+ capName: "pipeline-analytics",
51417
+ capScope: "device",
51418
+ addonId: null,
51419
+ access: "view"
51420
+ },
50906
51421
  "pipelineAnalytics.listTracks": {
50907
51422
  capName: "pipeline-analytics",
50908
51423
  capScope: "device",
@@ -51017,6 +51532,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
51017
51532
  addonId: null,
51018
51533
  access: "create"
51019
51534
  },
51535
+ "pipelineAnalytics.setTrackPurity": {
51536
+ capName: "pipeline-analytics",
51537
+ capScope: "device",
51538
+ addonId: null,
51539
+ access: "create"
51540
+ },
51541
+ "pipelineAnalytics.setTrackRelation": {
51542
+ capName: "pipeline-analytics",
51543
+ capScope: "device",
51544
+ addonId: null,
51545
+ access: "create"
51546
+ },
51020
51547
  "pipelineAnalytics.startStorageMigrationMove": {
51021
51548
  capName: "pipeline-analytics",
51022
51549
  capScope: "device",
@@ -51455,6 +51982,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51455
51982
  addonId: null,
51456
51983
  access: "delete"
51457
51984
  },
51985
+ "pipelineOrchestrator.requestOccupancyLook": {
51986
+ capName: "pipeline-orchestrator",
51987
+ capScope: "system",
51988
+ addonId: null,
51989
+ access: "create"
51990
+ },
51458
51991
  "pipelineOrchestrator.resetNodePipelineDefaults": {
51459
51992
  capName: "pipeline-orchestrator",
51460
51993
  capScope: "system",
@@ -51521,6 +52054,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
51521
52054
  addonId: null,
51522
52055
  access: "create"
51523
52056
  },
52057
+ "pipelineOrchestrator.setCameraSensors": {
52058
+ capName: "pipeline-orchestrator",
52059
+ capScope: "system",
52060
+ addonId: null,
52061
+ access: "create"
52062
+ },
51524
52063
  "pipelineOrchestrator.setCameraStepOverride": {
51525
52064
  capName: "pipeline-orchestrator",
51526
52065
  capScope: "system",
@@ -54931,6 +55470,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
54931
55470
  form: "single",
54932
55471
  optional: false
54933
55472
  }],
55473
+ "pipelineAnalytics.clearTrackRelation": [{
55474
+ name: "deviceId",
55475
+ form: "single",
55476
+ optional: false
55477
+ }],
54934
55478
  "pipelineAnalytics.clearTracks": [{
54935
55479
  name: "deviceId",
54936
55480
  form: "single",
@@ -55081,6 +55625,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
55081
55625
  form: "single",
55082
55626
  optional: false
55083
55627
  }],
55628
+ "pipelineAnalytics.listTrackRelations": [{
55629
+ name: "deviceId",
55630
+ form: "single",
55631
+ optional: false
55632
+ }],
55084
55633
  "pipelineAnalytics.listTracks": [{
55085
55634
  name: "deviceId",
55086
55635
  form: "single",
@@ -55151,6 +55700,16 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
55151
55700
  form: "single",
55152
55701
  optional: false
55153
55702
  }],
55703
+ "pipelineAnalytics.setTrackPurity": [{
55704
+ name: "deviceId",
55705
+ form: "single",
55706
+ optional: false
55707
+ }],
55708
+ "pipelineAnalytics.setTrackRelation": [{
55709
+ name: "deviceId",
55710
+ form: "single",
55711
+ optional: false
55712
+ }],
55154
55713
  "pipelineAnalytics.wipeAllAnalytics": [{
55155
55714
  name: "deviceId",
55156
55715
  form: "single",
@@ -55221,6 +55780,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
55221
55780
  form: "single",
55222
55781
  optional: false
55223
55782
  }],
55783
+ "pipelineOrchestrator.requestOccupancyLook": [{
55784
+ name: "deviceId",
55785
+ form: "single",
55786
+ optional: false
55787
+ }],
55224
55788
  "pipelineOrchestrator.resolvePipeline": [{
55225
55789
  name: "deviceId",
55226
55790
  form: "single",
@@ -55231,6 +55795,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
55231
55795
  form: "single",
55232
55796
  optional: false
55233
55797
  }],
55798
+ "pipelineOrchestrator.setCameraSensors": [{
55799
+ name: "deviceId",
55800
+ form: "single",
55801
+ optional: false
55802
+ }],
55234
55803
  "pipelineOrchestrator.setCameraStepOverride": [{
55235
55804
  name: "deviceId",
55236
55805
  form: "single",
@@ -56273,6 +56842,18 @@ var STATE_SUMMARY_VARS = [
56273
56842
  systemEventKinds: [...SUMMARISABLE],
56274
56843
  systemEventDeliveries: ["summary"]
56275
56844
  },
56845
+ {
56846
+ name: "summarySection",
56847
+ label: "Summary: this section",
56848
+ description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
56849
+ example: "Batterie scariche",
56850
+ group: "system",
56851
+ families: ["rule"],
56852
+ fields: [...RULE_TEXT],
56853
+ kinds: ["system"],
56854
+ systemEventKinds: [...SUMMARISABLE],
56855
+ systemEventDeliveries: ["summary"]
56856
+ },
56276
56857
  ...STATE_SUMMARY_SECTION_VARS.map((v) => ({
56277
56858
  name: v.name,
56278
56859
  label: v.label,
@@ -56982,6 +57563,38 @@ var NC_TEMPLATE_VARS = [
56982
57563
  },
56983
57564
  ...STATE_SUMMARY_VARS
56984
57565
  ];
57566
+ var STATE_LABEL_KEYS = [
57567
+ "disarmed",
57568
+ "armed_home",
57569
+ "armed_away",
57570
+ "armed_night",
57571
+ "armed_vacation",
57572
+ "armed_custom_bypass",
57573
+ "arming",
57574
+ "disarming",
57575
+ "pending",
57576
+ "triggered",
57577
+ "open",
57578
+ "opening",
57579
+ "closing",
57580
+ "closed",
57581
+ "stopped",
57582
+ "locked",
57583
+ "unlocked",
57584
+ "locking",
57585
+ "unlocking",
57586
+ "jammed",
57587
+ "on",
57588
+ "off",
57589
+ "home",
57590
+ "not_home",
57591
+ "matched",
57592
+ "diverged",
57593
+ "unknown",
57594
+ "latched",
57595
+ "live"
57596
+ ];
57597
+ var KEY_SET = new Set(STATE_LABEL_KEYS);
56985
57598
  var TimelapseTemplateSchema = external_exports.object({
56986
57599
  title: external_exports.string().max(500).optional(),
56987
57600
  body: external_exports.string().max(2e3).optional()
@@ -57280,233 +57893,6 @@ var NATIVE_LEASE_ADMISSION_FIELD = {
57280
57893
  }],
57281
57894
  default: DEFAULT_NATIVE_LEASE_SETTINGS.admission
57282
57895
  };
57283
- var UNIT_TABLE = {
57284
- "\xB0C": {
57285
- dimension: "temperature",
57286
- factor: 1,
57287
- offset: 0
57288
- },
57289
- "\xB0F": {
57290
- dimension: "temperature",
57291
- factor: 5 / 9,
57292
- offset: -160 / 9
57293
- },
57294
- K: {
57295
- dimension: "temperature",
57296
- factor: 1,
57297
- offset: -273.15
57298
- },
57299
- hPa: {
57300
- dimension: "pressure",
57301
- factor: 1,
57302
- offset: 0
57303
- },
57304
- kPa: {
57305
- dimension: "pressure",
57306
- factor: 10,
57307
- offset: 0
57308
- },
57309
- Pa: {
57310
- dimension: "pressure",
57311
- factor: 0.01,
57312
- offset: 0
57313
- },
57314
- mbar: {
57315
- dimension: "pressure",
57316
- factor: 1,
57317
- offset: 0
57318
- },
57319
- bar: {
57320
- dimension: "pressure",
57321
- factor: 1e3,
57322
- offset: 0
57323
- },
57324
- inHg: {
57325
- dimension: "pressure",
57326
- factor: 33.8639,
57327
- offset: 0
57328
- },
57329
- mmHg: {
57330
- dimension: "pressure",
57331
- factor: 1.33322,
57332
- offset: 0
57333
- },
57334
- psi: {
57335
- dimension: "pressure",
57336
- factor: 68.9476,
57337
- offset: 0
57338
- },
57339
- "m/s": {
57340
- dimension: "speed",
57341
- factor: 1,
57342
- offset: 0
57343
- },
57344
- "km/h": {
57345
- dimension: "speed",
57346
- factor: 1 / 3.6,
57347
- offset: 0
57348
- },
57349
- mph: {
57350
- dimension: "speed",
57351
- factor: 0.44704,
57352
- offset: 0
57353
- },
57354
- kn: {
57355
- dimension: "speed",
57356
- factor: 0.514444,
57357
- offset: 0
57358
- },
57359
- "mm/h": {
57360
- dimension: "precipitation-rate",
57361
- factor: 1,
57362
- offset: 0
57363
- },
57364
- "in/h": {
57365
- dimension: "precipitation-rate",
57366
- factor: 25.4,
57367
- offset: 0
57368
- },
57369
- m: {
57370
- dimension: "length",
57371
- factor: 1,
57372
- offset: 0
57373
- },
57374
- mm: {
57375
- dimension: "length",
57376
- factor: 1e-3,
57377
- offset: 0
57378
- },
57379
- cm: {
57380
- dimension: "length",
57381
- factor: 0.01,
57382
- offset: 0
57383
- },
57384
- km: {
57385
- dimension: "length",
57386
- factor: 1e3,
57387
- offset: 0
57388
- },
57389
- in: {
57390
- dimension: "length",
57391
- factor: 0.0254,
57392
- offset: 0
57393
- },
57394
- ft: {
57395
- dimension: "length",
57396
- factor: 0.3048,
57397
- offset: 0
57398
- },
57399
- mi: {
57400
- dimension: "length",
57401
- factor: 1609.344,
57402
- offset: 0
57403
- },
57404
- lx: {
57405
- dimension: "illuminance",
57406
- factor: 1,
57407
- offset: 0
57408
- },
57409
- "W/m\xB2": {
57410
- dimension: "irradiance",
57411
- factor: 1,
57412
- offset: 0
57413
- },
57414
- W: {
57415
- dimension: "power",
57416
- factor: 1,
57417
- offset: 0
57418
- },
57419
- kW: {
57420
- dimension: "power",
57421
- factor: 1e3,
57422
- offset: 0
57423
- },
57424
- VA: {
57425
- dimension: "apparent-power",
57426
- factor: 1,
57427
- offset: 0
57428
- },
57429
- Wh: {
57430
- dimension: "energy",
57431
- factor: 1,
57432
- offset: 0
57433
- },
57434
- kWh: {
57435
- dimension: "energy",
57436
- factor: 1e3,
57437
- offset: 0
57438
- },
57439
- MWh: {
57440
- dimension: "energy",
57441
- factor: 1e6,
57442
- offset: 0
57443
- },
57444
- V: {
57445
- dimension: "voltage",
57446
- factor: 1,
57447
- offset: 0
57448
- },
57449
- mV: {
57450
- dimension: "voltage",
57451
- factor: 1e-3,
57452
- offset: 0
57453
- },
57454
- A: {
57455
- dimension: "current",
57456
- factor: 1,
57457
- offset: 0
57458
- },
57459
- mA: {
57460
- dimension: "current",
57461
- factor: 1e-3,
57462
- offset: 0
57463
- },
57464
- ppm: {
57465
- dimension: "concentration-volume",
57466
- factor: 1,
57467
- offset: 0
57468
- },
57469
- ppb: {
57470
- dimension: "concentration-volume",
57471
- factor: 1e-3,
57472
- offset: 0
57473
- },
57474
- "\xB5g/m\xB3": {
57475
- dimension: "concentration-mass",
57476
- factor: 1,
57477
- offset: 0
57478
- },
57479
- "mg/m\xB3": {
57480
- dimension: "concentration-mass",
57481
- factor: 1e3,
57482
- offset: 0
57483
- },
57484
- kg: {
57485
- dimension: "mass",
57486
- factor: 1,
57487
- offset: 0
57488
- },
57489
- g: {
57490
- dimension: "mass",
57491
- factor: 1e-3,
57492
- offset: 0
57493
- },
57494
- lb: {
57495
- dimension: "mass",
57496
- factor: 0.453592,
57497
- offset: 0
57498
- },
57499
- oz: {
57500
- dimension: "mass",
57501
- factor: 0.0283495,
57502
- offset: 0
57503
- },
57504
- "%": {
57505
- dimension: "percentage",
57506
- factor: 1,
57507
- offset: 0
57508
- }
57509
- };
57510
57896
  var MB = 1024 * 1024;
57511
57897
  var DEFAULT_POOL_MEMORY_POLICY = {
57512
57898
  sampleIntervalMs: 6e4,