@camstack/types 1.2.400 → 1.2.402
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 +1 -71
- package/dist/addon.mjs +1 -71
- package/dist/capabilities/addon-settings.cap.d.ts +5 -0
- package/dist/capabilities/capability-definition.d.ts +42 -1
- package/dist/capabilities/consumables.cap.d.ts +187 -14
- package/dist/capabilities/core-blocks.cap.d.ts +1 -0
- package/dist/capabilities/device-history.cap.d.ts +148 -0
- package/dist/capabilities/device-manager.cap.d.ts +4 -0
- package/dist/capabilities/dishwasher.cap.d.ts +3 -38
- package/dist/capabilities/index.d.ts +7 -7
- package/dist/capabilities/pipeline-orchestrator.cap.d.ts +28 -0
- package/dist/capabilities/platform-probe.cap.d.ts +74 -0
- package/dist/capabilities/vacuum-control.cap.d.ts +5 -141
- package/dist/client.js +19 -4
- package/dist/client.mjs +19 -4
- package/dist/generated/addon-api.d.ts +28 -0
- package/dist/generated/addon-cap-facts.d.ts +1 -1
- package/dist/generated/history-catalog.d.ts +8 -2
- package/dist/generated/method-access-map.d.ts +1 -1
- package/dist/generated/system-proxy.d.ts +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +420 -129
- package/dist/index.mjs +407 -128
- package/dist/interfaces/config-ui.d.ts +4 -2
- package/dist/pipeline/load-balancing/effective-shares.d.ts +6 -0
- package/dist/pipeline/load-balancing/share-election.d.ts +46 -0
- package/dist/{sleep-DJFUfKvA.mjs → sleep-CUp20JkO.mjs} +10 -2
- package/dist/{sleep-CD18m9HF.js → sleep-DVovpDRU.js} +15 -1
- 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-DVovpDRU.js");
|
|
3
3
|
const require_event_category = require("./event-category-7AwNbPjm.js");
|
|
4
4
|
const require_composition = require("./composition-eoYYVfOp.js");
|
|
5
5
|
const require_node_color = require("./node-color.js");
|
|
@@ -8450,7 +8450,11 @@ var ConfigSectionWithValuesSchema = zod.z.object({
|
|
|
8450
8450
|
zod.z.literal(4)
|
|
8451
8451
|
]).optional(),
|
|
8452
8452
|
tab: zod.z.string().optional(),
|
|
8453
|
-
location: zod.z.enum([
|
|
8453
|
+
location: zod.z.enum([
|
|
8454
|
+
"settings",
|
|
8455
|
+
"top-tab",
|
|
8456
|
+
"hero"
|
|
8457
|
+
]).optional(),
|
|
8454
8458
|
order: zod.z.number().optional(),
|
|
8455
8459
|
fields: zod.z.array(zod.z.any())
|
|
8456
8460
|
});
|
|
@@ -15114,6 +15118,56 @@ var TierStatusSchema = zod.z.object({
|
|
|
15114
15118
|
countedAt: zod.z.number().nullable()
|
|
15115
15119
|
});
|
|
15116
15120
|
/** Operator/diagnostic view: rows per tier, last runs, refusals and drops since boot. */
|
|
15121
|
+
/**
|
|
15122
|
+
* Why a series is orphan. `device-gone`: its device is absent from the
|
|
15123
|
+
* successful device listings (the departure clock). `undeclared`: its `cap:`
|
|
15124
|
+
* key is declared by no capability any more (a field a cap removed).
|
|
15125
|
+
*/
|
|
15126
|
+
var DeviceHistoryOrphanReasonSchema = zod.z.enum(["device-gone", "undeclared"]);
|
|
15127
|
+
/** Rows held per stored tier. */
|
|
15128
|
+
var TierRowsSchema = zod.z.object({
|
|
15129
|
+
raw: zod.z.number().int(),
|
|
15130
|
+
"5m": zod.z.number().int(),
|
|
15131
|
+
"1h": zod.z.number().int(),
|
|
15132
|
+
"1d": zod.z.number().int()
|
|
15133
|
+
});
|
|
15134
|
+
var OrphanSeriesSchema = zod.z.object({
|
|
15135
|
+
seriesId: zod.z.number().int(),
|
|
15136
|
+
deviceId: zod.z.number().int(),
|
|
15137
|
+
key: zod.z.string(),
|
|
15138
|
+
scope: zod.z.string(),
|
|
15139
|
+
/** The metric's display name; `null` when its metric row is gone too. */
|
|
15140
|
+
displayName: zod.z.string().nullable(),
|
|
15141
|
+
reason: DeviceHistoryOrphanReasonSchema,
|
|
15142
|
+
/** `device-gone`: since when the device has been absent; `null` otherwise. */
|
|
15143
|
+
missingSince: zod.z.number().nullable(),
|
|
15144
|
+
firstTs: zod.z.number(),
|
|
15145
|
+
lastTs: zod.z.number(),
|
|
15146
|
+
rows: TierRowsSchema
|
|
15147
|
+
});
|
|
15148
|
+
/** At most this many orphans are listed (with their row counts) per call. */
|
|
15149
|
+
var DEVICE_HISTORY_ORPHAN_LIST_MAX = 200;
|
|
15150
|
+
/** At most this many series are deleted per call. */
|
|
15151
|
+
var DEVICE_HISTORY_ORPHAN_DELETE_MAX = 50;
|
|
15152
|
+
var DeviceHistoryOrphanDeleteRefusalSchema = zod.z.enum([
|
|
15153
|
+
"not-found",
|
|
15154
|
+
"not-orphan",
|
|
15155
|
+
"failed"
|
|
15156
|
+
]);
|
|
15157
|
+
var OrphanDeleteEntrySchema = zod.z.discriminatedUnion("ok", [zod.z.object({
|
|
15158
|
+
seriesId: zod.z.number().int(),
|
|
15159
|
+
ok: zod.z.literal(true),
|
|
15160
|
+
deleted: TierRowsSchema
|
|
15161
|
+
}), zod.z.object({
|
|
15162
|
+
seriesId: zod.z.number().int(),
|
|
15163
|
+
ok: zod.z.literal(false),
|
|
15164
|
+
reason: DeviceHistoryOrphanDeleteRefusalSchema
|
|
15165
|
+
})]);
|
|
15166
|
+
var OrphanListSchema = zod.z.object({
|
|
15167
|
+
series: zod.z.array(OrphanSeriesSchema).readonly(),
|
|
15168
|
+
/** More orphans exist than {@link DEVICE_HISTORY_ORPHAN_LIST_MAX}. */
|
|
15169
|
+
truncated: zod.z.boolean()
|
|
15170
|
+
});
|
|
15117
15171
|
var DeviceHistoryStatusSchema = zod.z.object({
|
|
15118
15172
|
startedAt: zod.z.number(),
|
|
15119
15173
|
/** The store is declared, series loaded and the first reconcile has answered. */
|
|
@@ -15255,7 +15309,24 @@ var deviceHistoryCapability = {
|
|
|
15255
15309
|
kind: "mutation",
|
|
15256
15310
|
auth: "admin"
|
|
15257
15311
|
}),
|
|
15258
|
-
getStatus: require_sleep.method(zod.z.object({}), DeviceHistoryStatusSchema, { auth: "admin" })
|
|
15312
|
+
getStatus: require_sleep.method(zod.z.object({}), DeviceHistoryStatusSchema, { auth: "admin" }),
|
|
15313
|
+
/**
|
|
15314
|
+
* Device series no longer linked to a device (D917): the device is absent
|
|
15315
|
+
* from the listings, or the key is declared by no capability. REPORTED,
|
|
15316
|
+
* never purged by this judgement; each entry counts its rows per tier
|
|
15317
|
+
* (a primary-key range per series). Ordered by device, key, scope.
|
|
15318
|
+
*/
|
|
15319
|
+
listOrphanSeries: require_sleep.method(zod.z.object({}), OrphanListSchema, { auth: "admin" }),
|
|
15320
|
+
/**
|
|
15321
|
+
* Delete orphan series by id. Each id is re-judged NOW: a series that is
|
|
15322
|
+
* not orphan (its device came back) is refused `not-orphan`, an unknown id
|
|
15323
|
+
* `not-found`. Deletes tier by tier in the retention slices, then the
|
|
15324
|
+
* series row; one entry per id, in order.
|
|
15325
|
+
*/
|
|
15326
|
+
deleteOrphanSeries: require_sleep.method(zod.z.object({ seriesIds: zod.z.array(zod.z.number().int()).min(1).max(50) }), zod.z.object({ results: zod.z.array(OrphanDeleteEntrySchema).readonly() }), {
|
|
15327
|
+
kind: "mutation",
|
|
15328
|
+
auth: "admin"
|
|
15329
|
+
})
|
|
15259
15330
|
}
|
|
15260
15331
|
};
|
|
15261
15332
|
//#endregion
|
|
@@ -54054,6 +54125,19 @@ var NodeInferenceDeviceSchema = zod.z.object({
|
|
|
54054
54125
|
/** Whether the node's live probe reports the device as usable right now. */
|
|
54055
54126
|
available: zod.z.boolean(),
|
|
54056
54127
|
/**
|
|
54128
|
+
* Is the device on the node at all (D919)? `present` — the live probe
|
|
54129
|
+
* reported it; `absent` — the probe ANSWERED and did not report it, so only
|
|
54130
|
+
* its stored settings remain (unplugged, moved to another node): never
|
|
54131
|
+
* eligible, whatever its stored `enabled`, and forgettable with
|
|
54132
|
+
* `forgetInferenceDevice`; `unknown` — the probe did not answer, nothing is
|
|
54133
|
+
* claimed (D315). Optional only for an orchestrator older than the field.
|
|
54134
|
+
*/
|
|
54135
|
+
presence: zod.z.enum([
|
|
54136
|
+
"present",
|
|
54137
|
+
"absent",
|
|
54138
|
+
"unknown"
|
|
54139
|
+
]).optional(),
|
|
54140
|
+
/**
|
|
54057
54141
|
* Whether this device participates in dispatch. AUTO default (spec C2):
|
|
54058
54142
|
* accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
|
|
54059
54143
|
* entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
|
|
@@ -54491,6 +54575,20 @@ var pipelineOrchestratorCapability = {
|
|
|
54491
54575
|
*/
|
|
54492
54576
|
getNodeInferenceDevices: require_sleep.method(zod.z.object({ nodeId: zod.z.string() }), NodeInferenceDevicesSchema),
|
|
54493
54577
|
/**
|
|
54578
|
+
* Delete ONE stored device entry of a node — the "forget" of a device the
|
|
54579
|
+
* node no longer has (D919). Refused unless the node's probe ANSWERED and
|
|
54580
|
+
* did not report the key: a present device is switched off, not forgotten,
|
|
54581
|
+
* and an unreachable node proves nothing about its hardware. The rest of
|
|
54582
|
+
* the node's map is kept as stored.
|
|
54583
|
+
*/
|
|
54584
|
+
forgetInferenceDevice: require_sleep.method(zod.z.object({
|
|
54585
|
+
agentNodeId: zod.z.string(),
|
|
54586
|
+
deviceKey: zod.z.string()
|
|
54587
|
+
}), zod.z.object({ success: zod.z.literal(true) }), {
|
|
54588
|
+
kind: "mutation",
|
|
54589
|
+
auth: "admin"
|
|
54590
|
+
}),
|
|
54591
|
+
/**
|
|
54494
54592
|
* Reset one node's pipeline to its hardware-aware defaults — the HONEST
|
|
54495
54593
|
* reset (replaces the executor's legacy `resetToDefault`, which cleared a
|
|
54496
54594
|
* dead persisted step-tree seed nothing in the live path read):
|
|
@@ -61209,17 +61307,88 @@ var connectivityCapability = {
|
|
|
61209
61307
|
//#endregion
|
|
61210
61308
|
//#region src/capabilities/consumables.cap.ts
|
|
61211
61309
|
/**
|
|
61212
|
-
* Generic device-consumables capability —
|
|
61213
|
-
*
|
|
61214
|
-
* descaling cycles,
|
|
61215
|
-
*
|
|
61216
|
-
*
|
|
61217
|
-
*
|
|
61310
|
+
* Generic device-consumables capability — the ONE place a device reports what
|
|
61311
|
+
* it uses up or fills: wear parts (vacuum filters/brushes, cartridges,
|
|
61312
|
+
* descaling cycles), supplies it draws from (a vacuum's clean-water tank and
|
|
61313
|
+
* detergent, a dishwasher's salt and rinse aid) and waste it collects (a dirty
|
|
61314
|
+
* water tank, a dust bin). Each item carries its remaining life or fill and an
|
|
61315
|
+
* optional "Replaced" reset action. Device-agnostic: any provider that knows
|
|
61316
|
+
* its device tracks consumables registers it; the provider names each item
|
|
61317
|
+
* verbatim and says which `kind` it is.
|
|
61318
|
+
*
|
|
61319
|
+
* The admin UI renders it as ONE collapsible section directly under the
|
|
61320
|
+
* device page's hero card (`placement: 'hero'`), for every device bound to
|
|
61321
|
+
* this cap — never drawn by a device type's hero card itself (D915).
|
|
61218
61322
|
*
|
|
61219
61323
|
* Like `childLayout`, the cap is INERT until a provider sets items: no
|
|
61220
61324
|
* provider populates it by guessing (no HA inference). The UI renders a
|
|
61221
61325
|
* "No consumables reported" placeholder when `items` is empty.
|
|
61222
61326
|
*/
|
|
61327
|
+
/**
|
|
61328
|
+
* What an item IS, which decides which direction is bad:
|
|
61329
|
+
* - `wear` — a part that wears out (a brush, a filter); low life is bad.
|
|
61330
|
+
* - `supply` — something the device draws from (clean water, detergent,
|
|
61331
|
+
* salt, rinse aid); low or empty is bad.
|
|
61332
|
+
* - `waste` — something the device fills (dirty water, a dust bin); full is
|
|
61333
|
+
* bad.
|
|
61334
|
+
* Absent = `wear`.
|
|
61335
|
+
*/
|
|
61336
|
+
var ConsumableKindSchema = zod.z.enum([
|
|
61337
|
+
"wear",
|
|
61338
|
+
"supply",
|
|
61339
|
+
"waste"
|
|
61340
|
+
]);
|
|
61341
|
+
/**
|
|
61342
|
+
* What an item LOOKS like, which decides how a client draws it — independent
|
|
61343
|
+
* of `kind`, which decides which direction is bad:
|
|
61344
|
+
* - `part` — a part that wears (a brush, a filter, a mop pad): a wear bar,
|
|
61345
|
+
* remaining time and a reset.
|
|
61346
|
+
* - `tank` — a container of liquid (clean water, dirty water): a fill gauge.
|
|
61347
|
+
* - `product` — something bought and refilled (detergent, salt, rinse aid):
|
|
61348
|
+
* a stepped level and "refill".
|
|
61349
|
+
* - `bin` — a container that collects waste (a dust bin): a fill gauge
|
|
61350
|
+
* that warns when full.
|
|
61351
|
+
* Absent = derived from the kind ({@link consumableFormOf}).
|
|
61352
|
+
*/
|
|
61353
|
+
var ConsumableFormSchema = zod.z.enum([
|
|
61354
|
+
"part",
|
|
61355
|
+
"tank",
|
|
61356
|
+
"product",
|
|
61357
|
+
"bin"
|
|
61358
|
+
]);
|
|
61359
|
+
/** The provider's own discrete verdict on an item. */
|
|
61360
|
+
var ConsumableStatusSchema = zod.z.enum([
|
|
61361
|
+
"ok",
|
|
61362
|
+
"low",
|
|
61363
|
+
"empty",
|
|
61364
|
+
"full",
|
|
61365
|
+
"replace"
|
|
61366
|
+
]);
|
|
61367
|
+
/**
|
|
61368
|
+
* The level vocabulary every client draws a consumable in (badge tone, bar
|
|
61369
|
+
* colour): derived from an item by its kind, level and status. `null` beside
|
|
61370
|
+
* it means unknown (D393).
|
|
61371
|
+
*/
|
|
61372
|
+
var ConsumableLevelSchema = zod.z.enum([
|
|
61373
|
+
"ok",
|
|
61374
|
+
"low",
|
|
61375
|
+
"empty",
|
|
61376
|
+
"full"
|
|
61377
|
+
]);
|
|
61378
|
+
/** The kind of an item, with the documented default for an absent one. */
|
|
61379
|
+
function consumableKindOf(item) {
|
|
61380
|
+
return item.kind ?? "wear";
|
|
61381
|
+
}
|
|
61382
|
+
/** The kind's default form: wear → part, waste → bin, supply → product. */
|
|
61383
|
+
var FORM_OF_KIND = {
|
|
61384
|
+
wear: "part",
|
|
61385
|
+
waste: "bin",
|
|
61386
|
+
supply: "product"
|
|
61387
|
+
};
|
|
61388
|
+
/** The form of an item: its own when the provider names one, else its kind's default. */
|
|
61389
|
+
function consumableFormOf(item) {
|
|
61390
|
+
return item.form ?? FORM_OF_KIND[consumableKindOf(item)];
|
|
61391
|
+
}
|
|
61223
61392
|
/** Units a remaining-life counter is reported in. Closed: the panel renders
|
|
61224
61393
|
* each. */
|
|
61225
61394
|
var ConsumableRemainingUnitSchema = zod.z.enum([
|
|
@@ -61234,18 +61403,23 @@ var ConsumableRemainingSchema = zod.z.object({
|
|
|
61234
61403
|
unit: ConsumableRemainingUnitSchema
|
|
61235
61404
|
});
|
|
61236
61405
|
/** A single consumable item. Either a continuous `level` (remaining
|
|
61237
|
-
* life
|
|
61238
|
-
*
|
|
61239
|
-
* mutually exclusive; a provider may
|
|
61406
|
+
* life %, or fill % for a `supply` / `waste` item) or a discrete `status`
|
|
61407
|
+
* may be known — both may be null when a provider only knows the item
|
|
61408
|
+
* exists. `level` and `status` are not mutually exclusive; a provider may
|
|
61409
|
+
* report both. */
|
|
61240
61410
|
var ConsumableItemSchema = zod.z.object({
|
|
61241
61411
|
/** Stable id, e.g. 'main-brush'. */
|
|
61242
61412
|
key: zod.z.string().min(1),
|
|
61243
61413
|
/** Display name. */
|
|
61244
61414
|
label: zod.z.string().min(1),
|
|
61245
|
-
/** Remaining life % when known (0..100). */
|
|
61415
|
+
/** Remaining life % (`wear`) or fill % (`supply`, `waste`) when known (0..100). */
|
|
61246
61416
|
level: zod.z.number().min(0).max(100).nullable(),
|
|
61247
|
-
/**
|
|
61248
|
-
status:
|
|
61417
|
+
/** The provider's discrete verdict when known (binary mode). */
|
|
61418
|
+
status: ConsumableStatusSchema.nullable(),
|
|
61419
|
+
/** What the item is — decides whether low or full is bad. Absent = `wear`. */
|
|
61420
|
+
kind: ConsumableKindSchema.optional(),
|
|
61421
|
+
/** How the item is drawn (part, tank, product, bin). Absent = derived from `kind`. */
|
|
61422
|
+
form: ConsumableFormSchema.optional(),
|
|
61249
61423
|
/** Ms epoch of the last replace, when known. */
|
|
61250
61424
|
lastResetAt: zod.z.number().nullable(),
|
|
61251
61425
|
/** Whether `reset()` is meaningful for this item. */
|
|
@@ -61268,7 +61442,7 @@ var consumablesCapability = {
|
|
|
61268
61442
|
kind: "widget",
|
|
61269
61443
|
widgetId: "host/consumables-panel",
|
|
61270
61444
|
tab: "consumables",
|
|
61271
|
-
|
|
61445
|
+
placement: "hero",
|
|
61272
61446
|
label: "Consumables",
|
|
61273
61447
|
order: 5
|
|
61274
61448
|
} },
|
|
@@ -61329,9 +61503,37 @@ reset: require_sleep.method(zod.z.object({
|
|
|
61329
61503
|
*/
|
|
61330
61504
|
durability: "restored",
|
|
61331
61505
|
/**
|
|
61332
|
-
* History (D850):
|
|
61506
|
+
* History (D850, D917): one series per (item field, item `key`) — the item key
|
|
61507
|
+
* is the series scope, the item `label` names it. A vacuum tank's fill, a
|
|
61508
|
+
* brush's remaining life and a dishwasher's salt are each recorded the moment
|
|
61509
|
+
* their provider reports them; an item that appears later gets its series.
|
|
61333
61510
|
*/
|
|
61334
|
-
history:
|
|
61511
|
+
history: {
|
|
61512
|
+
fields: {},
|
|
61513
|
+
items: {
|
|
61514
|
+
path: "items",
|
|
61515
|
+
key: "key",
|
|
61516
|
+
label: "label",
|
|
61517
|
+
fields: {
|
|
61518
|
+
level: {
|
|
61519
|
+
kind: "gauge",
|
|
61520
|
+
unit: "%",
|
|
61521
|
+
deadband: 2,
|
|
61522
|
+
displayName: "Level"
|
|
61523
|
+
},
|
|
61524
|
+
status: {
|
|
61525
|
+
kind: "enum",
|
|
61526
|
+
displayName: "Status"
|
|
61527
|
+
},
|
|
61528
|
+
"remaining.value": {
|
|
61529
|
+
kind: "gauge",
|
|
61530
|
+
unitFrom: "remaining.unit",
|
|
61531
|
+
deadband: 1,
|
|
61532
|
+
displayName: "Remaining"
|
|
61533
|
+
}
|
|
61534
|
+
}
|
|
61535
|
+
}
|
|
61536
|
+
},
|
|
61335
61537
|
/** Clocks, not content: a re-read that changed no item costs no commit. */
|
|
61336
61538
|
volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
|
|
61337
61539
|
};
|
|
@@ -61804,8 +62006,9 @@ onStatusChanged: { data: zod.z.object({
|
|
|
61804
62006
|
//#endregion
|
|
61805
62007
|
//#region src/capabilities/dishwasher.cap.ts
|
|
61806
62008
|
/**
|
|
61807
|
-
* Smart-dishwasher cap — program lifecycle, door / remote-start gates
|
|
61808
|
-
*
|
|
62009
|
+
* Smart-dishwasher cap — program lifecycle, door / remote-start gates and
|
|
62010
|
+
* common program options. Salt and rinse aid are NOT here: they are items of
|
|
62011
|
+
* the device's `consumables` cap, like every other device's (D915).
|
|
61809
62012
|
*
|
|
61810
62013
|
* Sources: native Bosch Home Connect (`dishwasher` device type). Reusable
|
|
61811
62014
|
* by any integration that exposes the same program / option surface.
|
|
@@ -61853,11 +62056,6 @@ var DishwasherAvailabilitySchema = zod.z.enum([
|
|
|
61853
62056
|
"offline",
|
|
61854
62057
|
"description-missing"
|
|
61855
62058
|
]);
|
|
61856
|
-
var DishwasherConsumableLevelSchema = zod.z.enum([
|
|
61857
|
-
"ok",
|
|
61858
|
-
"low",
|
|
61859
|
-
"empty"
|
|
61860
|
-
]);
|
|
61861
62059
|
var DishwasherStatusSchema = zod.z.object({
|
|
61862
62060
|
availability: DishwasherAvailabilitySchema,
|
|
61863
62061
|
/** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
|
|
@@ -61890,8 +62088,6 @@ var DishwasherStatusSchema = zod.z.object({
|
|
|
61890
62088
|
powerOn: zod.z.boolean().nullable(),
|
|
61891
62089
|
/** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
|
|
61892
62090
|
powerState: zod.z.string().nullable(),
|
|
61893
|
-
saltLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
61894
|
-
rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
61895
62091
|
/**
|
|
61896
62092
|
* True while the appliance asks for its filter to be cleaned (smart-filter, filter-system or
|
|
61897
62093
|
* combined care-and-filter reminder raised); false when every such reminder reads clear; null
|
|
@@ -65145,7 +65341,7 @@ var motionTriggerCapability = {
|
|
|
65145
65341
|
enabled: zod.z.boolean()
|
|
65146
65342
|
}), zod.z.void(), {
|
|
65147
65343
|
kind: "mutation",
|
|
65148
|
-
auth: "
|
|
65344
|
+
auth: "protected"
|
|
65149
65345
|
}) },
|
|
65150
65346
|
events: { onMotionTriggerChanged: { data: zod.z.object({
|
|
65151
65347
|
deviceId: zod.z.number(),
|
|
@@ -66075,6 +66271,13 @@ var TopologyNodeSchema = zod.z.object({
|
|
|
66075
66271
|
cpuModel: zod.z.string().nullable(),
|
|
66076
66272
|
cpuCores: zod.z.number(),
|
|
66077
66273
|
memoryMB: zod.z.number(),
|
|
66274
|
+
/**
|
|
66275
|
+
* The inference RUNTIMES installed on the node (`pythonRuntimes`: onnx,
|
|
66276
|
+
* openvino, edgetpu …) — not its devices. An installed runtime says nothing
|
|
66277
|
+
* about whether its hardware is there (a Coral delegate stays installed
|
|
66278
|
+
* after the stick leaves, D919); the live device set is
|
|
66279
|
+
* `pipelineOrchestrator.getNodeInferenceDevices`.
|
|
66280
|
+
*/
|
|
66078
66281
|
engines: zod.z.array(zod.z.string()).readonly(),
|
|
66079
66282
|
isHub: zod.z.boolean(),
|
|
66080
66283
|
isOnline: zod.z.boolean(),
|
|
@@ -67454,6 +67657,24 @@ var ResolvedInferenceConfigSchema = zod.z.object({
|
|
|
67454
67657
|
format: ModelFormatSchema,
|
|
67455
67658
|
reason: zod.z.string()
|
|
67456
67659
|
});
|
|
67660
|
+
/**
|
|
67661
|
+
* The answer of an accelerator rescan (D919): the node's device list after
|
|
67662
|
+
* the re-probe, what changed, and the evidence that decided the Coral answer
|
|
67663
|
+
* (`usbBus` — could the USB bus be read at all; `decidedBy` — USB ids, the PCI
|
|
67664
|
+
* bus, the installed-delegate fallback, or nothing).
|
|
67665
|
+
*/
|
|
67666
|
+
var AcceleratorRescanSchema = zod.z.object({
|
|
67667
|
+
devices: zod.z.array(InferenceDeviceDescriptorSchema).readonly(),
|
|
67668
|
+
appeared: zod.z.array(zod.z.string()).readonly(),
|
|
67669
|
+
disappeared: zod.z.array(zod.z.string()).readonly(),
|
|
67670
|
+
usbBus: zod.z.enum(["observed", "unobservable"]),
|
|
67671
|
+
decidedBy: zod.z.enum([
|
|
67672
|
+
"usb-ids",
|
|
67673
|
+
"pci",
|
|
67674
|
+
"delegate-fallback",
|
|
67675
|
+
"none"
|
|
67676
|
+
])
|
|
67677
|
+
});
|
|
67457
67678
|
var platformProbeCapability = {
|
|
67458
67679
|
name: "platform-probe",
|
|
67459
67680
|
scope: "system",
|
|
@@ -67462,7 +67683,18 @@ var platformProbeCapability = {
|
|
|
67462
67683
|
getCapabilities: require_sleep.method(zod.z.void(), PlatformCapabilitiesSchema),
|
|
67463
67684
|
getHardware: require_sleep.method(zod.z.void(), HardwareInfoSchema),
|
|
67464
67685
|
resolveInferenceConfig: require_sleep.method(zod.z.object({ requirements: zod.z.array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema),
|
|
67465
|
-
resolveHwAccel: require_sleep.method(zod.z.object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema)
|
|
67686
|
+
resolveHwAccel: require_sleep.method(zod.z.object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema),
|
|
67687
|
+
/**
|
|
67688
|
+
* Re-probe this node's accelerators NOW (Coral USB ids + PCIe apex units;
|
|
67689
|
+
* `/sys` and `/dev` reads, no model load) and rebuild the device list that
|
|
67690
|
+
* `getCapabilities` serves. The same re-probe runs every 60 s on its own;
|
|
67691
|
+
* this is the operator's "rescan inference devices". Target a node with the
|
|
67692
|
+
* `{ nodeId }` routing input, like `getCapabilities`.
|
|
67693
|
+
*/
|
|
67694
|
+
rescanAccelerators: require_sleep.method(zod.z.void(), AcceleratorRescanSchema, {
|
|
67695
|
+
kind: "mutation",
|
|
67696
|
+
auth: "admin"
|
|
67697
|
+
})
|
|
67466
67698
|
}
|
|
67467
67699
|
};
|
|
67468
67700
|
//#endregion
|
|
@@ -73144,14 +73376,9 @@ var userManagementCapability = {
|
|
|
73144
73376
|
* validates it against the vacuum's own list. `locate` triggers the
|
|
73145
73377
|
* find-me chirp; `returnToBase` sends it home.
|
|
73146
73378
|
*
|
|
73147
|
-
*
|
|
73148
|
-
* `
|
|
73149
|
-
*
|
|
73150
|
-
* SHOULD populate whichever tanks the hardware has — leave a field `null`
|
|
73151
|
-
* only when the device has no such tank at all, and use a `TankStatus`
|
|
73152
|
-
* with both inner fields `null` when the tank exists but its level is
|
|
73153
|
-
* currently unknown. HA `vacuum.*` entities expose no per-tank telemetry,
|
|
73154
|
-
* so the HA provider leaves all four `null`.
|
|
73379
|
+
* Tanks (clean water, dirty water, detergent, dust bin) are NOT here: they
|
|
73380
|
+
* are `supply` / `waste` items of the device's `consumables` cap, like every
|
|
73381
|
+
* other device's consumables (D915).
|
|
73155
73382
|
*/
|
|
73156
73383
|
var VacuumStateSchema = zod.z.enum([
|
|
73157
73384
|
"idle",
|
|
@@ -73162,23 +73389,6 @@ var VacuumStateSchema = zod.z.enum([
|
|
|
73162
73389
|
"drying",
|
|
73163
73390
|
"error"
|
|
73164
73391
|
]);
|
|
73165
|
-
/**
|
|
73166
|
-
* One consumable / waste tank on a robot vacuum (clean-water, dirty-water,
|
|
73167
|
-
* detergent or dust-bin). A tank can report a numeric fill `level` (0..100),
|
|
73168
|
-
* a discrete `status` (binary-style hardware), or both. Both `null` means the
|
|
73169
|
-
* level is currently unknown; the OWNING field being `null` means the
|
|
73170
|
-
* hardware has no such tank at all.
|
|
73171
|
-
*/
|
|
73172
|
-
var TankStatusSchema = zod.z.object({
|
|
73173
|
-
/** Numeric fill 0..100 when the hardware reports a percentage; null otherwise. */
|
|
73174
|
-
level: zod.z.number().min(0).max(100).nullable(),
|
|
73175
|
-
/** Discrete state when the hardware is binary-mode; null otherwise. */
|
|
73176
|
-
status: zod.z.enum([
|
|
73177
|
-
"ok",
|
|
73178
|
-
"low",
|
|
73179
|
-
"full"
|
|
73180
|
-
]).nullable()
|
|
73181
|
-
});
|
|
73182
73392
|
var VacuumControlStatusSchema = zod.z.object({
|
|
73183
73393
|
/** Lifecycle state of the vacuum. */
|
|
73184
73394
|
state: VacuumStateSchema,
|
|
@@ -73190,14 +73400,6 @@ var VacuumControlStatusSchema = zod.z.object({
|
|
|
73190
73400
|
fanSpeed: zod.z.string().nullable(),
|
|
73191
73401
|
/** Speed tokens the hardware accepts — drives the UI selector. */
|
|
73192
73402
|
availableFanSpeeds: zod.z.array(zod.z.string()),
|
|
73193
|
-
/** Clean-water (mop) tank. Null when the hardware has no clean-water tank. */
|
|
73194
|
-
cleanWater: TankStatusSchema.nullable(),
|
|
73195
|
-
/** Dirty-water (recovery) tank. Null when the hardware has no dirty-water tank. */
|
|
73196
|
-
dirtyWater: TankStatusSchema.nullable(),
|
|
73197
|
-
/** Detergent tank. Null when the hardware has no detergent tank. */
|
|
73198
|
-
detergent: TankStatusSchema.nullable(),
|
|
73199
|
-
/** Dust bin. Null when the hardware has no dust bin. */
|
|
73200
|
-
dustBin: TankStatusSchema.nullable(),
|
|
73201
73403
|
/** 0..100 cleaning-completion percentage of the current task, or null. */
|
|
73202
73404
|
progressPercent: zod.z.number().min(0).max(100).nullable(),
|
|
73203
73405
|
/** Current error code (0 / null = no error). */
|
|
@@ -73259,35 +73461,14 @@ var vacuumControlCapability = {
|
|
|
73259
73461
|
*/
|
|
73260
73462
|
durability: "session",
|
|
73261
73463
|
/**
|
|
73262
|
-
* History (D850): recorded series.
|
|
73464
|
+
* History (D850): recorded series. The tanks moved to `consumables` (D915), whose
|
|
73465
|
+
* items are keyed by runtime ids and record no history.
|
|
73263
73466
|
*/
|
|
73264
|
-
history: { fields: {
|
|
73265
|
-
|
|
73266
|
-
|
|
73267
|
-
|
|
73268
|
-
|
|
73269
|
-
},
|
|
73270
|
-
"cleanWater.level": {
|
|
73271
|
-
kind: "gauge",
|
|
73272
|
-
unit: "%",
|
|
73273
|
-
deadband: 2
|
|
73274
|
-
},
|
|
73275
|
-
"dirtyWater.level": {
|
|
73276
|
-
kind: "gauge",
|
|
73277
|
-
unit: "%",
|
|
73278
|
-
deadband: 2
|
|
73279
|
-
},
|
|
73280
|
-
"detergent.level": {
|
|
73281
|
-
kind: "gauge",
|
|
73282
|
-
unit: "%",
|
|
73283
|
-
deadband: 2
|
|
73284
|
-
},
|
|
73285
|
-
"dustBin.level": {
|
|
73286
|
-
kind: "gauge",
|
|
73287
|
-
unit: "%",
|
|
73288
|
-
deadband: 2
|
|
73289
|
-
}
|
|
73290
|
-
} }
|
|
73467
|
+
history: { fields: { batteryLevel: {
|
|
73468
|
+
kind: "gauge",
|
|
73469
|
+
unit: "%",
|
|
73470
|
+
deadband: 2
|
|
73471
|
+
} } }
|
|
73291
73472
|
};
|
|
73292
73473
|
//#endregion
|
|
73293
73474
|
//#region src/capabilities/valve.cap.ts
|
|
@@ -79805,6 +79986,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
79805
79986
|
addonId: null,
|
|
79806
79987
|
access: "create"
|
|
79807
79988
|
},
|
|
79989
|
+
"deviceHistory.deleteOrphanSeries": {
|
|
79990
|
+
capName: "device-history",
|
|
79991
|
+
capScope: "system",
|
|
79992
|
+
addonId: null,
|
|
79993
|
+
access: "delete"
|
|
79994
|
+
},
|
|
79808
79995
|
"deviceHistory.getDeviceEnabled": {
|
|
79809
79996
|
capName: "device-history",
|
|
79810
79997
|
capScope: "system",
|
|
@@ -79823,6 +80010,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
79823
80010
|
addonId: null,
|
|
79824
80011
|
access: "view"
|
|
79825
80012
|
},
|
|
80013
|
+
"deviceHistory.listOrphanSeries": {
|
|
80014
|
+
capName: "device-history",
|
|
80015
|
+
capScope: "system",
|
|
80016
|
+
addonId: null,
|
|
80017
|
+
access: "view"
|
|
80018
|
+
},
|
|
79826
80019
|
"deviceHistory.listSeries": {
|
|
79827
80020
|
capName: "device-history",
|
|
79828
80021
|
capScope: "system",
|
|
@@ -83447,6 +83640,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
83447
83640
|
addonId: null,
|
|
83448
83641
|
access: "delete"
|
|
83449
83642
|
},
|
|
83643
|
+
"pipelineOrchestrator.forgetInferenceDevice": {
|
|
83644
|
+
capName: "pipeline-orchestrator",
|
|
83645
|
+
capScope: "system",
|
|
83646
|
+
addonId: null,
|
|
83647
|
+
access: "delete"
|
|
83648
|
+
},
|
|
83450
83649
|
"pipelineOrchestrator.getAgentLoad": {
|
|
83451
83650
|
capName: "pipeline-orchestrator",
|
|
83452
83651
|
capScope: "system",
|
|
@@ -84023,6 +84222,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
84023
84222
|
addonId: null,
|
|
84024
84223
|
access: "view"
|
|
84025
84224
|
},
|
|
84225
|
+
"platformProbe.rescanAccelerators": {
|
|
84226
|
+
capName: "platform-probe",
|
|
84227
|
+
capScope: "system",
|
|
84228
|
+
addonId: null,
|
|
84229
|
+
access: "create"
|
|
84230
|
+
},
|
|
84026
84231
|
"platformProbe.resolveHwAccel": {
|
|
84027
84232
|
capName: "platform-probe",
|
|
84028
84233
|
capScope: "system",
|
|
@@ -93343,7 +93548,7 @@ var BucketAccumulator = class {
|
|
|
93343
93548
|
//#region src/generated/history-catalog.ts
|
|
93344
93549
|
/**
|
|
93345
93550
|
* Cap history catalog, projected from every `*.cap.ts` `history` block.
|
|
93346
|
-
* 40 caps with series (
|
|
93551
|
+
* 40 caps with series (73 series), 30 caps answered `'none'`.
|
|
93347
93552
|
* Field keys are `runtimeState` paths (`a.b` into fixed objects only).
|
|
93348
93553
|
*/
|
|
93349
93554
|
var HISTORY_CATALOG = {
|
|
@@ -93646,33 +93851,11 @@ var HISTORY_CATALOG = {
|
|
|
93646
93851
|
unit: "°C",
|
|
93647
93852
|
deadband: .1
|
|
93648
93853
|
} },
|
|
93649
|
-
"vacuum-control": {
|
|
93650
|
-
"
|
|
93651
|
-
|
|
93652
|
-
|
|
93653
|
-
|
|
93654
|
-
},
|
|
93655
|
-
"cleanWater.level": {
|
|
93656
|
-
kind: "gauge",
|
|
93657
|
-
unit: "%",
|
|
93658
|
-
deadband: 2
|
|
93659
|
-
},
|
|
93660
|
-
"dirtyWater.level": {
|
|
93661
|
-
kind: "gauge",
|
|
93662
|
-
unit: "%",
|
|
93663
|
-
deadband: 2
|
|
93664
|
-
},
|
|
93665
|
-
"detergent.level": {
|
|
93666
|
-
kind: "gauge",
|
|
93667
|
-
unit: "%",
|
|
93668
|
-
deadband: 2
|
|
93669
|
-
},
|
|
93670
|
-
"dustBin.level": {
|
|
93671
|
-
kind: "gauge",
|
|
93672
|
-
unit: "%",
|
|
93673
|
-
deadband: 2
|
|
93674
|
-
}
|
|
93675
|
-
},
|
|
93854
|
+
"vacuum-control": { "batteryLevel": {
|
|
93855
|
+
kind: "gauge",
|
|
93856
|
+
unit: "%",
|
|
93857
|
+
deadband: 2
|
|
93858
|
+
} },
|
|
93676
93859
|
"valve": { "position": {
|
|
93677
93860
|
kind: "gauge",
|
|
93678
93861
|
unit: "%",
|
|
@@ -93714,13 +93897,47 @@ var HISTORY_CATALOG = {
|
|
|
93714
93897
|
}
|
|
93715
93898
|
}
|
|
93716
93899
|
};
|
|
93900
|
+
/**
|
|
93901
|
+
* Keyed-array series (D917), projected from every `history.items` block:
|
|
93902
|
+
* 1 caps (3 item fields). The item key is the series SCOPE;
|
|
93903
|
+
* the series key is `cap:<capName>.<path>[].<field>`.
|
|
93904
|
+
*/
|
|
93905
|
+
var HISTORY_ITEM_CATALOG = { "consumables": {
|
|
93906
|
+
path: "items",
|
|
93907
|
+
key: "key",
|
|
93908
|
+
label: "label",
|
|
93909
|
+
fields: {
|
|
93910
|
+
"level": {
|
|
93911
|
+
kind: "gauge",
|
|
93912
|
+
unit: "%",
|
|
93913
|
+
deadband: 2,
|
|
93914
|
+
displayName: "Level"
|
|
93915
|
+
},
|
|
93916
|
+
"status": {
|
|
93917
|
+
kind: "enum",
|
|
93918
|
+
displayName: "Status",
|
|
93919
|
+
values: [
|
|
93920
|
+
"ok",
|
|
93921
|
+
"low",
|
|
93922
|
+
"empty",
|
|
93923
|
+
"full",
|
|
93924
|
+
"replace"
|
|
93925
|
+
]
|
|
93926
|
+
},
|
|
93927
|
+
"remaining.value": {
|
|
93928
|
+
kind: "gauge",
|
|
93929
|
+
unitFrom: "remaining.unit",
|
|
93930
|
+
deadband: 1,
|
|
93931
|
+
displayName: "Remaining"
|
|
93932
|
+
}
|
|
93933
|
+
}
|
|
93934
|
+
} };
|
|
93717
93935
|
/** Caps that declared `history: 'none'`, sorted. */
|
|
93718
93936
|
var HISTORY_NONE_CAPS = [
|
|
93719
93937
|
"audio-metrics",
|
|
93720
93938
|
"automation-control",
|
|
93721
93939
|
"camera-streams",
|
|
93722
93940
|
"color",
|
|
93723
|
-
"consumables",
|
|
93724
93941
|
"control",
|
|
93725
93942
|
"day-night",
|
|
93726
93943
|
"device-discovery",
|
|
@@ -94018,7 +94235,9 @@ function createSystemProxy(api) {
|
|
|
94018
94235
|
declareSeries: (input) => dispatch("deviceHistory", "declareSeries", "mutation", input),
|
|
94019
94236
|
record: (input) => dispatch("deviceHistory", "record", "mutation", input),
|
|
94020
94237
|
recordBuckets: (input) => dispatch("deviceHistory", "recordBuckets", "mutation", input),
|
|
94021
|
-
getStatus: (input) => dispatch("deviceHistory", "getStatus", "query", input)
|
|
94238
|
+
getStatus: (input) => dispatch("deviceHistory", "getStatus", "query", input),
|
|
94239
|
+
listOrphanSeries: (input) => dispatch("deviceHistory", "listOrphanSeries", "query", input),
|
|
94240
|
+
deleteOrphanSeries: (input) => dispatch("deviceHistory", "deleteOrphanSeries", "mutation", input)
|
|
94022
94241
|
},
|
|
94023
94242
|
deviceManager: {
|
|
94024
94243
|
allocateDeviceId: (input) => dispatch("deviceManager", "allocateDeviceId", "mutation", input),
|
|
@@ -94358,6 +94577,7 @@ function createSystemProxy(api) {
|
|
|
94358
94577
|
setAgentReachableHost: (input) => dispatch("pipelineOrchestrator", "setAgentReachableHost", "mutation", input),
|
|
94359
94578
|
setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
|
|
94360
94579
|
getNodeInferenceDevices: (input) => dispatch("pipelineOrchestrator", "getNodeInferenceDevices", "query", input),
|
|
94580
|
+
forgetInferenceDevice: (input) => dispatch("pipelineOrchestrator", "forgetInferenceDevice", "mutation", input),
|
|
94361
94581
|
resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
|
|
94362
94582
|
planAutoTune: (input) => dispatch("pipelineOrchestrator", "planAutoTune", "query", input),
|
|
94363
94583
|
applyAutoTune: (input) => dispatch("pipelineOrchestrator", "applyAutoTune", "mutation", input),
|
|
@@ -97981,17 +98201,18 @@ var NC_TEMPLATE_VARS = [
|
|
|
97981
98201
|
{
|
|
97982
98202
|
name: "item",
|
|
97983
98203
|
label: "Consumable",
|
|
98204
|
+
description: "The device's own name for the item: a filter, a brush, the salt, a tank.",
|
|
97984
98205
|
example: "Filtro",
|
|
97985
98206
|
group: "system",
|
|
97986
98207
|
families: ["rule"],
|
|
97987
98208
|
fields: [...RULE_TEXT],
|
|
97988
98209
|
kinds: ["system"],
|
|
97989
|
-
systemEventKinds: [...CONSUMABLE]
|
|
98210
|
+
systemEventKinds: [...CONSUMABLE, ...TANK]
|
|
97990
98211
|
},
|
|
97991
98212
|
{
|
|
97992
98213
|
name: "tank",
|
|
97993
98214
|
label: "Tank",
|
|
97994
|
-
description: "Which tank:
|
|
98215
|
+
description: "Which tank, as a stable token: cleanWater, dirtyWater, detergent, dustBin, or the device key of any other supply (salt, rinse aid).",
|
|
97995
98216
|
example: "clean water",
|
|
97996
98217
|
group: "system",
|
|
97997
98218
|
families: ["rule"],
|
|
@@ -101376,15 +101597,23 @@ function byDeficit(a, b) {
|
|
|
101376
101597
|
function spareOf(c) {
|
|
101377
101598
|
return c.spare ?? Number.POSITIVE_INFINITY;
|
|
101378
101599
|
}
|
|
101379
|
-
function
|
|
101380
|
-
|
|
101600
|
+
function loadOf(c) {
|
|
101601
|
+
return Math.max(c.running, 0) + Math.max(c.recent ?? 0, 0);
|
|
101602
|
+
}
|
|
101603
|
+
/** Every candidate with its deficit, the turn holder first. */
|
|
101604
|
+
function scoreShares(candidates) {
|
|
101381
101605
|
const shareSum = candidates.reduce((s, c) => s + Math.max(c.share, 0), 0);
|
|
101382
|
-
const loadOf = (c) => Math.max(c.running, 0) + Math.max(c.recent ?? 0, 0);
|
|
101383
101606
|
const running = candidates.reduce((s, c) => s + loadOf(c), 0);
|
|
101384
|
-
|
|
101607
|
+
return candidates.map((candidate) => ({
|
|
101385
101608
|
candidate,
|
|
101386
101609
|
deficit: (shareSum > 0 ? Math.max(candidate.share, 0) / shareSum : 1 / candidates.length) * (running + 1) - loadOf(candidate)
|
|
101387
101610
|
})).toSorted(byDeficit);
|
|
101611
|
+
}
|
|
101612
|
+
function electByShare(candidates) {
|
|
101613
|
+
if (candidates.length === 0) return { kind: "none" };
|
|
101614
|
+
return electFromScored(scoreShares(candidates));
|
|
101615
|
+
}
|
|
101616
|
+
function electFromScored(scored) {
|
|
101388
101617
|
const turn = scored[0].candidate;
|
|
101389
101618
|
if (!turn.capped && !turn.saturated) return {
|
|
101390
101619
|
kind: "elected",
|
|
@@ -101408,6 +101637,55 @@ function electByShare(candidates) {
|
|
|
101408
101637
|
reason: "share"
|
|
101409
101638
|
};
|
|
101410
101639
|
}
|
|
101640
|
+
/**
|
|
101641
|
+
* Affinity (D916, amends D913): a camera's sessions are short and frequent, and
|
|
101642
|
+
* every election is a fresh one — with the recency memory rotating on purpose,
|
|
101643
|
+
* one camera hopped node on 11 of 14 sessions in ten minutes, each hop a stream
|
|
101644
|
+
* dial, a decode-worker fork and a cold pre-roll. The candidate a camera ran on
|
|
101645
|
+
* last is kept while its deficit is within {@link SHARE_AFFINITY_TOLERANCE_SESSIONS}
|
|
101646
|
+
* of the turn holder's, and while it has room (offered, not capped, not
|
|
101647
|
+
* drowning). It moves only when the share is really off — and because a kept
|
|
101648
|
+
* session still counts toward its candidate, the cumulative split still follows
|
|
101649
|
+
* the shares: no candidate runs more than about one session over its share
|
|
101650
|
+
* before its cameras leave.
|
|
101651
|
+
*/
|
|
101652
|
+
var SHARE_AFFINITY_TOLERANCE_SESSIONS = 1;
|
|
101653
|
+
function toScoredCandidate(s) {
|
|
101654
|
+
return {
|
|
101655
|
+
key: s.candidate.key,
|
|
101656
|
+
share: s.candidate.share,
|
|
101657
|
+
running: s.candidate.running,
|
|
101658
|
+
recent: s.candidate.recent ?? 0,
|
|
101659
|
+
deficit: s.deficit
|
|
101660
|
+
};
|
|
101661
|
+
}
|
|
101662
|
+
/** {@link electByShare}, keeping the previous candidate while the share allows it. */
|
|
101663
|
+
function electByShareWithAffinity(candidates, previousKey, toleranceSessions = 1) {
|
|
101664
|
+
const scored = candidates.length === 0 ? [] : scoreShares(candidates);
|
|
101665
|
+
const plain = scored.length === 0 ? { kind: "none" } : electFromScored(scored);
|
|
101666
|
+
const turnKey = plain.kind === "elected" ? plain.key : null;
|
|
101667
|
+
const result = (election, sticky, affinityReason) => ({
|
|
101668
|
+
election,
|
|
101669
|
+
sticky,
|
|
101670
|
+
affinityReason,
|
|
101671
|
+
previousKey,
|
|
101672
|
+
turnKey,
|
|
101673
|
+
scored: scored.map(toScoredCandidate)
|
|
101674
|
+
});
|
|
101675
|
+
if (previousKey === null) return result(plain, false, "no-previous");
|
|
101676
|
+
if (turnKey === previousKey) return result(plain, true, "previous-is-turn");
|
|
101677
|
+
const previous = scored.find((s) => s.candidate.key === previousKey);
|
|
101678
|
+
if (previous === void 0) return result(plain, false, "previous-ineligible");
|
|
101679
|
+
if (previous.candidate.capped || previous.candidate.saturated) return result(plain, false, "previous-no-room");
|
|
101680
|
+
const elected = scored.find((s) => s.candidate.key === turnKey);
|
|
101681
|
+
if (elected === void 0) return result(plain, false, "share-off");
|
|
101682
|
+
if (previous.deficit >= elected.deficit - toleranceSessions - DEFICIT_EPSILON) return result({
|
|
101683
|
+
kind: "elected",
|
|
101684
|
+
key: previousKey,
|
|
101685
|
+
reason: "share"
|
|
101686
|
+
}, true, "within-one-session");
|
|
101687
|
+
return result(plain, false, "share-off");
|
|
101688
|
+
}
|
|
101411
101689
|
//#endregion
|
|
101412
101690
|
//#region src/pipeline/load-balancing/effective-shares.ts
|
|
101413
101691
|
/**
|
|
@@ -101443,7 +101721,8 @@ function resolveEffectiveShares(input) {
|
|
|
101443
101721
|
const nodes = input.nodeIds.map((nodeId) => {
|
|
101444
101722
|
const eligibleKeys = new Set(input.eligibleDevices[nodeId] ?? []);
|
|
101445
101723
|
const named = weights.devices[nodeId] ?? {};
|
|
101446
|
-
const
|
|
101724
|
+
const absent = new Set(input.absentDevices?.[nodeId] ?? []);
|
|
101725
|
+
const keys = [...new Set([...Object.keys(named), ...eligibleKeys])].filter((k) => !absent.has(k)).toSorted();
|
|
101447
101726
|
const perDevice = {};
|
|
101448
101727
|
for (const key of keys) perDevice[key] = positive(named[key]);
|
|
101449
101728
|
if (keys.length > 0) deviceWeights[nodeId] = perDevice;
|
|
@@ -104640,9 +104919,13 @@ exports.ConnectionTestDescriptorSchema = ConnectionTestDescriptorSchema;
|
|
|
104640
104919
|
exports.ConnectionTestInputSchema = ConnectionTestInputSchema;
|
|
104641
104920
|
exports.ConnectionTestOutcomeSchema = ConnectionTestOutcomeSchema;
|
|
104642
104921
|
exports.ConnectivityStatusSchema = ConnectivityStatusSchema;
|
|
104922
|
+
exports.ConsumableFormSchema = ConsumableFormSchema;
|
|
104643
104923
|
exports.ConsumableItemSchema = ConsumableItemSchema;
|
|
104924
|
+
exports.ConsumableKindSchema = ConsumableKindSchema;
|
|
104925
|
+
exports.ConsumableLevelSchema = ConsumableLevelSchema;
|
|
104644
104926
|
exports.ConsumableRemainingSchema = ConsumableRemainingSchema;
|
|
104645
104927
|
exports.ConsumableRemainingUnitSchema = ConsumableRemainingUnitSchema;
|
|
104928
|
+
exports.ConsumableStatusSchema = ConsumableStatusSchema;
|
|
104646
104929
|
exports.ConsumablesStatusSchema = ConsumablesStatusSchema;
|
|
104647
104930
|
exports.ContactStatusSchema = ContactStatusSchema;
|
|
104648
104931
|
exports.ControlKindSchema = ControlKindSchema;
|
|
@@ -104723,6 +105006,8 @@ exports.DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = DEVICE_DEFINITIVE_REFUSALS_BE
|
|
|
104723
105006
|
exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
|
|
104724
105007
|
exports.DEVICE_ENROLLMENT_TTL_MS = DEVICE_ENROLLMENT_TTL_MS;
|
|
104725
105008
|
exports.DEVICE_HISTORY_ENERGY_KEY = DEVICE_HISTORY_ENERGY_KEY;
|
|
105009
|
+
exports.DEVICE_HISTORY_ORPHAN_DELETE_MAX = DEVICE_HISTORY_ORPHAN_DELETE_MAX;
|
|
105010
|
+
exports.DEVICE_HISTORY_ORPHAN_LIST_MAX = DEVICE_HISTORY_ORPHAN_LIST_MAX;
|
|
104726
105011
|
exports.DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS = DEVICE_HISTORY_QUERY_MANY_MAX_ITEMS;
|
|
104727
105012
|
exports.DEVICE_NONCE_TTL_MS = DEVICE_NONCE_TTL_MS;
|
|
104728
105013
|
exports.DEVICE_PROFILES = DEVICE_PROFILES;
|
|
@@ -104782,6 +105067,8 @@ exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
|
|
|
104782
105067
|
exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
|
|
104783
105068
|
exports.DeviceFeature = require_err_msg.DeviceFeature;
|
|
104784
105069
|
exports.DeviceHistoryKindSchema = DeviceHistoryKindSchema;
|
|
105070
|
+
exports.DeviceHistoryOrphanDeleteRefusalSchema = DeviceHistoryOrphanDeleteRefusalSchema;
|
|
105071
|
+
exports.DeviceHistoryOrphanReasonSchema = DeviceHistoryOrphanReasonSchema;
|
|
104785
105072
|
exports.DeviceHistoryProducerKindSchema = DeviceHistoryProducerKindSchema;
|
|
104786
105073
|
exports.DeviceHistoryRefusalReasonSchema = DeviceHistoryRefusalReasonSchema;
|
|
104787
105074
|
exports.DeviceHistoryResolutionSchema = DeviceHistoryResolutionSchema;
|
|
@@ -104814,7 +105101,6 @@ exports.DiscoveredDeviceSchema = DiscoveredDeviceSchema;
|
|
|
104814
105101
|
exports.DiscoveredTargetSchema = DiscoveredTargetSchema;
|
|
104815
105102
|
exports.DishwasherAccessSchema = DishwasherAccessSchema;
|
|
104816
105103
|
exports.DishwasherAvailabilitySchema = DishwasherAvailabilitySchema;
|
|
104817
|
-
exports.DishwasherConsumableLevelSchema = DishwasherConsumableLevelSchema;
|
|
104818
105104
|
exports.DishwasherOperationStateSchema = DishwasherOperationStateSchema;
|
|
104819
105105
|
exports.DishwasherOptionDescriptorSchema = DishwasherOptionDescriptorSchema;
|
|
104820
105106
|
exports.DishwasherOptionsSchema = DishwasherOptionsSchema;
|
|
@@ -104975,6 +105261,7 @@ exports.HF_REPO = require_sleep.HF_REPO;
|
|
|
104975
105261
|
exports.HISTORY_BUCKET_MS = HISTORY_BUCKET_MS;
|
|
104976
105262
|
exports.HISTORY_CATALOG = HISTORY_CATALOG;
|
|
104977
105263
|
exports.HISTORY_DEFAULT_MIN_INTERVAL_MS = require_sleep.HISTORY_DEFAULT_MIN_INTERVAL_MS;
|
|
105264
|
+
exports.HISTORY_ITEM_CATALOG = HISTORY_ITEM_CATALOG;
|
|
104978
105265
|
exports.HISTORY_NONE_CAPS = HISTORY_NONE_CAPS;
|
|
104979
105266
|
exports.HISTORY_UNIT_LABELS = require_sleep.HISTORY_UNIT_LABELS;
|
|
104980
105267
|
exports.HOURS_PER_DAY = HOURS_PER_DAY;
|
|
@@ -105863,6 +106150,7 @@ exports.SENSOR_MAP = SENSOR_MAP;
|
|
|
105863
106150
|
exports.SERVER_NAME_MAX_LENGTH = SERVER_NAME_MAX_LENGTH;
|
|
105864
106151
|
exports.SERVER_NAME_SETTING_KEY = SERVER_NAME_SETTING_KEY;
|
|
105865
106152
|
exports.SESSION_PLACEMENT_SETTING_KEY = SESSION_PLACEMENT_SETTING_KEY;
|
|
106153
|
+
exports.SHARE_AFFINITY_TOLERANCE_SESSIONS = SHARE_AFFINITY_TOLERANCE_SESSIONS;
|
|
105866
106154
|
exports.SHARE_SOURCE_SETTING_KEY = SHARE_SOURCE_SETTING_KEY;
|
|
105867
106155
|
exports.SHARE_VIEW_KINDS = require_sleep.SHARE_VIEW_KINDS;
|
|
105868
106156
|
exports.SHARE_VIEW_MAX_DEVICES = SHARE_VIEW_MAX_DEVICES;
|
|
@@ -106027,7 +106315,6 @@ exports.TRAINING_RESULT_SCHEMA = TRAINING_RESULT_SCHEMA;
|
|
|
106027
106315
|
exports.TRANSCODE_DOWN_MAX_BITRATE_KBPS = TRANSCODE_DOWN_MAX_BITRATE_KBPS;
|
|
106028
106316
|
exports.TRANSCODE_DOWN_MAX_HEIGHT = TRANSCODE_DOWN_MAX_HEIGHT;
|
|
106029
106317
|
exports.TamperStatusSchema = TamperStatusSchema;
|
|
106030
|
-
exports.TankStatusSchema = TankStatusSchema;
|
|
106031
106318
|
exports.TargetKindCapsSchema = TargetKindCapsSchema;
|
|
106032
106319
|
exports.TargetKindLevelSchema = TargetKindLevelSchema;
|
|
106033
106320
|
exports.TargetKindSchema = TargetKindSchema;
|
|
@@ -106358,6 +106645,8 @@ exports.conditionExclusionReason = conditionExclusionReason;
|
|
|
106358
106645
|
exports.conditionVisibleForKind = conditionVisibleForKind;
|
|
106359
106646
|
exports.connectionTestCapability = connectionTestCapability;
|
|
106360
106647
|
exports.connectivityCapability = connectivityCapability;
|
|
106648
|
+
exports.consumableFormOf = consumableFormOf;
|
|
106649
|
+
exports.consumableKindOf = consumableKindOf;
|
|
106361
106650
|
exports.consumableLowPercentOf = consumableLowPercentOf;
|
|
106362
106651
|
exports.consumablesCapability = consumablesCapability;
|
|
106363
106652
|
exports.contactCapability = contactCapability;
|
|
@@ -106464,6 +106753,7 @@ exports.effectiveStepSettings = effectiveStepSettings;
|
|
|
106464
106753
|
exports.egressTranscodeSharingKey = egressTranscodeSharingKey;
|
|
106465
106754
|
exports.egressTransportFromRequest = egressTransportFromRequest;
|
|
106466
106755
|
exports.electByShare = electByShare;
|
|
106756
|
+
exports.electByShareWithAffinity = electByShareWithAffinity;
|
|
106467
106757
|
exports.eligibleUnderBenchmark = eligibleUnderBenchmark;
|
|
106468
106758
|
exports.embeddingEncoderCapability = embeddingEncoderCapability;
|
|
106469
106759
|
exports.embeddingModelFailedError = embeddingModelFailedError;
|
|
@@ -106557,6 +106847,7 @@ exports.hasUrlScheme = hasUrlScheme;
|
|
|
106557
106847
|
exports.heatingValveCapability = heatingValveCapability;
|
|
106558
106848
|
exports.hfModelUrl = require_sleep.hfModelUrl;
|
|
106559
106849
|
exports.historyFieldsFor = historyFieldsFor;
|
|
106850
|
+
exports.historyItemFieldPath = require_sleep.historyItemFieldPath;
|
|
106560
106851
|
exports.htmlToText = htmlToText;
|
|
106561
106852
|
exports.hubAddressHostname = hubAddressHostname;
|
|
106562
106853
|
exports.hubMotionNativeProvider = hubMotionNativeProvider;
|