@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.
- package/dist/{clip-model-registry-B1BMbjlk.js → clip-model-registry-C7WMvftu.js} +729 -141
- package/dist/{clip-model-registry-CHMOaqp1.mjs → clip-model-registry-JH4cTI06.mjs} +706 -142
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +2 -2
- 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
- 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
- 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
- package/dist/pipeline-analytics/{hostInit-vT2SQQV2.mjs → hostInit-Bl6Zvb1p.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +68007 -67085
- package/dist/pipeline-analytics/index.mjs +77067 -76144
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -1
- 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
- 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-
|
|
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
|
|
7999
|
-
* and validates them (`
|
|
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 `
|
|
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([
|
|
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({
|
|
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
|
-
|
|
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:
|
|
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
|
-
*
|
|
41503
|
-
*
|
|
41504
|
-
*
|
|
41505
|
-
*
|
|
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
|
|
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 —
|
|
41541
|
-
*
|
|
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
|
-
|
|
41575
|
-
|
|
41576
|
-
|
|
41577
|
-
|
|
41578
|
-
|
|
41579
|
-
|
|
41580
|
-
|
|
41581
|
-
|
|
41582
|
-
|
|
41583
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
41865
|
-
|
|
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
|
-
|
|
41868
|
-
|
|
41869
|
-
|
|
41870
|
-
|
|
41871
|
-
|
|
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):
|
|
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: "
|
|
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
|
-
]).
|
|
44609
|
-
/**
|
|
44915
|
+
]).optional(),
|
|
44916
|
+
/** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
|
|
44610
44917
|
frame: NcMediaFrameSchema.optional(),
|
|
44611
|
-
/**
|
|
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
|
-
|
|
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):
|
|
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: "
|
|
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: {
|
|
59098
|
-
|
|
59099
|
-
|
|
59100
|
-
|
|
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):
|
|
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:
|
|
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):
|
|
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: "
|
|
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):
|
|
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:
|
|
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):
|
|
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:
|
|
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
|
|
67713
|
-
*
|
|
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`
|
|
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(
|
|
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: "
|
|
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.
|
|
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 $,
|
|
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 };
|