@camstack/addon-post-analysis 1.2.607 → 1.2.608

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (15) hide show
  1. package/dist/{clip-model-registry-VgOXFRFr.js → clip-model-registry-B11yS32V.js} +472 -47
  2. package/dist/{clip-model-registry-CTfe5v5_.mjs → clip-model-registry-BItfTZEx.mjs} +431 -48
  3. package/dist/embedding-encoder/index.js +1 -1
  4. package/dist/embedding-encoder/index.mjs +1 -1
  5. package/dist/pipeline-analytics/_stub.js +2 -2
  6. package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DUNQoBDI.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-LGLlz5Sk.mjs} +3 -3
  7. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-iXmJsQ9Y.mjs +26 -0
  8. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Cm7pZeMH.mjs +26 -0
  9. package/dist/pipeline-analytics/{hostInit-B8mC_3oV.mjs → hostInit-Cko0y33G.mjs} +3 -3
  10. package/dist/pipeline-analytics/index.js +457 -51
  11. package/dist/pipeline-analytics/index.mjs +457 -51
  12. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  13. package/package.json +1 -1
  14. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-1AlitJg2.mjs +0 -26
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DalpVM1q.mjs +0 -26
@@ -30,7 +30,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  }) : target, mod));
31
31
  //#endregion
32
32
  let node_crypto = require("node:crypto");
33
- //#region ../types/dist/event-category-BvOFi6PY.mjs
33
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
34
34
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
35
35
  EventCategory["SystemBoot"] = "system.boot";
36
36
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -109,9 +109,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
109
109
  /**
110
110
  * The node's one-shot runner boot check (D877): planned runners against the
111
111
  * process service, `degraded` when any is failed, refused or missing. The
112
- * alert centre turns it into one alert and a direct critical push.
112
+ * alert centre turns it into one critical alert.
113
113
  */
114
114
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
115
+ /**
116
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
117
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
118
+ * centre sends no notification of its own: Notification Center turns this
119
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
120
+ * system-event kinds, and reconciles from the alerts store because a bus
121
+ * event may be dropped (D8, D11).
122
+ */
123
+ EventCategory["AlertEpisode"] = "alert.episode";
115
124
  EventCategory["AddonError"] = "addon.error";
116
125
  EventCategory["AddonPageReady"] = "addon.page-ready";
117
126
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5634,7 +5643,7 @@ var ZodIssueCode = {
5634
5643
  var ZodFirstPartyTypeKind;
5635
5644
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5636
5645
  //#endregion
5637
- //#region ../types/dist/sleep-BegKjwUu.mjs
5646
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5638
5647
  /**
5639
5648
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5640
5649
  * window to float samples (D455).
@@ -12826,6 +12835,41 @@ var StorageCleanupJobSchema = object({
12826
12835
  });
12827
12836
  var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
12828
12837
  /**
12838
+ * Start a mover only when no single-location repoint holds an overlapping
12839
+ * physical root. Asks BEFORE (cheap refusal, no job) and AFTER registering the
12840
+ * job: the repoint announces its claim and then lists movers, so a mover that
12841
+ * registers first is seen by it and one that registers second sees the claim —
12842
+ * neither side can miss the other (2026-10-20: a repoint and a relocate job
12843
+ * moved and deleted the same event media with no lock between them).
12844
+ *
12845
+ * Fail CLOSED: a clearance that cannot be asked refuses the start.
12846
+ */
12847
+ async function startMoverUnderClearance(deps) {
12848
+ const refuse = (detail) => {
12849
+ throw new Error(`mover refused: ${detail}`);
12850
+ };
12851
+ const ask = async () => {
12852
+ try {
12853
+ return await deps.clearance(deps.locationIds);
12854
+ } catch (err) {
12855
+ return refuse(`the storage orchestrator could not be asked (${err instanceof Error ? err.message : String(err)})`);
12856
+ }
12857
+ };
12858
+ const blocked = (answer) => `a re-point of "${answer.repointLocationId ?? "a location"}" holds an overlapping storage root`;
12859
+ const before = await ask();
12860
+ if (!before.clear) return refuse(blocked(before));
12861
+ const jobId = deps.start();
12862
+ const after = await ask().catch((err) => {
12863
+ deps.cancel(jobId);
12864
+ throw err;
12865
+ });
12866
+ if (!after.clear) {
12867
+ deps.cancel(jobId);
12868
+ return refuse(blocked(after));
12869
+ }
12870
+ return jobId;
12871
+ }
12872
+ /**
12829
12873
  * The storage-location STATE MODEL (D385) — one typed state, one policy module.
12830
12874
  *
12831
12875
  * A location's state used to be split across two authorities: the typed
@@ -14669,7 +14713,14 @@ var AlertSeveritySchema = _enum([
14669
14713
  ]);
14670
14714
  var AlertActionSchema = object({
14671
14715
  label: string(),
14672
- href: string().optional()
14716
+ href: string().optional(),
14717
+ /**
14718
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
14719
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
14720
+ * start) — the browser must leave the SPA with a full navigation, because
14721
+ * the SPA has no such route and would bounce to the home page.
14722
+ */
14723
+ navigation: _enum(["app", "server"]).optional()
14673
14724
  });
14674
14725
  var AlertStatusSchema = _enum([
14675
14726
  "active",
@@ -43543,6 +43594,9 @@ var NcSystemEventKindSchema = _enum([
43543
43594
  "server-updated",
43544
43595
  "export-completed",
43545
43596
  "backup-completed",
43597
+ "alert-critical",
43598
+ "alert-error",
43599
+ "alert-critical-resolved",
43546
43600
  "camera-online",
43547
43601
  "camera-offline",
43548
43602
  "camera-disabled",
@@ -45108,6 +45162,18 @@ var NC_CONDITION_CATALOG = [
45108
45162
  value: "backup-completed",
45109
45163
  label: "Backup completed"
45110
45164
  },
45165
+ {
45166
+ value: "alert-critical",
45167
+ label: "Critical alert raised"
45168
+ },
45169
+ {
45170
+ value: "alert-error",
45171
+ label: "Error alert raised"
45172
+ },
45173
+ {
45174
+ value: "alert-critical-resolved",
45175
+ label: "Critical alert resolved"
45176
+ },
45111
45177
  {
45112
45178
  value: "alarm-arm-refused",
45113
45179
  label: "Alarm arm refused"
@@ -54411,7 +54477,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
54411
54477
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
54412
54478
  kind: "mutation",
54413
54479
  auth: "admin"
54414
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
54480
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
54481
+ clear: boolean(),
54482
+ repointLocationId: string().optional()
54483
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
54415
54484
  kind: "mutation",
54416
54485
  auth: "admin"
54417
54486
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -58750,6 +58819,11 @@ onStatusChanged: { data: object({
58750
58819
  *
58751
58820
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
58752
58821
  * provider refreshes the slice on an interval and eagerly after commands.
58822
+ *
58823
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
58824
+ * nullable: `null` means "not known right now" (the appliance has not said,
58825
+ * the link is down, or the description does not carry it) and is never
58826
+ * rendered or exported as `false` / `0`. `availability` says why.
58753
58827
  */
58754
58828
  var DishwasherStateSchema = _enum([
58755
58829
  "idle",
@@ -58759,43 +58833,155 @@ var DishwasherStateSchema = _enum([
58759
58833
  "error",
58760
58834
  "unavailable"
58761
58835
  ]);
58836
+ /**
58837
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
58838
+ * view for compact surfaces; this is what the appliance said.
58839
+ */
58840
+ var DishwasherOperationStateSchema = _enum([
58841
+ "Inactive",
58842
+ "Ready",
58843
+ "DelayedStart",
58844
+ "Run",
58845
+ "Pause",
58846
+ "ActionRequired",
58847
+ "Finished",
58848
+ "Error",
58849
+ "Aborting"
58850
+ ]);
58851
+ /**
58852
+ * Why fields may be `null`:
58853
+ * - `available` — the link is up and the description is loaded;
58854
+ * - `offline` — the local link is down (values are unknown, not last-known);
58855
+ * - `description-missing` — the link is up but the appliance's description could not
58856
+ * be loaded, so its values cannot be decoded.
58857
+ */
58858
+ var DishwasherAvailabilitySchema = _enum([
58859
+ "available",
58860
+ "offline",
58861
+ "description-missing"
58862
+ ]);
58762
58863
  var DishwasherConsumableLevelSchema = _enum([
58763
58864
  "ok",
58764
58865
  "low",
58765
58866
  "empty"
58766
58867
  ]);
58767
58868
  var DishwasherStatusSchema = object({
58869
+ availability: DishwasherAvailabilitySchema,
58870
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
58768
58871
  state: DishwasherStateSchema,
58769
- /** Active program id/name, or null when none selected / unknown. */
58872
+ /** The appliance's operation state as reported; null when not known. */
58873
+ operationState: DishwasherOperationStateSchema.nullable(),
58874
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
58770
58875
  program: string().nullable(),
58771
- /** Program tokens the hardware accepts — drives the UI selector. */
58876
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
58877
+ selectedProgram: string().nullable(),
58878
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
58772
58879
  availablePrograms: array(string()),
58773
- /** Minutes remaining on the active cycle, or null when not running. */
58774
- remainingMinutes: number().int().nonnegative().nullable(),
58880
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
58881
+ remainingSeconds: number().int().nonnegative().nullable(),
58882
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
58883
+ delayedStartSeconds: number().int().nonnegative().nullable(),
58775
58884
  /** Cycle completion 0..100, or null when not applicable. */
58776
58885
  progressPercent: number().min(0).max(100).nullable(),
58777
- /** True when the door is reported open. */
58778
- doorOpen: boolean(),
58779
- /** True when remote start is allowed (door closed, power on, etc.). */
58780
- remoteStartAllowed: boolean(),
58781
- /** Main power / switched-on state. */
58782
- powerOn: boolean(),
58886
+ /** True when the door is reported open; null when the door state is not known. */
58887
+ doorOpen: boolean().nullable(),
58888
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
58889
+ doorLocked: boolean().nullable(),
58890
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
58891
+ remoteStartAllowed: boolean().nullable(),
58892
+ /** True when the appliance accepts remote control now; null when not known. */
58893
+ remoteControlActive: boolean().nullable(),
58894
+ /** True while somebody operates the appliance at its panel; null when not reported. */
58895
+ localControlActive: boolean().nullable(),
58896
+ /** Main power / switched-on state; null when not known. */
58897
+ powerOn: boolean().nullable(),
58898
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
58899
+ powerState: string().nullable(),
58783
58900
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
58784
58901
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
58785
- halfLoad: boolean(),
58786
- hygienePlus: boolean(),
58902
+ /** Option states: null when the appliance does not expose the option or has not said. */
58903
+ halfLoad: boolean().nullable(),
58904
+ hygienePlus: boolean().nullable(),
58787
58905
  /** Extra dry option when the appliance exposes it. */
58788
- extraDry: boolean(),
58906
+ extraDry: boolean().nullable(),
58789
58907
  /** Intensive zone (lower basket) when the appliance exposes it. */
58790
- intensiveZone: boolean(),
58908
+ intensiveZone: boolean().nullable(),
58791
58909
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
58792
- varioSpeedPlus: boolean(),
58793
- /** Child lock (controls disabled on the appliance). */
58794
- childLock: boolean(),
58910
+ varioSpeedPlus: boolean().nullable(),
58911
+ /** Child lock (controls disabled on the appliance); null when not known. */
58912
+ childLock: boolean().nullable(),
58913
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
58914
+ activeEvents: array(string()),
58915
+ /** Numeric error code when the appliance reports one; null otherwise. */
58795
58916
  errorCode: number().nullable(),
58917
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
58796
58918
  errorLabel: string().nullable(),
58919
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
58797
58920
  lastFetchedAt: number()
58798
58921
  });
58922
+ var DeviceIdSchema = number().int().nonnegative();
58923
+ /** A value a program option or setting can take. */
58924
+ var DishwasherValueSchema = union([
58925
+ boolean(),
58926
+ string(),
58927
+ number()
58928
+ ]);
58929
+ var DishwasherAccessSchema = _enum([
58930
+ "none",
58931
+ "read",
58932
+ "readWrite",
58933
+ "writeOnly",
58934
+ "readStatic"
58935
+ ]);
58936
+ /**
58937
+ * One option or setting the appliance declares, with the constraints its description
58938
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
58939
+ */
58940
+ var DishwasherOptionDescriptorSchema = object({
58941
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
58942
+ key: string(),
58943
+ /** Last segment of the key, for display. */
58944
+ name: string(),
58945
+ type: _enum([
58946
+ "boolean",
58947
+ "number",
58948
+ "enum",
58949
+ "string"
58950
+ ]),
58951
+ access: DishwasherAccessSchema,
58952
+ /** The appliance reports this entity as currently available. */
58953
+ available: boolean(),
58954
+ /** Unit the description declares for a number; null when it declares none. */
58955
+ unit: string().nullable(),
58956
+ min: number().nullable(),
58957
+ max: number().nullable(),
58958
+ step: number().nullable(),
58959
+ /** Allowed members of an enum; null for other types. */
58960
+ enumValues: array(string()).nullable(),
58961
+ defaultValue: DishwasherValueSchema.nullable()
58962
+ });
58963
+ var DishwasherProgramSchema = object({
58964
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
58965
+ key: string(),
58966
+ name: string(),
58967
+ /** The appliance currently offers this program. */
58968
+ available: boolean(),
58969
+ /** The options this program lists, with the program-level access / availability / default. */
58970
+ options: array(DishwasherOptionDescriptorSchema)
58971
+ });
58972
+ var DishwasherOptionsSchema = object({
58973
+ availability: DishwasherAvailabilitySchema,
58974
+ /** What the appliance can be told to do, from the commands its description declares. */
58975
+ supportsStart: boolean(),
58976
+ supportsPause: boolean(),
58977
+ supportsResume: boolean(),
58978
+ supportsStop: boolean(),
58979
+ supportsPower: boolean(),
58980
+ /** Every program the description lists, with its options. */
58981
+ programs: array(DishwasherProgramSchema),
58982
+ /** Every option and setting entity the description lists (programs reference these by key). */
58983
+ options: array(DishwasherOptionDescriptorSchema)
58984
+ });
58799
58985
  var dishwasherCapability = {
58800
58986
  name: "dishwasher",
58801
58987
  scope: "device",
@@ -58803,86 +58989,102 @@ var dishwasherCapability = {
58803
58989
  mode: "singleton",
58804
58990
  deviceTypes: [DeviceType.Dishwasher],
58805
58991
  methods: {
58806
- start: method(object({ deviceId: number().int().nonnegative() }), _void(), {
58992
+ /**
58993
+ * Start a program. Without `program` the selected one starts. `options` are
58994
+ * option feature keys; each is checked against the program's constraints.
58995
+ */
58996
+ start: method(object({
58997
+ deviceId: DeviceIdSchema,
58998
+ program: string().min(1).optional(),
58999
+ options: record(string(), DishwasherValueSchema).optional()
59000
+ }), _void(), {
58807
59001
  kind: "mutation",
58808
59002
  auth: "protected"
58809
59003
  }),
58810
- pause: method(object({ deviceId: number().int().nonnegative() }), _void(), {
59004
+ pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
58811
59005
  kind: "mutation",
58812
59006
  auth: "protected"
58813
59007
  }),
58814
- stop: method(object({ deviceId: number().int().nonnegative() }), _void(), {
59008
+ resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
59009
+ kind: "mutation",
59010
+ auth: "protected"
59011
+ }),
59012
+ stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
58815
59013
  kind: "mutation",
58816
59014
  auth: "protected"
58817
59015
  }),
59016
+ /** Select (not start) a program; refused when the appliance does not offer it. */
58818
59017
  setProgram: method(object({
58819
- deviceId: number().int().nonnegative(),
59018
+ deviceId: DeviceIdSchema,
58820
59019
  program: string().min(1)
58821
59020
  }), _void(), {
58822
59021
  kind: "mutation",
58823
59022
  auth: "protected"
58824
59023
  }),
58825
59024
  setPower: method(object({
58826
- deviceId: number().int().nonnegative(),
59025
+ deviceId: DeviceIdSchema,
58827
59026
  on: boolean()
58828
59027
  }), _void(), {
58829
59028
  kind: "mutation",
58830
59029
  auth: "protected"
58831
59030
  }),
58832
59031
  setHalfLoad: method(object({
58833
- deviceId: number().int().nonnegative(),
59032
+ deviceId: DeviceIdSchema,
58834
59033
  on: boolean()
58835
59034
  }), _void(), {
58836
59035
  kind: "mutation",
58837
59036
  auth: "protected"
58838
59037
  }),
58839
59038
  setHygienePlus: method(object({
58840
- deviceId: number().int().nonnegative(),
59039
+ deviceId: DeviceIdSchema,
58841
59040
  on: boolean()
58842
59041
  }), _void(), {
58843
59042
  kind: "mutation",
58844
59043
  auth: "protected"
58845
59044
  }),
58846
59045
  setExtraDry: method(object({
58847
- deviceId: number().int().nonnegative(),
59046
+ deviceId: DeviceIdSchema,
58848
59047
  on: boolean()
58849
59048
  }), _void(), {
58850
59049
  kind: "mutation",
58851
59050
  auth: "protected"
58852
59051
  }),
58853
59052
  setIntensiveZone: method(object({
58854
- deviceId: number().int().nonnegative(),
59053
+ deviceId: DeviceIdSchema,
58855
59054
  on: boolean()
58856
59055
  }), _void(), {
58857
59056
  kind: "mutation",
58858
59057
  auth: "protected"
58859
59058
  }),
58860
59059
  setVarioSpeedPlus: method(object({
58861
- deviceId: number().int().nonnegative(),
59060
+ deviceId: DeviceIdSchema,
58862
59061
  on: boolean()
58863
59062
  }), _void(), {
58864
59063
  kind: "mutation",
58865
59064
  auth: "protected"
58866
59065
  }),
58867
59066
  setChildLock: method(object({
58868
- deviceId: number().int().nonnegative(),
59067
+ deviceId: DeviceIdSchema,
58869
59068
  on: boolean()
58870
59069
  }), _void(), {
58871
59070
  kind: "mutation",
58872
59071
  auth: "protected"
58873
59072
  }),
59073
+ /**
59074
+ * Write any option or setting by feature key. Refused when the description does
59075
+ * not list it, it is not writable or not available now, or the value is outside
59076
+ * its declared range / members.
59077
+ */
58874
59078
  setOption: method(object({
58875
- deviceId: number().int().nonnegative(),
59079
+ deviceId: DeviceIdSchema,
58876
59080
  key: string().min(1),
58877
- value: union([
58878
- boolean(),
58879
- string(),
58880
- number()
58881
- ])
59081
+ value: DishwasherValueSchema
58882
59082
  }), _void(), {
58883
59083
  kind: "mutation",
58884
59084
  auth: "protected"
58885
- })
59085
+ }),
59086
+ /** What this appliance can do, from its own description — the UI is derived from it. */
59087
+ getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
58886
59088
  },
58887
59089
  status: {
58888
59090
  schema: DishwasherStatusSchema,
@@ -72570,6 +72772,12 @@ Object.freeze({
72570
72772
  addonId: null,
72571
72773
  access: "view"
72572
72774
  },
72775
+ "dishwasher.getOptions": {
72776
+ capName: "dishwasher",
72777
+ capScope: "device",
72778
+ addonId: null,
72779
+ access: "view"
72780
+ },
72573
72781
  "dishwasher.getStatus": {
72574
72782
  capName: "dishwasher",
72575
72783
  capScope: "device",
@@ -72582,6 +72790,12 @@ Object.freeze({
72582
72790
  addonId: null,
72583
72791
  access: "create"
72584
72792
  },
72793
+ "dishwasher.resume": {
72794
+ capName: "dishwasher",
72795
+ capScope: "device",
72796
+ addonId: null,
72797
+ access: "create"
72798
+ },
72585
72799
  "dishwasher.setChildLock": {
72586
72800
  capName: "dishwasher",
72587
72801
  capScope: "device",
@@ -77082,6 +77296,12 @@ Object.freeze({
77082
77296
  addonId: null,
77083
77297
  access: "view"
77084
77298
  },
77299
+ "storageMigration.moverClearance": {
77300
+ capName: "storage-migration",
77301
+ capScope: "system",
77302
+ addonId: null,
77303
+ access: "view"
77304
+ },
77085
77305
  "storageMigration.movers": {
77086
77306
  capName: "storage-migration",
77087
77307
  capScope: "system",
@@ -79275,6 +79495,11 @@ Object.freeze({
79275
79495
  form: "single",
79276
79496
  optional: false
79277
79497
  }],
79498
+ "dishwasher.getOptions": [{
79499
+ name: "deviceId",
79500
+ form: "single",
79501
+ optional: false
79502
+ }],
79278
79503
  "dishwasher.getStatus": [{
79279
79504
  name: "deviceId",
79280
79505
  form: "single",
@@ -79285,6 +79510,11 @@ Object.freeze({
79285
79510
  form: "single",
79286
79511
  optional: false
79287
79512
  }],
79513
+ "dishwasher.resume": [{
79514
+ name: "deviceId",
79515
+ form: "single",
79516
+ optional: false
79517
+ }],
79288
79518
  "dishwasher.setChildLock": [{
79289
79519
  name: "deviceId",
79290
79520
  form: "single",
@@ -81482,7 +81712,7 @@ function systemEventFilterApplies(kind, filter) {
81482
81712
  switch (filter) {
81483
81713
  case "deviceIds": return kind.startsWith("device-") || kind.startsWith("stream-") || kind === "detection-blind" || kind.startsWith("recording-") || kind === "alarm-triggered";
81484
81714
  case "deviceTypes": return kind.startsWith("device-") || kind === "detection-blind";
81485
- case "nodeIds": return kind.startsWith("node-") || kind === "addon-crash-loop" || kind === "addon-update-available" || kind === "addon-updated" || kind === "server-update-available" || kind === "wrapper-update-available" || kind === "server-updated" || kind.startsWith("storage-location-");
81715
+ case "nodeIds": return kind.startsWith("node-") || kind === "addon-crash-loop" || kind === "addon-update-available" || kind === "addon-updated" || kind === "server-update-available" || kind === "wrapper-update-available" || kind === "server-updated" || kind.startsWith("storage-location-") || kind.startsWith("alert-");
81486
81716
  case "packageNames": return kind.endsWith("update-available") || kind === "addon-updated" || kind === "node-updating" || kind === "server-updated";
81487
81717
  case "consumableLowPercent": return NC_CONSUMABLE_SYSTEM_EVENT_KINDS.includes(kind);
81488
81718
  }
@@ -81542,6 +81772,9 @@ var NC_SYSTEM_EVENT_FAMILY = {
81542
81772
  "wrapper-update-available": "system",
81543
81773
  "backup-completed": "system",
81544
81774
  "export-completed": "system",
81775
+ "alert-critical": "system",
81776
+ "alert-error": "system",
81777
+ "alert-critical-resolved": "system",
81545
81778
  "storage-location-low": "system",
81546
81779
  "storage-location-critical": "system",
81547
81780
  "storage-location-ok": "system",
@@ -81684,6 +81917,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
81684
81917
  "storage-location-ok"
81685
81918
  ]
81686
81919
  },
81920
+ {
81921
+ id: "alerts",
81922
+ family: "system",
81923
+ label: "Alerts",
81924
+ kinds: [
81925
+ "alert-critical",
81926
+ "alert-error",
81927
+ "alert-critical-resolved"
81928
+ ]
81929
+ },
81687
81930
  {
81688
81931
  id: "alarm",
81689
81932
  family: "alarm",
@@ -82495,6 +82738,96 @@ function sensorRaisedOf(kind, value) {
82495
82738
  const raw = Object.entries(value).find(([key]) => key === field)?.[1];
82496
82739
  return typeof raw === "boolean" ? raw : void 0;
82497
82740
  }
82741
+ /**
82742
+ * An alert EPISODE as a notification subject.
82743
+ *
82744
+ * The alert centre sends nothing of its own. A critical or error alert reaches
82745
+ * the operator through Notification Center system-event rules, and this file is
82746
+ * the one vocabulary the two sides share: the alert centre mints the episode
82747
+ * identity and announces its two edges on the bus (`alert.episode`), and
82748
+ * Notification Center derives the same identity when it RECONCILES from the
82749
+ * alerts store, because a bus event may be dropped (D8, D11).
82750
+ *
82751
+ * ## Episode identity
82752
+ *
82753
+ * `metadata.episodeId`, minted by the alert centre when an alert opens (new, or
82754
+ * re-opened after it was completed/dismissed, or its emitter changed
82755
+ * `metadata.episodeKey`) and kept through every re-emit while it stays open. An
82756
+ * alert row written before the alert centre minted ids has none: its episode is
82757
+ * `<id>@<createdAt>`, derived here so both sides agree.
82758
+ */
82759
+ /** The bus payload of `EventCategory.AlertEpisode`. */
82760
+ var AlertEpisodePayloadSchema = object({
82761
+ phase: _enum(["raised", "resolved"]),
82762
+ episodeId: string().min(1),
82763
+ alertId: string().min(1),
82764
+ severity: AlertSeveritySchema,
82765
+ category: string(),
82766
+ title: string(),
82767
+ message: string(),
82768
+ sourceType: string().optional(),
82769
+ sourceId: string().optional(),
82770
+ nodeId: string().optional(),
82771
+ /** The alert's own action link (where the operator acts on it), when it has one. */
82772
+ actionUrl: string().optional(),
82773
+ at: number()
82774
+ });
82775
+ /** The payload of an `alert.episode` event's `data`, or `null` when it is not one. */
82776
+ function parseAlertEpisodePayload(data) {
82777
+ const parsed = AlertEpisodePayloadSchema.safeParse(data);
82778
+ return parsed.success ? parsed.data : null;
82779
+ }
82780
+ /** An episode is closed once its alert is completed or dismissed. */
82781
+ function isAlertEpisodeOpen(status) {
82782
+ return status !== "completed" && status !== "dismissed";
82783
+ }
82784
+ /** Only these severities are ever announced. */
82785
+ function isAlertEpisodeSeverity(severity) {
82786
+ return severity === "critical" || severity === "error";
82787
+ }
82788
+ function alertEpisodeId(alert) {
82789
+ const minted = alert.metadata?.["episodeId"];
82790
+ return typeof minted === "string" && minted.length > 0 ? minted : `${alert.id}@${String(alert.createdAt)}`;
82791
+ }
82792
+ /** The node an alert is about, from the places emitters put it. */
82793
+ function alertNodeId(alert) {
82794
+ const direct = alert.metadata?.["nodeId"];
82795
+ if (typeof direct === "string") return direct;
82796
+ const runner = alert.metadata?.["runner"];
82797
+ if (typeof runner === "object" && runner !== null && "nodeId" in runner) {
82798
+ const id = runner.nodeId;
82799
+ if (typeof id === "string") return id;
82800
+ }
82801
+ return alert.source?.type === "node" ? alert.source.id : void 0;
82802
+ }
82803
+ /**
82804
+ * The system-event kind of an episode edge, or `null` when none is announced
82805
+ * (an `error` episode announces its opening only).
82806
+ */
82807
+ function alertEpisodeKind(severity, phase) {
82808
+ if (severity === "critical") return phase === "raised" ? "alert-critical" : "alert-critical-resolved";
82809
+ if (severity === "error" && phase === "raised") return "alert-error";
82810
+ return null;
82811
+ }
82812
+ function alertEpisodePayload(alert, phase, at) {
82813
+ const nodeId = alertNodeId(alert);
82814
+ return {
82815
+ phase,
82816
+ episodeId: alertEpisodeId(alert),
82817
+ alertId: alert.id,
82818
+ severity: alert.severity,
82819
+ category: alert.category,
82820
+ title: alert.title,
82821
+ message: alert.message,
82822
+ ...alert.source !== void 0 ? {
82823
+ sourceType: alert.source.type,
82824
+ sourceId: alert.source.id
82825
+ } : {},
82826
+ ...nodeId !== void 0 ? { nodeId } : {},
82827
+ ...alert.action?.href !== void 0 ? { actionUrl: alert.action.href } : {},
82828
+ at
82829
+ };
82830
+ }
82498
82831
  var RULE_BODY_ONLY = ["body"];
82499
82832
  var RULE_TEXT = ["title", "body"];
82500
82833
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -82504,6 +82837,11 @@ var TANK = [
82504
82837
  "device-tank-full",
82505
82838
  "device-tank-normal"
82506
82839
  ];
82840
+ var ALERT_EPISODE = [
82841
+ "alert-critical",
82842
+ "alert-error",
82843
+ "alert-critical-resolved"
82844
+ ];
82507
82845
  var UPDATES = [
82508
82846
  "addon-update-available",
82509
82847
  "server-update-available",
@@ -83028,7 +83366,8 @@ var NC_TEMPLATE_VARS = [
83028
83366
  "server-updated",
83029
83367
  "storage-location-low",
83030
83368
  "storage-location-critical",
83031
- "storage-location-ok"
83369
+ "storage-location-ok",
83370
+ ...ALERT_EPISODE
83032
83371
  ]
83033
83372
  },
83034
83373
  {
@@ -83050,7 +83389,8 @@ var NC_TEMPLATE_VARS = [
83050
83389
  "server-updated",
83051
83390
  "storage-location-low",
83052
83391
  "storage-location-critical",
83053
- "storage-location-ok"
83392
+ "storage-location-ok",
83393
+ ...ALERT_EPISODE
83054
83394
  ]
83055
83395
  },
83056
83396
  {
@@ -83117,7 +83457,7 @@ var NC_TEMPLATE_VARS = [
83117
83457
  families: ["rule"],
83118
83458
  fields: [...RULE_TEXT],
83119
83459
  kinds: ["system"],
83120
- systemEventKinds: ["recording-degraded"]
83460
+ systemEventKinds: ["recording-degraded", ...ALERT_EPISODE]
83121
83461
  },
83122
83462
  {
83123
83463
  name: "locationName",
@@ -83314,13 +83654,53 @@ var NC_TEMPLATE_VARS = [
83314
83654
  },
83315
83655
  {
83316
83656
  name: "title",
83317
- label: "Export title",
83657
+ label: "Export or alert title",
83318
83658
  example: "Ingresso 08:00",
83319
83659
  group: "system",
83320
83660
  families: ["rule"],
83321
83661
  fields: [...RULE_TEXT],
83322
83662
  kinds: ["system"],
83323
- systemEventKinds: ["export-completed"]
83663
+ systemEventKinds: ["export-completed", ...ALERT_EPISODE]
83664
+ },
83665
+ {
83666
+ name: "severity",
83667
+ label: "Alert severity",
83668
+ example: "critical",
83669
+ group: "system",
83670
+ families: ["rule"],
83671
+ fields: [...RULE_TEXT],
83672
+ kinds: ["system"],
83673
+ systemEventKinds: [...ALERT_EPISODE]
83674
+ },
83675
+ {
83676
+ name: "category",
83677
+ label: "Alert category",
83678
+ example: "addon.runner-failed",
83679
+ group: "system",
83680
+ families: ["rule"],
83681
+ fields: [...RULE_TEXT],
83682
+ kinds: ["system"],
83683
+ systemEventKinds: [...ALERT_EPISODE]
83684
+ },
83685
+ {
83686
+ name: "source",
83687
+ label: "Alert source (addon, node or runner)",
83688
+ example: "recorder",
83689
+ group: "system",
83690
+ families: ["rule"],
83691
+ fields: [...RULE_TEXT],
83692
+ kinds: ["system"],
83693
+ systemEventKinds: [...ALERT_EPISODE]
83694
+ },
83695
+ {
83696
+ name: "actionUrl",
83697
+ label: "Alert action link",
83698
+ example: "/system/addons",
83699
+ group: "system",
83700
+ families: ["rule"],
83701
+ fields: [...RULE_TEXT],
83702
+ kinds: ["system"],
83703
+ systemEventKinds: [...ALERT_EPISODE]
83324
83704
  },
83325
83705
  {
83326
83706
  name: "exportId",
@@ -83531,7 +83911,10 @@ var NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS = [
83531
83911
  "device-tank-full",
83532
83912
  "device-tank-normal",
83533
83913
  "node-restarting",
83534
- "node-updating"
83914
+ "node-updating",
83915
+ "alert-critical",
83916
+ "alert-error",
83917
+ "alert-critical-resolved"
83535
83918
  ];
83536
83919
  /**
83537
83920
  * The catalog as `getTemplateCatalog` SERVES it: every descriptor, with the
@@ -86331,6 +86714,24 @@ Object.defineProperty(exports, "alarmPanelCapability", {
86331
86714
  return alarmPanelCapability;
86332
86715
  }
86333
86716
  });
86717
+ Object.defineProperty(exports, "alertEpisodeId", {
86718
+ enumerable: true,
86719
+ get: function() {
86720
+ return alertEpisodeId;
86721
+ }
86722
+ });
86723
+ Object.defineProperty(exports, "alertEpisodeKind", {
86724
+ enumerable: true,
86725
+ get: function() {
86726
+ return alertEpisodeKind;
86727
+ }
86728
+ });
86729
+ Object.defineProperty(exports, "alertEpisodePayload", {
86730
+ enumerable: true,
86731
+ get: function() {
86732
+ return alertEpisodePayload;
86733
+ }
86734
+ });
86334
86735
  Object.defineProperty(exports, "applyBlockingEdit", {
86335
86736
  enumerable: true,
86336
86737
  get: function() {
@@ -86625,6 +87026,18 @@ Object.defineProperty(exports, "isAlarmControllableCap", {
86625
87026
  return isAlarmControllableCap;
86626
87027
  }
86627
87028
  });
87029
+ Object.defineProperty(exports, "isAlertEpisodeOpen", {
87030
+ enumerable: true,
87031
+ get: function() {
87032
+ return isAlertEpisodeOpen;
87033
+ }
87034
+ });
87035
+ Object.defineProperty(exports, "isAlertEpisodeSeverity", {
87036
+ enumerable: true,
87037
+ get: function() {
87038
+ return isAlertEpisodeSeverity;
87039
+ }
87040
+ });
86628
87041
  Object.defineProperty(exports, "isAppLinkBase", {
86629
87042
  enumerable: true,
86630
87043
  get: function() {
@@ -86799,6 +87212,12 @@ Object.defineProperty(exports, "occupancyScope", {
86799
87212
  return occupancyScope;
86800
87213
  }
86801
87214
  });
87215
+ Object.defineProperty(exports, "parseAlertEpisodePayload", {
87216
+ enumerable: true,
87217
+ get: function() {
87218
+ return parseAlertEpisodePayload;
87219
+ }
87220
+ });
86802
87221
  Object.defineProperty(exports, "parseProcStatus", {
86803
87222
  enumerable: true,
86804
87223
  get: function() {
@@ -86973,6 +87392,12 @@ Object.defineProperty(exports, "sleep", {
86973
87392
  return sleep;
86974
87393
  }
86975
87394
  });
87395
+ Object.defineProperty(exports, "startMoverUnderClearance", {
87396
+ enumerable: true,
87397
+ get: function() {
87398
+ return startMoverUnderClearance;
87399
+ }
87400
+ });
86976
87401
  Object.defineProperty(exports, "storageOccupancyCapability", {
86977
87402
  enumerable: true,
86978
87403
  get: function() {