@camstack/addon-post-analysis 1.2.655 → 1.2.656

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (15) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/{clip-model-registry-C-en5vSD.js → clip-model-registry-BQ_2RsIp.js} +473 -5
  3. package/dist/{clip-model-registry-_b3KHYFm.mjs → clip-model-registry-C06M8A8U.mjs} +473 -5
  4. package/dist/embedding-encoder/index.js +1 -1
  5. package/dist/embedding-encoder/index.mjs +1 -1
  6. package/dist/pipeline-analytics/_stub.js +2 -2
  7. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-CF-Mts9j.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-8vah5-KD.mjs} +2 -2
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-YXyP9GJm.mjs +26 -0
  9. package/dist/pipeline-analytics/{_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DXQUFp7P.mjs → _virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-gv38vKug.mjs} +1 -1
  10. package/dist/pipeline-analytics/{hostInit-BSfz5s98.mjs → hostInit-0O7AUcsV.mjs} +2 -2
  11. package/dist/pipeline-analytics/index.js +20 -2
  12. package/dist/pipeline-analytics/index.mjs +20 -2
  13. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  14. package/package.json +1 -1
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C7OJ7wek.mjs +0 -26
@@ -5645,7 +5645,7 @@ var ZodIssueCode = {
5645
5645
  var ZodFirstPartyTypeKind;
5646
5646
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5647
5647
  //#endregion
5648
- //#region ../types/dist/sleep-CeyhrcOk.mjs
5648
+ //#region ../types/dist/sleep-SX9bkW3_.mjs
5649
5649
  /**
5650
5650
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5651
5651
  * window to float samples (D455).
@@ -9316,6 +9316,7 @@ var CAP_NAMES = Object.freeze([
9316
9316
  "remote-layout-components",
9317
9317
  "running-state",
9318
9318
  "scene-monitor",
9319
+ "schedulers",
9319
9320
  "script-runner",
9320
9321
  "server-management",
9321
9322
  "settings-store",
@@ -10261,7 +10262,8 @@ Object.freeze({
10261
10262
  "unlocked",
10262
10263
  "locking",
10263
10264
  "unlocking",
10264
- "jammed"
10265
+ "jammed",
10266
+ "door-open"
10265
10267
  ]
10266
10268
  }],
10267
10269
  "media-player": [
@@ -17755,6 +17757,11 @@ var ACTUATOR_CAP_VOCABULARY = {
17755
17757
  value: "jammed",
17756
17758
  label: t("Jammed", "Inceppata"),
17757
17759
  phrase: t("When {device} jams", "Quando {device} si inceppa")
17760
+ },
17761
+ {
17762
+ value: "door-open",
17763
+ label: t("Door open", "Porta aperta"),
17764
+ phrase: t("When the door of {device} opens", "Quando la porta di {device} si apre")
17758
17765
  }
17759
17766
  ],
17760
17767
  icon: "lock"
@@ -21245,6 +21252,7 @@ var SYSTEM_CAP_VOCABULARY = {
21245
21252
  records: system(INTERNAL),
21246
21253
  remote: system("the per-device remote setup — authored in the Customize remote editor, sent through the remote UI"),
21247
21254
  "remote-layout-components": system("the palette of the remote template editor — read-only data, never actuated"),
21255
+ schedulers: system("time schedulers — authored on their own page, not device actions"),
21248
21256
  "server-management": system(CLUSTER),
21249
21257
  "settings-store": system(INTERNAL),
21250
21258
  "smtp-provider": system(INTERNAL),
@@ -42368,6 +42376,122 @@ var AutomationWhenSchema = lazy(() => discriminatedUnion("kind", [
42368
42376
  StationaryPresentLeafSchema,
42369
42377
  ExpressionLeafSchema
42370
42378
  ]));
42379
+ var EVENT_KINDS = new Set([
42380
+ "device-becomes",
42381
+ "device-event",
42382
+ "schedule",
42383
+ "manual",
42384
+ "interval",
42385
+ "detection",
42386
+ "stationary"
42387
+ ]);
42388
+ function isEventLeaf(node) {
42389
+ return EVENT_KINDS.has(node.kind);
42390
+ }
42391
+ function isLeaf(node) {
42392
+ return node.kind !== "all" && node.kind !== "any" && node.kind !== "not";
42393
+ }
42394
+ /** Depth of a tree, root container = 1. A bare leaf is depth 1. */
42395
+ function whenDepth(node) {
42396
+ if (isLeaf(node)) return 1;
42397
+ if (node.kind === "not") return 1 + whenDepth(node.child);
42398
+ let deepest = 0;
42399
+ for (const child of node.children) deepest = Math.max(deepest, whenDepth(child));
42400
+ return 1 + deepest;
42401
+ }
42402
+ /** Leaves only — containers do not count toward the leaf budget. */
42403
+ function countWhenLeaves(node) {
42404
+ if (isLeaf(node)) return 1;
42405
+ if (node.kind === "not") return countWhenLeaves(node.child);
42406
+ let total = 0;
42407
+ for (const child of node.children) total += countWhenLeaves(child);
42408
+ return total;
42409
+ }
42410
+ /** Every leaf with its path (`when`, `when.0`, `when.0.1`, `when.0` under a `not`). */
42411
+ function forEachLeaf(node, visit, path = "when") {
42412
+ if (isLeaf(node)) {
42413
+ visit(node, path);
42414
+ return;
42415
+ }
42416
+ if (node.kind === "not") {
42417
+ forEachLeaf(node.child, visit, `${path}.0`);
42418
+ return;
42419
+ }
42420
+ node.children.forEach((child, i) => {
42421
+ forEachLeaf(child, visit, `${path}.${i}`);
42422
+ });
42423
+ }
42424
+ function hasEventLeaves(node) {
42425
+ let found = false;
42426
+ forEachLeaf(node, (leaf) => {
42427
+ if (isEventLeaf(leaf)) found = true;
42428
+ });
42429
+ return found;
42430
+ }
42431
+ function hasEmptyContainer(node) {
42432
+ if (isLeaf(node)) return false;
42433
+ if (node.kind === "not") return hasEmptyContainer(node.child);
42434
+ if (node.children.length === 0) return true;
42435
+ return node.children.some(hasEmptyContainer);
42436
+ }
42437
+ var LEAF_WORDS = {
42438
+ "device-becomes": "a device value that becomes",
42439
+ "device-event": "a device event",
42440
+ schedule: "a schedule",
42441
+ manual: "a manual run",
42442
+ interval: "an interval",
42443
+ detection: "a detection",
42444
+ stationary: "a parked object appearing or leaving"
42445
+ };
42446
+ function say(kind) {
42447
+ return LEAF_WORDS[kind] ?? kind;
42448
+ }
42449
+ /**
42450
+ * The cheapest set of event leaves that makes `node` true, with negation pushed
42451
+ * down to the leaves first (De Morgan), so `not(any(A, B))` and `all(not A,
42452
+ * not B)` are the same shape to the check. A negated event is its own error: an
42453
+ * event is an instant, "the event did not occur" is true at every other moment.
42454
+ */
42455
+ function eventNeed(node, path, negated) {
42456
+ if (isLeaf(node)) {
42457
+ if (!isEventLeaf(node)) return { paths: [] };
42458
+ if (negated) return { error: `"not" is applied to ${say(node.kind)} (${path}) — an event is an instant, so "it did not happen" is true at every other moment and can never start a run. Negate a state ("is") instead, or remove the "not"` };
42459
+ return { paths: [{
42460
+ path,
42461
+ kind: node.kind
42462
+ }] };
42463
+ }
42464
+ if (node.kind === "not") return eventNeed(node.child, `${path}.0`, !negated);
42465
+ const conjunctive = node.kind === "all" !== negated;
42466
+ const parts = [];
42467
+ for (let i = 0; i < node.children.length; i += 1) {
42468
+ const child = node.children[i];
42469
+ if (child === void 0) continue;
42470
+ const need = eventNeed(child, `${path}.${i}`, negated);
42471
+ if ("error" in need) return need;
42472
+ parts.push(need);
42473
+ }
42474
+ if (conjunctive) return { paths: parts.flatMap((p) => p.paths) };
42475
+ let best;
42476
+ for (const part of parts) if (best === void 0 || part.paths.length < best.paths.length) best = part;
42477
+ return best ?? { paths: [] };
42478
+ }
42479
+ /**
42480
+ * Author-time bounds and sense check of a `when` tree. Returns `null` when it
42481
+ * is legal, else a message the editor shows verbatim.
42482
+ */
42483
+ function validateWhenTree(when) {
42484
+ if (hasEmptyContainer(when)) return "a group is empty — group existing rows instead of leaving a container to fill";
42485
+ const depth = whenDepth(when);
42486
+ if (depth > 4) return `the rules nest ${depth} levels deep — the limit is 4. "not (any of …)" is the same as "all of (not …)", which is one level shallower`;
42487
+ const leaves = countWhenLeaves(when);
42488
+ if (leaves > 32) return `the rules use ${leaves} rows — the limit is 32`;
42489
+ const need = eventNeed(when, "when", false);
42490
+ if ("error" in need) return need.error;
42491
+ const [first, second] = need.paths;
42492
+ if (first !== void 0 && second !== void 0) return `${say(first.kind)} (${first.path}) and ${say(second.kind)} (${second.path}) would both have to happen at the same instant, and an event happens at one moment — this can never run. Use "any of" to start on either, or turn one of them into a state ("is") that must already hold`;
42493
+ return null;
42494
+ }
42371
42495
  /**
42372
42496
  * The recipe shape before the single `when` tree: a flat list of triggers
42373
42497
  * (OR'd, each an instant) and an optional condition tree. Stored recipes —
@@ -42723,6 +42847,187 @@ function convertLegacyRecipe(legacy) {
42723
42847
  var AutomationRecipeSchema = union([CurrentAutomationRecipeSchema, LegacyAutomationRecipeSchema.transform(convertLegacyRecipe)]);
42724
42848
  new Set(Object.values(COCO_TO_MACRO.mapping));
42725
42849
  /**
42850
+ * Schedulers (D983) — an entity that performs actions over the day.
42851
+ *
42852
+ * A scheduler has profiles; a profile has weekdays and a timeline of POINTS.
42853
+ * A point is an `edge` (run once at its time), a `hold` (from this point until
42854
+ * the next point of the profile, keep the steps' effects true) or a `release`
42855
+ * (end the current hold without acting). The scheduler AND each profile carry
42856
+ * a manual `enabled` flag and an optional `activeWhen`: a `when` STATE tree
42857
+ * (facts only — an event leaf is an instant and cannot be "in force").
42858
+ *
42859
+ * This file is the data half: the schemas, and the author-time rules that
42860
+ * decide whether a scheduler can be saved at all (a hold needs an action that
42861
+ * leads to a state; a sun point needs the site location). It holds no runtime.
42862
+ */
42863
+ /** A `when` tree that is a STATE: no event leaf, and legal as a tree. */
42864
+ var SchedulerStateTreeSchema = AutomationWhenSchema.superRefine((when, ctx) => {
42865
+ if (hasEventLeaves(when)) {
42866
+ ctx.addIssue({
42867
+ code: "custom",
42868
+ message: "a scheduler condition is a state — an event (\"becomes\", \"detects\", \"at a time\") is an instant and cannot be in force"
42869
+ });
42870
+ return;
42871
+ }
42872
+ const problem = validateWhenTree(when);
42873
+ if (problem !== null) ctx.addIssue({
42874
+ code: "custom",
42875
+ message: problem
42876
+ });
42877
+ });
42878
+ /** A point's moment: a clock time or a sun event. A one-shot date is not a position on a day. */
42879
+ var SchedulerTimeSpecSchema = TimeSpecSchema.refine((spec) => spec.kind !== "date", { message: "a scheduler point is a clock time or a sun event — a one-shot date has no place on a timeline" });
42880
+ var SchedulerPointModeSchema = _enum([
42881
+ "edge",
42882
+ "hold",
42883
+ "release"
42884
+ ]);
42885
+ /** What a hold does when someone changes the device by hand. */
42886
+ var HoldOverrideSchema = discriminatedUnion("mode", [object({ mode: literal("respect") }), object({
42887
+ mode: literal("reassert"),
42888
+ /** How long the manual state is left alone before the hold puts its own back. */
42889
+ graceMs: number().int().min(0).max(24 * 36e5)
42890
+ })]);
42891
+ /** A missed edge up to this late still runs. */
42892
+ var DEFAULT_MAX_LATE_MS = 10 * 6e4;
42893
+ var SchedulerPointSchema = object({
42894
+ id: string().min(1).max(64),
42895
+ at: SchedulerTimeSpecSchema,
42896
+ mode: SchedulerPointModeSchema,
42897
+ /** The actions of an `edge` or `hold`; a `release` has none. */
42898
+ steps: array(ActionStepSchema).max(20).default([]),
42899
+ /** Checked when the point runs (an edge) or is applied (a hold). */
42900
+ conditions: SchedulerStateTreeSchema.optional(),
42901
+ /** Hold only; absent means `respect`. */
42902
+ override: HoldOverrideSchema.optional(),
42903
+ /** Hold only: re-applications per window; absent means {@link DEFAULT_MAX_HOLD_ATTEMPTS}. */
42904
+ maxHoldAttempts: number().int().min(1).max(20).optional()
42905
+ });
42906
+ var SchedulerProfileSchema = object({
42907
+ id: string().min(1).max(64),
42908
+ name: string().min(1).max(120),
42909
+ enabled: boolean().default(true),
42910
+ activeWhen: SchedulerStateTreeSchema.optional(),
42911
+ days: array(WeekdayKeySchema).min(1).max(7),
42912
+ points: array(SchedulerPointSchema).max(50)
42913
+ });
42914
+ /** What an operator writes. */
42915
+ var SchedulerInputSchema = object({
42916
+ name: string().min(1).max(120),
42917
+ enabled: boolean().default(true),
42918
+ activeWhen: SchedulerStateTreeSchema.optional(),
42919
+ /** Higher wins when two holds want the same device in different states. */
42920
+ priority: number().int().min(0).max(100).default(0),
42921
+ maxLateMs: number().int().min(1e3).max(24 * 36e5).default(DEFAULT_MAX_LATE_MS),
42922
+ profiles: array(SchedulerProfileSchema).max(20)
42923
+ });
42924
+ var SchedulerSchema = SchedulerInputSchema.extend({
42925
+ id: string().min(1),
42926
+ createdAt: number(),
42927
+ updatedAt: number()
42928
+ });
42929
+ /** Every outcome a scheduler reports to the runs ledger (`AutomationRunTrace.scheduler`). */
42930
+ var SchedulerOutcomeSchema = _enum([
42931
+ "done",
42932
+ "missed",
42933
+ "inactive",
42934
+ "condition-false",
42935
+ "failed",
42936
+ "held",
42937
+ "gave-up",
42938
+ "overridden",
42939
+ "suspended-manual"
42940
+ ]);
42941
+ _enum([
42942
+ "not-found",
42943
+ "invalid-scheduler",
42944
+ "invalid-date"
42945
+ ]);
42946
+ var LOCAL_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
42947
+ /** One point of the day, placed. `at` is `null` when the sun never crosses that day. */
42948
+ var SchedulerPreviewPointSchema = object({
42949
+ pointId: string(),
42950
+ mode: SchedulerPointModeSchema,
42951
+ at: number().nullable(),
42952
+ /** A hold: when its window ends (the next point, else the end of the day). */
42953
+ until: number().nullable(),
42954
+ /** The point's steps are held on a different scheduler's claim at this time — see `conflicts`. */
42955
+ stepCount: number().int()
42956
+ });
42957
+ var SchedulerPreviewSchema = object({
42958
+ schedulerId: string(),
42959
+ /** The site-local day previewed. */
42960
+ date: string().regex(LOCAL_DATE_PATTERN),
42961
+ timeZone: string(),
42962
+ /** Why no profile is in force, or `null` when one is. */
42963
+ idleReason: string().nullable(),
42964
+ /** The profile in force that day: first in list order whose rules hold. */
42965
+ profileId: string().nullable(),
42966
+ points: array(SchedulerPreviewPointSchema)
42967
+ });
42968
+ /** Two holds that want the same device in different states at the same time. */
42969
+ var SchedulerConflictSchema = object({
42970
+ deviceId: number().int(),
42971
+ cap: string(),
42972
+ field: string(),
42973
+ mine: object({
42974
+ profileId: string(),
42975
+ pointId: string(),
42976
+ value: union([
42977
+ string(),
42978
+ number(),
42979
+ boolean()
42980
+ ]),
42981
+ priority: number().int()
42982
+ }),
42983
+ other: object({
42984
+ schedulerId: string(),
42985
+ schedulerName: string(),
42986
+ profileId: string(),
42987
+ pointId: string(),
42988
+ value: union([
42989
+ string(),
42990
+ number(),
42991
+ boolean()
42992
+ ]),
42993
+ priority: number().int()
42994
+ }),
42995
+ /** The overlapping stretch, as site-local minutes of the day. */
42996
+ fromMinute: number().int(),
42997
+ toMinute: number().int(),
42998
+ /** `mine` | `other` | `tie` — who holds when it happens (a tie: the one that started first). */
42999
+ winner: _enum([
43000
+ "mine",
43001
+ "other",
43002
+ "tie"
43003
+ ])
43004
+ });
43005
+ var HoldTargetStatusSchema = _enum([
43006
+ "pending",
43007
+ "held",
43008
+ "suspended-manual",
43009
+ "gave-up",
43010
+ "overridden"
43011
+ ]);
43012
+ var SchedulerStatusSchema = object({
43013
+ schedulerId: string(),
43014
+ profileId: string().nullable(),
43015
+ /** The hold in force right now, with where each target stands. */
43016
+ hold: object({
43017
+ pointId: string(),
43018
+ until: number(),
43019
+ /** `true` while the scheduler or profile `activeWhen` is false. */
43020
+ suspendedInactive: boolean(),
43021
+ targets: array(object({
43022
+ deviceId: number().int(),
43023
+ cap: string(),
43024
+ field: string(),
43025
+ status: HoldTargetStatusSchema,
43026
+ attempts: number().int()
43027
+ }))
43028
+ }).nullable()
43029
+ });
43030
+ /**
42726
43031
  * Run traces — what an automation (or, later, an Action run) DID, node by node,
42727
43032
  * so the editor can paint every block green or red with its reason.
42728
43033
  *
@@ -42858,7 +43163,13 @@ var AutomationRunTraceSchema = object({
42858
43163
  /** How many identical consecutive skips this trace stands for (>= 1). */
42859
43164
  repeat: number().int().min(1),
42860
43165
  /** When the latest of those repeats happened. */
42861
- lastAt: number()
43166
+ lastAt: number(),
43167
+ /**
43168
+ * A scheduler point's own outcome (D983). `outcome` carries the closest
43169
+ * automation outcome so a reader that does not know schedulers still reads
43170
+ * the trace; this field says exactly what happened.
43171
+ */
43172
+ scheduler: SchedulerOutcomeSchema.optional()
42862
43173
  });
42863
43174
  /**
42864
43175
  * What the hub's `runs` ledger holds for one owner (`automation:<blockId>` or
@@ -46399,6 +46710,7 @@ method(object({
46399
46710
  kind: "mutation",
46400
46711
  auth: "admin"
46401
46712
  }), method(object({ blockIds: array(string()) }), object({ states: array(CompositionBlockStateSchema) }), { auth: "admin" });
46713
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.PetFountain, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Gateway, DeviceType.Camera, DeviceType.Lock, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
46402
46714
  var NUMBER = {
46403
46715
  kind: "fixed",
46404
46716
  result: ["number"]
@@ -67220,6 +67532,43 @@ method(object({}), array(ActionEntrySchema), { auth: "admin" }), method(object({
67220
67532
  auth: "admin"
67221
67533
  });
67222
67534
  /**
67535
+ * schedulers — timelines of edge and hold points that perform actions over the
67536
+ * day (D983). Provided by the core-blocks builtin on the hub, beside `actions`:
67537
+ * the same runs ledger (owner `scheduler:<id>`), the same target resolver, the
67538
+ * same step runner.
67539
+ *
67540
+ * The hub runs ONE timer for the next point across every scheduler. A save is
67541
+ * refused with its reason (`[invalid-scheduler] …`) when a hold has a step that
67542
+ * leads to no state, or a sun point has no site location to read.
67543
+ */
67544
+ var SchedulerIdInput = object({ schedulerId: string().min(1) });
67545
+ method(object({}), array(SchedulerSchema), { auth: "admin" }), method(SchedulerIdInput, object({ scheduler: SchedulerSchema.nullable() }), { auth: "admin" }), method(object({ scheduler: SchedulerInputSchema }), object({ scheduler: SchedulerSchema }), {
67546
+ kind: "mutation",
67547
+ auth: "admin"
67548
+ }), method(object({
67549
+ schedulerId: string().min(1),
67550
+ scheduler: SchedulerInputSchema
67551
+ }), object({ scheduler: SchedulerSchema }), {
67552
+ kind: "mutation",
67553
+ auth: "admin"
67554
+ }), method(SchedulerIdInput, _void(), {
67555
+ kind: "mutation",
67556
+ auth: "admin"
67557
+ }), method(object({
67558
+ schedulerId: string().min(1),
67559
+ profileId: string().min(1).optional(),
67560
+ enabled: boolean()
67561
+ }), object({ scheduler: SchedulerSchema }), {
67562
+ kind: "mutation",
67563
+ auth: "admin"
67564
+ }), method(object({
67565
+ schedulerId: string().min(1),
67566
+ date: string().regex(LOCAL_DATE_PATTERN).optional()
67567
+ }), SchedulerPreviewSchema, { auth: "admin" }), method(object({
67568
+ scheduler: SchedulerInputSchema,
67569
+ schedulerId: string().min(1).optional()
67570
+ }), object({ conflicts: array(SchedulerConflictSchema) }), { auth: "admin" }), method(object({}), array(SchedulerStatusSchema), { auth: "admin" }), method(SchedulerIdInput, object({ traces: array(AutomationRunTraceSchema) }), { auth: "admin" });
67571
+ /**
67223
67572
  * actions — the ONE surface for runnable actions, for the UI and for
67224
67573
  * automations. Provided by the core-blocks builtin on the hub.
67225
67574
  *
@@ -71525,6 +71874,8 @@ var IntegrationWithStateSchema = object({
71525
71874
  name: string(),
71526
71875
  enabled: boolean(),
71527
71876
  info: record(string(), unknown()).readonly(),
71877
+ /** The discovery candidate this integration was set up from (D984). */
71878
+ originStableId: string().optional(),
71528
71879
  createdAt: number(),
71529
71880
  updatedAt: number(),
71530
71881
  processState: string()
@@ -71535,6 +71886,8 @@ var IntegrationLiteSchema = object({
71535
71886
  name: string(),
71536
71887
  enabled: boolean(),
71537
71888
  info: record(string(), unknown()).readonly(),
71889
+ /** The discovery candidate this integration was set up from (D984). */
71890
+ originStableId: string().optional(),
71538
71891
  createdAt: number(),
71539
71892
  updatedAt: number()
71540
71893
  });
@@ -71632,6 +71985,8 @@ var CreateIntegrationInputSchema = object({
71632
71985
  name: string(),
71633
71986
  enabled: boolean().optional(),
71634
71987
  info: record(string(), unknown()).optional(),
71988
+ /** `stableId` of the discovery candidate the form was seeded from (D984). */
71989
+ originStableId: string().optional(),
71635
71990
  settings: record(string(), unknown()).optional(),
71636
71991
  /** Keys of `settings` the form's schema declares secret (by type) — kept in
71637
71992
  * the keychain, not the table (D787). */
@@ -72412,12 +72767,22 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
72412
72767
  * reports `LockEntityFeature.OPEN` (bit value 1) in HA
72413
72768
  * `supported_features`.
72414
72769
  */
72770
+ /**
72771
+ * `door-open` (D984): the linked door contact reads open, so the bolt cannot be
72772
+ * thrown. It is the lock's REAL reported state, written into the mirrored slice
72773
+ * by the door-contact Customize extension — never a provider's own value, and
72774
+ * never a projection a reader has to compute. Precedence: a native `jammed`
72775
+ * wins; otherwise an open contact reports `door-open` whatever the native state
72776
+ * says (`locked` included); a closed or unknown contact leaves the native state.
72777
+ * A `lock()` is refused while the state is `door-open`; `unlock()` never is.
72778
+ */
72415
72779
  var LockStateSchema = _enum([
72416
72780
  "locked",
72417
72781
  "unlocked",
72418
72782
  "locking",
72419
72783
  "unlocking",
72420
- "jammed"
72784
+ "jammed",
72785
+ "door-open"
72421
72786
  ]);
72422
72787
  var LockControlStatusSchema = object({
72423
72788
  /** Lifecycle state of the lock. `jammed` means the motor reported
@@ -72426,6 +72791,38 @@ var LockControlStatusSchema = object({
72426
72791
  /** Ms epoch when the slice was last updated. */
72427
72792
  lastChangedAt: number()
72428
72793
  });
72794
+ /**
72795
+ * "Door contact" Customize extension (D984): the ONE extension that replaces a
72796
+ * native field. `state` is listed in `overridable` for this target, so the
72797
+ * validator and the guard accept it and nothing else.
72798
+ */
72799
+ var lockControlCustomize = {
72800
+ version: 1,
72801
+ overridable: [{
72802
+ path: "state",
72803
+ by: "door-contact"
72804
+ }],
72805
+ targets: [{
72806
+ id: "door-contact",
72807
+ cardinality: "scalar",
72808
+ vocabulary: {
72809
+ cap: "lock-control",
72810
+ stateField: "state"
72811
+ },
72812
+ deviceTypes: [DeviceType.Lock],
72813
+ apply: "replace",
72814
+ path: "state",
72815
+ override: {
72816
+ whenSourceTrue: "door-open",
72817
+ unlessNative: ["jammed"]
72818
+ },
72819
+ sources: [{
72820
+ kind: "binary",
72821
+ transforms: [{ kind: "identity" }]
72822
+ }],
72823
+ sourceReport: { status: "assignment-status" }
72824
+ }]
72825
+ };
72429
72826
  var lockControlCapability = {
72430
72827
  name: "lock-control",
72431
72828
  scope: "device",
@@ -72471,6 +72868,7 @@ var lockControlCapability = {
72471
72868
  * transitions.
72472
72869
  */
72473
72870
  runtimeState: LockControlStatusSchema,
72871
+ customize: lockControlCustomize,
72474
72872
  /**
72475
72873
  * Runtime-state durability: **restored** — a lock left locked must still read locked.
72476
72874
  *
@@ -80985,7 +81383,6 @@ discriminatedUnion("kind", [object({
80985
81383
  })]);
80986
81384
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
80987
81385
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
80988
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.PetFountain, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Gateway, DeviceType.Camera, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
80989
81386
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
80990
81387
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
80991
81388
  new Set(CAP_NAMES);
@@ -90098,6 +90495,76 @@ Object.freeze({
90098
90495
  access: "create",
90099
90496
  role: "feature:scenes"
90100
90497
  },
90498
+ "schedulers.conflicts": {
90499
+ capName: "schedulers",
90500
+ capScope: "system",
90501
+ addonId: null,
90502
+ access: "view",
90503
+ role: "admin"
90504
+ },
90505
+ "schedulers.create": {
90506
+ capName: "schedulers",
90507
+ capScope: "system",
90508
+ addonId: null,
90509
+ access: "create",
90510
+ role: "admin"
90511
+ },
90512
+ "schedulers.delete": {
90513
+ capName: "schedulers",
90514
+ capScope: "system",
90515
+ addonId: null,
90516
+ access: "delete",
90517
+ role: "admin"
90518
+ },
90519
+ "schedulers.get": {
90520
+ capName: "schedulers",
90521
+ capScope: "system",
90522
+ addonId: null,
90523
+ access: "view",
90524
+ role: "admin"
90525
+ },
90526
+ "schedulers.getStatus": {
90527
+ capName: "schedulers",
90528
+ capScope: "system",
90529
+ addonId: null,
90530
+ access: "view",
90531
+ role: "admin"
90532
+ },
90533
+ "schedulers.getTraces": {
90534
+ capName: "schedulers",
90535
+ capScope: "system",
90536
+ addonId: null,
90537
+ access: "view",
90538
+ role: "admin"
90539
+ },
90540
+ "schedulers.list": {
90541
+ capName: "schedulers",
90542
+ capScope: "system",
90543
+ addonId: null,
90544
+ access: "view",
90545
+ role: "admin"
90546
+ },
90547
+ "schedulers.preview": {
90548
+ capName: "schedulers",
90549
+ capScope: "system",
90550
+ addonId: null,
90551
+ access: "view",
90552
+ role: "admin"
90553
+ },
90554
+ "schedulers.setEnabled": {
90555
+ capName: "schedulers",
90556
+ capScope: "system",
90557
+ addonId: null,
90558
+ access: "create",
90559
+ role: "admin"
90560
+ },
90561
+ "schedulers.update": {
90562
+ capName: "schedulers",
90563
+ capScope: "system",
90564
+ addonId: null,
90565
+ access: "create",
90566
+ role: "admin"
90567
+ },
90101
90568
  "scriptRunner.getStatus": {
90102
90569
  capName: "script-runner",
90103
90570
  capScope: "device",
@@ -98683,6 +99150,7 @@ new Set([
98683
99150
  "locking",
98684
99151
  "unlocking",
98685
99152
  "jammed",
99153
+ "door-open",
98686
99154
  "on",
98687
99155
  "off",
98688
99156
  "home",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_clip_model_registry = require("../clip-model-registry-C-en5vSD.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-BQ_2RsIp.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_clip_model_registry.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Si as resolvePoolMemoryPolicy, _r as embeddingModelFailedError, a as CLIP_EMBEDDING_STEP_ID, aa as BaseAddon, br as embeddingRequirementsUnavailableError, gr as embeddingEncoderCapability, i as CLIP_TEXT_MODELS, l as resolveClusterModelPin, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, rn as PoolMemoryWatchdog, si as parseProcStatus, t as BUILTIN_CLIP_MODELS, va as normalizeNodeId, yr as embeddingRequirementsFailedError } from "../clip-model-registry-_b3KHYFm.mjs";
1
+ import { Si as resolvePoolMemoryPolicy, _r as embeddingModelFailedError, a as CLIP_EMBEDDING_STEP_ID, aa as BaseAddon, br as embeddingRequirementsUnavailableError, gr as embeddingEncoderCapability, i as CLIP_TEXT_MODELS, l as resolveClusterModelPin, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, rn as PoolMemoryWatchdog, si as parseProcStatus, t as BUILTIN_CLIP_MODELS, va as normalizeNodeId, yr as embeddingRequirementsFailedError } from "../clip-model-registry-C06M8A8U.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -1,8 +1,8 @@
1
1
  import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.js-Cx9AsA5q.mjs";
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
- import { a as s, c, d as l, f as u, i as d, l as f, m as p, n as m, o as h, p as g, r as _, s as v, t as y, u as b } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DXQUFp7P.mjs";
3
+ import { a as s, c, d as l, f as u, i as d, l as f, m as p, n as m, o as h, p as g, r as _, s as v, t as y, u as b } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-gv38vKug.mjs";
4
4
  import { n as x, t as S } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-CkwmHEi0.mjs";
5
- import { t as C } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C7OJ7wek.mjs";
5
+ import { t as C } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-YXyP9GJm.mjs";
6
6
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
7
7
  var w = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), T = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), E = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), D = (e) => {
8
8
  let t = E(e);
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.455",
21
+ version: "1.2.457",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.359",
36
+ version: "1.2.361",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",