@camstack/addon-post-analysis 1.2.610 → 1.2.612

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.
Files changed (15) hide show
  1. package/dist/{clip-model-registry-B1BMbjlk.js → clip-model-registry-C7WMvftu.js} +729 -141
  2. package/dist/{clip-model-registry-CHMOaqp1.mjs → clip-model-registry-JH4cTI06.mjs} +706 -142
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Cv1RqnQj.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DQE_Wu6_.mjs} +3 -3
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-7dLQKt_H.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DbUPeg6m.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-vT2SQQV2.mjs → hostInit-Bl6Zvb1p.mjs} +3 -3
  10. package/dist/pipeline-analytics/index.js +68007 -67085
  11. package/dist/pipeline-analytics/index.mjs +77067 -76144
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DyXzqvY7.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Cm7pZeMH.mjs +0 -26
@@ -5612,7 +5612,7 @@ var ZodIssueCode = {
5612
5612
  var ZodFirstPartyTypeKind;
5613
5613
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5614
5614
  //#endregion
5615
- //#region ../types/dist/sleep-BxjU_fJM.mjs
5615
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5616
5616
  /**
5617
5617
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5618
5618
  * window to float samples (D455).
@@ -7995,9 +7995,9 @@ function normalizeAddonInitResult(result) {
7995
7995
  return result;
7996
7996
  }
7997
7997
  /**
7998
- * The share-view scope kinds a `csv_*` share token can carry. The hub mints
7999
- * and validates them (`share-token.service.ts` builds its enum from this
8000
- * list); a data plane names the kinds it ACCEPTS in `share`.
7998
+ * The share-view scope kinds a share-link token can carry. The hub mints
7999
+ * and validates them (`ShareViewGrantSchema` builds its
8000
+ * enum from this list); a data plane names the kinds it ACCEPTS in `share`.
8001
8001
  */
8002
8002
  var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
8003
8003
  /** The wire shape of {@link PeerBytesTicket} — see the type for what it is. */
@@ -13975,7 +13975,7 @@ var ConvertResultSchema = object({
13975
13975
  * `super_admin` — collapsed onto the single boolean because every
13976
13976
  * non-admin caller is governed by the same scope-check rules; the
13977
13977
  * distinction was only ever used to route role-specific procedures
13978
- * which we no longer have. CLI / webhook integrations are `cst_*` tokens
13978
+ * which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
13979
13979
  * with `isAdmin: false` + an explicit scope list.
13980
13980
  */
13981
13981
  /** Per-method access flavour. Materialised on every cap method via codegen. */
@@ -14164,10 +14164,12 @@ var AddonRoutesScopeSchema = object({
14164
14164
  type: literal("addon-routes"),
14165
14165
  access: array(MethodAccessSchema).min(1)
14166
14166
  });
14167
+ var PreferencesSelfScopeSchema = object({ type: literal("preferences-self") });
14167
14168
  var CredentialScopeSchema = union([
14168
14169
  literal("*"),
14169
14170
  ShareViewScopeSchema,
14170
14171
  AddonRoutesScopeSchema,
14172
+ PreferencesSelfScopeSchema,
14171
14173
  TokenScopeSchema
14172
14174
  ]);
14173
14175
  object({
@@ -14176,6 +14178,55 @@ object({
14176
14178
  jti: string().min(16),
14177
14179
  scopes: array(CredentialScopeSchema).min(1)
14178
14180
  });
14181
+ var PreferenceNamespaceSchema = string().regex(/^[a-z][a-z0-9.-]{0,63}$/);
14182
+ /** A namespace's value: a JSON object, opaque to the hub. */
14183
+ var PreferenceValueSchema = record(string(), unknown());
14184
+ var PreferenceDeviceIdSchema = string().min(1).max(64);
14185
+ /** A stored row, as the owner reads it. */
14186
+ var PreferenceRowSchema = object({
14187
+ namespace: PreferenceNamespaceSchema,
14188
+ value: PreferenceValueSchema,
14189
+ /** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
14190
+ revision: number().int().positive(),
14191
+ updatedAt: number().int(),
14192
+ /** The client id the last writer sent; `null` when it sent none. */
14193
+ updatedByDevice: PreferenceDeviceIdSchema.nullable()
14194
+ });
14195
+ object({
14196
+ /** Absent: every namespace the caller holds. */
14197
+ namespaces: array(PreferenceNamespaceSchema).max(32).optional() });
14198
+ object({ rows: array(PreferenceRowSchema) });
14199
+ object({
14200
+ namespace: PreferenceNamespaceSchema,
14201
+ value: PreferenceValueSchema,
14202
+ /**
14203
+ * The revision the edit was based on. Absent: last write wins. `0`: the
14204
+ * namespace must not exist yet. Any other value that is not the current
14205
+ * revision answers `conflict` and writes nothing.
14206
+ */
14207
+ baseRevision: number().int().nonnegative().optional(),
14208
+ deviceId: PreferenceDeviceIdSchema.optional()
14209
+ });
14210
+ discriminatedUnion("status", [object({
14211
+ status: literal("saved"),
14212
+ row: PreferenceRowSchema
14213
+ }), object({
14214
+ status: literal("conflict"),
14215
+ current: PreferenceRowSchema.nullable()
14216
+ })]);
14217
+ object({ namespace: PreferenceNamespaceSchema });
14218
+ object({
14219
+ /** `false` when the namespace did not exist. */
14220
+ deleted: boolean() });
14221
+ object({
14222
+ /** The revision the client holds per namespace; a namespace it does not list is new to it. */
14223
+ revisionByNamespace: record(PreferenceNamespaceSchema, number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
14224
+ object({
14225
+ /** Every row whose revision differs from the client's, and every row it did not list. */
14226
+ rows: array(PreferenceRowSchema),
14227
+ /** Namespaces the client listed that no longer exist. */
14228
+ deleted: array(PreferenceNamespaceSchema)
14229
+ });
14179
14230
  _enum(["new-session", "step-up"]);
14180
14231
  /** The languages the hub's app landing pages are written in (D858). */
14181
14232
  var AppPageLangSchema = _enum(["en", "it"]);
@@ -18459,7 +18510,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
18459
18510
  kind: literal("node"),
18460
18511
  nodeId: string().min(1)
18461
18512
  })]);
18513
+ /**
18514
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
18515
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
18516
+ * meaning); a rollup keeps the time spent in each state (`states`).
18517
+ */
18462
18518
  var DeviceHistoryKindSchema = _enum([
18519
+ "gauge",
18520
+ "counter",
18521
+ "boolean",
18522
+ "enum"
18523
+ ]);
18524
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
18525
+ var DeviceHistoryProducerKindSchema = _enum([
18463
18526
  "gauge",
18464
18527
  "counter",
18465
18528
  "boolean"
@@ -18496,7 +18559,13 @@ var SeriesInfoSchema = object({
18496
18559
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
18497
18560
  unit: string().nullable(),
18498
18561
  displayName: string(),
18499
- source: _enum(["cap", "addon"]),
18562
+ source: _enum([
18563
+ "cap",
18564
+ "addon",
18565
+ "derived"
18566
+ ]),
18567
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
18568
+ values: array(string()).readonly().nullable(),
18500
18569
  firstTs: number(),
18501
18570
  lastTs: number()
18502
18571
  });
@@ -18510,17 +18579,31 @@ var QueryPointSchema = object({
18510
18579
  twMean: number().nullable(),
18511
18580
  min: number(),
18512
18581
  max: number(),
18513
- /** `null` is unknown, never zero (D393). */
18514
- last: number().nullable()
18582
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
18583
+ last: number().nullable(),
18584
+ /**
18585
+ * The increase over the point: a `counter`'s growth since the previous point
18586
+ * or bucket (a drop is a reset, counted from zero), and for
18587
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
18588
+ * every other kind, and when it cannot be known.
18589
+ */
18590
+ delta: number().nullable(),
18591
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
18592
+ state: string().nullable(),
18593
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
18594
+ states: record(string(), number()).nullable()
18515
18595
  });
18516
18596
  var QuerySeriesSchema = object({
18517
18597
  scope: string(),
18518
18598
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
18519
18599
  before: object({
18520
18600
  t: number(),
18521
- value: number().nullable()
18601
+ value: number().nullable(),
18602
+ state: string().nullable()
18522
18603
  }).nullable(),
18523
- points: array(QueryPointSchema).readonly()
18604
+ points: array(QueryPointSchema).readonly(),
18605
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
18606
+ derivedFrom: string().nullable()
18524
18607
  });
18525
18608
  /** The window part of a query, shared by the device and node forms. */
18526
18609
  var QueryWindowShape = {
@@ -18536,6 +18619,23 @@ var QueryResultSchema = object({
18536
18619
  series: array(QuerySeriesSchema).readonly(),
18537
18620
  truncated: boolean()
18538
18621
  });
18622
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
18623
+ var QueryManyItemSchema = union([object({
18624
+ deviceId: number().int(),
18625
+ key: string(),
18626
+ scope: string().optional()
18627
+ }), object({
18628
+ forNodeId: string().min(1),
18629
+ key: string(),
18630
+ scope: string().optional()
18631
+ })]);
18632
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
18633
+ ok: literal(true),
18634
+ result: QueryResultSchema
18635
+ }), object({
18636
+ ok: literal(false),
18637
+ error: string()
18638
+ })]);
18539
18639
  var TierStatusSchema = object({
18540
18640
  tier: DeviceHistoryResolutionSchema,
18541
18641
  /** `null` until the first background count answered. */
@@ -18591,16 +18691,22 @@ var DeviceHistoryStatusSchema = object({
18591
18691
  lastRefreshAt: number().nullable()
18592
18692
  })
18593
18693
  });
18594
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
18694
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
18595
18695
  deviceId: number().int(),
18596
18696
  ...QueryWindowShape
18597
18697
  }), QueryResultSchema), method(object({
18598
- nodeId: string().min(1),
18698
+ forNodeId: string().min(1),
18599
18699
  ...QueryWindowShape
18600
18700
  }), QueryResultSchema, { auth: "admin" }), method(object({
18701
+ items: array(QueryManyItemSchema).min(1).max(24),
18702
+ from: QueryWindowShape.from,
18703
+ to: QueryWindowShape.to,
18704
+ resolution: QueryWindowShape.resolution,
18705
+ maxPoints: QueryWindowShape.maxPoints
18706
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
18601
18707
  name: string().regex(/^[a-z0-9-]+$/),
18602
18708
  subjectKind: _enum(["device", "node"]),
18603
- kind: DeviceHistoryKindSchema,
18709
+ kind: DeviceHistoryProducerKindSchema,
18604
18710
  unit: string().optional(),
18605
18711
  displayName: string().min(1),
18606
18712
  ingest: _enum(["points", "buckets"])
@@ -41498,38 +41604,37 @@ method(LlmRuntimeCompleteInputSchema, LlmGenerateResultSchema, {
41498
41604
  auth: "admin",
41499
41605
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
41500
41606
  });
41607
+ var LlmProfileKindSchema = string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "a kind id is lower-case letters, digits and dashes");
41608
+ /** What a model (or, by default, every model of a kind) can do. */
41609
+ var LlmModelFeaturesSchema = object({
41610
+ vision: boolean(),
41611
+ tools: boolean(),
41612
+ streaming: boolean()
41613
+ });
41614
+ /** One model a provider offers. `features` overrides the kind's defaults, per field. */
41615
+ var LlmModelInfoSchema = object({
41616
+ id: string(),
41617
+ label: string().optional(),
41618
+ contextLength: number().int().positive().optional(),
41619
+ features: LlmModelFeaturesSchema.partial().optional()
41620
+ });
41501
41621
  /**
41502
- * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
41503
- * methods concat-fan across providers; single-row methods route to ONE
41504
- * provider by the `addonId` in the call input (the notification-output
41505
- * posture, notification-output.cap.ts:215-250). Provided by `addon-ai`
41506
- * (hub-placed); the cap stays open for future providers.
41507
- *
41508
- * Profiles are ROWS (data), not addons: one row = one usable model endpoint.
41509
- * `apiKey` is a password field — providers REDACT it on read and merge on
41510
- * write; a stored key NEVER round-trips to a client.
41622
+ * The provider-specific part of a profile, validated by the provider that owns
41623
+ * the kind (`upsertProfile` refuses what it does not accept). A field its
41624
+ * `connectionSchema` declares `type: 'password'` is a secret: it is held in the
41625
+ * keychain, never in the row, and reads back as the redaction marker.
41511
41626
  */
41512
- var LlmProfileKindSchema = _enum([
41513
- "openai-compatible",
41514
- "openai",
41515
- "anthropic",
41516
- "google",
41517
- "managed-local",
41518
- "apple-foundation"
41519
- ]);
41627
+ var LlmProviderConfigSchema = record(string(), unknown());
41520
41628
  var LlmProfileSchema = object({
41521
41629
  id: string(),
41522
41630
  name: string(),
41631
+ /** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
41523
41632
  kind: LlmProfileKindSchema,
41524
41633
  /** Stamped by the provider — keeps the fanned catalog routable. */
41525
41634
  addonId: string(),
41526
41635
  enabled: boolean(),
41527
41636
  /** Vendor model id, or the managed runtime's loaded model. */
41528
41637
  model: string(),
41529
- /** Required for openai-compatible; override for cloud kinds. */
41530
- baseUrl: string().optional(),
41531
- /** ConfigUISchema type:'password' — never round-trips (spec §5). */
41532
- apiKey: string().optional(),
41533
41638
  /** Vision on/off. A vision call against a `false` profile is REFUSED, never
41534
41639
  * degraded to text — that shipped once and produced a confident answer to a
41535
41640
  * question about a picture nobody sent. */
@@ -41537,15 +41642,11 @@ var LlmProfileSchema = object({
41537
41642
  temperature: number().min(0).max(2).optional(),
41538
41643
  /** Nucleus sampling. Every wire we speak has it. */
41539
41644
  topP: number().min(0).max(1).optional(),
41540
- /** Top-k sampling. Carried only by the wires that have it — NEITHER OpenAI
41541
- * wire does, and the client drops it there (measured: the request body gets
41542
- * `top_p` and no `top_k`). The profile editor hides the field wherever it
41543
- * would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
41645
+ /** Top-k sampling. Carried only by the wires that have it — a kind offers the
41646
+ * field in its editor only when its descriptor lists it in `profileFields`. */
41544
41647
  topK: number().int().positive().optional(),
41545
41648
  maxTokens: number().int().positive().optional(),
41546
- /** Prompt context window. Advisory for cloud kinds (they enforce their own);
41547
- * for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
41548
- * the model with, so it is the one field that changes a PROCESS. */
41649
+ /** Prompt context window. Advisory for cloud kinds (they enforce their own). */
41549
41650
  contextLength: number().int().positive().optional(),
41550
41651
  /** Default system prompt. A caller's `system` REPLACES it (never appends —
41551
41652
  * two system prompts fighting is worse than either alone). */
@@ -41571,16 +41672,37 @@ var LlmProfileSchema = object({
41571
41672
  * library; the REGISTRY of callable tools is ours and is empty in v1, so a
41572
41673
  * `true` here buys the wiring, not behaviour, until tools are registered. */
41573
41674
  toolsEnabled: boolean().default(false),
41574
- extraHeaders: record(string(), string()).optional(),
41575
- /** kind === 'managed-local' only (spec §4). */
41576
- runtime: ManagedRuntimeConfigSchema.optional(),
41577
- /**
41578
- * kind === 'apple-foundation' only: WHERE it runs — the only thing there is
41579
- * to configure (no key, no URL, no download; `model` is `apple-system`).
41580
- * `supportsVision` on such a row is stamped by the provider from the node's
41581
- * reported `imageInput`, never taken from the operator (D62).
41582
- */
41583
- appleFoundation: object({ nodeId: string() }).optional()
41675
+ /** Everything the kind's provider owns (endpoint, key, node, runtime…). */
41676
+ providerConfig: LlmProviderConfigSchema.default({})
41677
+ });
41678
+ /**
41679
+ * The common profile fields a kind's editor offers. The editor owns how each
41680
+ * one is drawn; the provider says which of them mean something on its wire.
41681
+ */
41682
+ var LlmProfileFieldSchema = _enum([
41683
+ "temperature",
41684
+ "topP",
41685
+ "topK",
41686
+ "maxTokens",
41687
+ "contextLength",
41688
+ "systemPrompt",
41689
+ "timeoutMs",
41690
+ "connectTimeoutMs",
41691
+ "firstTokenTimeoutMs",
41692
+ "idleTimeoutMs",
41693
+ "retry",
41694
+ "toolsEnabled"
41695
+ ]);
41696
+ /**
41697
+ * A provider-drawn part of the editor, by a generic widget id the admin UI
41698
+ * registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
41699
+ * picker: that widget owns the model choice.
41700
+ */
41701
+ var LlmProviderWidgetSchema = object({
41702
+ id: string(),
41703
+ placement: _enum(["connection", "model"]),
41704
+ /** `providerConfig` keys this widget must fill before the profile can be saved. */
41705
+ requires: array(string()).optional()
41584
41706
  });
41585
41707
  /** ConfigUISchema tree passed through untyped on the wire (the
41586
41708
  * notification-output `ConfigSchemaPassthrough` precedent at
@@ -41589,11 +41711,56 @@ var ConfigSchemaPassthrough$3 = unknown();
41589
41711
  var LlmProfileKindDescriptorSchema = object({
41590
41712
  kind: LlmProfileKindSchema,
41591
41713
  label: string(),
41714
+ /** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
41592
41715
  icon: string(),
41593
41716
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
41594
41717
  addonId: string(),
41595
- configSchema: ConfigSchemaPassthrough$3
41718
+ /** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
41719
+ connectionSchema: ConfigSchemaPassthrough$3,
41720
+ /** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
41721
+ advancedSchema: ConfigSchemaPassthrough$3.optional(),
41722
+ /** The kind's defaults; a model from `listModels` may override any of them. */
41723
+ features: LlmModelFeaturesSchema,
41724
+ /** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
41725
+ visionEditable: boolean(),
41726
+ /** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
41727
+ modelCatalog: _enum([
41728
+ "fetch",
41729
+ "static",
41730
+ "none"
41731
+ ]),
41732
+ staticModels: array(LlmModelInfoSchema).optional(),
41733
+ /** The common fields that mean something on this kind's wire. */
41734
+ profileFields: array(LlmProfileFieldSchema),
41735
+ providerWidgets: array(LlmProviderWidgetSchema).optional()
41736
+ });
41737
+ /**
41738
+ * `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
41739
+ * (the editor's form); with `profileId` too, a secret the draft leaves
41740
+ * untouched (absent or the redaction marker) is resolved server-side from the
41741
+ * stored profile — the browser never receives it.
41742
+ */
41743
+ var LlmListModelsInputSchema = object({
41744
+ addonId: string(),
41745
+ kind: LlmProfileKindSchema,
41746
+ profileId: string().optional(),
41747
+ connection: LlmProviderConfigSchema.optional()
41596
41748
  });
41749
+ var LlmListModelsErrorCodeSchema = _enum([
41750
+ "auth",
41751
+ "network",
41752
+ "unsupported",
41753
+ "invalid"
41754
+ ]);
41755
+ /** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
41756
+ var LlmListModelsResultSchema = discriminatedUnion("ok", [object({
41757
+ ok: literal(true),
41758
+ models: array(LlmModelInfoSchema)
41759
+ }), object({
41760
+ ok: literal(false),
41761
+ code: LlmListModelsErrorCodeSchema,
41762
+ message: string()
41763
+ })]);
41597
41764
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
41598
41765
  var LlmDefaultSchema = object({
41599
41766
  selector: LlmDefaultSelectorSchema,
@@ -41693,7 +41860,10 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
41693
41860
  kind: "mutation",
41694
41861
  auth: "admin",
41695
41862
  timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
41696
- }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
41863
+ }), method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
41864
+ kind: "mutation",
41865
+ auth: "admin"
41866
+ }), method(object({}), array(LlmDefaultSchema)), method(object({
41697
41867
  selector: LlmDefaultSelectorSchema,
41698
41868
  profileId: string().nullable()
41699
41869
  }), _void(), {
@@ -41861,14 +42031,106 @@ var LogEntrySchema = object({
41861
42031
  meta: record(string(), unknown()).optional(),
41862
42032
  tags: record(string(), string()).optional()
41863
42033
  });
41864
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
41865
- scope: array(string()).optional(),
42034
+ /**
42035
+ * A history READ against one destination (D898).
42036
+ *
42037
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
42038
+ * browser applied after the limit is what made a rare device's lines
42039
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
42040
+ * minted (opaque to everyone else): a file position for the rotated files, a
42041
+ * nanosecond timestamp for Loki.
42042
+ *
42043
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
42044
+ * store answers `done: false` with the cursor it reached and the bytes it
42045
+ * scanned, and the caller decides whether to go on. That is what makes a long
42046
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
42047
+ * flight, and not asking for the next slice ends the scan.
42048
+ */
42049
+ var LogReadQuerySchema = object({
42050
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
42051
+ requestId: string().min(1).max(64).optional(),
42052
+ /** The device the line is about (`tags.deviceId`, numeric). */
42053
+ deviceId: number().int().optional(),
42054
+ /**
42055
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
42056
+ * match. Not `addonId`: a cap router reads that name as "which provider".
42057
+ */
42058
+ fromAddonId: string().min(1).max(200).optional(),
42059
+ /**
42060
+ * The emitting node: matches the agent that emitted the line, the node
42061
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
42062
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
42063
+ * name as "which node's provider".
42064
+ */
42065
+ fromNodeId: string().min(1).max(200).optional(),
42066
+ /** Any other tag, exact match (AND). */
42067
+ tags: record(string(), union([string(), number()])).optional(),
42068
+ /** Severity FLOOR: this level and above. */
41866
42069
  level: LogLevelSchema.optional(),
41867
- since: date().optional(),
41868
- until: date().optional(),
41869
- limit: number().optional(),
41870
- tags: record(string(), string()).optional()
41871
- }), array(LogEntrySchema).readonly());
42070
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
42071
+ text: string().min(1).max(200).optional(),
42072
+ /** Epoch ms, inclusive. */
42073
+ since: number().optional(),
42074
+ /** Epoch ms, inclusive. */
42075
+ until: number().optional(),
42076
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
42077
+ before: string().min(1).max(1024).optional(),
42078
+ /** Newer than this cursor (exclusive). */
42079
+ after: string().min(1).max(1024).optional(),
42080
+ limit: number().int().min(1).max(1e3).optional(),
42081
+ /** Wall-clock bound of this slice. The provider caps it. */
42082
+ budgetMs: number().int().min(50).max(1e4).optional()
42083
+ });
42084
+ var LogReadResultSchema = object({
42085
+ /** Newest first. */
42086
+ entries: array(object({
42087
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
42088
+ id: string().optional(),
42089
+ /** Epoch ms. */
42090
+ timestamp: number(),
42091
+ level: LogLevelSchema,
42092
+ scope: string().optional(),
42093
+ message: string(),
42094
+ tags: record(string(), union([string(), number()])).optional(),
42095
+ meta: record(string(), unknown()).optional()
42096
+ })),
42097
+ /** Pass as `before` for the next older page; null when nothing older exists. */
42098
+ nextBefore: string().nullable(),
42099
+ /** Pass as `after` to read what arrived since; null when unknown. */
42100
+ nextAfter: string().nullable(),
42101
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
42102
+ scannedBytes: number().int().nonnegative(),
42103
+ /**
42104
+ * True when the scan in this direction reached the end of the store.
42105
+ * False with fewer than `limit` entries means the budget ran out first —
42106
+ * call again with `nextBefore` to go on.
42107
+ */
42108
+ done: boolean(),
42109
+ /** True when `cancelRead` ended this slice early. */
42110
+ cancelled: boolean().optional()
42111
+ });
42112
+ var LogReadCapabilitiesSchema = object({
42113
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
42114
+ readable: boolean(),
42115
+ /** Why not, when `readable` is false — rendered next to the source. */
42116
+ reason: string().nullable(),
42117
+ /** Filters the provider applies itself. A false one is applied by nobody. */
42118
+ filters: object({
42119
+ deviceId: boolean(),
42120
+ addonId: boolean(),
42121
+ nodeId: boolean(),
42122
+ tags: boolean(),
42123
+ level: boolean(),
42124
+ text: boolean(),
42125
+ timeRange: boolean()
42126
+ }),
42127
+ /** How far back the store reaches, when the provider knows (days). */
42128
+ retentionDays: number().nullable()
42129
+ });
42130
+ method(LogEntrySchema, _void(), { kind: "mutation" }), optionalMethod(_void(), LogReadCapabilitiesSchema, { auth: "admin" }), optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }), optionalMethod(object({ requestId: string().min(1).max(64) }), object({ cancelled: boolean() }), {
42131
+ kind: "mutation",
42132
+ auth: "admin"
42133
+ });
41872
42134
  /**
41873
42135
  * `login-method` — collection cap through which auth addons contribute
41874
42136
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -43617,9 +43879,11 @@ var alarmPanelCapability = {
43617
43879
  */
43618
43880
  durability: "restored",
43619
43881
  /**
43620
- * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
43882
+ * History (D850): the panel's lifecycle state as an `enum` series —
43883
+ * change-only, no floor, so an `arming -> pending -> triggered` sequence of a
43884
+ * few seconds keeps every step. Who armed it stays in the events ledger.
43621
43885
  */
43622
- history: "none",
43886
+ history: { fields: { state: { kind: "enum" } } },
43623
43887
  /** Clock fields: written, but excluded from the compare that decides
43624
43888
  * whether persisting is worth a SQLite commit. */
43625
43889
  volatileStateFields: ["lastChangedAt"]
@@ -44541,6 +44805,33 @@ var NcRuleTargetSchema = object({
44541
44805
  params: record(string(), unknown()).optional()
44542
44806
  });
44543
44807
  /**
44808
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
44809
+ *
44810
+ * Every mode starts from the same CLEAN source frame of the trigger moment
44811
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
44812
+ * to the zone that fired the rule) and renders it once at send time:
44813
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
44814
+ * colour and every OTHER track visible at that instant outlined thin, each
44815
+ * labelled with class and confidence ("dog 87%").
44816
+ * - `crop` — the subject cut out of that frame around its box at that instant.
44817
+ * - `clean` — the whole scene with nothing drawn on it.
44818
+ * - `none` — no picture.
44819
+ *
44820
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
44821
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
44822
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
44823
+ * ship a crop on one event and a boxed scene on the next depending on which
44824
+ * stored kind had landed.
44825
+ */
44826
+ var NcMediaImageSchema = _enum([
44827
+ "scene-boxes",
44828
+ "crop",
44829
+ "clean",
44830
+ "none"
44831
+ ]);
44832
+ /**
44833
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
44834
+ *
44544
44835
  * Media attachment policy (P1 still-image subset).
44545
44836
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
44546
44837
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -44554,6 +44845,8 @@ var NcRuleTargetSchema = object({
44554
44845
  * - `none` — no attachment.
44555
44846
  */
44556
44847
  /**
44848
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
44849
+ *
44557
44850
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
44558
44851
  * conflate it with the selection strategy and betray the request: asking for
44559
44852
  * the clean scene frame on an object-event owner used to start at
@@ -44600,16 +44893,29 @@ var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
44600
44893
  var NC_CLIP_PRE_ROLL_DEFAULT_SEC = 4;
44601
44894
  var NC_CLIP_POST_ROLL_DEFAULT_SEC = 6;
44602
44895
  var NcMediaPolicySchema = object({
44896
+ /**
44897
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
44898
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
44899
+ * triple below, at load and at every write, and the store keeps only this.
44900
+ */
44901
+ image: NcMediaImageSchema.optional(),
44902
+ /**
44903
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
44904
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
44905
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
44906
+ * Replaces `zoneCrop`.
44907
+ */
44908
+ showTriggerZone: boolean().optional(),
44909
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
44603
44910
  attach: _enum([
44604
44911
  "best",
44605
44912
  "best-matching",
44606
44913
  "keyFrame",
44607
44914
  "none"
44608
- ]).default("best"),
44609
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
44915
+ ]).optional(),
44916
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
44610
44917
  frame: NcMediaFrameSchema.optional(),
44611
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
44612
- * "show me the ZONE", not the whole scene or the subject crop. */
44918
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
44613
44919
  zoneCrop: boolean().optional(),
44614
44920
  /**
44615
44921
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -44795,7 +45101,9 @@ var NcRuleInputSchema = object({
44795
45101
  * targets.
44796
45102
  */
44797
45103
  targetUsers: array(string()).optional(),
44798
- media: NcMediaPolicySchema.default({ attach: "best" }),
45104
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
45105
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
45106
+ media: NcMediaPolicySchema.default({}),
44799
45107
  throttle: NcThrottleSchema.default({
44800
45108
  cooldownSec: 60,
44801
45109
  scope: "rule-device"
@@ -46330,13 +46638,37 @@ var NcAlarmModeOpeningsSchema = object({
46330
46638
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
46331
46639
  unknown: array(number().int())
46332
46640
  });
46641
+ /**
46642
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
46643
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
46644
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
46645
+ * never looks fully armed (D62: off must never look like broken).
46646
+ */
46647
+ var NcAlarmInputBypassViewSchema = object({
46648
+ ruleId: string(),
46649
+ /** The rule's current name (its frozen name when the rule is gone). */
46650
+ ruleName: string(),
46651
+ /** The input: the sensor of the match, else its camera. */
46652
+ deviceId: number().int(),
46653
+ /** The input's current name. */
46654
+ name: string(),
46655
+ /** When it was bypassed (ms epoch). */
46656
+ since: number(),
46657
+ /** Triggers from this input dropped since. */
46658
+ dropped: number().int().min(0)
46659
+ });
46333
46660
  var NcAlarmLiveSchema = object({
46334
46661
  state: AlarmStateSchema,
46335
46662
  /** The mode being armed into (exit delay) or held; null when disarmed. */
46336
46663
  targetMode: AlarmArmModeSchema.nullable(),
46337
46664
  availableModes: array(AlarmArmModeSchema),
46338
46665
  openings: array(NcAlarmModeOpeningsSchema),
46339
- exclusions: array(NcAlarmExclusionViewSchema)
46666
+ exclusions: array(NcAlarmExclusionViewSchema),
46667
+ /**
46668
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
46669
+ * Defaulted so an older hub answer still parses (as "none known").
46670
+ */
46671
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
46340
46672
  });
46341
46673
  var NcAlarmConfigSchema = object({
46342
46674
  /**
@@ -58246,9 +58578,11 @@ var connectivityCapability = {
58246
58578
  */
58247
58579
  durability: "restored",
58248
58580
  /**
58249
- * History (D850): none — duplicates device-status.online (one authority for availability).
58581
+ * History (D850): `connected` as a boolean series — change-only, no floor. It
58582
+ * is the upstream entity's own link (a HA connectivity sensor), not the
58583
+ * device's reachability, which stays `device-status.online`.
58250
58584
  */
58251
- history: "none",
58585
+ history: { fields: { connected: { kind: "boolean" } } },
58252
58586
  /** Clock fields: written, but excluded from the compare that decides
58253
58587
  * whether persisting is worth a SQLite commit. */
58254
58588
  volatileStateFields: ["lastChangedAt"]
@@ -59094,11 +59428,22 @@ var dishwasherCapability = {
59094
59428
  },
59095
59429
  runtimeState: DishwasherStatusSchema,
59096
59430
  durability: "session",
59097
- history: { fields: { progressPercent: {
59098
- kind: "gauge",
59099
- unit: "%",
59100
- deadband: 2
59101
- } } }
59431
+ history: { fields: {
59432
+ progressPercent: {
59433
+ kind: "gauge",
59434
+ unit: "%",
59435
+ deadband: 2
59436
+ },
59437
+ state: { kind: "enum" },
59438
+ operationState: { kind: "enum" },
59439
+ remainingSeconds: {
59440
+ kind: "gauge",
59441
+ unit: "s",
59442
+ minIntervalMs: 6e4
59443
+ },
59444
+ doorOpen: { kind: "boolean" },
59445
+ powerOn: { kind: "boolean" }
59446
+ } }
59102
59447
  };
59103
59448
  var DoorbellStatusSchema = object({
59104
59449
  /** Ms epoch of the last press. null = never observed since this provider started. */
@@ -59215,9 +59560,15 @@ var enumSensorCapability = {
59215
59560
  */
59216
59561
  durability: "restored",
59217
59562
  /**
59218
- * History (D850): none — text/enum state has no history (non-goal).
59563
+ * History (D850): the value as an `enum` series (an appliance's program or
59564
+ * operation state, an HVAC action). The option set is per device, so the
59565
+ * value list is LEARNED as values are first seen (bounded). A sensor with a
59566
+ * `format` carries a timestamp, not a state, and is not recorded.
59219
59567
  */
59220
- history: "none",
59568
+ history: { fields: { value: {
59569
+ kind: "enum",
59570
+ skipWhenSet: "format"
59571
+ } } },
59221
59572
  /** Clock fields: written, but excluded from the compare that decides
59222
59573
  * whether persisting is worth a SQLite commit. */
59223
59574
  volatileStateFields: ["lastFetchedAt"]
@@ -61251,9 +61602,10 @@ var lockControlCapability = {
61251
61602
  */
61252
61603
  durability: "restored",
61253
61604
  /**
61254
- * History (D850): none — enum state; lock events belong in the events ledger.
61605
+ * History (D850): the lock's state as an `enum` series — change-only, no
61606
+ * floor: a jam or an unlock lasting seconds is the edge an operator looks for.
61255
61607
  */
61256
- history: "none",
61608
+ history: { fields: { state: { kind: "enum" } } },
61257
61609
  /** Clock fields: written, but excluded from the compare that decides
61258
61610
  * whether persisting is worth a SQLite commit. */
61259
61611
  volatileStateFields: ["lastChangedAt"]
@@ -61427,9 +61779,18 @@ var mediaPlayerCapability = {
61427
61779
  */
61428
61780
  durability: "session",
61429
61781
  /**
61430
- * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
61782
+ * History (D850): volume (a level an operator or an automation sets; the
61783
+ * default 10 s floor folds a slider drag into its end value) and mute.
61784
+ * `positionMs` is not recorded: it moves continuously while playing.
61431
61785
  */
61432
- history: "none"
61786
+ history: { fields: {
61787
+ volumeLevel: {
61788
+ kind: "gauge",
61789
+ unit: "%",
61790
+ deadband: 1
61791
+ },
61792
+ isMuted: { kind: "boolean" }
61793
+ } }
61433
61794
  };
61434
61795
  /**
61435
61796
  * mesh-network — collection cap for mesh-VPN providers.
@@ -66831,9 +67192,29 @@ var streamParamsCapability = {
66831
67192
  */
66832
67193
  durability: "restored",
66833
67194
  /**
66834
- * History (D850): none — encoder configuration.
67195
+ * History (D850): the configured bitrate and frame rate of the main and sub
67196
+ * profiles. Configuration, so change-only on the default floor: a point is an
67197
+ * operator's (or a tuner's) edit, which is exactly what a chart of a stream's
67198
+ * quality over time must show.
66835
67199
  */
66836
- history: "none",
67200
+ history: { fields: {
67201
+ "main.bitrate": {
67202
+ kind: "gauge",
67203
+ unit: "kbps"
67204
+ },
67205
+ "main.framerate": {
67206
+ kind: "gauge",
67207
+ unit: "fps"
67208
+ },
67209
+ "sub.bitrate": {
67210
+ kind: "gauge",
67211
+ unit: "kbps"
67212
+ },
67213
+ "sub.framerate": {
67214
+ kind: "gauge",
67215
+ unit: "fps"
67216
+ }
67217
+ } },
66837
67218
  /** Clock fields: written, but excluded from the compare that decides
66838
67219
  * whether persisting is worth a SQLite commit. */
66839
67220
  volatileStateFields: ["lastFetchedAt"]
@@ -67668,26 +68049,6 @@ var ApiKeySummarySchema = object({
67668
68049
  createdAt: number(),
67669
68050
  lastUsedAt: number().optional()
67670
68051
  });
67671
- var ScopedTokenSummarySchema = object({
67672
- id: string(),
67673
- userId: string(),
67674
- name: string(),
67675
- tokenPrefix: string(),
67676
- scopes: array(TokenScopeSchema),
67677
- expiresAt: number().nullish(),
67678
- lastUsedAt: number().nullish(),
67679
- createdAt: number()
67680
- });
67681
- var CreateScopedTokenInputSchema = object({
67682
- userId: string(),
67683
- name: string(),
67684
- scopes: array(TokenScopeSchema),
67685
- expiresAt: number().optional()
67686
- });
67687
- var CreateScopedTokenResultSchema = object({
67688
- token: string(),
67689
- record: ScopedTokenSummarySchema
67690
- });
67691
68052
  var OauthSessionSummarySchema = object({
67692
68053
  id: string(),
67693
68054
  userId: string(),
@@ -67709,11 +68070,11 @@ var TotpStatusSchema = object({
67709
68070
  confirmedAt: number().nullable()
67710
68071
  });
67711
68072
  /**
67712
- * user-management — singleton capability for user accounts, API keys,
67713
- * and scoped tokens.
68073
+ * user-management — singleton capability for user accounts and the
68074
+ * legacy API-key rows.
67714
68075
  *
67715
68076
  * v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
67716
- * — the subset check on `setUserScopes` / `createScopedToken` is moot
68077
+ * — the subset check on `setUserScopes` is moot
67717
68078
  * because non-admins never reach these. If/when we open non-admin
67718
68079
  * delegation, structural caller-scope subset check goes inside the
67719
68080
  * provider.
@@ -67770,15 +68131,7 @@ method(_void(), array(UserSummarySchema), { auth: "admin" }), method(CreateUserI
67770
68131
  kind: "mutation",
67771
68132
  auth: "admin",
67772
68133
  access: "delete"
67773
- }), method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
67774
- kind: "mutation",
67775
- auth: "admin",
67776
- access: "create"
67777
- }), method(object({ id: string() }), object({ success: literal(true) }), {
67778
- kind: "mutation",
67779
- auth: "admin",
67780
- access: "delete"
67781
- }), method(object({ token: string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }), method(object({ userId: string() }), array(ScopedTokenSummarySchema), { auth: "admin" }), method(object({ userId: string() }), TotpSetupResultSchema, {
68134
+ }), method(object({ userId: string() }), TotpSetupResultSchema, {
67782
68135
  kind: "mutation",
67783
68136
  auth: "admin",
67784
68137
  access: "create"
@@ -70092,6 +70445,15 @@ var BaseDevice = class {
70092
70445
  * Drivers can use the `getProbeFlags()` helper to read the flag bag
70093
70446
  * with a typed cast.
70094
70447
  *
70448
+ * Answer what you KNOW. A plain array is read as the complete list only
70449
+ * while this device is `online` and probed; return
70450
+ * `accessoryChildrenUnknown(reason)` whenever you cannot know the list right
70451
+ * now (no credentials, parent not connected, a failed or partial read) —
70452
+ * the kernel then deletes nothing. Return `accessoryChildrenComplete(list)`
70453
+ * to say "connected, and this is the complete list" explicitly. A shrink is
70454
+ * deleted only after a second agreeing complete read on a later probe (D49;
70455
+ * `packages/system/src/kernel/moleculer/accessory-prune-gate.ts`).
70456
+ *
70095
70457
  * Default: no children.
70096
70458
  */
70097
70459
  getAccessoryChildren() {
@@ -73438,7 +73800,7 @@ Object.freeze({
73438
73800
  capName: "llm",
73439
73801
  capScope: "system",
73440
73802
  addonId: null,
73441
- access: "view"
73803
+ access: "create"
73442
73804
  },
73443
73805
  "llm.listNodeModels": {
73444
73806
  capName: "llm",
@@ -73740,7 +74102,19 @@ Object.freeze({
73740
74102
  addonId: null,
73741
74103
  access: "view"
73742
74104
  },
73743
- "logDestination.query": {
74105
+ "logDestination.cancelRead": {
74106
+ capName: "log-destination",
74107
+ capScope: "system",
74108
+ addonId: null,
74109
+ access: "create"
74110
+ },
74111
+ "logDestination.describeRead": {
74112
+ capName: "log-destination",
74113
+ capScope: "system",
74114
+ addonId: null,
74115
+ access: "view"
74116
+ },
74117
+ "logDestination.read": {
73744
74118
  capName: "log-destination",
73745
74119
  capScope: "system",
73746
74120
  addonId: null,
@@ -78102,12 +78476,6 @@ Object.freeze({
78102
78476
  addonId: null,
78103
78477
  access: "create"
78104
78478
  },
78105
- "userManagement.createScopedToken": {
78106
- capName: "user-management",
78107
- capScope: "system",
78108
- addonId: null,
78109
- access: "create"
78110
- },
78111
78479
  "userManagement.createUser": {
78112
78480
  capName: "user-management",
78113
78481
  capScope: "system",
@@ -78156,12 +78524,6 @@ Object.freeze({
78156
78524
  addonId: null,
78157
78525
  access: "view"
78158
78526
  },
78159
- "userManagement.listScopedTokens": {
78160
- capName: "user-management",
78161
- capScope: "system",
78162
- addonId: null,
78163
- access: "view"
78164
- },
78165
78527
  "userManagement.listUsers": {
78166
78528
  capName: "user-management",
78167
78529
  capScope: "system",
@@ -78216,12 +78578,6 @@ Object.freeze({
78216
78578
  addonId: null,
78217
78579
  access: "delete"
78218
78580
  },
78219
- "userManagement.revokeScopedToken": {
78220
- capName: "user-management",
78221
- capScope: "system",
78222
- addonId: null,
78223
- access: "delete"
78224
- },
78225
78581
  "userManagement.setupTotp": {
78226
78582
  capName: "user-management",
78227
78583
  capScope: "system",
@@ -78252,12 +78608,6 @@ Object.freeze({
78252
78608
  addonId: null,
78253
78609
  access: "view"
78254
78610
  },
78255
- "userManagement.validateScopedToken": {
78256
- capName: "user-management",
78257
- capScope: "system",
78258
- addonId: null,
78259
- access: "view"
78260
- },
78261
78611
  "userManagement.verifyTotp": {
78262
78612
  capName: "user-management",
78263
78613
  capScope: "system",
@@ -79771,6 +80121,11 @@ Object.freeze({
79771
80121
  form: "single",
79772
80122
  optional: false
79773
80123
  }],
80124
+ "logDestination.read": [{
80125
+ name: "deviceId",
80126
+ form: "single",
80127
+ optional: true
80128
+ }],
79774
80129
  "mediaPlayer.getStatus": [{
79775
80130
  name: "deviceId",
79776
80131
  form: "single",
@@ -82020,6 +82375,123 @@ function isSystemRuleKind(kind) {
82020
82375
  function systemFamilyOfKind(kind) {
82021
82376
  return isSystemEventFamily(kind) ? kind : void 0;
82022
82377
  }
82378
+ /**
82379
+ * Reasons, written once. Each names the SUBJECT FIELD the engine reads and
82380
+ * finds absent — that is what makes the exclusion checkable against the engine
82381
+ * rather than an opinion about tidiness.
82382
+ */
82383
+ var NO_SENSOR_KIND = "An occupancy edge is not a sensor event: it carries no sensor kind, so this condition can never match one.";
82384
+ var NO_EVENT_TOKEN = "An occupancy edge carries no device event-type token — that comes from an event-emitter slice, which a count crossing has none of.";
82385
+ var NO_SENSOR_EDGE = "An occupancy edge is a count crossing, not a sensor reading: it has no raise or clear, so this choice could never narrow it.";
82386
+ var OCCUPANCY_SOURCE = "An occupancy edge is always produced by the pipeline, so any other source can never match and “pipeline” narrows nothing.";
82387
+ var AUDIO_SOURCE = "A confirmed sound window is always stamped as an audio subject, so any other source can never match.";
82388
+ var SOUND_NOT_A_PICTURE = "A sound rule fires on what the camera HEARD. Its subject carries no detection, so this condition can never match one — name the sounds in the Sound condition instead.";
82389
+ var SOUND_NO_CONFIDENCE = "A sound window’s evidence is a percentage of samples, not a detector score, so a confidence threshold can never be satisfied.";
82390
+ var SOUND_NO_GEOMETRY = "A sound has no position in the frame, so a zone or a drawn polygon can never match it.";
82391
+ var NC_RULE_KIND_SPECS = [
82392
+ {
82393
+ kind: "detection",
82394
+ label: "Conditions",
82395
+ excluded: { audio: "A detection rule fires on what the camera SAW. Sounds are a Sound rule of their own — adding one here turned the rule into a sound rule and dropped every detection condition." },
82396
+ editable: true,
82397
+ carriesMedia: true,
82398
+ carriesSubjectCrop: true
82399
+ },
82400
+ {
82401
+ kind: "sensor",
82402
+ label: "Conditions",
82403
+ /** `occupancy` is still offered here: authoring it converts a sensor rule into an occupancy rule. */
82404
+ excluded: {},
82405
+ editable: true,
82406
+ carriesMedia: true,
82407
+ carriesSubjectCrop: true,
82408
+ blurb: "A doorbell press or a linked sensor changing state. The picture comes from the camera the sensor is attributed to."
82409
+ },
82410
+ {
82411
+ kind: "occupancy",
82412
+ label: "Occupancy",
82413
+ discriminator: "occupancy",
82414
+ excluded: {
82415
+ sensorKinds: NO_SENSOR_KIND,
82416
+ eventTypeTokens: NO_EVENT_TOKEN,
82417
+ sensorTransition: NO_SENSOR_EDGE,
82418
+ source: OCCUPANCY_SOURCE
82419
+ },
82420
+ editable: true,
82421
+ carriesMedia: true,
82422
+ carriesSubjectCrop: true,
82423
+ blurb: "Fires when the count in a camera frame or a zone crosses your threshold and holds. Pick the camera first — the zone list is that camera’s."
82424
+ },
82425
+ {
82426
+ kind: "sound",
82427
+ label: "Sound",
82428
+ discriminator: "audio",
82429
+ excluded: {
82430
+ classes: SOUND_NOT_A_PICTURE,
82431
+ classesExclude: SOUND_NOT_A_PICTURE,
82432
+ minConfidence: SOUND_NO_CONFIDENCE,
82433
+ zones: SOUND_NO_GEOMETRY,
82434
+ zonesExclude: SOUND_NO_GEOMETRY,
82435
+ customZones: SOUND_NO_GEOMETRY,
82436
+ crossing: SOUND_NO_GEOMETRY,
82437
+ labelEquals: SOUND_NOT_A_PICTURE,
82438
+ identities: SOUND_NOT_A_PICTURE,
82439
+ identitiesExclude: SOUND_NOT_A_PICTURE,
82440
+ plates: SOUND_NOT_A_PICTURE,
82441
+ source: AUDIO_SOURCE
82442
+ },
82443
+ editable: true,
82444
+ carriesMedia: true,
82445
+ carriesSubjectCrop: false,
82446
+ blurb: "Fires on a confirmed sampling window of audio, never on a picture. Name the sounds and/or keep a level threshold — with neither it can never match.",
82447
+ mediaBlurb: "A sound owns no frame, so the picture is a photograph of the camera taken at the moment of the match — the whole scene, never a crop. The GIF and the clip are cut around the same instant, from the camera."
82448
+ },
82449
+ {
82450
+ kind: "device-events",
82451
+ label: "Device events",
82452
+ discriminator: "systemEvent",
82453
+ excluded: {},
82454
+ editable: true,
82455
+ carriesMedia: false,
82456
+ carriesSubjectCrop: false,
82457
+ blurb: "A device or its stream going away or coming back, switched off or on, a battery or consumable running low, a camera detecting nothing. There is no frame to attach."
82458
+ },
82459
+ {
82460
+ kind: "system",
82461
+ label: "System events",
82462
+ discriminator: "systemEvent",
82463
+ excluded: {},
82464
+ editable: true,
82465
+ carriesMedia: false,
82466
+ carriesSubjectCrop: false,
82467
+ blurb: "The installation itself: a node leaving, an addon crash-looping, an update available or installed, a backup or an export finishing."
82468
+ },
82469
+ {
82470
+ kind: "alarm",
82471
+ label: "Alarm",
82472
+ discriminator: "systemEvent",
82473
+ excluded: {},
82474
+ editable: true,
82475
+ carriesMedia: false,
82476
+ carriesSubjectCrop: false,
82477
+ blurb: "The alarm panel: refused, arming, armed, entry delay, triggered, re-armed, sensor bypass, disarmed.",
82478
+ mediaBlurb: "An alarm set off by a rule arrives with THAT rule's pictures, combined into one notification. This rule adds none of its own."
82479
+ },
82480
+ {
82481
+ kind: "mixed",
82482
+ label: "To recreate",
82483
+ discriminator: "systemEvent",
82484
+ excluded: {},
82485
+ editable: false,
82486
+ carriesMedia: false,
82487
+ carriesSubjectCrop: false,
82488
+ blurb: "This rule mixes events from more than one family (device events, system, alarm). It keeps firing as it is, but it can no longer be edited: create one rule per family, then delete this one."
82489
+ }
82490
+ ];
82491
+ /** The spec for a kind. Total by construction — every member has an entry. */
82492
+ function ruleKindSpec(kind) {
82493
+ return NC_RULE_KIND_SPECS.find((s) => s.kind === kind) ?? NC_RULE_KIND_SPECS[0];
82494
+ }
82023
82495
  /** The delivery a system rule rides — named once, compared everywhere. */
82024
82496
  var NC_SYSTEM_DELIVERY = "system-event";
82025
82497
  /**
@@ -82137,6 +82609,98 @@ function systemRuleKindOf(condition) {
82137
82609
  return verdict.kind === "family" ? verdict.family : "mixed";
82138
82610
  }
82139
82611
  NC_AUDIO_DEFAULTS.hitPercent, NC_AUDIO_DEFAULTS.samplingSeconds;
82612
+ /** Every mode, in the order an editor offers them. */
82613
+ var NC_MEDIA_IMAGE_MODES = [
82614
+ "scene-boxes",
82615
+ "crop",
82616
+ "clean",
82617
+ "none"
82618
+ ];
82619
+ /**
82620
+ * The modes a rule of this kind can honour. A kind that carries no media gets
82621
+ * none (its row ships text, or — an alarm — its SOURCE rule's picture); a kind
82622
+ * whose subject has no region of the frame (a sound) is never offered `crop`.
82623
+ */
82624
+ function imageModesForKind(kind) {
82625
+ const spec = ruleKindSpec(kind);
82626
+ if (!spec.carriesMedia) return [];
82627
+ return spec.carriesSubjectCrop ? NC_MEDIA_IMAGE_MODES : NC_MEDIA_IMAGE_MODES.filter((mode) => mode !== "crop");
82628
+ }
82629
+ /**
82630
+ * The zone ids that FIRE a rule: its `zones` condition, or an occupancy rule's
82631
+ * own scoped zone. Empty when the trigger is not a zone — and then
82632
+ * `showTriggerZone` has nothing to draw and is refused on save.
82633
+ */
82634
+ function ruleTriggerZoneIds(conditions) {
82635
+ if (conditions.zones !== void 0) return conditions.zones.ids;
82636
+ const zoneId = conditions.occupancy?.zoneId;
82637
+ return zoneId !== void 0 ? [zoneId] : [];
82638
+ }
82639
+ /**
82640
+ * What the legacy triple MEANT, as a mode. `zoneCrop` forced the clean
82641
+ * keyFrame ladder and dropped `frame`, so it is `clean` whatever else was set;
82642
+ * `frame` decided over `attach` when present; `keyFrame` was the clean scene;
82643
+ * every other still (`best`, `best-matching`, the default) was the subject.
82644
+ */
82645
+ function legacyImageMode(media) {
82646
+ if (media.attach === "none") return "none";
82647
+ if (media.zoneCrop === true) return "clean";
82648
+ if (media.frame === "full") return "clean";
82649
+ if (media.frame === "boxed") return "scene-boxes";
82650
+ if (media.frame === "cropped") return "crop";
82651
+ if (media.attach === "keyFrame") return "clean";
82652
+ return "crop";
82653
+ }
82654
+ /** A mode the kind cannot honour, mapped to the nearest one it can. */
82655
+ function clampToKind(mode, kind) {
82656
+ const offered = imageModesForKind(kind);
82657
+ if (offered.length === 0 || offered.includes(mode)) return mode;
82658
+ return mode === "crop" ? "clean" : mode;
82659
+ }
82660
+ /**
82661
+ * The mode a rule's picture is rendered in. `image` when stored; else what the
82662
+ * legacy triple meant — and, for a SENSOR rule written before D897, `clean`
82663
+ * whatever it stored (even `attach: 'none'`), because its stored triple was
82664
+ * ignored and one plain snapshot always shipped (operator ruling, 2026-10-01):
82665
+ * the migration keeps what the rule actually DID. Clamped to what the kind can
82666
+ * honour.
82667
+ */
82668
+ function resolveNcMediaImage(media, kind) {
82669
+ if (media.image !== void 0) return clampToKind(media.image, kind);
82670
+ if (kind === "sensor") return "clean";
82671
+ return clampToKind(legacyImageMode(media), kind);
82672
+ }
82673
+ /**
82674
+ * The stored shape of a media policy: `image` set, the legacy triple gone.
82675
+ * `showTriggerZone` survives only where it can be drawn — a zone trigger and a
82676
+ * mode other than `crop`/`none`; a legacy `zoneCrop` on a zone rule becomes it.
82677
+ * Every other field (gif, clip, rolls, speed, profile, linked cameras) is
82678
+ * carried through untouched. Pure; never throws.
82679
+ */
82680
+ function normalizeNcMediaPolicy(media, rule) {
82681
+ const image = resolveNcMediaImage(media, ruleKindOf(rule));
82682
+ const { attach: _attach, frame: _frame, zoneCrop, showTriggerZone, image: _image, ...rest } = media;
82683
+ const drawable = (showTriggerZone === true || media.image === void 0 && zoneCrop === true) && image !== "crop" && image !== "none" && ruleTriggerZoneIds(rule.conditions).length > 0;
82684
+ return {
82685
+ ...rest,
82686
+ image,
82687
+ ...drawable ? { showTriggerZone: true } : {}
82688
+ };
82689
+ }
82690
+ /**
82691
+ * Why a media policy cannot be SAVED on this rule, or null. Server-side and
82692
+ * editor alike: `showTriggerZone` on a rule whose trigger is not a zone, and a
82693
+ * mode the rule's kind cannot honour.
82694
+ */
82695
+ function ncMediaPolicyError(media, rule) {
82696
+ const kind = ruleKindOf(rule);
82697
+ if (media.image !== void 0) {
82698
+ const offered = imageModesForKind(kind);
82699
+ if (offered.length > 0 && !offered.includes(media.image)) return `media.image '${media.image}' is not available for a ${kind} rule (offered: ${offered.join(", ")})`;
82700
+ }
82701
+ if (media.showTriggerZone === true && ruleTriggerZoneIds(rule.conditions).length === 0) return "media.showTriggerZone needs a rule triggered by a zone (a zones condition or an occupancy zone)";
82702
+ return null;
82703
+ }
82140
82704
  var WEEKDAY_TO_DAY = {
82141
82705
  Sun: 0,
82142
82706
  Mon: 1,
@@ -85810,4 +86374,4 @@ function buildClipModelRegistry(entries) {
85810
86374
  /** The built-in catalog's registry. */
85811
86375
  var BUILTIN_CLIP_MODELS = buildClipModelRegistry(CLIP_IMAGE_MODELS);
85812
86376
  //#endregion
85813
- export { MediaFileKindEnum as $, boolean as $i, coreBlockIdFromAddonId as $n, readTimelapseGeneratedAt as $r, NcTemplateVarDescriptorSchema as $t, DeclaredDevices as A, viewerLinkBaseOf as Ai, TrackSideSchema as An, isEventOwnerType as Ar, NcAlarmSensorsInputSchema as At, FULL_IMAGE_BBOX as B, RECORD_MAX_DATA_BYTES as Bi, applyModeDelaysEdits as Bn, kebabToCamel as Br, NcRuleSchema as Bt, ClearTrackRelationResultSchema as C, systemEventFamilyProblems as Ci, TRACK_RELATIONS_DEFAULT_LIMIT as Cn, isAlertEpisodeOpen as Cr, NC_SNOOZE_MAX_MINUTES as Ct, DEFAULT_TIMELAPSE_PREVIEW_TEXT as D, templateCarriesSummary as Di, TrackPuritySchema as Dn, isDefaultAlarmProfileId as Dr, NC_TEMPLATE_VARS as Dt, DEFAULT_EVENT_COLOR as E, systemEventSummarySplitOf as Ei, TimelapseRuleSchema as En, isAudioClassName as Er, NC_TAXONOMY as Et, EVENT_DENSITY_BATCH_MAX as F, isSourceCap as Fi, alarmPanelCapability as Fn, isRootSuppliableStepId as Fr, NcLegacyRuleActionSequenceSchema as Ft, ListTrackRelationsResultSchema as G, hydrateSchema as Gi, audioMetricsCapability as Gn, occupancyScope as Gr, NcSnoozeInputSchema as Gt, LABEL_SUPPLY_MACRO as H, customAction as Hi, applySecureOnArmEdit as Hn, mayWriteToLocation as Hr, NcRuleUpdateInputSchema as Ht, EVENT_KIND_BY_CAP as I, DeviceType as Ii, alertEpisodeId as In, isScheduleActive as Ir, NcRuleActionSchema as It, MAX_BIRTH_DECISION_RECORDS as J, normalizeNodeId as Ji, buildViewerLink as Jn, pickFaceRescoreIntervalMinutes as Jr, NcStateSummarySectionIdSchema as Jt, LockStateSchema as K, isDeviceScopedCap as Ki, audioModeOf as Kn, parseAlertEpisodePayload as Kr, NcSnoozeSchema as Kt, EVENT_OWNER_TYPES as L, errMsg as Li, alertEpisodeKind as Ln, isSystemDelivery as Lr, NcRuleActionsSchema as Lt, EMBEDDING_MODEL_FAILED as M, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Mi, activateAlarmProfile as Mn, isLabelSupplyStepId as Mr, NcAlarmSettingsPatchSchema as Mt, EMBEDDING_REQUIREMENTS_FAILED as N, canonicalHash as Ni, addonWidgetsSourceCapability as Nn, isMediaOwnerType as Nr, NcConditionDescriptorSchema as Nt, DETECTION_MACRO_CLASSES as O, templateVarsFor as Oi, TrackRelationKindSchema as On, isDetectionMacroClass as Or, NcAlarmConfigSchema as Ot, EMBEDDING_REQUIREMENTS_UNAVAILABLE as P, evaluateSensorEdge as Pi, alarmDeviceSecureOnArm as Pn, isRetiredClearKey as Pr, NcConditionsSchema as Pt, MOTION_CLOSE_AFTER_MS as Q, array as Qi, consumableLowPercentOf as Qn, readMotionTriggeredBy as Qr, NcTemplatePreviewSchema as Qt, EXPORT_DENSE_MAX_RANGES as R, BaseAddon as Ri, alertEpisodePayload as Rn, isSystemEventSummaryRule as Rr, NcRuleInputSchema as Rt, ClearTrackRelationInputSchema as S, systemEventDeliveryProblems as Si, TIMELAPSE_DENSE_FLOOR_SEC as Sn, isAlarmControllableCap as Sr, NC_SENSOR_TRANSITION_KINDS as St, DEFAULT_DETAIL_CROP_CONVENTION as T, systemEventSummaryScheduleOf as Ti, TimelapseRulePatchSchema as Tn, isAppLinkBase as Tr, NC_TANK_SYSTEM_EVENT_KINDS as Tt, LabelAttributionSchema as U, defineCustomActions as Ui, armRemovalReconcile as Un, memoizePinnedFfmpeg as Ur, NcScheduleSchema as Ut, FailureCounters as V, createEvent as Vi, applyNonBlockingEdit as Vn, linkedStepOf as Vr, NcRuleTargetSchema as Vt, ListTrackRelationsInputSchema as W, defineRecordKinds as Wi, assertTimelapseCadences as Wn, notificationRulesCapability as Wr, NcSharedSequenceSchema as Wt, MAX_TRACK_PURITIES as X, ZodObject as Xi, classifyRetrainReview as Xn, plateGalleryCapability as Xr, NcTaxonomySchema as Xt, MAX_BIRTH_LATENCY_PROXY_MS as Y, sleep as Yi, calendarEventLocalSpan as Yn, pipelineAnalyticsCapability as Yr, NcSystemEventKindSchema as Yt, MAX_TRACK_RELATIONS as Z, _enum as Zi, cloneAlarmSettings as Zn, readDeviceStateFrom as Zr, NcTemplatePreviewInputSchema as Zt, BIRTH_DECISION_DEFAULT_LIMIT as _, startMoverUnderClearance as _i, SCENE_RESET_RECAPTURES as _n, evictionPolicyOfLocation as _r, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as _t, CLIP_EMBEDDING_STEP_ID as a, partialRecord as aa, resolvePoolMemoryPolicy as ai, RebuildObjectEmbeddingsRefusalSchema as an, deriveRecordingMode as ar, NC_ALARM_NOTIFY_FIELDS as at, BucketAccumulator as b, summarizeReview as bi, SetTrackPurityResultSchema as bn, gifDeriveSpeed as br, NC_GROUPING_MAX_SEC as bt, readClusterModelPinStrict as c, string as ca, ruleAutoTriggersAlarm as ci, RetrainStatusSchema as cn, deviceRemovalHookCapability as cr, NC_AUDIO_CONFIRM_HITS_DEFAULT as ct, APPEARANCE_BLOCKS as d, union as da, ruleGroupingApplies as di, SCENE_DEFAULT_ANCHOR_THRESHOLD as dn, embeddingRefusalOf as dr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as dt, discriminatedUnion as ea, renameAlarmProfile as ei, OPS_LOG_DEFAULT_LIMIT as en, cosineSimilarity as er, MotionTriggeredBySchema as et, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as f, unknown as fa, ruleKindOf as fi, SCENE_DEFAULT_CHECK_INTERVAL_SEC as fn, embeddingRequirementsFailedError as fr, NC_CLIP_RETENTION_MAX_SEC as ft, ArchivedDebugNoteSchema as g, servedTemplateVars as gi, SCENE_DIVERGED as gn, eventKindLabel as gr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as gt, AlarmArmModeSchema as h, sensorRaisedOf as hi, SCENE_DEFAULT_UNCOVERED_POLICY as hn, ensureAlarmProfiles as hr, NC_CONFIRM_DEFAULT_TIMEOUT_MS as ht, CLIP_TEXT_MODELS as i, object as ia, resolveModeNotifyPolicy as ii, RECORDING_SOURCE_CAMSTACK_ADDON as in, derivePostTriggeredAction as ir, NC_ALARM_DELAY_MAX_SEC as it, DetectionSourceSchema as j, zoneAnalyticsCapability as ji, TrackSourceSchema as jn, isKnownTemplateVar as jr, NcAlarmSensorsSchema as jt, DETECTION_PIPELINE_CAP_NAME as k, vectorDimFromBase64 as ki, TrackRelationSchema as kn, isEventKindLabelKey as kr, NcAlarmPostTriggeredActionSchema as kt, resolveClusterModelPin as l, templateLiteral as la, ruleBelongsToAlarm as li, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as ln, embeddingEncoderCapability as lr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as lt, AUDIO_MACRO_LABELS as m, secureActuationFor as mi, SCENE_DEFAULT_QUIET_SECONDS as mn, encodeVectorBase64 as mr, NC_CONFIRM_DEFAULT_MAX_IMAGE_PX as mt, DEFAULT_CLIP_MODEL as n, looseObject as na, resolveLocationMode as ni, PoolMemoryWatchdog as nn, deleteAlarmProfile as nr, NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as nt, CLUSTER_MODEL_OWNER_ADDON_ID as o, record as oa, retrainRevisionConflictMessage as oi, RetrainDismissedSchema as on, describeSystemEventDeliveryProblem as or, NC_ALARM_SYSTEM_EVENT_KINDS as ot, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as p, EventCategory as pa, sceneMonitorCapability as pi, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as pn, embeddingRequirementsUnavailableError as pr, NC_CONDITION_CATALOG as pt, MAX_ARCHIVED_DEBUG_NOTES as q, nodePin as qi, buildEventKindDescriptor as qn, parseProcStatus as qr, NcSnoozeSuppressedSchema as qt, CLIP_IMAGE_MODELS as r, number as ra, resolveModeDelays as ri, RECORDING_EXPORT_MAX_READ_BYTES as rn, deriveDetailCropRect as rr, NC_ALARM_DELAY_FIELDS as rt, FACE_EMBEDDING_STEP_ID as s, strictObject as sa, rootSupplyServes as si, RetrainOriginSchema as sn, describeSystemEventFamilyProblem as sr, NC_ALARM_TRIGGERED_MAX_SEC as st, BUILTIN_CLIP_MODELS as t, literal as ta, resolveClipSearchMinScore as ti, OpsLogEntrySchema as tn, createAlarmProfile as tr, NC_ALARM_DEFAULT_PROFILE_ID as tt, APPEARANCE_BIN_COUNT as u, tuple as ua, ruleDeviceCompatCapQueries as ui, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as un, embeddingModelFailedError as ur, NC_CLIP_POST_ROLL_DEFAULT_SEC as ut, BaseDevice as v, storageOccupancyCapability as vi, SceneMonitorSchema as vn, faceGalleryCapability as vr, NC_DEFAULT_SNOOZE_MINUTES as vt, CoverStateSchema as w, systemEventFilterApplies as wi, TimelapseRuleInputSchema as wn, isAlertEpisodeSeverity as wr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as wt, COCO_TO_MACRO as x, syncActiveAlarmProfileSettings as xi, SetTrackRelationInputSchema as xn, gifFromMp4Args as xr, NC_GROUPING_MIN_SEC as xt, BirthDecisionRecordSchema as y, subKindsOf as yi, SetTrackPurityInputSchema as yn, failureContributionCapability as yr, NC_GROUPING_DEFAULT_SEC as yt, FIRST_LEVEL_MACRO_CLASSES as z, CamProfileSchema as zi, applyBlockingEdit as zn, isVectorIndexDimConflict as zr, NcRulePatchSchema as zt };
86377
+ export { MediaFileKindEnum as $, sleep as $i, coreBlockIdFromAddonId as $n, readDeviceStateFrom as $r, NcTemplateVarDescriptorSchema as $t, DeclaredDevices as A, templateCarriesSummary as Ai, TrackSideSchema as An, isEventOwnerType as Ar, NcAlarmSensorsInputSchema as At, FULL_IMAGE_BBOX as B, errMsg as Bi, applyModeDelaysEdits as Bn, kebabToCamel as Br, NcRuleSchema as Bt, ClearTrackRelationResultSchema as C, summarizeReview as Ci, TRACK_RELATIONS_DEFAULT_LIMIT as Cn, isAlertEpisodeOpen as Cr, NC_SNOOZE_MAX_MINUTES as Ct, DEFAULT_TIMELAPSE_PREVIEW_TEXT as D, systemEventFilterApplies as Di, TrackPuritySchema as Dn, isDefaultAlarmProfileId as Dr, NC_TEMPLATE_VARS as Dt, DEFAULT_EVENT_COLOR as E, systemEventFamilyProblems as Ei, TimelapseRuleSchema as En, isAudioClassName as Er, NC_TAXONOMY as Et, EVENT_DENSITY_BATCH_MAX as F, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Fi, alarmPanelCapability as Fn, isRootSuppliableStepId as Fr, NcLegacyRuleActionSequenceSchema as Ft, ListTrackRelationsResultSchema as G, createEvent as Gi, audioMetricsCapability as Gn, normalizeNcMediaPolicy as Gr, NcSnoozeInputSchema as Gt, LABEL_SUPPLY_MACRO as H, CamProfileSchema as Hi, applySecureOnArmEdit as Hn, mayWriteToLocation as Hr, NcRuleUpdateInputSchema as Ht, EVENT_KIND_BY_CAP as I, canonicalHash as Ii, alertEpisodeId as In, isScheduleActive as Ir, NcRuleActionSchema as It, MAX_BIRTH_DECISION_RECORDS as J, defineRecordKinds as Ji, buildViewerLink as Jn, parseAlertEpisodePayload as Jr, NcStateSummarySectionIdSchema as Jt, LockStateSchema as K, customAction as Ki, audioModeOf as Kn, notificationRulesCapability as Kr, NcSnoozeSchema as Kt, EVENT_OWNER_TYPES as L, evaluateSensorEdge as Li, alertEpisodeKind as Ln, isSystemDelivery as Lr, NcRuleActionsSchema as Lt, EMBEDDING_MODEL_FAILED as M, vectorDimFromBase64 as Mi, activateAlarmProfile as Mn, isLabelSupplyStepId as Mr, NcAlarmSettingsPatchSchema as Mt, EMBEDDING_REQUIREMENTS_FAILED as N, viewerLinkBaseOf as Ni, addonWidgetsSourceCapability as Nn, isMediaOwnerType as Nr, NcConditionDescriptorSchema as Nt, DETECTION_MACRO_CLASSES as O, systemEventSummaryScheduleOf as Oi, TrackRelationKindSchema as On, isDetectionMacroClass as Or, NcAlarmConfigSchema as Ot, EMBEDDING_REQUIREMENTS_UNAVAILABLE as P, zoneAnalyticsCapability as Pi, alarmDeviceSecureOnArm as Pn, isRetiredClearKey as Pr, NcConditionsSchema as Pt, MOTION_CLOSE_AFTER_MS as Q, normalizeNodeId as Qi, consumableLowPercentOf as Qn, plateGalleryCapability as Qr, NcTemplatePreviewSchema as Qt, EXPORT_DENSE_MAX_RANGES as R, isSourceCap as Ri, alertEpisodePayload as Rn, isSystemEventSummaryRule as Rr, NcRuleInputSchema as Rt, ClearTrackRelationInputSchema as S, subKindsOf as Si, TIMELAPSE_DENSE_FLOOR_SEC as Sn, isAlarmControllableCap as Sr, NC_SENSOR_TRANSITION_KINDS as St, DEFAULT_DETAIL_CROP_CONVENTION as T, systemEventDeliveryProblems as Ti, TimelapseRulePatchSchema as Tn, isAppLinkBase as Tr, NC_TANK_SYSTEM_EVENT_KINDS as Tt, LabelAttributionSchema as U, RECORD_MAX_DATA_BYTES as Ui, armRemovalReconcile as Un, memoizePinnedFfmpeg as Ur, NcScheduleSchema as Ut, FailureCounters as V, BaseAddon as Vi, applyNonBlockingEdit as Vn, linkedStepOf as Vr, NcRuleTargetSchema as Vt, ListTrackRelationsInputSchema as W, RECORD_QUERY_MAX as Wi, assertTimelapseCadences as Wn, ncMediaPolicyError as Wr, NcSharedSequenceSchema as Wt, MAX_TRACK_PURITIES as X, isDeviceScopedCap as Xi, classifyRetrainReview as Xn, pickFaceRescoreIntervalMinutes as Xr, NcTaxonomySchema as Xt, MAX_BIRTH_LATENCY_PROXY_MS as Y, hydrateSchema as Yi, calendarEventLocalSpan as Yn, parseProcStatus as Yr, NcSystemEventKindSchema as Yt, MAX_TRACK_RELATIONS as Z, nodePin as Zi, cloneAlarmSettings as Zn, pipelineAnalyticsCapability as Zr, NcTemplatePreviewInputSchema as Zt, BIRTH_DECISION_DEFAULT_LIMIT as _, EventCategory as _a, secureActuationFor as _i, SCENE_RESET_RECAPTURES as _n, evictionPolicyOfLocation as _r, NC_CONSUMABLE_SYSTEM_EVENT_KINDS as _t, CLIP_EMBEDDING_STEP_ID as a, literal as aa, resolveModeDelays as ai, RebuildObjectEmbeddingsRefusalSchema as an, deriveRecordingMode as ar, NC_ALARM_NOTIFY_FIELDS as at, BucketAccumulator as b, startMoverUnderClearance as bi, SetTrackPurityResultSchema as bn, gifDeriveSpeed as br, NC_GROUPING_MAX_SEC as bt, readClusterModelPinStrict as c, object as ca, resolvePoolMemoryPolicy as ci, RetrainStatusSchema as cn, deviceRemovalHookCapability as cr, NC_AUDIO_CONFIRM_HITS_DEFAULT as ct, APPEARANCE_BLOCKS as d, strictObject as da, ruleAutoTriggersAlarm as di, SCENE_DEFAULT_ANCHOR_THRESHOLD as dn, embeddingRefusalOf as dr, NC_CLIP_PRE_ROLL_DEFAULT_SEC as dt, ZodObject as ea, readMotionTriggeredBy as ei, OPS_LOG_DEFAULT_LIMIT as en, cosineSimilarity as er, MotionTriggeredBySchema as et, APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT as f, string as fa, ruleBelongsToAlarm as fi, SCENE_DEFAULT_CHECK_INTERVAL_SEC as fn, embeddingRequirementsFailedError as fr, NC_CLIP_RETENTION_MAX_SEC as ft, ArchivedDebugNoteSchema as g, unknown as ga, sceneMonitorCapability as gi, SCENE_DIVERGED as gn, eventKindLabel as gr, NC_CONSUMABLE_LOW_PERCENT_DEFAULT as gt, AlarmArmModeSchema as h, union as ha, ruleKindOf as hi, SCENE_DEFAULT_UNCOVERED_POLICY as hn, ensureAlarmProfiles as hr, NC_CONFIRM_DEFAULT_TIMEOUT_MS as ht, CLIP_TEXT_MODELS as i, discriminatedUnion as ia, resolveLocationMode as ii, RECORDING_SOURCE_CAMSTACK_ADDON as in, derivePostTriggeredAction as ir, NC_ALARM_DELAY_MAX_SEC as it, DetectionSourceSchema as j, templateVarsFor as ji, TrackSourceSchema as jn, isKnownTemplateVar as jr, NcAlarmSensorsSchema as jt, DETECTION_PIPELINE_CAP_NAME as k, systemEventSummarySplitOf as ki, TrackRelationSchema as kn, isEventKindLabelKey as kr, NcAlarmPostTriggeredActionSchema as kt, resolveClusterModelPin as l, partialRecord as la, retrainRevisionConflictMessage as li, SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX as ln, embeddingEncoderCapability as lr, NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT as lt, AUDIO_MACRO_LABELS as m, tuple as ma, ruleGroupingApplies as mi, SCENE_DEFAULT_QUIET_SECONDS as mn, encodeVectorBase64 as mr, NC_CONFIRM_DEFAULT_MAX_IMAGE_PX as mt, DEFAULT_CLIP_MODEL as n, array as na, renameAlarmProfile as ni, PoolMemoryWatchdog as nn, deleteAlarmProfile as nr, NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC as nt, CLUSTER_MODEL_OWNER_ADDON_ID as o, looseObject as oa, resolveModeNotifyPolicy as oi, RetrainDismissedSchema as on, describeSystemEventDeliveryProblem as or, NC_ALARM_SYSTEM_EVENT_KINDS as ot, ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT as p, templateLiteral as pa, ruleDeviceCompatCapQueries as pi, SCENE_DEFAULT_OBSERVATION_SPACING_SEC as pn, embeddingRequirementsUnavailableError as pr, NC_CONDITION_CATALOG as pt, MAX_ARCHIVED_DEBUG_NOTES as q, defineCustomActions as qi, buildEventKindDescriptor as qn, occupancyScope as qr, NcSnoozeSuppressedSchema as qt, CLIP_IMAGE_MODELS as r, boolean as ra, resolveClipSearchMinScore as ri, RECORDING_EXPORT_MAX_READ_BYTES as rn, deriveDetailCropRect as rr, NC_ALARM_DELAY_FIELDS as rt, FACE_EMBEDDING_STEP_ID as s, number as sa, resolveNcMediaImage as si, RetrainOriginSchema as sn, describeSystemEventFamilyProblem as sr, NC_ALARM_TRIGGERED_MAX_SEC as st, BUILTIN_CLIP_MODELS as t, _enum as ta, readTimelapseGeneratedAt as ti, OpsLogEntrySchema as tn, createAlarmProfile as tr, NC_ALARM_DEFAULT_PROFILE_ID as tt, APPEARANCE_BIN_COUNT as u, record as ua, rootSupplyServes as ui, SCENE_CONFIRM_DEFAULT_TIMEOUT_MS as un, embeddingModelFailedError as ur, NC_CLIP_POST_ROLL_DEFAULT_SEC as ut, BaseDevice as v, sensorRaisedOf as vi, SceneMonitorSchema as vn, faceGalleryCapability as vr, NC_DEFAULT_SNOOZE_MINUTES as vt, CoverStateSchema as w, syncActiveAlarmProfileSettings as wi, TimelapseRuleInputSchema as wn, isAlertEpisodeSeverity as wr, NC_SYSTEM_EVENT_KIND_GROUP_SPECS as wt, COCO_TO_MACRO as x, storageOccupancyCapability as xi, SetTrackRelationInputSchema as xn, gifFromMp4Args as xr, NC_GROUPING_MIN_SEC as xt, BirthDecisionRecordSchema as y, servedTemplateVars as yi, SetTrackPurityInputSchema as yn, failureContributionCapability as yr, NC_GROUPING_DEFAULT_SEC as yt, FIRST_LEVEL_MACRO_CLASSES as z, DeviceType as zi, applyBlockingEdit as zn, isVectorIndexDimConflict as zr, NcRulePatchSchema as zt };