@camstack/types 1.2.386 → 1.2.388
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/addon.js +26 -16
- package/dist/addon.mjs +26 -16
- package/dist/auth/credential-scope.d.ts +37 -5
- package/dist/auth/principal-scope.d.ts +1 -1
- package/dist/capabilities/alarm-panel.cap.d.ts +10 -2
- package/dist/capabilities/capability-definition.d.ts +21 -3
- package/dist/capabilities/connectivity.cap.d.ts +10 -2
- package/dist/capabilities/device-history.cap.d.ts +195 -3
- package/dist/capabilities/dishwasher.cap.d.ts +17 -0
- package/dist/capabilities/enum-sensor.cap.d.ts +12 -2
- package/dist/capabilities/index.d.ts +6 -5
- package/dist/capabilities/llm.cap.d.ts +252 -309
- package/dist/capabilities/lock-control.cap.d.ts +9 -2
- package/dist/capabilities/log-destination.cap.d.ts +148 -19
- package/dist/capabilities/media-player.cap.d.ts +15 -2
- package/dist/capabilities/notification-rules.cap.d.ts +213 -13
- package/dist/capabilities/stream-params.cap.d.ts +24 -2
- package/dist/capabilities/user-management.cap.d.ts +4 -409
- package/dist/client.js +76 -11
- package/dist/client.mjs +76 -11
- package/dist/device/base-device.d.ts +34 -1
- package/dist/device/index.d.ts +2 -2
- package/dist/generated/addon-api.d.ts +548 -187
- package/dist/generated/cap-input-defaults.d.ts +1 -1
- package/dist/generated/collection-array-methods.d.ts +2 -2
- package/dist/generated/history-catalog.d.ts +1 -1
- package/dist/generated/method-access-map.d.ts +1 -1
- package/dist/generated/method-device-selectors.d.ts +2 -2
- package/dist/generated/system-proxy.d.ts +2 -2
- package/dist/index.d.ts +5 -3
- package/dist/index.js +861 -164
- package/dist/index.mjs +815 -162
- package/dist/interfaces/addon-data-plane.d.ts +4 -4
- package/dist/interfaces/addon-peer-bytes.d.ts +1 -1
- package/dist/interfaces/logging.d.ts +16 -1
- package/dist/notification/media-image.d.ts +67 -0
- package/dist/schemas/auth-records.d.ts +1 -1
- package/dist/schemas/user-preferences.d.ts +103 -0
- package/dist/{sleep-BxjU_fJM.mjs → sleep-BSuCCFjf.mjs} +34 -5
- package/dist/{sleep-BE7_6UnC.js → sleep-DKtoyk6X.js} +34 -5
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_sleep = require("./sleep-
|
|
2
|
+
const require_sleep = require("./sleep-DKtoyk6X.js");
|
|
3
3
|
const require_event_category = require("./event-category-eSqkye-K.js");
|
|
4
4
|
const require_composition = require("./composition-eoYYVfOp.js");
|
|
5
5
|
const require_node_color = require("./node-color.js");
|
|
@@ -6616,7 +6616,7 @@ function classifyBearerPrincipal(payload) {
|
|
|
6616
6616
|
* would lock every non-admin viewer out of recorder playback, snapshot media
|
|
6617
6617
|
* and the stream-broker embed, which is a worse outcome than the hole.
|
|
6618
6618
|
* - **integration** — must hold `addon:<addonId>` at the verb's access. This is
|
|
6619
|
-
* the same rule the
|
|
6619
|
+
* the same rule the scoped-token branch has always applied; the JWT
|
|
6620
6620
|
* branch simply never applied it, and closing that divergence IS the fix.
|
|
6621
6621
|
* `isAdmin` is ignored: an integration token is minted `isAdmin: false` and a
|
|
6622
6622
|
* token claiming otherwise must not talk its way past the grant.
|
|
@@ -6660,7 +6660,7 @@ function principalMayReachAddon(input) {
|
|
|
6660
6660
|
* `super_admin` — collapsed onto the single boolean because every
|
|
6661
6661
|
* non-admin caller is governed by the same scope-check rules; the
|
|
6662
6662
|
* distinction was only ever used to route role-specific procedures
|
|
6663
|
-
* which we no longer have. CLI / webhook integrations are `
|
|
6663
|
+
* which we no longer have. CLI / webhook integrations are tokens (`auth.mintToken`)
|
|
6664
6664
|
* with `isAdmin: false` + an explicit scope list.
|
|
6665
6665
|
*/
|
|
6666
6666
|
/** Per-method access flavour. Materialised on every cap method via codegen. */
|
|
@@ -6839,13 +6839,13 @@ var ScopedTokenSchema = zod.z.object({
|
|
|
6839
6839
|
/**
|
|
6840
6840
|
* The ONE permission vocabulary every credential is reduced to (D892).
|
|
6841
6841
|
*
|
|
6842
|
-
* A credential — a login session, an account-link token, a
|
|
6843
|
-
* `
|
|
6842
|
+
* A credential — a login session, an account-link token, or a token
|
|
6843
|
+
* `auth.mintToken` issues (there is no other format, D895) — is
|
|
6844
6844
|
* verified into a principal whose permissions are a `CredentialScope[]`, and
|
|
6845
6845
|
* nothing else. What KIND of credential it was never decides what it may do:
|
|
6846
6846
|
*
|
|
6847
|
-
* - `'*'` — everything (the admin bypass). Held by an admin's session
|
|
6848
|
-
*
|
|
6847
|
+
* - `'*'` — everything (the admin bypass). Held by an admin's session and
|
|
6848
|
+
* a token minted with it.
|
|
6849
6849
|
* - a {@link TokenScope} — the v3 capability grants (`category`,
|
|
6850
6850
|
* `capability`, `addon`, `device`) the tRPC matcher has always applied.
|
|
6851
6851
|
* - `share-view` — one fail-closed embed perimeter (`grid-view` /
|
|
@@ -6854,7 +6854,12 @@ var ScopedTokenSchema = zod.z.object({
|
|
|
6854
6854
|
* - `addon-routes` — may reach any addon's own `authenticated` HTTP routes
|
|
6855
6855
|
* and data planes (never an `admin` one). A person's session has always
|
|
6856
6856
|
* had this; an integration token never had it and must hold
|
|
6857
|
-
* `addon:<id>` instead.
|
|
6857
|
+
* `addon:<id>` instead. Only an admin may mint it into a token.
|
|
6858
|
+
* - `preferences-self` — may read and write the SUBJECT's own account
|
|
6859
|
+
* preferences (D894), never another user's. Every person's session holds
|
|
6860
|
+
* it; a unified token holds it only when minted with it. `'*'` does NOT
|
|
6861
|
+
* imply it: the hub's own mesh principal holds `'*'` and is nobody's
|
|
6862
|
+
* account.
|
|
6858
6863
|
*
|
|
6859
6864
|
* Pure: no I/O. It lives in `@camstack/types` so the hub, the kernel and any
|
|
6860
6865
|
* addon read the same vocabulary.
|
|
@@ -6878,10 +6883,14 @@ var AddonRoutesScopeSchema = zod.z.object({
|
|
|
6878
6883
|
type: zod.z.literal("addon-routes"),
|
|
6879
6884
|
access: zod.z.array(MethodAccessSchema).min(1)
|
|
6880
6885
|
});
|
|
6886
|
+
var PreferencesSelfScopeSchema = zod.z.object({ type: zod.z.literal("preferences-self") });
|
|
6887
|
+
/** The grant every person's session carries for its own account preferences. */
|
|
6888
|
+
var PREFERENCES_SELF_SCOPE = { type: "preferences-self" };
|
|
6881
6889
|
var CredentialScopeSchema = zod.z.union([
|
|
6882
6890
|
zod.z.literal("*"),
|
|
6883
6891
|
ShareViewScopeSchema,
|
|
6884
6892
|
AddonRoutesScopeSchema,
|
|
6893
|
+
PreferencesSelfScopeSchema,
|
|
6885
6894
|
TokenScopeSchema
|
|
6886
6895
|
]);
|
|
6887
6896
|
/** Every access flavour — what a person's session holds on addon routes. */
|
|
@@ -6891,7 +6900,7 @@ var ALL_METHOD_ACCESS = [
|
|
|
6891
6900
|
"delete"
|
|
6892
6901
|
];
|
|
6893
6902
|
function isTokenScope(scope) {
|
|
6894
|
-
return scope !== "*" && scope.type !== "share-view" && scope.type !== "addon-routes";
|
|
6903
|
+
return scope !== "*" && scope.type !== "share-view" && scope.type !== "addon-routes" && scope.type !== "preferences-self";
|
|
6895
6904
|
}
|
|
6896
6905
|
/** True iff the scope set holds `'*'`. */
|
|
6897
6906
|
function scopesGrantAdmin(scopes) {
|
|
@@ -6915,6 +6924,15 @@ function scopesAllowAddonRoutes(scopes, access) {
|
|
|
6915
6924
|
return scopes.some((s) => s !== "*" && s.type === "addon-routes" && s.access.includes(access));
|
|
6916
6925
|
}
|
|
6917
6926
|
/**
|
|
6927
|
+
* True iff the set may touch its subject's own account preferences: it holds
|
|
6928
|
+
* `preferences-self` and no share-view grant restricts it. `'*'` alone is not
|
|
6929
|
+
* enough (see the vocabulary above).
|
|
6930
|
+
*/
|
|
6931
|
+
function scopesAllowOwnPreferences(scopes) {
|
|
6932
|
+
if (shareViewGrantOf(scopes) !== null) return false;
|
|
6933
|
+
return scopes.some((s) => s !== "*" && s.type === "preferences-self");
|
|
6934
|
+
}
|
|
6935
|
+
/**
|
|
6918
6936
|
* Parse a scope array from an untrusted source (a JWT claim, a stored row).
|
|
6919
6937
|
* Any element that does not parse makes the WHOLE set unusable — `null` — so
|
|
6920
6938
|
* a corrupt grant can never degrade into a partial one.
|
|
@@ -6931,6 +6949,22 @@ function parseCredentialScopes(raw) {
|
|
|
6931
6949
|
*/
|
|
6932
6950
|
var CREDENTIAL_TOKEN_KIND = "credential";
|
|
6933
6951
|
/**
|
|
6952
|
+
* The `aud` claim every minted token is signed with (D895). The hub's raw JWT
|
|
6953
|
+
* verify (`AuthManager.verifyToken`, used by every surface that wants a LOGIN
|
|
6954
|
+
* session — the OAuth consent page, the session cookie, health, backups)
|
|
6955
|
+
* refuses a token carrying it, so a minted token — a share link above all —
|
|
6956
|
+
* can never be replayed as a person's session. Only the credential verifier's
|
|
6957
|
+
* own door (`verifyCredentialToken`) accepts it.
|
|
6958
|
+
*/
|
|
6959
|
+
var CREDENTIAL_TOKEN_AUDIENCE = "camstack:credential";
|
|
6960
|
+
/** Does a verified JWT payload belong to the minted-token family? */
|
|
6961
|
+
function isCredentialTokenPayload(payload) {
|
|
6962
|
+
if (payload === null || typeof payload !== "object") return false;
|
|
6963
|
+
const kind = Reflect.get(payload, "kind");
|
|
6964
|
+
const aud = Reflect.get(payload, "aud");
|
|
6965
|
+
return kind === "credential" || aud === "camstack:credential" || Array.isArray(aud) && aud.includes("camstack:credential");
|
|
6966
|
+
}
|
|
6967
|
+
/**
|
|
6934
6968
|
* The claims of a unified token (`auth.mintToken`). It carries no `exp`: its
|
|
6935
6969
|
* row (looked up by `jti` on every verify, for revocation) holds the ONE
|
|
6936
6970
|
* expiry, so a share link can be extended and a JWT clock can never disagree
|
|
@@ -6943,6 +6977,80 @@ var CredentialTokenClaimsSchema = zod.z.object({
|
|
|
6943
6977
|
scopes: zod.z.array(CredentialScopeSchema).min(1)
|
|
6944
6978
|
});
|
|
6945
6979
|
//#endregion
|
|
6980
|
+
//#region src/schemas/user-preferences.ts
|
|
6981
|
+
/**
|
|
6982
|
+
* Per-user ACCOUNT preferences (D894): the hub-side half of the viewer's two
|
|
6983
|
+
* settings levels.
|
|
6984
|
+
*
|
|
6985
|
+
* - DEVICE settings never leave the phone.
|
|
6986
|
+
* - ACCOUNT settings live here: one row per `(user, namespace)`, private to
|
|
6987
|
+
* that user, synced across every device signed in as them, last write wins
|
|
6988
|
+
* unless the writer sends the revision it based its edit on.
|
|
6989
|
+
*
|
|
6990
|
+
* A setting lives in exactly ONE level; there are no overrides. The caller
|
|
6991
|
+
* never names a user: the hub stamps the principal's own id, admin included.
|
|
6992
|
+
*
|
|
6993
|
+
* The contract the client codes against is the `preferences.*` tRPC router
|
|
6994
|
+
* (`server/backend/src/api/core/preferences.router.ts`).
|
|
6995
|
+
*/
|
|
6996
|
+
/** `viewer.app`, `viewer.cameras`, `viewer.grids` … — lowercase, dot/dash separated. */
|
|
6997
|
+
var PREFERENCES_NAMESPACE_PATTERN = /^[a-z][a-z0-9.-]{0,63}$/;
|
|
6998
|
+
/** One row's value, measured as UTF-8 JSON. */
|
|
6999
|
+
var PREFERENCES_MAX_VALUE_BYTES = 256 * 1024;
|
|
7000
|
+
/** Namespaces one user may hold. */
|
|
7001
|
+
var PREFERENCES_MAX_NAMESPACES = 32;
|
|
7002
|
+
/** The opaque client id a writer stamps (`updatedByDevice`). */
|
|
7003
|
+
var PREFERENCES_MAX_DEVICE_ID_LENGTH = 64;
|
|
7004
|
+
var PreferenceNamespaceSchema = zod.z.string().regex(PREFERENCES_NAMESPACE_PATTERN);
|
|
7005
|
+
/** A namespace's value: a JSON object, opaque to the hub. */
|
|
7006
|
+
var PreferenceValueSchema = zod.z.record(zod.z.string(), zod.z.unknown());
|
|
7007
|
+
var PreferenceDeviceIdSchema = zod.z.string().min(1).max(64);
|
|
7008
|
+
/** A stored row, as the owner reads it. */
|
|
7009
|
+
var PreferenceRowSchema = zod.z.object({
|
|
7010
|
+
namespace: PreferenceNamespaceSchema,
|
|
7011
|
+
value: PreferenceValueSchema,
|
|
7012
|
+
/** Starts at 1, +1 on every write of this namespace. A delete ends the row and its count. */
|
|
7013
|
+
revision: zod.z.number().int().positive(),
|
|
7014
|
+
updatedAt: zod.z.number().int(),
|
|
7015
|
+
/** The client id the last writer sent; `null` when it sent none. */
|
|
7016
|
+
updatedByDevice: PreferenceDeviceIdSchema.nullable()
|
|
7017
|
+
});
|
|
7018
|
+
var PreferencesGetInputSchema = zod.z.object({
|
|
7019
|
+
/** Absent: every namespace the caller holds. */
|
|
7020
|
+
namespaces: zod.z.array(PreferenceNamespaceSchema).max(32).optional() });
|
|
7021
|
+
var PreferencesGetOutputSchema = zod.z.object({ rows: zod.z.array(PreferenceRowSchema) });
|
|
7022
|
+
var PreferencesPutInputSchema = zod.z.object({
|
|
7023
|
+
namespace: PreferenceNamespaceSchema,
|
|
7024
|
+
value: PreferenceValueSchema,
|
|
7025
|
+
/**
|
|
7026
|
+
* The revision the edit was based on. Absent: last write wins. `0`: the
|
|
7027
|
+
* namespace must not exist yet. Any other value that is not the current
|
|
7028
|
+
* revision answers `conflict` and writes nothing.
|
|
7029
|
+
*/
|
|
7030
|
+
baseRevision: zod.z.number().int().nonnegative().optional(),
|
|
7031
|
+
deviceId: PreferenceDeviceIdSchema.optional()
|
|
7032
|
+
});
|
|
7033
|
+
var PreferencesPutOutputSchema = zod.z.discriminatedUnion("status", [zod.z.object({
|
|
7034
|
+
status: zod.z.literal("saved"),
|
|
7035
|
+
row: PreferenceRowSchema
|
|
7036
|
+
}), zod.z.object({
|
|
7037
|
+
status: zod.z.literal("conflict"),
|
|
7038
|
+
current: PreferenceRowSchema.nullable()
|
|
7039
|
+
})]);
|
|
7040
|
+
var PreferencesDeleteInputSchema = zod.z.object({ namespace: PreferenceNamespaceSchema });
|
|
7041
|
+
var PreferencesDeleteOutputSchema = zod.z.object({
|
|
7042
|
+
/** `false` when the namespace did not exist. */
|
|
7043
|
+
deleted: zod.z.boolean() });
|
|
7044
|
+
var PreferencesChangedSinceInputSchema = zod.z.object({
|
|
7045
|
+
/** The revision the client holds per namespace; a namespace it does not list is new to it. */
|
|
7046
|
+
revisionByNamespace: zod.z.record(PreferenceNamespaceSchema, zod.z.number().int().nonnegative()).refine((map) => Object.keys(map).length <= 32, { message: `at most 32 namespaces` }) });
|
|
7047
|
+
var PreferencesChangedSinceOutputSchema = zod.z.object({
|
|
7048
|
+
/** Every row whose revision differs from the client's, and every row it did not list. */
|
|
7049
|
+
rows: zod.z.array(PreferenceRowSchema),
|
|
7050
|
+
/** Namespaces the client listed that no longer exist. */
|
|
7051
|
+
deleted: zod.z.array(PreferenceNamespaceSchema)
|
|
7052
|
+
});
|
|
7053
|
+
//#endregion
|
|
6946
7054
|
//#region src/auth/app-callback.ts
|
|
6947
7055
|
/**
|
|
6948
7056
|
* The viewer app's custom-scheme callback — the ONE list of URLs a hub flow
|
|
@@ -14926,11 +15034,30 @@ var DeviceHistorySubjectSchema = zod.z.discriminatedUnion("kind", [zod.z.object(
|
|
|
14926
15034
|
kind: zod.z.literal("node"),
|
|
14927
15035
|
nodeId: zod.z.string().min(1)
|
|
14928
15036
|
})]);
|
|
15037
|
+
/**
|
|
15038
|
+
* `enum` stores a STATE as the ordinal of its value in the series' value list
|
|
15039
|
+
* (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
|
|
15040
|
+
* meaning); a rollup keeps the time spent in each state (`states`).
|
|
15041
|
+
*/
|
|
14929
15042
|
var DeviceHistoryKindSchema = zod.z.enum([
|
|
15043
|
+
"gauge",
|
|
15044
|
+
"counter",
|
|
15045
|
+
"boolean",
|
|
15046
|
+
"enum"
|
|
15047
|
+
]);
|
|
15048
|
+
/** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
|
|
15049
|
+
var DeviceHistoryProducerKindSchema = zod.z.enum([
|
|
14930
15050
|
"gauge",
|
|
14931
15051
|
"counter",
|
|
14932
15052
|
"boolean"
|
|
14933
15053
|
]);
|
|
15054
|
+
/**
|
|
15055
|
+
* A key computed at READ time from stored series of the same device, never
|
|
15056
|
+
* stored itself. Energy (kWh per bucket) comes from the power meter's
|
|
15057
|
+
* `kwhTotal` counter when the device has one, else from integrating its
|
|
15058
|
+
* `watts` gauge over time.
|
|
15059
|
+
*/
|
|
15060
|
+
var DEVICE_HISTORY_ENERGY_KEY = "derived:energy.kwh";
|
|
14934
15061
|
var DeviceHistoryResolutionSchema = zod.z.enum([
|
|
14935
15062
|
"raw",
|
|
14936
15063
|
"5m",
|
|
@@ -14963,7 +15090,13 @@ var SeriesInfoSchema = zod.z.object({
|
|
|
14963
15090
|
/** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
|
|
14964
15091
|
unit: zod.z.string().nullable(),
|
|
14965
15092
|
displayName: zod.z.string(),
|
|
14966
|
-
source: zod.z.enum([
|
|
15093
|
+
source: zod.z.enum([
|
|
15094
|
+
"cap",
|
|
15095
|
+
"addon",
|
|
15096
|
+
"derived"
|
|
15097
|
+
]),
|
|
15098
|
+
/** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
|
|
15099
|
+
values: zod.z.array(zod.z.string()).readonly().nullable(),
|
|
14967
15100
|
firstTs: zod.z.number(),
|
|
14968
15101
|
lastTs: zod.z.number()
|
|
14969
15102
|
});
|
|
@@ -14977,17 +15110,31 @@ var QueryPointSchema = zod.z.object({
|
|
|
14977
15110
|
twMean: zod.z.number().nullable(),
|
|
14978
15111
|
min: zod.z.number(),
|
|
14979
15112
|
max: zod.z.number(),
|
|
14980
|
-
/** `null` is unknown, never zero (D393). */
|
|
14981
|
-
last: zod.z.number().nullable()
|
|
15113
|
+
/** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
|
|
15114
|
+
last: zod.z.number().nullable(),
|
|
15115
|
+
/**
|
|
15116
|
+
* The increase over the point: a `counter`'s growth since the previous point
|
|
15117
|
+
* or bucket (a drop is a reset, counted from zero), and for
|
|
15118
|
+
* {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
|
|
15119
|
+
* every other kind, and when it cannot be known.
|
|
15120
|
+
*/
|
|
15121
|
+
delta: zod.z.number().nullable(),
|
|
15122
|
+
/** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
|
|
15123
|
+
state: zod.z.string().nullable(),
|
|
15124
|
+
/** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
|
|
15125
|
+
states: zod.z.record(zod.z.string(), zod.z.number()).nullable()
|
|
14982
15126
|
});
|
|
14983
15127
|
var QuerySeriesSchema = zod.z.object({
|
|
14984
15128
|
scope: zod.z.string(),
|
|
14985
15129
|
/** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
|
|
14986
15130
|
before: zod.z.object({
|
|
14987
15131
|
t: zod.z.number(),
|
|
14988
|
-
value: zod.z.number().nullable()
|
|
15132
|
+
value: zod.z.number().nullable(),
|
|
15133
|
+
state: zod.z.string().nullable()
|
|
14989
15134
|
}).nullable(),
|
|
14990
|
-
points: zod.z.array(QueryPointSchema).readonly()
|
|
15135
|
+
points: zod.z.array(QueryPointSchema).readonly(),
|
|
15136
|
+
/** A derived key: the stored key its points were computed from; `null` for a stored series. */
|
|
15137
|
+
derivedFrom: zod.z.string().nullable()
|
|
14991
15138
|
});
|
|
14992
15139
|
/** The window part of a query, shared by the device and node forms. */
|
|
14993
15140
|
var QueryWindowShape = {
|
|
@@ -15003,6 +15150,25 @@ var QueryResultSchema = zod.z.object({
|
|
|
15003
15150
|
series: zod.z.array(QuerySeriesSchema).readonly(),
|
|
15004
15151
|
truncated: zod.z.boolean()
|
|
15005
15152
|
});
|
|
15153
|
+
/** Items one `queryMany` may carry: a dashboard's worth, not a scan. */
|
|
15154
|
+
var DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS = 24;
|
|
15155
|
+
/** One read of a batch: a device's key or a node's key (exactly one subject). */
|
|
15156
|
+
var QueryManyItemSchema = zod.z.union([zod.z.object({
|
|
15157
|
+
deviceId: zod.z.number().int(),
|
|
15158
|
+
key: zod.z.string(),
|
|
15159
|
+
scope: zod.z.string().optional()
|
|
15160
|
+
}), zod.z.object({
|
|
15161
|
+
forNodeId: zod.z.string().min(1),
|
|
15162
|
+
key: zod.z.string(),
|
|
15163
|
+
scope: zod.z.string().optional()
|
|
15164
|
+
})]);
|
|
15165
|
+
var QueryManyEntrySchema = zod.z.discriminatedUnion("ok", [zod.z.object({
|
|
15166
|
+
ok: zod.z.literal(true),
|
|
15167
|
+
result: QueryResultSchema
|
|
15168
|
+
}), zod.z.object({
|
|
15169
|
+
ok: zod.z.literal(false),
|
|
15170
|
+
error: zod.z.string()
|
|
15171
|
+
})]);
|
|
15006
15172
|
var TierStatusSchema = zod.z.object({
|
|
15007
15173
|
tier: DeviceHistoryResolutionSchema,
|
|
15008
15174
|
/** `null` until the first background count answered. */
|
|
@@ -15071,26 +15237,45 @@ var deviceHistoryCapability = {
|
|
|
15071
15237
|
* `listNodeSeries` / `queryNode`.
|
|
15072
15238
|
*/
|
|
15073
15239
|
listSeries: require_sleep.method(zod.z.object({ deviceId: zod.z.number().int() }), zod.z.array(SeriesInfoSchema).readonly()),
|
|
15074
|
-
|
|
15240
|
+
/**
|
|
15241
|
+
* A NODE's series. The subject is `forNodeId`, never `nodeId`: a top-level
|
|
15242
|
+
* `nodeId` is the cap ROUTING key, and `nodeId: 'little-unraid'` sent the
|
|
15243
|
+
* read to that agent, which hosts no device-history.
|
|
15244
|
+
*/
|
|
15245
|
+
listNodeSeries: require_sleep.method(zod.z.object({ forNodeId: zod.z.string().min(1) }), zod.z.array(SeriesInfoSchema).readonly(), { auth: "admin" }),
|
|
15075
15246
|
/**
|
|
15076
15247
|
* One series (or every scope of it) at one resolution. `auto` picks the
|
|
15077
15248
|
* finest tier whose retention covers `from` and whose point count fits
|
|
15078
15249
|
* `maxPoints`; when even the coarsest tier does not fit, the newest
|
|
15079
|
-
* `maxPoints` points are returned and `truncated` is true.
|
|
15250
|
+
* `maxPoints` points are returned and `truncated` is true. A series fed by
|
|
15251
|
+
* closed buckets has no raw rows, so `auto` never answers it from raw; nor
|
|
15252
|
+
* {@link DEVICE_HISTORY_ENERGY_KEY}, which is computed from rollups.
|
|
15080
15253
|
*/
|
|
15081
15254
|
query: require_sleep.method(zod.z.object({
|
|
15082
15255
|
deviceId: zod.z.number().int(),
|
|
15083
15256
|
...QueryWindowShape
|
|
15084
15257
|
}), QueryResultSchema),
|
|
15085
15258
|
queryNode: require_sleep.method(zod.z.object({
|
|
15086
|
-
|
|
15259
|
+
forNodeId: zod.z.string().min(1),
|
|
15087
15260
|
...QueryWindowShape
|
|
15088
15261
|
}), QueryResultSchema, { auth: "admin" }),
|
|
15262
|
+
/**
|
|
15263
|
+
* Several reads over ONE window, answered in order (one entry per item).
|
|
15264
|
+
* Admin-only: its subjects are nested in `items`, where the device scope
|
|
15265
|
+
* gate cannot see them — a principal limited to one device uses `query`.
|
|
15266
|
+
*/
|
|
15267
|
+
queryMany: require_sleep.method(zod.z.object({
|
|
15268
|
+
items: zod.z.array(QueryManyItemSchema).min(1).max(24),
|
|
15269
|
+
from: QueryWindowShape.from,
|
|
15270
|
+
to: QueryWindowShape.to,
|
|
15271
|
+
resolution: QueryWindowShape.resolution,
|
|
15272
|
+
maxPoints: QueryWindowShape.maxPoints
|
|
15273
|
+
}), zod.z.object({ results: zod.z.array(QueryManyEntrySchema).readonly() }), { auth: "admin" }),
|
|
15089
15274
|
/** Producer: declare (idempotent) a series key this addon owns: `addon:<callerAddonId>/<name>`. */
|
|
15090
15275
|
declareSeries: require_sleep.method(zod.z.object({
|
|
15091
15276
|
name: zod.z.string().regex(/^[a-z0-9-]+$/),
|
|
15092
15277
|
subjectKind: zod.z.enum(["device", "node"]),
|
|
15093
|
-
kind:
|
|
15278
|
+
kind: DeviceHistoryProducerKindSchema,
|
|
15094
15279
|
unit: zod.z.string().optional(),
|
|
15095
15280
|
displayName: zod.z.string().min(1),
|
|
15096
15281
|
ingest: zod.z.enum(["points", "buckets"])
|
|
@@ -40118,30 +40303,50 @@ var llmRuntimeCapability = {
|
|
|
40118
40303
|
* (hub-placed); the cap stays open for future providers.
|
|
40119
40304
|
*
|
|
40120
40305
|
* Profiles are ROWS (data), not addons: one row = one usable model endpoint.
|
|
40121
|
-
*
|
|
40122
|
-
*
|
|
40123
|
-
|
|
40124
|
-
|
|
40125
|
-
|
|
40126
|
-
|
|
40127
|
-
|
|
40128
|
-
|
|
40129
|
-
|
|
40130
|
-
|
|
40131
|
-
|
|
40306
|
+
* A row is common fields plus `providerConfig`, which the provider owning the
|
|
40307
|
+
* row's kind declares (`connectionSchema`) and validates. The kind is an open
|
|
40308
|
+
* id declared by that provider (D893). A `password` field of the provider's
|
|
40309
|
+
* schema is a secret — providers REDACT it on read and merge on write; a
|
|
40310
|
+
* stored key NEVER round-trips to a client.
|
|
40311
|
+
*/
|
|
40312
|
+
/**
|
|
40313
|
+
* A profile kind is an OPEN id, declared by the provider that serves it
|
|
40314
|
+
* (`listProfileKinds`). The cap names no kind: a new provider ships a new kind
|
|
40315
|
+
* without a framework change. Lower-case, digits and dashes, so it stays safe
|
|
40316
|
+
* as a URL segment, a record field and a CSS hook.
|
|
40317
|
+
*/
|
|
40318
|
+
var LLM_PROFILE_KIND_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
40319
|
+
var LlmProfileKindSchema = zod.z.string().regex(LLM_PROFILE_KIND_PATTERN, "a kind id is lower-case letters, digits and dashes");
|
|
40320
|
+
/** What a model (or, by default, every model of a kind) can do. */
|
|
40321
|
+
var LlmModelFeaturesSchema = zod.z.object({
|
|
40322
|
+
vision: zod.z.boolean(),
|
|
40323
|
+
tools: zod.z.boolean(),
|
|
40324
|
+
streaming: zod.z.boolean()
|
|
40325
|
+
});
|
|
40326
|
+
/** One model a provider offers. `features` overrides the kind's defaults, per field. */
|
|
40327
|
+
var LlmModelInfoSchema = zod.z.object({
|
|
40328
|
+
id: zod.z.string(),
|
|
40329
|
+
label: zod.z.string().optional(),
|
|
40330
|
+
contextLength: zod.z.number().int().positive().optional(),
|
|
40331
|
+
features: LlmModelFeaturesSchema.partial().optional()
|
|
40332
|
+
});
|
|
40333
|
+
/**
|
|
40334
|
+
* The provider-specific part of a profile, validated by the provider that owns
|
|
40335
|
+
* the kind (`upsertProfile` refuses what it does not accept). A field its
|
|
40336
|
+
* `connectionSchema` declares `type: 'password'` is a secret: it is held in the
|
|
40337
|
+
* keychain, never in the row, and reads back as the redaction marker.
|
|
40338
|
+
*/
|
|
40339
|
+
var LlmProviderConfigSchema = zod.z.record(zod.z.string(), zod.z.unknown());
|
|
40132
40340
|
var LlmProfileSchema = zod.z.object({
|
|
40133
40341
|
id: zod.z.string(),
|
|
40134
40342
|
name: zod.z.string(),
|
|
40343
|
+
/** The provider-declared kind (`LlmProfileKindDescriptor.kind`). */
|
|
40135
40344
|
kind: LlmProfileKindSchema,
|
|
40136
40345
|
/** Stamped by the provider — keeps the fanned catalog routable. */
|
|
40137
40346
|
addonId: zod.z.string(),
|
|
40138
40347
|
enabled: zod.z.boolean(),
|
|
40139
40348
|
/** Vendor model id, or the managed runtime's loaded model. */
|
|
40140
40349
|
model: zod.z.string(),
|
|
40141
|
-
/** Required for openai-compatible; override for cloud kinds. */
|
|
40142
|
-
baseUrl: zod.z.string().optional(),
|
|
40143
|
-
/** ConfigUISchema type:'password' — never round-trips (spec §5). */
|
|
40144
|
-
apiKey: zod.z.string().optional(),
|
|
40145
40350
|
/** Vision on/off. A vision call against a `false` profile is REFUSED, never
|
|
40146
40351
|
* degraded to text — that shipped once and produced a confident answer to a
|
|
40147
40352
|
* question about a picture nobody sent. */
|
|
@@ -40149,15 +40354,11 @@ var LlmProfileSchema = zod.z.object({
|
|
|
40149
40354
|
temperature: zod.z.number().min(0).max(2).optional(),
|
|
40150
40355
|
/** Nucleus sampling. Every wire we speak has it. */
|
|
40151
40356
|
topP: zod.z.number().min(0).max(1).optional(),
|
|
40152
|
-
/** Top-k sampling. Carried only by the wires that have it —
|
|
40153
|
-
*
|
|
40154
|
-
* `top_p` and no `top_k`). The profile editor hides the field wherever it
|
|
40155
|
-
* would change nothing; `KINDS_WITH_TOP_K` is the single owner of that list. */
|
|
40357
|
+
/** Top-k sampling. Carried only by the wires that have it — a kind offers the
|
|
40358
|
+
* field in its editor only when its descriptor lists it in `profileFields`. */
|
|
40156
40359
|
topK: zod.z.number().int().positive().optional(),
|
|
40157
40360
|
maxTokens: zod.z.number().int().positive().optional(),
|
|
40158
|
-
/** Prompt context window. Advisory for cloud kinds (they enforce their own)
|
|
40159
|
-
* for `managed-local` it is the llama.cpp `--ctx-size` the runtime starts
|
|
40160
|
-
* the model with, so it is the one field that changes a PROCESS. */
|
|
40361
|
+
/** Prompt context window. Advisory for cloud kinds (they enforce their own). */
|
|
40161
40362
|
contextLength: zod.z.number().int().positive().optional(),
|
|
40162
40363
|
/** Default system prompt. A caller's `system` REPLACES it (never appends —
|
|
40163
40364
|
* two system prompts fighting is worse than either alone). */
|
|
@@ -40183,16 +40384,37 @@ var LlmProfileSchema = zod.z.object({
|
|
|
40183
40384
|
* library; the REGISTRY of callable tools is ours and is empty in v1, so a
|
|
40184
40385
|
* `true` here buys the wiring, not behaviour, until tools are registered. */
|
|
40185
40386
|
toolsEnabled: zod.z.boolean().default(false),
|
|
40186
|
-
|
|
40187
|
-
|
|
40188
|
-
|
|
40189
|
-
|
|
40190
|
-
|
|
40191
|
-
|
|
40192
|
-
|
|
40193
|
-
|
|
40194
|
-
|
|
40195
|
-
|
|
40387
|
+
/** Everything the kind's provider owns (endpoint, key, node, runtime…). */
|
|
40388
|
+
providerConfig: LlmProviderConfigSchema.default({})
|
|
40389
|
+
});
|
|
40390
|
+
/**
|
|
40391
|
+
* The common profile fields a kind's editor offers. The editor owns how each
|
|
40392
|
+
* one is drawn; the provider says which of them mean something on its wire.
|
|
40393
|
+
*/
|
|
40394
|
+
var LlmProfileFieldSchema = zod.z.enum([
|
|
40395
|
+
"temperature",
|
|
40396
|
+
"topP",
|
|
40397
|
+
"topK",
|
|
40398
|
+
"maxTokens",
|
|
40399
|
+
"contextLength",
|
|
40400
|
+
"systemPrompt",
|
|
40401
|
+
"timeoutMs",
|
|
40402
|
+
"connectTimeoutMs",
|
|
40403
|
+
"firstTokenTimeoutMs",
|
|
40404
|
+
"idleTimeoutMs",
|
|
40405
|
+
"retry",
|
|
40406
|
+
"toolsEnabled"
|
|
40407
|
+
]);
|
|
40408
|
+
/**
|
|
40409
|
+
* A provider-drawn part of the editor, by a generic widget id the admin UI
|
|
40410
|
+
* registers (`ai/apple-node`). `placement: 'model'` replaces the generic model
|
|
40411
|
+
* picker: that widget owns the model choice.
|
|
40412
|
+
*/
|
|
40413
|
+
var LlmProviderWidgetSchema = zod.z.object({
|
|
40414
|
+
id: zod.z.string(),
|
|
40415
|
+
placement: zod.z.enum(["connection", "model"]),
|
|
40416
|
+
/** `providerConfig` keys this widget must fill before the profile can be saved. */
|
|
40417
|
+
requires: zod.z.array(zod.z.string()).optional()
|
|
40196
40418
|
});
|
|
40197
40419
|
/** ConfigUISchema tree passed through untyped on the wire (the
|
|
40198
40420
|
* notification-output `ConfigSchemaPassthrough` precedent at
|
|
@@ -40201,11 +40423,56 @@ var ConfigSchemaPassthrough$3 = zod.z.unknown();
|
|
|
40201
40423
|
var LlmProfileKindDescriptorSchema = zod.z.object({
|
|
40202
40424
|
kind: LlmProfileKindSchema,
|
|
40203
40425
|
label: zod.z.string(),
|
|
40426
|
+
/** A generic icon name (`cloud`, `plug`, `cpu`) — never a glyph or a logo. */
|
|
40204
40427
|
icon: zod.z.string(),
|
|
40205
40428
|
/** Stamped by each provider so the concat-fanned catalog stays routable. */
|
|
40206
40429
|
addonId: zod.z.string(),
|
|
40207
|
-
|
|
40430
|
+
/** The provider's own fields (`providerConfig`); `password` fields are keychain-held. */
|
|
40431
|
+
connectionSchema: ConfigSchemaPassthrough$3,
|
|
40432
|
+
/** Provider fields that belong under "Advanced" (extra headers, runtime tuning). */
|
|
40433
|
+
advancedSchema: ConfigSchemaPassthrough$3.optional(),
|
|
40434
|
+
/** The kind's defaults; a model from `listModels` may override any of them. */
|
|
40435
|
+
features: LlmModelFeaturesSchema,
|
|
40436
|
+
/** `false` = the provider stamps `supportsVision` itself (from what a node reports). */
|
|
40437
|
+
visionEditable: zod.z.boolean(),
|
|
40438
|
+
/** Where the model list comes from: `listModels`, `staticModels`, or nowhere. */
|
|
40439
|
+
modelCatalog: zod.z.enum([
|
|
40440
|
+
"fetch",
|
|
40441
|
+
"static",
|
|
40442
|
+
"none"
|
|
40443
|
+
]),
|
|
40444
|
+
staticModels: zod.z.array(LlmModelInfoSchema).optional(),
|
|
40445
|
+
/** The common fields that mean something on this kind's wire. */
|
|
40446
|
+
profileFields: zod.z.array(LlmProfileFieldSchema),
|
|
40447
|
+
providerWidgets: zod.z.array(LlmProviderWidgetSchema).optional()
|
|
40208
40448
|
});
|
|
40449
|
+
/**
|
|
40450
|
+
* `listModels` input. `connection` is an UNSAVED draft of `providerConfig`
|
|
40451
|
+
* (the editor's form); with `profileId` too, a secret the draft leaves
|
|
40452
|
+
* untouched (absent or the redaction marker) is resolved server-side from the
|
|
40453
|
+
* stored profile — the browser never receives it.
|
|
40454
|
+
*/
|
|
40455
|
+
var LlmListModelsInputSchema = zod.z.object({
|
|
40456
|
+
addonId: zod.z.string(),
|
|
40457
|
+
kind: LlmProfileKindSchema,
|
|
40458
|
+
profileId: zod.z.string().optional(),
|
|
40459
|
+
connection: LlmProviderConfigSchema.optional()
|
|
40460
|
+
});
|
|
40461
|
+
var LlmListModelsErrorCodeSchema = zod.z.enum([
|
|
40462
|
+
"auth",
|
|
40463
|
+
"network",
|
|
40464
|
+
"unsupported",
|
|
40465
|
+
"invalid"
|
|
40466
|
+
]);
|
|
40467
|
+
/** A RESULT, never a throw: "wrong key" is an answer the editor renders inline. */
|
|
40468
|
+
var LlmListModelsResultSchema = zod.z.discriminatedUnion("ok", [zod.z.object({
|
|
40469
|
+
ok: zod.z.literal(true),
|
|
40470
|
+
models: zod.z.array(LlmModelInfoSchema)
|
|
40471
|
+
}), zod.z.object({
|
|
40472
|
+
ok: zod.z.literal(false),
|
|
40473
|
+
code: LlmListModelsErrorCodeSchema,
|
|
40474
|
+
message: zod.z.string()
|
|
40475
|
+
})]);
|
|
40209
40476
|
var LlmDefaultSelectorSchema = zod.z.union([zod.z.object({ consumer: zod.z.string() }), zod.z.object({ purpose: zod.z.enum(["text", "vision"]) })]);
|
|
40210
40477
|
var LlmDefaultSchema = zod.z.object({
|
|
40211
40478
|
selector: LlmDefaultSelectorSchema,
|
|
@@ -40336,8 +40603,17 @@ var llmCapability = {
|
|
|
40336
40603
|
auth: "admin",
|
|
40337
40604
|
timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
|
|
40338
40605
|
}),
|
|
40339
|
-
/**
|
|
40340
|
-
|
|
40606
|
+
/**
|
|
40607
|
+
* The models a kind offers, for a SAVED profile or an unsaved draft
|
|
40608
|
+
* (`connection`). A mutation, not a query: a draft may carry a key, and a
|
|
40609
|
+
* query's input travels in the URL. Admin: it dials whatever endpoint the
|
|
40610
|
+
* draft names and may resolve a stored key to do it. The answer never
|
|
40611
|
+
* carries a secret — failures are a typed result, never a throw.
|
|
40612
|
+
*/
|
|
40613
|
+
listModels: require_sleep.method(LlmListModelsInputSchema, LlmListModelsResultSchema, {
|
|
40614
|
+
kind: "mutation",
|
|
40615
|
+
auth: "admin"
|
|
40616
|
+
}),
|
|
40341
40617
|
getDefaults: require_sleep.method(zod.z.object({}), zod.z.array(LlmDefaultSchema)),
|
|
40342
40618
|
setDefault: require_sleep.method(zod.z.object({
|
|
40343
40619
|
selector: LlmDefaultSelectorSchema,
|
|
@@ -40651,6 +40927,103 @@ var LogEntrySchema = zod.z.object({
|
|
|
40651
40927
|
meta: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
|
|
40652
40928
|
tags: zod.z.record(zod.z.string(), zod.z.string()).optional()
|
|
40653
40929
|
});
|
|
40930
|
+
/**
|
|
40931
|
+
* A history READ against one destination (D898).
|
|
40932
|
+
*
|
|
40933
|
+
* Every filter is applied by the PROVIDER, before the limit — a filter the
|
|
40934
|
+
* browser applied after the limit is what made a rare device's lines
|
|
40935
|
+
* unreachable behind a busy one's. `before` / `after` are cursors the provider
|
|
40936
|
+
* minted (opaque to everyone else): a file position for the rotated files, a
|
|
40937
|
+
* nanosecond timestamp for Loki.
|
|
40938
|
+
*
|
|
40939
|
+
* A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
|
|
40940
|
+
* store answers `done: false` with the cursor it reached and the bytes it
|
|
40941
|
+
* scanned, and the caller decides whether to go on. That is what makes a long
|
|
40942
|
+
* scan show progress and stop when asked — `cancelRead` ends the slice in
|
|
40943
|
+
* flight, and not asking for the next slice ends the scan.
|
|
40944
|
+
*/
|
|
40945
|
+
var LogReadQuerySchema = zod.z.object({
|
|
40946
|
+
/** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
|
|
40947
|
+
requestId: zod.z.string().min(1).max(64).optional(),
|
|
40948
|
+
/** The device the line is about (`tags.deviceId`, numeric). */
|
|
40949
|
+
deviceId: zod.z.number().int().optional(),
|
|
40950
|
+
/**
|
|
40951
|
+
* The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
|
|
40952
|
+
* match. Not `addonId`: a cap router reads that name as "which provider".
|
|
40953
|
+
*/
|
|
40954
|
+
fromAddonId: zod.z.string().min(1).max(200).optional(),
|
|
40955
|
+
/**
|
|
40956
|
+
* The emitting node: matches the agent that emitted the line, the node
|
|
40957
|
+
* itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
|
|
40958
|
+
* semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
|
|
40959
|
+
* name as "which node's provider".
|
|
40960
|
+
*/
|
|
40961
|
+
fromNodeId: zod.z.string().min(1).max(200).optional(),
|
|
40962
|
+
/** Any other tag, exact match (AND). */
|
|
40963
|
+
tags: zod.z.record(zod.z.string(), zod.z.union([zod.z.string(), zod.z.number()])).optional(),
|
|
40964
|
+
/** Severity FLOOR: this level and above. */
|
|
40965
|
+
level: LogLevelSchema.optional(),
|
|
40966
|
+
/** Case-insensitive substring over message, scope, tag values and meta values. */
|
|
40967
|
+
text: zod.z.string().min(1).max(200).optional(),
|
|
40968
|
+
/** Epoch ms, inclusive. */
|
|
40969
|
+
since: zod.z.number().optional(),
|
|
40970
|
+
/** Epoch ms, inclusive. */
|
|
40971
|
+
until: zod.z.number().optional(),
|
|
40972
|
+
/** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
|
|
40973
|
+
before: zod.z.string().min(1).max(1024).optional(),
|
|
40974
|
+
/** Newer than this cursor (exclusive). */
|
|
40975
|
+
after: zod.z.string().min(1).max(1024).optional(),
|
|
40976
|
+
limit: zod.z.number().int().min(1).max(1e3).optional(),
|
|
40977
|
+
/** Wall-clock bound of this slice. The provider caps it. */
|
|
40978
|
+
budgetMs: zod.z.number().int().min(50).max(1e4).optional()
|
|
40979
|
+
});
|
|
40980
|
+
var LogReadEntrySchema = zod.z.object({
|
|
40981
|
+
/** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
|
|
40982
|
+
id: zod.z.string().optional(),
|
|
40983
|
+
/** Epoch ms. */
|
|
40984
|
+
timestamp: zod.z.number(),
|
|
40985
|
+
level: LogLevelSchema,
|
|
40986
|
+
scope: zod.z.string().optional(),
|
|
40987
|
+
message: zod.z.string(),
|
|
40988
|
+
tags: zod.z.record(zod.z.string(), zod.z.union([zod.z.string(), zod.z.number()])).optional(),
|
|
40989
|
+
meta: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
|
|
40990
|
+
});
|
|
40991
|
+
var LogReadResultSchema = zod.z.object({
|
|
40992
|
+
/** Newest first. */
|
|
40993
|
+
entries: zod.z.array(LogReadEntrySchema),
|
|
40994
|
+
/** Pass as `before` for the next older page; null when nothing older exists. */
|
|
40995
|
+
nextBefore: zod.z.string().nullable(),
|
|
40996
|
+
/** Pass as `after` to read what arrived since; null when unknown. */
|
|
40997
|
+
nextAfter: zod.z.string().nullable(),
|
|
40998
|
+
/** Bytes this slice read (files) or received (remote). Progress, not a promise. */
|
|
40999
|
+
scannedBytes: zod.z.number().int().nonnegative(),
|
|
41000
|
+
/**
|
|
41001
|
+
* True when the scan in this direction reached the end of the store.
|
|
41002
|
+
* False with fewer than `limit` entries means the budget ran out first —
|
|
41003
|
+
* call again with `nextBefore` to go on.
|
|
41004
|
+
*/
|
|
41005
|
+
done: zod.z.boolean(),
|
|
41006
|
+
/** True when `cancelRead` ended this slice early. */
|
|
41007
|
+
cancelled: zod.z.boolean().optional()
|
|
41008
|
+
});
|
|
41009
|
+
var LogReadCapabilitiesSchema = zod.z.object({
|
|
41010
|
+
/** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
|
|
41011
|
+
readable: zod.z.boolean(),
|
|
41012
|
+
/** Why not, when `readable` is false — rendered next to the source. */
|
|
41013
|
+
reason: zod.z.string().nullable(),
|
|
41014
|
+
/** Filters the provider applies itself. A false one is applied by nobody. */
|
|
41015
|
+
filters: zod.z.object({
|
|
41016
|
+
deviceId: zod.z.boolean(),
|
|
41017
|
+
addonId: zod.z.boolean(),
|
|
41018
|
+
nodeId: zod.z.boolean(),
|
|
41019
|
+
tags: zod.z.boolean(),
|
|
41020
|
+
level: zod.z.boolean(),
|
|
41021
|
+
text: zod.z.boolean(),
|
|
41022
|
+
timeRange: zod.z.boolean()
|
|
41023
|
+
}),
|
|
41024
|
+
/** How far back the store reaches, when the provider knows (days). */
|
|
41025
|
+
retentionDays: zod.z.number().nullable()
|
|
41026
|
+
});
|
|
40654
41027
|
var logDestinationCapability = {
|
|
40655
41028
|
name: "log-destination",
|
|
40656
41029
|
scope: "system",
|
|
@@ -40658,14 +41031,13 @@ var logDestinationCapability = {
|
|
|
40658
41031
|
internal: true,
|
|
40659
41032
|
methods: {
|
|
40660
41033
|
write: require_sleep.method(LogEntrySchema, zod.z.void(), { kind: "mutation" }),
|
|
40661
|
-
|
|
40662
|
-
|
|
40663
|
-
|
|
40664
|
-
|
|
40665
|
-
|
|
40666
|
-
|
|
40667
|
-
|
|
40668
|
-
}), zod.z.array(LogEntrySchema).readonly())
|
|
41034
|
+
/** Absent ⇒ the destination cannot read back (same as `readable: false`). */
|
|
41035
|
+
describeRead: require_sleep.optionalMethod(zod.z.void(), LogReadCapabilitiesSchema, { auth: "admin" }),
|
|
41036
|
+
read: require_sleep.optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }),
|
|
41037
|
+
cancelRead: require_sleep.optionalMethod(zod.z.object({ requestId: zod.z.string().min(1).max(64) }), zod.z.object({ cancelled: zod.z.boolean() }), {
|
|
41038
|
+
kind: "mutation",
|
|
41039
|
+
auth: "admin"
|
|
41040
|
+
})
|
|
40669
41041
|
},
|
|
40670
41042
|
/** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
|
|
40671
41043
|
mount: { kind: "skip" }
|
|
@@ -42990,9 +43362,11 @@ var alarmPanelCapability = {
|
|
|
42990
43362
|
*/
|
|
42991
43363
|
durability: "restored",
|
|
42992
43364
|
/**
|
|
42993
|
-
* History (D850):
|
|
43365
|
+
* History (D850): the panel's lifecycle state as an `enum` series —
|
|
43366
|
+
* change-only, no floor, so an `arming -> pending -> triggered` sequence of a
|
|
43367
|
+
* few seconds keeps every step. Who armed it stays in the events ledger.
|
|
42994
43368
|
*/
|
|
42995
|
-
history: "
|
|
43369
|
+
history: { fields: { state: { kind: "enum" } } },
|
|
42996
43370
|
/** Clock fields: written, but excluded from the compare that decides
|
|
42997
43371
|
* whether persisting is worth a SQLite commit. */
|
|
42998
43372
|
volatileStateFields: ["lastChangedAt"]
|
|
@@ -43985,6 +44359,33 @@ var NcRuleTargetSchema = zod.z.object({
|
|
|
43985
44359
|
params: zod.z.record(zod.z.string(), zod.z.unknown()).optional()
|
|
43986
44360
|
});
|
|
43987
44361
|
/**
|
|
44362
|
+
* WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
|
|
44363
|
+
*
|
|
44364
|
+
* Every mode starts from the same CLEAN source frame of the trigger moment
|
|
44365
|
+
* (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
|
|
44366
|
+
* to the zone that fired the rule) and renders it once at send time:
|
|
44367
|
+
* - `scene-boxes` — the whole scene, the subject outlined thick in the accent
|
|
44368
|
+
* colour and every OTHER track visible at that instant outlined thin, each
|
|
44369
|
+
* labelled with class and confidence ("dog 87%").
|
|
44370
|
+
* - `crop` — the subject cut out of that frame around its box at that instant.
|
|
44371
|
+
* - `clean` — the whole scene with nothing drawn on it.
|
|
44372
|
+
* - `none` — no picture.
|
|
44373
|
+
*
|
|
44374
|
+
* A mode that cannot be honoured (no box at that instant, a photograph with no
|
|
44375
|
+
* tracked subject) ships `clean` and names the reason in the log, per camera.
|
|
44376
|
+
* It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
|
|
44377
|
+
* ship a crop on one event and a boxed scene on the next depending on which
|
|
44378
|
+
* stored kind had landed.
|
|
44379
|
+
*/
|
|
44380
|
+
var NcMediaImageSchema = zod.z.enum([
|
|
44381
|
+
"scene-boxes",
|
|
44382
|
+
"crop",
|
|
44383
|
+
"clean",
|
|
44384
|
+
"none"
|
|
44385
|
+
]);
|
|
44386
|
+
/**
|
|
44387
|
+
* @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
|
|
44388
|
+
*
|
|
43988
44389
|
* Media attachment policy (P1 still-image subset).
|
|
43989
44390
|
* - `best` — the best AVAILABLE subject image at dispatch time (D-3).
|
|
43990
44391
|
* - `best-matching` — the media that explains WHY the rule fired: a rule
|
|
@@ -43998,6 +44399,8 @@ var NcRuleTargetSchema = zod.z.object({
|
|
|
43998
44399
|
* - `none` — no attachment.
|
|
43999
44400
|
*/
|
|
44000
44401
|
/**
|
|
44402
|
+
* @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
|
|
44403
|
+
*
|
|
44001
44404
|
* WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
|
|
44002
44405
|
* conflate it with the selection strategy and betray the request: asking for
|
|
44003
44406
|
* the clean scene frame on an object-event owner used to start at
|
|
@@ -44044,16 +44447,29 @@ var NcLinkedCameraModeSchema = zod.z.enum(["mosaic", "each"]);
|
|
|
44044
44447
|
var NC_CLIP_PRE_ROLL_DEFAULT_SEC = 4;
|
|
44045
44448
|
var NC_CLIP_POST_ROLL_DEFAULT_SEC = 6;
|
|
44046
44449
|
var NcMediaPolicySchema = zod.z.object({
|
|
44450
|
+
/**
|
|
44451
|
+
* The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
|
|
44452
|
+
* saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
|
|
44453
|
+
* triple below, at load and at every write, and the store keeps only this.
|
|
44454
|
+
*/
|
|
44455
|
+
image: NcMediaImageSchema.optional(),
|
|
44456
|
+
/**
|
|
44457
|
+
* Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
|
|
44458
|
+
* a `crop` never shows it). Valid only on a rule whose trigger is a zone —
|
|
44459
|
+
* `conditions.zones` or an occupancy zone — and refused on save otherwise.
|
|
44460
|
+
* Replaces `zoneCrop`.
|
|
44461
|
+
*/
|
|
44462
|
+
showTriggerZone: zod.z.boolean().optional(),
|
|
44463
|
+
/** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
|
|
44047
44464
|
attach: zod.z.enum([
|
|
44048
44465
|
"best",
|
|
44049
44466
|
"best-matching",
|
|
44050
44467
|
"keyFrame",
|
|
44051
44468
|
"none"
|
|
44052
|
-
]).
|
|
44053
|
-
/**
|
|
44469
|
+
]).optional(),
|
|
44470
|
+
/** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
|
|
44054
44471
|
frame: NcMediaFrameSchema.optional(),
|
|
44055
|
-
/**
|
|
44056
|
-
* "show me the ZONE", not the whole scene or the subject crop. */
|
|
44472
|
+
/** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
|
|
44057
44473
|
zoneCrop: zod.z.boolean().optional(),
|
|
44058
44474
|
/**
|
|
44059
44475
|
* Also attach a short GIF cut from the stream broker's clip ring around the
|
|
@@ -44239,7 +44655,9 @@ var NcRuleInputSchema = zod.z.object({
|
|
|
44239
44655
|
* targets.
|
|
44240
44656
|
*/
|
|
44241
44657
|
targetUsers: zod.z.array(zod.z.string()).optional(),
|
|
44242
|
-
|
|
44658
|
+
/** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
|
|
44659
|
+
* detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
|
|
44660
|
+
media: NcMediaPolicySchema.default({}),
|
|
44243
44661
|
throttle: NcThrottleSchema.default({
|
|
44244
44662
|
cooldownSec: 60,
|
|
44245
44663
|
scope: "rule-device"
|
|
@@ -45811,13 +46229,37 @@ var NcAlarmModeOpeningsSchema = zod.z.object({
|
|
|
45811
46229
|
/** Covered devices whose state could not be read (D49): neither open nor closed. */
|
|
45812
46230
|
unknown: zod.z.array(zod.z.number().int())
|
|
45813
46231
|
});
|
|
46232
|
+
/**
|
|
46233
|
+
* One alarm INPUT — a (rule, device) pair — the operator bypassed until the
|
|
46234
|
+
* next disarm ("Bypass this input until disarm" on a trigger notification, or
|
|
46235
|
+
* `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
|
|
46236
|
+
* never looks fully armed (D62: off must never look like broken).
|
|
46237
|
+
*/
|
|
46238
|
+
var NcAlarmInputBypassViewSchema = zod.z.object({
|
|
46239
|
+
ruleId: zod.z.string(),
|
|
46240
|
+
/** The rule's current name (its frozen name when the rule is gone). */
|
|
46241
|
+
ruleName: zod.z.string(),
|
|
46242
|
+
/** The input: the sensor of the match, else its camera. */
|
|
46243
|
+
deviceId: zod.z.number().int(),
|
|
46244
|
+
/** The input's current name. */
|
|
46245
|
+
name: zod.z.string(),
|
|
46246
|
+
/** When it was bypassed (ms epoch). */
|
|
46247
|
+
since: zod.z.number(),
|
|
46248
|
+
/** Triggers from this input dropped since. */
|
|
46249
|
+
dropped: zod.z.number().int().min(0)
|
|
46250
|
+
});
|
|
45814
46251
|
var NcAlarmLiveSchema = zod.z.object({
|
|
45815
46252
|
state: AlarmStateSchema,
|
|
45816
46253
|
/** The mode being armed into (exit delay) or held; null when disarmed. */
|
|
45817
46254
|
targetMode: AlarmArmModeSchema.nullable(),
|
|
45818
46255
|
availableModes: zod.z.array(AlarmArmModeSchema),
|
|
45819
46256
|
openings: zod.z.array(NcAlarmModeOpeningsSchema),
|
|
45820
|
-
exclusions: zod.z.array(NcAlarmExclusionViewSchema)
|
|
46257
|
+
exclusions: zod.z.array(NcAlarmExclusionViewSchema),
|
|
46258
|
+
/**
|
|
46259
|
+
* Inputs bypassed for the rest of this arm session; cleared on disarm.
|
|
46260
|
+
* Defaulted so an older hub answer still parses (as "none known").
|
|
46261
|
+
*/
|
|
46262
|
+
bypassedInputs: zod.z.array(NcAlarmInputBypassViewSchema).default([])
|
|
45821
46263
|
});
|
|
45822
46264
|
var NcAlarmConfigSchema = zod.z.object({
|
|
45823
46265
|
/**
|
|
@@ -60786,9 +61228,11 @@ var connectivityCapability = {
|
|
|
60786
61228
|
*/
|
|
60787
61229
|
durability: "restored",
|
|
60788
61230
|
/**
|
|
60789
|
-
* History (D850):
|
|
61231
|
+
* History (D850): `connected` as a boolean series — change-only, no floor. It
|
|
61232
|
+
* is the upstream entity's own link (a HA connectivity sensor), not the
|
|
61233
|
+
* device's reachability, which stays `device-status.online`.
|
|
60790
61234
|
*/
|
|
60791
|
-
history: "
|
|
61235
|
+
history: { fields: { connected: { kind: "boolean" } } },
|
|
60792
61236
|
/** Clock fields: written, but excluded from the compare that decides
|
|
60793
61237
|
* whether persisting is worth a SQLite commit. */
|
|
60794
61238
|
volatileStateFields: ["lastChangedAt"]
|
|
@@ -61672,11 +62116,22 @@ var dishwasherCapability = {
|
|
|
61672
62116
|
},
|
|
61673
62117
|
runtimeState: DishwasherStatusSchema,
|
|
61674
62118
|
durability: "session",
|
|
61675
|
-
history: { fields: {
|
|
61676
|
-
|
|
61677
|
-
|
|
61678
|
-
|
|
61679
|
-
|
|
62119
|
+
history: { fields: {
|
|
62120
|
+
progressPercent: {
|
|
62121
|
+
kind: "gauge",
|
|
62122
|
+
unit: "%",
|
|
62123
|
+
deadband: 2
|
|
62124
|
+
},
|
|
62125
|
+
state: { kind: "enum" },
|
|
62126
|
+
operationState: { kind: "enum" },
|
|
62127
|
+
remainingSeconds: {
|
|
62128
|
+
kind: "gauge",
|
|
62129
|
+
unit: "s",
|
|
62130
|
+
minIntervalMs: 6e4
|
|
62131
|
+
},
|
|
62132
|
+
doorOpen: { kind: "boolean" },
|
|
62133
|
+
powerOn: { kind: "boolean" }
|
|
62134
|
+
} }
|
|
61680
62135
|
};
|
|
61681
62136
|
//#endregion
|
|
61682
62137
|
//#region src/capabilities/doorbell.cap.ts
|
|
@@ -61797,9 +62252,15 @@ var enumSensorCapability = {
|
|
|
61797
62252
|
*/
|
|
61798
62253
|
durability: "restored",
|
|
61799
62254
|
/**
|
|
61800
|
-
* History (D850):
|
|
62255
|
+
* History (D850): the value as an `enum` series (an appliance's program or
|
|
62256
|
+
* operation state, an HVAC action). The option set is per device, so the
|
|
62257
|
+
* value list is LEARNED as values are first seen (bounded). A sensor with a
|
|
62258
|
+
* `format` carries a timestamp, not a state, and is not recorded.
|
|
61801
62259
|
*/
|
|
61802
|
-
history:
|
|
62260
|
+
history: { fields: { value: {
|
|
62261
|
+
kind: "enum",
|
|
62262
|
+
skipWhenSet: "format"
|
|
62263
|
+
} } },
|
|
61803
62264
|
/** Clock fields: written, but excluded from the compare that decides
|
|
61804
62265
|
* whether persisting is worth a SQLite commit. */
|
|
61805
62266
|
volatileStateFields: ["lastFetchedAt"]
|
|
@@ -64053,9 +64514,10 @@ var lockControlCapability = {
|
|
|
64053
64514
|
*/
|
|
64054
64515
|
durability: "restored",
|
|
64055
64516
|
/**
|
|
64056
|
-
* History (D850):
|
|
64517
|
+
* History (D850): the lock's state as an `enum` series — change-only, no
|
|
64518
|
+
* floor: a jam or an unlock lasting seconds is the edge an operator looks for.
|
|
64057
64519
|
*/
|
|
64058
|
-
history: "
|
|
64520
|
+
history: { fields: { state: { kind: "enum" } } },
|
|
64059
64521
|
/** Clock fields: written, but excluded from the compare that decides
|
|
64060
64522
|
* whether persisting is worth a SQLite commit. */
|
|
64061
64523
|
volatileStateFields: ["lastChangedAt"]
|
|
@@ -64231,9 +64693,18 @@ var mediaPlayerCapability = {
|
|
|
64231
64693
|
*/
|
|
64232
64694
|
durability: "session",
|
|
64233
64695
|
/**
|
|
64234
|
-
* History (D850):
|
|
64696
|
+
* History (D850): volume (a level an operator or an automation sets; the
|
|
64697
|
+
* default 10 s floor folds a slider drag into its end value) and mute.
|
|
64698
|
+
* `positionMs` is not recorded: it moves continuously while playing.
|
|
64235
64699
|
*/
|
|
64236
|
-
history:
|
|
64700
|
+
history: { fields: {
|
|
64701
|
+
volumeLevel: {
|
|
64702
|
+
kind: "gauge",
|
|
64703
|
+
unit: "%",
|
|
64704
|
+
deadband: 1
|
|
64705
|
+
},
|
|
64706
|
+
isMuted: { kind: "boolean" }
|
|
64707
|
+
} }
|
|
64237
64708
|
};
|
|
64238
64709
|
//#endregion
|
|
64239
64710
|
//#region src/capabilities/mesh-network.cap.ts
|
|
@@ -71185,9 +71656,29 @@ var streamParamsCapability = {
|
|
|
71185
71656
|
*/
|
|
71186
71657
|
durability: "restored",
|
|
71187
71658
|
/**
|
|
71188
|
-
* History (D850):
|
|
71659
|
+
* History (D850): the configured bitrate and frame rate of the main and sub
|
|
71660
|
+
* profiles. Configuration, so change-only on the default floor: a point is an
|
|
71661
|
+
* operator's (or a tuner's) edit, which is exactly what a chart of a stream's
|
|
71662
|
+
* quality over time must show.
|
|
71189
71663
|
*/
|
|
71190
|
-
history:
|
|
71664
|
+
history: { fields: {
|
|
71665
|
+
"main.bitrate": {
|
|
71666
|
+
kind: "gauge",
|
|
71667
|
+
unit: "kbps"
|
|
71668
|
+
},
|
|
71669
|
+
"main.framerate": {
|
|
71670
|
+
kind: "gauge",
|
|
71671
|
+
unit: "fps"
|
|
71672
|
+
},
|
|
71673
|
+
"sub.bitrate": {
|
|
71674
|
+
kind: "gauge",
|
|
71675
|
+
unit: "kbps"
|
|
71676
|
+
},
|
|
71677
|
+
"sub.framerate": {
|
|
71678
|
+
kind: "gauge",
|
|
71679
|
+
unit: "fps"
|
|
71680
|
+
}
|
|
71681
|
+
} },
|
|
71191
71682
|
/** Clock fields: written, but excluded from the compare that decides
|
|
71192
71683
|
* whether persisting is worth a SQLite commit. */
|
|
71193
71684
|
volatileStateFields: ["lastFetchedAt"]
|
|
@@ -72461,26 +72952,6 @@ var ApiKeySummarySchema = zod.z.object({
|
|
|
72461
72952
|
createdAt: zod.z.number(),
|
|
72462
72953
|
lastUsedAt: zod.z.number().optional()
|
|
72463
72954
|
});
|
|
72464
|
-
var ScopedTokenSummarySchema = zod.z.object({
|
|
72465
|
-
id: zod.z.string(),
|
|
72466
|
-
userId: zod.z.string(),
|
|
72467
|
-
name: zod.z.string(),
|
|
72468
|
-
tokenPrefix: zod.z.string(),
|
|
72469
|
-
scopes: zod.z.array(TokenScopeSchema),
|
|
72470
|
-
expiresAt: zod.z.number().nullish(),
|
|
72471
|
-
lastUsedAt: zod.z.number().nullish(),
|
|
72472
|
-
createdAt: zod.z.number()
|
|
72473
|
-
});
|
|
72474
|
-
var CreateScopedTokenInputSchema = zod.z.object({
|
|
72475
|
-
userId: zod.z.string(),
|
|
72476
|
-
name: zod.z.string(),
|
|
72477
|
-
scopes: zod.z.array(TokenScopeSchema),
|
|
72478
|
-
expiresAt: zod.z.number().optional()
|
|
72479
|
-
});
|
|
72480
|
-
var CreateScopedTokenResultSchema = zod.z.object({
|
|
72481
|
-
token: zod.z.string(),
|
|
72482
|
-
record: ScopedTokenSummarySchema
|
|
72483
|
-
});
|
|
72484
72955
|
var OauthSessionSummarySchema = zod.z.object({
|
|
72485
72956
|
id: zod.z.string(),
|
|
72486
72957
|
userId: zod.z.string(),
|
|
@@ -72502,11 +72973,11 @@ var TotpStatusSchema = zod.z.object({
|
|
|
72502
72973
|
confirmedAt: zod.z.number().nullable()
|
|
72503
72974
|
});
|
|
72504
72975
|
/**
|
|
72505
|
-
* user-management — singleton capability for user accounts
|
|
72506
|
-
*
|
|
72976
|
+
* user-management — singleton capability for user accounts and the
|
|
72977
|
+
* legacy API-key rows.
|
|
72507
72978
|
*
|
|
72508
72979
|
* v2 model: every method gated by `auth: 'admin'`. Admin-only delegation
|
|
72509
|
-
* — the subset check on `setUserScopes`
|
|
72980
|
+
* — the subset check on `setUserScopes` is moot
|
|
72510
72981
|
* because non-admins never reach these. If/when we open non-admin
|
|
72511
72982
|
* delegation, structural caller-scope subset check goes inside the
|
|
72512
72983
|
* provider.
|
|
@@ -72577,18 +73048,6 @@ var userManagementCapability = {
|
|
|
72577
73048
|
auth: "admin",
|
|
72578
73049
|
access: "delete"
|
|
72579
73050
|
}),
|
|
72580
|
-
createScopedToken: require_sleep.method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
|
|
72581
|
-
kind: "mutation",
|
|
72582
|
-
auth: "admin",
|
|
72583
|
-
access: "create"
|
|
72584
|
-
}),
|
|
72585
|
-
revokeScopedToken: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.literal(true) }), {
|
|
72586
|
-
kind: "mutation",
|
|
72587
|
-
auth: "admin",
|
|
72588
|
-
access: "delete"
|
|
72589
|
-
}),
|
|
72590
|
-
validateScopedToken: require_sleep.method(zod.z.object({ token: zod.z.string() }), ScopedTokenSummarySchema.nullable(), { access: "view" }),
|
|
72591
|
-
listScopedTokens: require_sleep.method(zod.z.object({ userId: zod.z.string() }), zod.z.array(ScopedTokenSummarySchema), { auth: "admin" }),
|
|
72592
73051
|
setupTotp: require_sleep.method(zod.z.object({ userId: zod.z.string() }), TotpSetupResultSchema, {
|
|
72593
73052
|
kind: "mutation",
|
|
72594
73053
|
auth: "admin",
|
|
@@ -76160,6 +76619,15 @@ var BaseDevice = class {
|
|
|
76160
76619
|
* Drivers can use the `getProbeFlags()` helper to read the flag bag
|
|
76161
76620
|
* with a typed cast.
|
|
76162
76621
|
*
|
|
76622
|
+
* Answer what you KNOW. A plain array is read as the complete list only
|
|
76623
|
+
* while this device is `online` and probed; return
|
|
76624
|
+
* `accessoryChildrenUnknown(reason)` whenever you cannot know the list right
|
|
76625
|
+
* now (no credentials, parent not connected, a failed or partial read) —
|
|
76626
|
+
* the kernel then deletes nothing. Return `accessoryChildrenComplete(list)`
|
|
76627
|
+
* to say "connected, and this is the complete list" explicitly. A shrink is
|
|
76628
|
+
* deleted only after a second agreeing complete read on a later probe (D49;
|
|
76629
|
+
* `packages/system/src/kernel/moleculer/accessory-prune-gate.ts`).
|
|
76630
|
+
*
|
|
76163
76631
|
* Default: no children.
|
|
76164
76632
|
*/
|
|
76165
76633
|
getAccessoryChildren() {
|
|
@@ -76183,6 +76651,22 @@ var BaseDevice = class {
|
|
|
76183
76651
|
return (this.runtimeState.getCapState("feature-probe")?.lastProbedAt ?? 0) > 0;
|
|
76184
76652
|
}
|
|
76185
76653
|
};
|
|
76654
|
+
function accessoryChildrenUnknown(reason, known) {
|
|
76655
|
+
return known === void 0 ? {
|
|
76656
|
+
kind: "unknown",
|
|
76657
|
+
reason
|
|
76658
|
+
} : {
|
|
76659
|
+
kind: "unknown",
|
|
76660
|
+
reason,
|
|
76661
|
+
known
|
|
76662
|
+
};
|
|
76663
|
+
}
|
|
76664
|
+
function accessoryChildrenComplete(children) {
|
|
76665
|
+
return {
|
|
76666
|
+
kind: "complete",
|
|
76667
|
+
children
|
|
76668
|
+
};
|
|
76669
|
+
}
|
|
76186
76670
|
//#endregion
|
|
76187
76671
|
//#region src/device/device-restore-retry.ts
|
|
76188
76672
|
/**
|
|
@@ -80812,7 +81296,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
80812
81296
|
capName: "llm",
|
|
80813
81297
|
capScope: "system",
|
|
80814
81298
|
addonId: null,
|
|
80815
|
-
access: "
|
|
81299
|
+
access: "create"
|
|
80816
81300
|
},
|
|
80817
81301
|
"llm.listNodeModels": {
|
|
80818
81302
|
capName: "llm",
|
|
@@ -81114,7 +81598,19 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
81114
81598
|
addonId: null,
|
|
81115
81599
|
access: "view"
|
|
81116
81600
|
},
|
|
81117
|
-
"logDestination.
|
|
81601
|
+
"logDestination.cancelRead": {
|
|
81602
|
+
capName: "log-destination",
|
|
81603
|
+
capScope: "system",
|
|
81604
|
+
addonId: null,
|
|
81605
|
+
access: "create"
|
|
81606
|
+
},
|
|
81607
|
+
"logDestination.describeRead": {
|
|
81608
|
+
capName: "log-destination",
|
|
81609
|
+
capScope: "system",
|
|
81610
|
+
addonId: null,
|
|
81611
|
+
access: "view"
|
|
81612
|
+
},
|
|
81613
|
+
"logDestination.read": {
|
|
81118
81614
|
capName: "log-destination",
|
|
81119
81615
|
capScope: "system",
|
|
81120
81616
|
addonId: null,
|
|
@@ -85476,12 +85972,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
85476
85972
|
addonId: null,
|
|
85477
85973
|
access: "create"
|
|
85478
85974
|
},
|
|
85479
|
-
"userManagement.createScopedToken": {
|
|
85480
|
-
capName: "user-management",
|
|
85481
|
-
capScope: "system",
|
|
85482
|
-
addonId: null,
|
|
85483
|
-
access: "create"
|
|
85484
|
-
},
|
|
85485
85975
|
"userManagement.createUser": {
|
|
85486
85976
|
capName: "user-management",
|
|
85487
85977
|
capScope: "system",
|
|
@@ -85530,12 +86020,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
85530
86020
|
addonId: null,
|
|
85531
86021
|
access: "view"
|
|
85532
86022
|
},
|
|
85533
|
-
"userManagement.listScopedTokens": {
|
|
85534
|
-
capName: "user-management",
|
|
85535
|
-
capScope: "system",
|
|
85536
|
-
addonId: null,
|
|
85537
|
-
access: "view"
|
|
85538
|
-
},
|
|
85539
86023
|
"userManagement.listUsers": {
|
|
85540
86024
|
capName: "user-management",
|
|
85541
86025
|
capScope: "system",
|
|
@@ -85590,12 +86074,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
85590
86074
|
addonId: null,
|
|
85591
86075
|
access: "delete"
|
|
85592
86076
|
},
|
|
85593
|
-
"userManagement.revokeScopedToken": {
|
|
85594
|
-
capName: "user-management",
|
|
85595
|
-
capScope: "system",
|
|
85596
|
-
addonId: null,
|
|
85597
|
-
access: "delete"
|
|
85598
|
-
},
|
|
85599
86077
|
"userManagement.setupTotp": {
|
|
85600
86078
|
capName: "user-management",
|
|
85601
86079
|
capScope: "system",
|
|
@@ -85626,12 +86104,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
85626
86104
|
addonId: null,
|
|
85627
86105
|
access: "view"
|
|
85628
86106
|
},
|
|
85629
|
-
"userManagement.validateScopedToken": {
|
|
85630
|
-
capName: "user-management",
|
|
85631
|
-
capScope: "system",
|
|
85632
|
-
addonId: null,
|
|
85633
|
-
access: "view"
|
|
85634
|
-
},
|
|
85635
86107
|
"userManagement.verifyTotp": {
|
|
85636
86108
|
capName: "user-management",
|
|
85637
86109
|
capScope: "system",
|
|
@@ -90557,6 +91029,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
|
|
|
90557
91029
|
form: "single",
|
|
90558
91030
|
optional: false
|
|
90559
91031
|
}],
|
|
91032
|
+
"logDestination.read": [{
|
|
91033
|
+
name: "deviceId",
|
|
91034
|
+
form: "single",
|
|
91035
|
+
optional: true
|
|
91036
|
+
}],
|
|
90560
91037
|
"mediaPlayer.getStatus": [{
|
|
90561
91038
|
name: "deviceId",
|
|
90562
91039
|
form: "single",
|
|
@@ -92324,6 +92801,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
|
|
|
92324
92801
|
"faceGallery.getFaceByTrack",
|
|
92325
92802
|
"faceGallery.listRecentFaces",
|
|
92326
92803
|
"keychain.deleteDeviceScope",
|
|
92804
|
+
"logDestination.read",
|
|
92327
92805
|
"networkQuality.getDeviceStats",
|
|
92328
92806
|
"networkQuality.reportClientStats",
|
|
92329
92807
|
"notificationRules.getAlarmSensors",
|
|
@@ -92919,7 +93397,7 @@ var BucketAccumulator = class {
|
|
|
92919
93397
|
//#region src/generated/history-catalog.ts
|
|
92920
93398
|
/**
|
|
92921
93399
|
* Cap history catalog, projected from every `*.cap.ts` `history` block.
|
|
92922
|
-
*
|
|
93400
|
+
* 40 caps with series (77 series), 31 caps answered `'none'`.
|
|
92923
93401
|
* Field keys are `runtimeState` paths (`a.b` into fixed objects only).
|
|
92924
93402
|
*/
|
|
92925
93403
|
var HISTORY_CATALOG = {
|
|
@@ -92950,6 +93428,21 @@ var HISTORY_CATALOG = {
|
|
|
92950
93428
|
deadband: 1
|
|
92951
93429
|
}
|
|
92952
93430
|
},
|
|
93431
|
+
"alarm-panel": { "state": {
|
|
93432
|
+
kind: "enum",
|
|
93433
|
+
values: [
|
|
93434
|
+
"disarmed",
|
|
93435
|
+
"armed_home",
|
|
93436
|
+
"armed_away",
|
|
93437
|
+
"armed_night",
|
|
93438
|
+
"armed_vacation",
|
|
93439
|
+
"armed_custom_bypass",
|
|
93440
|
+
"arming",
|
|
93441
|
+
"disarming",
|
|
93442
|
+
"pending",
|
|
93443
|
+
"triggered"
|
|
93444
|
+
]
|
|
93445
|
+
} },
|
|
92953
93446
|
"ambient-light-sensor": { "lux": {
|
|
92954
93447
|
kind: "gauge",
|
|
92955
93448
|
unit: "lx",
|
|
@@ -92994,6 +93487,7 @@ var HISTORY_CATALOG = {
|
|
|
92994
93487
|
minIntervalMs: 0
|
|
92995
93488
|
}
|
|
92996
93489
|
},
|
|
93490
|
+
"connectivity": { "connected": { kind: "boolean" } },
|
|
92997
93491
|
"contact": { "entryOpen": { kind: "boolean" } },
|
|
92998
93492
|
"cover": { "position": {
|
|
92999
93493
|
kind: "gauge",
|
|
@@ -93001,10 +93495,48 @@ var HISTORY_CATALOG = {
|
|
|
93001
93495
|
minIntervalMs: 0
|
|
93002
93496
|
} },
|
|
93003
93497
|
"device-status": { "online": { kind: "boolean" } },
|
|
93004
|
-
"dishwasher": {
|
|
93005
|
-
|
|
93006
|
-
|
|
93007
|
-
|
|
93498
|
+
"dishwasher": {
|
|
93499
|
+
"progressPercent": {
|
|
93500
|
+
kind: "gauge",
|
|
93501
|
+
unit: "%",
|
|
93502
|
+
deadband: 2
|
|
93503
|
+
},
|
|
93504
|
+
"state": {
|
|
93505
|
+
kind: "enum",
|
|
93506
|
+
values: [
|
|
93507
|
+
"idle",
|
|
93508
|
+
"running",
|
|
93509
|
+
"paused",
|
|
93510
|
+
"finished",
|
|
93511
|
+
"error",
|
|
93512
|
+
"unavailable"
|
|
93513
|
+
]
|
|
93514
|
+
},
|
|
93515
|
+
"operationState": {
|
|
93516
|
+
kind: "enum",
|
|
93517
|
+
values: [
|
|
93518
|
+
"Inactive",
|
|
93519
|
+
"Ready",
|
|
93520
|
+
"DelayedStart",
|
|
93521
|
+
"Run",
|
|
93522
|
+
"Pause",
|
|
93523
|
+
"ActionRequired",
|
|
93524
|
+
"Finished",
|
|
93525
|
+
"Error",
|
|
93526
|
+
"Aborting"
|
|
93527
|
+
]
|
|
93528
|
+
},
|
|
93529
|
+
"remainingSeconds": {
|
|
93530
|
+
kind: "gauge",
|
|
93531
|
+
unit: "s",
|
|
93532
|
+
minIntervalMs: 6e4
|
|
93533
|
+
},
|
|
93534
|
+
"doorOpen": { kind: "boolean" },
|
|
93535
|
+
"powerOn": { kind: "boolean" }
|
|
93536
|
+
},
|
|
93537
|
+
"enum-sensor": { "value": {
|
|
93538
|
+
kind: "enum",
|
|
93539
|
+
skipWhenSet: "format"
|
|
93008
93540
|
} },
|
|
93009
93541
|
"fan-control": {
|
|
93010
93542
|
"percentage": {
|
|
@@ -93039,6 +93571,24 @@ var HISTORY_CATALOG = {
|
|
|
93039
93571
|
unit: "%",
|
|
93040
93572
|
deadband: 2
|
|
93041
93573
|
} },
|
|
93574
|
+
"lock-control": { "state": {
|
|
93575
|
+
kind: "enum",
|
|
93576
|
+
values: [
|
|
93577
|
+
"locked",
|
|
93578
|
+
"unlocked",
|
|
93579
|
+
"locking",
|
|
93580
|
+
"unlocking",
|
|
93581
|
+
"jammed"
|
|
93582
|
+
]
|
|
93583
|
+
} },
|
|
93584
|
+
"media-player": {
|
|
93585
|
+
"volumeLevel": {
|
|
93586
|
+
kind: "gauge",
|
|
93587
|
+
unit: "%",
|
|
93588
|
+
deadband: 1
|
|
93589
|
+
},
|
|
93590
|
+
"isMuted": { kind: "boolean" }
|
|
93591
|
+
},
|
|
93042
93592
|
"motion": { "detected": {
|
|
93043
93593
|
kind: "boolean",
|
|
93044
93594
|
excludeDeviceTypes: [require_err_msg.DeviceType.Camera]
|
|
@@ -93125,6 +93675,24 @@ var HISTORY_CATALOG = {
|
|
|
93125
93675
|
deadband: .1
|
|
93126
93676
|
} },
|
|
93127
93677
|
"smoke": { "detected": { kind: "boolean" } },
|
|
93678
|
+
"stream-params": {
|
|
93679
|
+
"main.bitrate": {
|
|
93680
|
+
kind: "gauge",
|
|
93681
|
+
unit: "kbps"
|
|
93682
|
+
},
|
|
93683
|
+
"main.framerate": {
|
|
93684
|
+
kind: "gauge",
|
|
93685
|
+
unit: "fps"
|
|
93686
|
+
},
|
|
93687
|
+
"sub.bitrate": {
|
|
93688
|
+
kind: "gauge",
|
|
93689
|
+
unit: "kbps"
|
|
93690
|
+
},
|
|
93691
|
+
"sub.framerate": {
|
|
93692
|
+
kind: "gauge",
|
|
93693
|
+
unit: "fps"
|
|
93694
|
+
}
|
|
93695
|
+
},
|
|
93128
93696
|
"switch": { "on": { kind: "boolean" } },
|
|
93129
93697
|
"tamper": { "tampered": { kind: "boolean" } },
|
|
93130
93698
|
"temperature-sensor": { "celsius": {
|
|
@@ -93202,25 +93770,20 @@ var HISTORY_CATALOG = {
|
|
|
93202
93770
|
};
|
|
93203
93771
|
/** Caps that declared `history: 'none'`, sorted. */
|
|
93204
93772
|
var HISTORY_NONE_CAPS = [
|
|
93205
|
-
"alarm-panel",
|
|
93206
93773
|
"audio-metrics",
|
|
93207
93774
|
"automation-control",
|
|
93208
93775
|
"camera-streams",
|
|
93209
93776
|
"color",
|
|
93210
|
-
"connectivity",
|
|
93211
93777
|
"consumables",
|
|
93212
93778
|
"control",
|
|
93213
93779
|
"day-night",
|
|
93214
93780
|
"device-discovery",
|
|
93215
93781
|
"doorbell",
|
|
93216
|
-
"enum-sensor",
|
|
93217
93782
|
"event-emitter",
|
|
93218
93783
|
"feature-probe",
|
|
93219
93784
|
"image",
|
|
93220
93785
|
"image-settings",
|
|
93221
93786
|
"intercom",
|
|
93222
|
-
"lock-control",
|
|
93223
|
-
"media-player",
|
|
93224
93787
|
"motion-trigger",
|
|
93225
93788
|
"motion-zones",
|
|
93226
93789
|
"native-object-detection",
|
|
@@ -93233,7 +93796,6 @@ var HISTORY_NONE_CAPS = [
|
|
|
93233
93796
|
"scene-monitor",
|
|
93234
93797
|
"script-runner",
|
|
93235
93798
|
"stream-catalog",
|
|
93236
|
-
"stream-params",
|
|
93237
93799
|
"stream-signals",
|
|
93238
93800
|
"update",
|
|
93239
93801
|
"zone-analytics",
|
|
@@ -93506,6 +94068,7 @@ function createSystemProxy(api) {
|
|
|
93506
94068
|
deviceHistory: {
|
|
93507
94069
|
listNodeSeries: (input) => dispatch("deviceHistory", "listNodeSeries", "query", input),
|
|
93508
94070
|
queryNode: (input) => dispatch("deviceHistory", "queryNode", "query", input),
|
|
94071
|
+
queryMany: (input) => dispatch("deviceHistory", "queryMany", "query", input),
|
|
93509
94072
|
declareSeries: (input) => dispatch("deviceHistory", "declareSeries", "mutation", input),
|
|
93510
94073
|
record: (input) => dispatch("deviceHistory", "record", "mutation", input),
|
|
93511
94074
|
recordBuckets: (input) => dispatch("deviceHistory", "recordBuckets", "mutation", input),
|
|
@@ -93639,7 +94202,7 @@ function createSystemProxy(api) {
|
|
|
93639
94202
|
migrateRawSecrets: (input) => dispatch("llm", "migrateRawSecrets", "mutation", input),
|
|
93640
94203
|
deleteProfile: (input) => dispatch("llm", "deleteProfile", "mutation", input),
|
|
93641
94204
|
testProfile: (input) => dispatch("llm", "testProfile", "mutation", input),
|
|
93642
|
-
listModels: (input) => dispatch("llm", "listModels", "
|
|
94205
|
+
listModels: (input) => dispatch("llm", "listModels", "mutation", input),
|
|
93643
94206
|
getDefaults: (input) => dispatch("llm", "getDefaults", "query", input),
|
|
93644
94207
|
setDefault: (input) => dispatch("llm", "setDefault", "mutation", input),
|
|
93645
94208
|
getUsage: (input) => dispatch("llm", "getUsage", "query", input),
|
|
@@ -94083,10 +94646,6 @@ function createSystemProxy(api) {
|
|
|
94083
94646
|
validateCredentials: (input) => dispatch("userManagement", "validateCredentials", "mutation", input),
|
|
94084
94647
|
listApiKeys: (input) => dispatch("userManagement", "listApiKeys", "query", input),
|
|
94085
94648
|
revokeApiKey: (input) => dispatch("userManagement", "revokeApiKey", "mutation", input),
|
|
94086
|
-
createScopedToken: (input) => dispatch("userManagement", "createScopedToken", "mutation", input),
|
|
94087
|
-
revokeScopedToken: (input) => dispatch("userManagement", "revokeScopedToken", "mutation", input),
|
|
94088
|
-
validateScopedToken: (input) => dispatch("userManagement", "validateScopedToken", "query", input),
|
|
94089
|
-
listScopedTokens: (input) => dispatch("userManagement", "listScopedTokens", "query", input),
|
|
94090
94649
|
setupTotp: (input) => dispatch("userManagement", "setupTotp", "mutation", input),
|
|
94091
94650
|
confirmTotp: (input) => dispatch("userManagement", "confirmTotp", "mutation", input),
|
|
94092
94651
|
disableTotp: (input) => dispatch("userManagement", "disableTotp", "mutation", input),
|
|
@@ -95783,6 +96342,100 @@ function ruleEditorSectionsForKind(kind) {
|
|
|
95783
96342
|
return sections;
|
|
95784
96343
|
}
|
|
95785
96344
|
//#endregion
|
|
96345
|
+
//#region src/notification/media-image.ts
|
|
96346
|
+
/** Every mode, in the order an editor offers them. */
|
|
96347
|
+
var NC_MEDIA_IMAGE_MODES = [
|
|
96348
|
+
"scene-boxes",
|
|
96349
|
+
"crop",
|
|
96350
|
+
"clean",
|
|
96351
|
+
"none"
|
|
96352
|
+
];
|
|
96353
|
+
/**
|
|
96354
|
+
* The modes a rule of this kind can honour. A kind that carries no media gets
|
|
96355
|
+
* none (its row ships text, or — an alarm — its SOURCE rule's picture); a kind
|
|
96356
|
+
* whose subject has no region of the frame (a sound) is never offered `crop`.
|
|
96357
|
+
*/
|
|
96358
|
+
function imageModesForKind(kind) {
|
|
96359
|
+
const spec = ruleKindSpec(kind);
|
|
96360
|
+
if (!spec.carriesMedia) return [];
|
|
96361
|
+
return spec.carriesSubjectCrop ? NC_MEDIA_IMAGE_MODES : NC_MEDIA_IMAGE_MODES.filter((mode) => mode !== "crop");
|
|
96362
|
+
}
|
|
96363
|
+
/**
|
|
96364
|
+
* The zone ids that FIRE a rule: its `zones` condition, or an occupancy rule's
|
|
96365
|
+
* own scoped zone. Empty when the trigger is not a zone — and then
|
|
96366
|
+
* `showTriggerZone` has nothing to draw and is refused on save.
|
|
96367
|
+
*/
|
|
96368
|
+
function ruleTriggerZoneIds(conditions) {
|
|
96369
|
+
if (conditions.zones !== void 0) return conditions.zones.ids;
|
|
96370
|
+
const zoneId = conditions.occupancy?.zoneId;
|
|
96371
|
+
return zoneId !== void 0 ? [zoneId] : [];
|
|
96372
|
+
}
|
|
96373
|
+
/**
|
|
96374
|
+
* What the legacy triple MEANT, as a mode. `zoneCrop` forced the clean
|
|
96375
|
+
* keyFrame ladder and dropped `frame`, so it is `clean` whatever else was set;
|
|
96376
|
+
* `frame` decided over `attach` when present; `keyFrame` was the clean scene;
|
|
96377
|
+
* every other still (`best`, `best-matching`, the default) was the subject.
|
|
96378
|
+
*/
|
|
96379
|
+
function legacyImageMode(media) {
|
|
96380
|
+
if (media.attach === "none") return "none";
|
|
96381
|
+
if (media.zoneCrop === true) return "clean";
|
|
96382
|
+
if (media.frame === "full") return "clean";
|
|
96383
|
+
if (media.frame === "boxed") return "scene-boxes";
|
|
96384
|
+
if (media.frame === "cropped") return "crop";
|
|
96385
|
+
if (media.attach === "keyFrame") return "clean";
|
|
96386
|
+
return "crop";
|
|
96387
|
+
}
|
|
96388
|
+
/** A mode the kind cannot honour, mapped to the nearest one it can. */
|
|
96389
|
+
function clampToKind(mode, kind) {
|
|
96390
|
+
const offered = imageModesForKind(kind);
|
|
96391
|
+
if (offered.length === 0 || offered.includes(mode)) return mode;
|
|
96392
|
+
return mode === "crop" ? "clean" : mode;
|
|
96393
|
+
}
|
|
96394
|
+
/**
|
|
96395
|
+
* The mode a rule's picture is rendered in. `image` when stored; else what the
|
|
96396
|
+
* legacy triple meant — and, for a SENSOR rule written before D897, `clean`
|
|
96397
|
+
* whatever it stored (even `attach: 'none'`), because its stored triple was
|
|
96398
|
+
* ignored and one plain snapshot always shipped (operator ruling, 2026-10-01):
|
|
96399
|
+
* the migration keeps what the rule actually DID. Clamped to what the kind can
|
|
96400
|
+
* honour.
|
|
96401
|
+
*/
|
|
96402
|
+
function resolveNcMediaImage(media, kind) {
|
|
96403
|
+
if (media.image !== void 0) return clampToKind(media.image, kind);
|
|
96404
|
+
if (kind === "sensor") return "clean";
|
|
96405
|
+
return clampToKind(legacyImageMode(media), kind);
|
|
96406
|
+
}
|
|
96407
|
+
/**
|
|
96408
|
+
* The stored shape of a media policy: `image` set, the legacy triple gone.
|
|
96409
|
+
* `showTriggerZone` survives only where it can be drawn — a zone trigger and a
|
|
96410
|
+
* mode other than `crop`/`none`; a legacy `zoneCrop` on a zone rule becomes it.
|
|
96411
|
+
* Every other field (gif, clip, rolls, speed, profile, linked cameras) is
|
|
96412
|
+
* carried through untouched. Pure; never throws.
|
|
96413
|
+
*/
|
|
96414
|
+
function normalizeNcMediaPolicy(media, rule) {
|
|
96415
|
+
const image = resolveNcMediaImage(media, ruleKindOf(rule));
|
|
96416
|
+
const { attach: _attach, frame: _frame, zoneCrop, showTriggerZone, image: _image, ...rest } = media;
|
|
96417
|
+
const drawable = (showTriggerZone === true || media.image === void 0 && zoneCrop === true) && image !== "crop" && image !== "none" && ruleTriggerZoneIds(rule.conditions).length > 0;
|
|
96418
|
+
return {
|
|
96419
|
+
...rest,
|
|
96420
|
+
image,
|
|
96421
|
+
...drawable ? { showTriggerZone: true } : {}
|
|
96422
|
+
};
|
|
96423
|
+
}
|
|
96424
|
+
/**
|
|
96425
|
+
* Why a media policy cannot be SAVED on this rule, or null. Server-side and
|
|
96426
|
+
* editor alike: `showTriggerZone` on a rule whose trigger is not a zone, and a
|
|
96427
|
+
* mode the rule's kind cannot honour.
|
|
96428
|
+
*/
|
|
96429
|
+
function ncMediaPolicyError(media, rule) {
|
|
96430
|
+
const kind = ruleKindOf(rule);
|
|
96431
|
+
if (media.image !== void 0) {
|
|
96432
|
+
const offered = imageModesForKind(kind);
|
|
96433
|
+
if (offered.length > 0 && !offered.includes(media.image)) return `media.image '${media.image}' is not available for a ${kind} rule (offered: ${offered.join(", ")})`;
|
|
96434
|
+
}
|
|
96435
|
+
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)";
|
|
96436
|
+
return null;
|
|
96437
|
+
}
|
|
96438
|
+
//#endregion
|
|
95786
96439
|
//#region src/notification/schedule.ts
|
|
95787
96440
|
var WEEKDAY_TO_DAY = {
|
|
95788
96441
|
Sun: 0,
|
|
@@ -103201,6 +103854,7 @@ exports.CONNECTION_TEST_TIMEOUT_MS = CONNECTION_TEST_TIMEOUT_MS;
|
|
|
103201
103854
|
exports.CONTAINER_CHILD_PRIORITY = CONTAINER_CHILD_PRIORITY;
|
|
103202
103855
|
exports.CORE_BLOCKS_ADDON_ID = CORE_BLOCKS_ADDON_ID;
|
|
103203
103856
|
exports.CORE_BLOCK_ADDON_PREFIX = CORE_BLOCK_ADDON_PREFIX;
|
|
103857
|
+
exports.CREDENTIAL_TOKEN_AUDIENCE = CREDENTIAL_TOKEN_AUDIENCE;
|
|
103204
103858
|
exports.CREDENTIAL_TOKEN_KIND = CREDENTIAL_TOKEN_KIND;
|
|
103205
103859
|
exports.CROP_SUPPLY_SOURCES = CROP_SUPPLY_SOURCES;
|
|
103206
103860
|
exports.CROP_SUPPLY_STEP_IDS = CROP_SUPPLY_STEP_IDS;
|
|
@@ -103379,8 +104033,6 @@ exports.CoreBlockStatusSchema = CoreBlockStatusSchema;
|
|
|
103379
104033
|
exports.CoverStateSchema = CoverStateSchema;
|
|
103380
104034
|
exports.CoverStatusSchema = CoverStatusSchema;
|
|
103381
104035
|
exports.CreateIntegrationInputSchema = CreateIntegrationInputSchema;
|
|
103382
|
-
exports.CreateScopedTokenInputSchema = CreateScopedTokenInputSchema;
|
|
103383
|
-
exports.CreateScopedTokenResultSchema = CreateScopedTokenResultSchema;
|
|
103384
104036
|
exports.CreateUserInputSchema = CreateUserInputSchema;
|
|
103385
104037
|
exports.CredentialScopeSchema = CredentialScopeSchema;
|
|
103386
104038
|
exports.CredentialTokenClaimsSchema = CredentialTokenClaimsSchema;
|
|
@@ -103441,6 +104093,8 @@ exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
|
|
|
103441
104093
|
exports.DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE;
|
|
103442
104094
|
exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
|
|
103443
104095
|
exports.DEVICE_ENROLLMENT_TTL_MS = DEVICE_ENROLLMENT_TTL_MS;
|
|
104096
|
+
exports.DEVICE_HISTORY_ENERGY_KEY = DEVICE_HISTORY_ENERGY_KEY;
|
|
104097
|
+
exports.DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS = DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS;
|
|
103444
104098
|
exports.DEVICE_NONCE_TTL_MS = DEVICE_NONCE_TTL_MS;
|
|
103445
104099
|
exports.DEVICE_PROFILES = DEVICE_PROFILES;
|
|
103446
104100
|
exports.DEVICE_RAMP = DEVICE_RAMP;
|
|
@@ -103499,6 +104153,7 @@ exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
|
|
|
103499
104153
|
exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
|
|
103500
104154
|
exports.DeviceFeature = require_err_msg.DeviceFeature;
|
|
103501
104155
|
exports.DeviceHistoryKindSchema = DeviceHistoryKindSchema;
|
|
104156
|
+
exports.DeviceHistoryProducerKindSchema = DeviceHistoryProducerKindSchema;
|
|
103502
104157
|
exports.DeviceHistoryRefusalReasonSchema = DeviceHistoryRefusalReasonSchema;
|
|
103503
104158
|
exports.DeviceHistoryResolutionSchema = DeviceHistoryResolutionSchema;
|
|
103504
104159
|
exports.DeviceHistoryStatusSchema = DeviceHistoryStatusSchema;
|
|
@@ -103763,6 +104418,7 @@ exports.LABEL_SUPPLY_VOCABULARIES = LABEL_SUPPLY_VOCABULARIES;
|
|
|
103763
104418
|
exports.LEGACY_READ_ONLY_CONFIG_KEY = LEGACY_READ_ONLY_CONFIG_KEY;
|
|
103764
104419
|
exports.LINKED_DEVICES_SLOT = LINKED_DEVICES_SLOT;
|
|
103765
104420
|
exports.LINKED_LABEL_STEP_PREFIX = LINKED_LABEL_STEP_PREFIX;
|
|
104421
|
+
exports.LLM_PROFILE_KIND_PATTERN = LLM_PROFILE_KIND_PATTERN;
|
|
103766
104422
|
exports.LOAD_CONTRIBUTION_ATTRIBUTIONS = LOAD_CONTRIBUTION_ATTRIBUTIONS;
|
|
103767
104423
|
exports.LOAD_CONTRIBUTION_ROLES = LOAD_CONTRIBUTION_ROLES;
|
|
103768
104424
|
exports.LOCATION_DESCRIPTION_MAX = LOCATION_DESCRIPTION_MAX;
|
|
@@ -103799,10 +104455,18 @@ exports.LlmGenerateErrSchema = LlmGenerateErrSchema;
|
|
|
103799
104455
|
exports.LlmGenerateOkSchema = LlmGenerateOkSchema;
|
|
103800
104456
|
exports.LlmGenerateResultSchema = LlmGenerateResultSchema;
|
|
103801
104457
|
exports.LlmImageSchema = LlmImageSchema;
|
|
104458
|
+
exports.LlmListModelsErrorCodeSchema = LlmListModelsErrorCodeSchema;
|
|
104459
|
+
exports.LlmListModelsInputSchema = LlmListModelsInputSchema;
|
|
104460
|
+
exports.LlmListModelsResultSchema = LlmListModelsResultSchema;
|
|
104461
|
+
exports.LlmModelFeaturesSchema = LlmModelFeaturesSchema;
|
|
104462
|
+
exports.LlmModelInfoSchema = LlmModelInfoSchema;
|
|
103802
104463
|
exports.LlmNodeModelSchema = LlmNodeModelSchema;
|
|
104464
|
+
exports.LlmProfileFieldSchema = LlmProfileFieldSchema;
|
|
103803
104465
|
exports.LlmProfileKindDescriptorSchema = LlmProfileKindDescriptorSchema;
|
|
103804
104466
|
exports.LlmProfileKindSchema = LlmProfileKindSchema;
|
|
103805
104467
|
exports.LlmProfileSchema = LlmProfileSchema;
|
|
104468
|
+
exports.LlmProviderConfigSchema = LlmProviderConfigSchema;
|
|
104469
|
+
exports.LlmProviderWidgetSchema = LlmProviderWidgetSchema;
|
|
103806
104470
|
exports.LlmRefusalSourceSchema = LlmRefusalSourceSchema;
|
|
103807
104471
|
exports.LlmRetryPolicySchema = LlmRetryPolicySchema;
|
|
103808
104472
|
exports.LlmRuntimeAppleCompleteInputSchema = LlmRuntimeAppleCompleteInputSchema;
|
|
@@ -103832,6 +104496,10 @@ exports.LogChannelWindowSchema = LogChannelWindowSchema;
|
|
|
103832
104496
|
exports.LogChannelWindowStateSchema = LogChannelWindowStateSchema;
|
|
103833
104497
|
exports.LogEntrySchema = LogEntrySchema;
|
|
103834
104498
|
exports.LogLevelSchema = LogLevelSchema;
|
|
104499
|
+
exports.LogReadCapabilitiesSchema = LogReadCapabilitiesSchema;
|
|
104500
|
+
exports.LogReadEntrySchema = LogReadEntrySchema;
|
|
104501
|
+
exports.LogReadQuerySchema = LogReadQuerySchema;
|
|
104502
|
+
exports.LogReadResultSchema = LogReadResultSchema;
|
|
103835
104503
|
exports.LogStreamEntrySchema = LogStreamEntrySchema;
|
|
103836
104504
|
exports.LoggingEffectiveSchema = LoggingEffectiveSchema;
|
|
103837
104505
|
exports.LoggingExplicitSchema = LoggingExplicitSchema;
|
|
@@ -104013,6 +104681,7 @@ exports.NC_GROUPING_MIN_SEC = NC_GROUPING_MIN_SEC;
|
|
|
104013
104681
|
exports.NC_HISTORY_LIMIT_DEFAULT = NC_HISTORY_LIMIT_DEFAULT;
|
|
104014
104682
|
exports.NC_HISTORY_LIMIT_MAX = NC_HISTORY_LIMIT_MAX;
|
|
104015
104683
|
exports.NC_MAX_PER_TRACK_IMMEDIATE = NC_MAX_PER_TRACK_IMMEDIATE;
|
|
104684
|
+
exports.NC_MEDIA_IMAGE_MODES = NC_MEDIA_IMAGE_MODES;
|
|
104016
104685
|
exports.NC_OCCUPANCY_DEFAULTS = NC_OCCUPANCY_DEFAULTS;
|
|
104017
104686
|
exports.NC_RULE_CLEARABLE_KEYS = NC_RULE_CLEARABLE_KEYS;
|
|
104018
104687
|
exports.NC_RULE_EDITOR_SECTION_ORDER = NC_RULE_EDITOR_SECTION_ORDER;
|
|
@@ -104111,6 +104780,7 @@ exports.NcHookBindingsSchema = NcHookBindingsSchema;
|
|
|
104111
104780
|
exports.NcLegacyRuleActionSequenceSchema = NcLegacyRuleActionSequenceSchema;
|
|
104112
104781
|
exports.NcLinkedCameraModeSchema = NcLinkedCameraModeSchema;
|
|
104113
104782
|
exports.NcMediaFrameSchema = NcMediaFrameSchema;
|
|
104783
|
+
exports.NcMediaImageSchema = NcMediaImageSchema;
|
|
104114
104784
|
exports.NcMediaPolicySchema = NcMediaPolicySchema;
|
|
104115
104785
|
exports.NcOccupancyConditionSchema = NcOccupancyConditionSchema;
|
|
104116
104786
|
exports.NcPlateMatcherSchema = NcPlateMatcherSchema;
|
|
@@ -104261,6 +104931,11 @@ exports.PIPELINE_ANALYTICS_CAP_NAME = PIPELINE_ANALYTICS_CAP_NAME;
|
|
|
104261
104931
|
exports.PIPELINE_FLOW_CAPABILITY_NAMES = PIPELINE_FLOW_CAPABILITY_NAMES;
|
|
104262
104932
|
exports.PIPELINE_OWNER_CAPABILITY_NAMES = PIPELINE_OWNER_CAPABILITY_NAMES;
|
|
104263
104933
|
exports.PIPELINE_RAMP = PIPELINE_RAMP;
|
|
104934
|
+
exports.PREFERENCES_MAX_DEVICE_ID_LENGTH = PREFERENCES_MAX_DEVICE_ID_LENGTH;
|
|
104935
|
+
exports.PREFERENCES_MAX_NAMESPACES = PREFERENCES_MAX_NAMESPACES;
|
|
104936
|
+
exports.PREFERENCES_MAX_VALUE_BYTES = PREFERENCES_MAX_VALUE_BYTES;
|
|
104937
|
+
exports.PREFERENCES_NAMESPACE_PATTERN = PREFERENCES_NAMESPACE_PATTERN;
|
|
104938
|
+
exports.PREFERENCES_SELF_SCOPE = PREFERENCES_SELF_SCOPE;
|
|
104264
104939
|
exports.PRIVACY_MASK_CAP_NAME = PRIVACY_MASK_CAP_NAME;
|
|
104265
104940
|
exports.PROVIDER_KIND_CAP_NAMES = PROVIDER_KIND_CAP_NAMES;
|
|
104266
104941
|
exports.PROVIDER_PIN_FIELD = require_sleep.PROVIDER_PIN_FIELD;
|
|
@@ -104300,6 +104975,19 @@ exports.PlaintextSecretError = require_sleep.PlaintextSecretError;
|
|
|
104300
104975
|
exports.PolygonPointSchema = PolygonPointSchema;
|
|
104301
104976
|
exports.PoolMemoryWatchdog = PoolMemoryWatchdog;
|
|
104302
104977
|
exports.PowerMeterStatusSchema = PowerMeterStatusSchema;
|
|
104978
|
+
exports.PreferenceDeviceIdSchema = PreferenceDeviceIdSchema;
|
|
104979
|
+
exports.PreferenceNamespaceSchema = PreferenceNamespaceSchema;
|
|
104980
|
+
exports.PreferenceRowSchema = PreferenceRowSchema;
|
|
104981
|
+
exports.PreferenceValueSchema = PreferenceValueSchema;
|
|
104982
|
+
exports.PreferencesChangedSinceInputSchema = PreferencesChangedSinceInputSchema;
|
|
104983
|
+
exports.PreferencesChangedSinceOutputSchema = PreferencesChangedSinceOutputSchema;
|
|
104984
|
+
exports.PreferencesDeleteInputSchema = PreferencesDeleteInputSchema;
|
|
104985
|
+
exports.PreferencesDeleteOutputSchema = PreferencesDeleteOutputSchema;
|
|
104986
|
+
exports.PreferencesGetInputSchema = PreferencesGetInputSchema;
|
|
104987
|
+
exports.PreferencesGetOutputSchema = PreferencesGetOutputSchema;
|
|
104988
|
+
exports.PreferencesPutInputSchema = PreferencesPutInputSchema;
|
|
104989
|
+
exports.PreferencesPutOutputSchema = PreferencesPutOutputSchema;
|
|
104990
|
+
exports.PreferencesSelfScopeSchema = PreferencesSelfScopeSchema;
|
|
104303
104991
|
exports.PresenceStatusSchema = PresenceStatusSchema;
|
|
104304
104992
|
exports.PressureSensorStatusSchema = PressureSensorStatusSchema;
|
|
104305
104993
|
exports.PrivacyMaskOptionsSchema = PrivacyMaskOptionsSchema;
|
|
@@ -104582,7 +105270,6 @@ exports.SceneUnavailableSchema = SceneUnavailableSchema;
|
|
|
104582
105270
|
exports.SceneUncoveredPolicySchema = SceneUncoveredPolicySchema;
|
|
104583
105271
|
exports.SceneVerdictSchema = SceneVerdictSchema;
|
|
104584
105272
|
exports.ScopedTokenSchema = ScopedTokenSchema;
|
|
104585
|
-
exports.ScopedTokenSummarySchema = ScopedTokenSummarySchema;
|
|
104586
105273
|
exports.ScoredObjectEventSchema = ScoredObjectEventSchema;
|
|
104587
105274
|
exports.ScriptRunnerStatusSchema = ScriptRunnerStatusSchema;
|
|
104588
105275
|
exports.SearchResultSchema = SearchResultSchema;
|
|
@@ -104868,6 +105555,8 @@ exports.ZoneScopeBreakdownSchema = ZoneScopeBreakdownSchema;
|
|
|
104868
105555
|
exports.__resetLogChannelRegistryForTests = __resetLogChannelRegistryForTests;
|
|
104869
105556
|
exports.acceleratorKindOf = acceleratorKindOf;
|
|
104870
105557
|
exports.accessoriesCapability = accessoriesCapability;
|
|
105558
|
+
exports.accessoryChildrenComplete = accessoryChildrenComplete;
|
|
105559
|
+
exports.accessoryChildrenUnknown = accessoryChildrenUnknown;
|
|
104871
105560
|
exports.accessoryStableId = accessoryStableId;
|
|
104872
105561
|
exports.actionsForBoundCaps = actionsForBoundCaps;
|
|
104873
105562
|
exports.actionsForDevice = actionsForDevice;
|
|
@@ -105238,6 +105927,7 @@ exports.iconCategoryLabel = iconCategoryLabel;
|
|
|
105238
105927
|
exports.iconEntry = iconEntry;
|
|
105239
105928
|
exports.iconsInCategory = iconsInCategory;
|
|
105240
105929
|
exports.imageCapability = imageCapability;
|
|
105930
|
+
exports.imageModesForKind = imageModesForKind;
|
|
105241
105931
|
exports.imageSettingsCapability = imageSettingsCapability;
|
|
105242
105932
|
exports.inferExpressionKinds = inferExpressionKinds;
|
|
105243
105933
|
exports.inferModelProvider = inferModelProvider;
|
|
@@ -105265,6 +105955,7 @@ exports.isBaseConditionKey = isBaseConditionKey;
|
|
|
105265
105955
|
exports.isBatteryPresenceFault = isBatteryPresenceFault;
|
|
105266
105956
|
exports.isClusterScopedStep = isClusterScopedStep;
|
|
105267
105957
|
exports.isCollectionArrayMethod = isCollectionArrayMethod;
|
|
105958
|
+
exports.isCredentialTokenPayload = isCredentialTokenPayload;
|
|
105268
105959
|
exports.isDefaultAlarmProfileId = isDefaultAlarmProfileId;
|
|
105269
105960
|
exports.isDefaultAppConnectionEndpoint = isDefaultAppConnectionEndpoint;
|
|
105270
105961
|
exports.isDefinitiveDeviceRefusal = isDefinitiveDeviceRefusal;
|
|
@@ -105329,6 +106020,7 @@ exports.knownSecretCount = require_sleep.knownSecretCount;
|
|
|
105329
106020
|
exports.knownValues = knownValues;
|
|
105330
106021
|
exports.lawnMowerControlCapability = lawnMowerControlCapability;
|
|
105331
106022
|
exports.legacyAutoLinkIds = legacyAutoLinkIds;
|
|
106023
|
+
exports.legacyImageMode = legacyImageMode;
|
|
105332
106024
|
exports.legacyModeOf = legacyModeOf;
|
|
105333
106025
|
exports.lifecycleJobSchema = lifecycleJobSchema;
|
|
105334
106026
|
exports.lifecycleJobScopeSchema = lifecycleJobScopeSchema;
|
|
@@ -105391,6 +106083,7 @@ exports.mqttBrokerCapability = mqttBrokerCapability;
|
|
|
105391
106083
|
exports.nativeObjectDetectionCapability = nativeObjectDetectionCapability;
|
|
105392
106084
|
exports.navigationCapability = navigationCapability;
|
|
105393
106085
|
exports.ncAlarmSystemDefaultSettings = ncAlarmSystemDefaultSettings;
|
|
106086
|
+
exports.ncMediaPolicyError = ncMediaPolicyError;
|
|
105394
106087
|
exports.networkAccessCapability = networkAccessCapability;
|
|
105395
106088
|
exports.networkLinkCapability = networkLinkCapability;
|
|
105396
106089
|
exports.networkQualityCapability = networkQualityCapability;
|
|
@@ -105402,6 +106095,7 @@ exports.nodesCapability = nodesCapability;
|
|
|
105402
106095
|
exports.normalizeAddonInitResult = require_sleep.normalizeAddonInitResult;
|
|
105403
106096
|
exports.normalizeAudioLabel = normalizeAudioLabel;
|
|
105404
106097
|
exports.normalizeCoreBlockWrite = normalizeCoreBlockWrite;
|
|
106098
|
+
exports.normalizeNcMediaPolicy = normalizeNcMediaPolicy;
|
|
105405
106099
|
exports.normalizeNodeId = require_sleep.normalizeNodeId;
|
|
105406
106100
|
exports.normalizeOrigin = normalizeOrigin;
|
|
105407
106101
|
exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
|
|
@@ -105559,6 +106253,7 @@ exports.resolveModeDelays = resolveModeDelays;
|
|
|
105559
106253
|
exports.resolveModeNotifyPolicy = resolveModeNotifyPolicy;
|
|
105560
106254
|
exports.resolveModelBoundSetting = resolveModelBoundSetting;
|
|
105561
106255
|
exports.resolveMutate = resolveMutate;
|
|
106256
|
+
exports.resolveNcMediaImage = resolveNcMediaImage;
|
|
105562
106257
|
exports.resolveNotificationTapAddress = resolveNotificationTapAddress;
|
|
105563
106258
|
exports.resolvePoolMemoryPolicy = resolvePoolMemoryPolicy;
|
|
105564
106259
|
exports.resolvePublicEndpoint = resolvePublicEndpoint;
|
|
@@ -105592,6 +106287,7 @@ exports.ruleMatchesSection = ruleMatchesSection;
|
|
|
105592
106287
|
exports.ruleSection = ruleSection;
|
|
105593
106288
|
exports.ruleSectionOf = ruleSectionOf;
|
|
105594
106289
|
exports.ruleSeedForSection = ruleSeedForSection;
|
|
106290
|
+
exports.ruleTriggerZoneIds = ruleTriggerZoneIds;
|
|
105595
106291
|
exports.runInferenceStep = runInferenceStep;
|
|
105596
106292
|
exports.runtimeDevices = runtimeDevices;
|
|
105597
106293
|
exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
|
|
@@ -105604,6 +106300,7 @@ exports.scopeKey = require_sleep.scopeKey;
|
|
|
105604
106300
|
exports.scopesAllowAddon = scopesAllowAddon;
|
|
105605
106301
|
exports.scopesAllowAddonRoutes = scopesAllowAddonRoutes;
|
|
105606
106302
|
exports.scopesAllowDeviceCap = scopesAllowDeviceCap;
|
|
106303
|
+
exports.scopesAllowOwnPreferences = scopesAllowOwnPreferences;
|
|
105607
106304
|
exports.scopesGrantAdmin = scopesGrantAdmin;
|
|
105608
106305
|
exports.scoreRuntimes = scoreRuntimes;
|
|
105609
106306
|
exports.scriptRunnerCapability = scriptRunnerCapability;
|