@camstack/addon-post-analysis 1.2.661 → 1.2.662

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 (16) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/{clip-model-registry-RvEPUqvS.js → clip-model-registry-C3N1NpST.js} +191 -30
  3. package/dist/{clip-model-registry-CVajwmEk.mjs → clip-model-registry-ELaSS9jq.mjs} +191 -30
  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-CwKrui6c.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BvOlyiL9.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-D4zkNcgf.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-vaatUWY6.mjs +26 -0
  10. package/dist/pipeline-analytics/{hostInit-DR75U6YM.mjs → hostInit-BjZchMMh.mjs} +2 -2
  11. package/dist/pipeline-analytics/index.js +177 -5
  12. package/dist/pipeline-analytics/index.mjs +177 -5
  13. package/dist/pipeline-analytics/remoteEntry.js +1 -1
  14. package/package.json +2 -2
  15. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BDKliSzv.mjs +0 -26
  16. package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BGdtpHOa.mjs +0 -26
package/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.662] - 2026-11-01
11
+
12
+ ### Changed
13
+
14
+ - An appliance that finishes its cycle now notifies by default as "<Device> ha terminato dopo N minuti", and the text can carry the energy used
15
+ - The appliance finish notification reads the recorded run, so duration and energy survive a restart.
16
+
10
17
  ## [1.2.661] - 2026-11-01
11
18
 
12
19
  ### Changed
@@ -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-CaURIwQA.mjs
33
+ //#region ../types/dist/event-category-BmPm98n0.mjs
34
34
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
35
35
  EventCategory["SystemBoot"] = "system.boot";
36
36
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -514,6 +514,10 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
514
514
  EventCategory["RunningStarted"] = "running.started";
515
515
  /** Mirrors `runningStateCapability.events.onFinished`. */
516
516
  EventCategory["RunningFinished"] = "running.finished";
517
+ /** Mirrors `deviceRunsCapability.events.onRunOpened` - a durable run record opened. */
518
+ EventCategory["DeviceRunOpened"] = "device-run.opened";
519
+ /** Mirrors `deviceRunsCapability.events.onRunClosed` - a durable run record closed. */
520
+ EventCategory["DeviceRunClosed"] = "device-run.closed";
517
521
  /**
518
522
  * Cap event fired by every device that registers the `event-emitter`
519
523
  * capability. Mirrors `eventEmitterCapability.events.onEvent`. Carries
@@ -6052,7 +6056,7 @@ var ZodIssueCode = {
6052
6056
  var ZodFirstPartyTypeKind;
6053
6057
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6054
6058
  //#endregion
6055
- //#region ../types/dist/sleep-CSYuxssh.mjs
6059
+ //#region ../types/dist/sleep-BKzhQTSm.mjs
6056
6060
  /**
6057
6061
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6058
6062
  * window to float samples (D455).
@@ -9818,6 +9822,7 @@ var CAP_NAMES = Object.freeze([
9818
9822
  "device-ops",
9819
9823
  "device-provider",
9820
9824
  "device-removal-hook",
9825
+ "device-runs",
9821
9826
  "device-state",
9822
9827
  "device-status",
9823
9828
  "dishwasher",
@@ -11764,7 +11769,7 @@ Object.freeze({
11764
11769
  * can answer "may a rule actuate this?" without importing the schema barrel
11765
11770
  * (~144MB RSS per runner, D28).
11766
11771
  *
11767
- * Coverage: 98 device-scoped capabilities.
11772
+ * Coverage: 99 device-scoped capabilities.
11768
11773
  */
11769
11774
  var DEVICE_SCOPED_CAPS = new Set([
11770
11775
  "accessories",
@@ -11796,6 +11801,7 @@ var DEVICE_SCOPED_CAPS = new Set([
11796
11801
  "device-discovery",
11797
11802
  "device-extension",
11798
11803
  "device-ops",
11804
+ "device-runs",
11799
11805
  "device-status",
11800
11806
  "dishwasher",
11801
11807
  "doorbell",
@@ -20982,6 +20988,14 @@ var APPLIANCE_CAP_VOCABULARY = {
20982
20988
  }
20983
20989
  } }
20984
20990
  },
20991
+ "device-runs": {
20992
+ scope: "device",
20993
+ noun: t("Runs", "Esecuzioni"),
20994
+ events: {
20995
+ onRunOpened: { notOperatorFacing: "the durable record of a run that the running-state start flip already announces" },
20996
+ onRunClosed: { notOperatorFacing: "the durable record of a run that the running-state finish flip already announces" }
20997
+ }
20998
+ },
20985
20999
  update: {
20986
21000
  scope: "device",
20987
21001
  noun: t("Firmware update", "Aggiornamento firmware"),
@@ -49352,6 +49366,101 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
49352
49366
  kind: "mutation",
49353
49367
  auth: "admin"
49354
49368
  });
49369
+ /**
49370
+ * device-runs - the durable record of ONE run of a device: a washing cycle, a
49371
+ * dishwasher cycle, later a mow or a clean (D992).
49372
+ *
49373
+ * A run is a DOCUMENT (opened at one instant, closed at another, carrying what
49374
+ * was measured over it), never a sample - device-history keeps the numbers over
49375
+ * time and its `device-runs` provider keeps these documents beside them, because
49376
+ * the energy of a run is a question about device-history's own series. The
49377
+ * record is written from the `running-state` flip on `DeviceStateChanged`; it
49378
+ * survives a restart (the open row is on disk) and a missed flip (boot compares
49379
+ * the open rows against the live snapshots).
49380
+ *
49381
+ * Every measurement is `number | null` and `null` means "could not be
49382
+ * measured", never `0` (D393). A run closed by the boot reconcile because the
49383
+ * device stopped while nobody was watching has `outcome: 'unknown'`.
49384
+ */
49385
+ var DeviceRunKindSchema = _enum([
49386
+ "appliance",
49387
+ "mower",
49388
+ "vacuum"
49389
+ ]);
49390
+ var DeviceRunStateSchema = _enum(["open", "closed"]);
49391
+ var DeviceRunOutcomeSchema = _enum([
49392
+ "completed",
49393
+ "aborted",
49394
+ "error",
49395
+ "unknown"
49396
+ ]);
49397
+ /** What opened or closed the run. `reconcile` is the boot comparison against live state. */
49398
+ var DeviceRunSourceSchema = _enum([
49399
+ "running-state",
49400
+ "activity",
49401
+ "reconcile"
49402
+ ]);
49403
+ /** How the energy of a run was obtained; `null` when it could not be. */
49404
+ var DeviceRunEnergyMethodSchema = _enum(["counter-delta", "history-integral"]);
49405
+ var DeviceRunPhaseSchema = object({
49406
+ phase: string(),
49407
+ at: number()
49408
+ });
49409
+ /** The kind-specific block; a later phase adds a branch, nothing else changes. */
49410
+ var DeviceRunDetailSchema = discriminatedUnion("kind", [object({
49411
+ kind: literal("appliance"),
49412
+ /** kWh used over the run. */
49413
+ energyKwh: number().nullable().meta(readingMeta("energy")),
49414
+ energyMethod: DeviceRunEnergyMethodSchema.nullable(),
49415
+ /** Highest power seen while the run was open. */
49416
+ peakW: number().nullable().meta(readingMeta("power")),
49417
+ /** Time-weighted mean power while the run was open. */
49418
+ avgW: number().nullable().meta(readingMeta("power")),
49419
+ /** The program the appliance said it ran when the run opened. */
49420
+ program: string().nullable(),
49421
+ remainingAtStartSec: number().nullable().meta(readingMeta("duration")),
49422
+ /** The last phase the device reported before the run closed. */
49423
+ finalPhase: string().nullable(),
49424
+ /**
49425
+ * The meter's energy counter when the run opened; `null` when the meter had
49426
+ * not said (or the run was opened late, by the boot reconcile). It lives in
49427
+ * the row so a run that outlives a restart still ends with `end - start`.
49428
+ */
49429
+ energyStartKwh: number().nullable().meta(readingMeta("energy")),
49430
+ /** Milliseconds of power readings behind `avgW` - the weight a restart resumes the mean with. */
49431
+ powerObservedMs: number()
49432
+ })]);
49433
+ var DeviceRunSchema = object({
49434
+ /** `${deviceId}:${startedAt}`. */
49435
+ runId: string(),
49436
+ deviceId: number().int(),
49437
+ kind: DeviceRunKindSchema,
49438
+ state: DeviceRunStateSchema,
49439
+ startedAt: number(),
49440
+ endedAt: number().nullable(),
49441
+ durationMs: number().nullable(),
49442
+ outcome: DeviceRunOutcomeSchema.nullable(),
49443
+ startSource: DeviceRunSourceSchema,
49444
+ endSource: DeviceRunSourceSchema.nullable(),
49445
+ /** Where the device's running bit came from (`running-state.source`); `null` when it did not say. */
49446
+ runningSource: _enum(["native", "assigned"]).nullable(),
49447
+ phases: array(DeviceRunPhaseSchema),
49448
+ detail: DeviceRunDetailSchema
49449
+ });
49450
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, method(object({
49451
+ deviceId: number().int(),
49452
+ outcome: DeviceRunOutcomeSchema.optional(),
49453
+ atFrom: number().optional(),
49454
+ atTo: number().optional(),
49455
+ limit: number().int().positive().max(200).default(50),
49456
+ cursor: string().optional()
49457
+ }), object({
49458
+ runs: array(DeviceRunSchema).readonly(),
49459
+ nextCursor: string().nullable()
49460
+ })), method(object({
49461
+ deviceId: number().int(),
49462
+ runId: string()
49463
+ }), DeviceRunSchema.nullable()), method(object({ deviceId: number().int() }), DeviceRunSchema.nullable());
49355
49464
  var DeviceCaStatusSchema = discriminatedUnion("state", [
49356
49465
  object({ state: literal("absent") }),
49357
49466
  object({
@@ -49487,8 +49596,8 @@ method(object({}), object({
49487
49596
  });
49488
49597
  var KeychainKeySourceSchema = object({
49489
49598
  kind: _enum([
49490
- "config-file",
49491
- "previous-config-file",
49599
+ "mounted-file",
49600
+ "previous-mounted-file",
49492
49601
  "platform",
49493
49602
  "default-file"
49494
49603
  ]),
@@ -67997,10 +68106,7 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
67997
68106
  }), InstallPackageResultSchema, {
67998
68107
  kind: "mutation",
67999
68108
  auth: "admin"
68000
- }), method(object({ packageName: string() }), InstallPackageResultSchema, {
68001
- kind: "mutation",
68002
- auth: "admin"
68003
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
68109
+ }), method(object({
68004
68110
  packageName: string().min(1),
68005
68111
  nodeId: string().optional(),
68006
68112
  everywhere: boolean().optional()
@@ -83612,13 +83718,6 @@ Object.freeze({
83612
83718
  access: "view",
83613
83719
  role: "admin"
83614
83720
  },
83615
- "addons.installFromWorkspace": {
83616
- capName: "addons",
83617
- capScope: "system",
83618
- addonId: null,
83619
- access: "create",
83620
- role: "admin"
83621
- },
83622
83721
  "addons.installPackage": {
83623
83722
  capName: "addons",
83624
83723
  capScope: "system",
@@ -83626,13 +83725,6 @@ Object.freeze({
83626
83725
  access: "create",
83627
83726
  role: "admin"
83628
83727
  },
83629
- "addons.isWorkspaceAvailable": {
83630
- capName: "addons",
83631
- capScope: "system",
83632
- addonId: null,
83633
- access: "view",
83634
- role: "admin"
83635
- },
83636
83728
  "addons.list": {
83637
83729
  capName: "addons",
83638
83730
  capScope: "system",
@@ -83682,13 +83774,6 @@ Object.freeze({
83682
83774
  access: "view",
83683
83775
  role: "admin"
83684
83776
  },
83685
- "addons.listWorkspacePackages": {
83686
- capName: "addons",
83687
- capScope: "system",
83688
- addonId: null,
83689
- access: "view",
83690
- role: "admin"
83691
- },
83692
83777
  "addons.onAddonLogs": {
83693
83778
  capName: "addons",
83694
83779
  capScope: "system",
@@ -86356,6 +86441,27 @@ Object.freeze({
86356
86441
  access: "create",
86357
86442
  role: "admin"
86358
86443
  },
86444
+ "deviceRuns.getCurrentRun": {
86445
+ capName: "device-runs",
86446
+ capScope: "device",
86447
+ addonId: null,
86448
+ access: "view",
86449
+ role: "viewer"
86450
+ },
86451
+ "deviceRuns.getRun": {
86452
+ capName: "device-runs",
86453
+ capScope: "device",
86454
+ addonId: null,
86455
+ access: "view",
86456
+ role: "viewer"
86457
+ },
86458
+ "deviceRuns.listRuns": {
86459
+ capName: "device-runs",
86460
+ capScope: "device",
86461
+ addonId: null,
86462
+ access: "view",
86463
+ role: "viewer"
86464
+ },
86359
86465
  "deviceState.claimFields": {
86360
86466
  capName: "device-state",
86361
86467
  capScope: "system",
@@ -94561,6 +94667,21 @@ Object.freeze({
94561
94667
  form: "single",
94562
94668
  optional: false
94563
94669
  }],
94670
+ "deviceRuns.getCurrentRun": [{
94671
+ name: "deviceId",
94672
+ form: "single",
94673
+ optional: false
94674
+ }],
94675
+ "deviceRuns.getRun": [{
94676
+ name: "deviceId",
94677
+ form: "single",
94678
+ optional: false
94679
+ }],
94680
+ "deviceRuns.listRuns": [{
94681
+ name: "deviceId",
94682
+ form: "single",
94683
+ optional: false
94684
+ }],
94564
94685
  "deviceState.claimFields": [{
94565
94686
  name: "deviceId",
94566
94687
  form: "single",
@@ -99098,6 +99219,46 @@ var NC_TEMPLATE_VARS = [
99098
99219
  fields: [...RULE_TEXT],
99099
99220
  kinds: ["sensor"]
99100
99221
  },
99222
+ {
99223
+ name: "duration",
99224
+ label: "Cycle duration",
99225
+ description: "How long a finished appliance cycle ran, e.g. \"52 minutes\" or \"1 h 12 min\"; empty when the start is unknown.",
99226
+ example: "52 minuti",
99227
+ group: "sensor",
99228
+ families: ["rule"],
99229
+ fields: [...RULE_TEXT],
99230
+ kinds: ["sensor"]
99231
+ },
99232
+ {
99233
+ name: "energy",
99234
+ label: "Cycle energy",
99235
+ description: "Energy an appliance used over its finished cycle, e.g. \"0.84 kWh\"; empty without a power meter.",
99236
+ example: "0,84 kWh",
99237
+ group: "sensor",
99238
+ families: ["rule"],
99239
+ fields: [...RULE_TEXT],
99240
+ kinds: ["sensor"]
99241
+ },
99242
+ {
99243
+ name: "afterDuration",
99244
+ label: "\"after <duration>\" fragment",
99245
+ description: "Leading space included; empty when the cycle duration is unknown.",
99246
+ example: " dopo 52 minuti",
99247
+ group: "sensor",
99248
+ families: ["rule"],
99249
+ fields: [...RULE_TEXT],
99250
+ kinds: ["sensor"]
99251
+ },
99252
+ {
99253
+ name: "usedEnergy",
99254
+ label: "\"used <energy>\" fragment",
99255
+ description: "Leading space included; empty when the energy is unknown.",
99256
+ example: " e ha consumato 0,84 kWh",
99257
+ group: "sensor",
99258
+ families: ["rule"],
99259
+ fields: [...RULE_TEXT],
99260
+ kinds: ["sensor"]
99261
+ },
99101
99262
  {
99102
99263
  name: "ai",
99103
99264
  label: "AI sentence",
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- //#region ../types/dist/event-category-CaURIwQA.mjs
2
+ //#region ../types/dist/event-category-BmPm98n0.mjs
3
3
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4
4
  EventCategory["SystemBoot"] = "system.boot";
5
5
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -483,6 +483,10 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
483
483
  EventCategory["RunningStarted"] = "running.started";
484
484
  /** Mirrors `runningStateCapability.events.onFinished`. */
485
485
  EventCategory["RunningFinished"] = "running.finished";
486
+ /** Mirrors `deviceRunsCapability.events.onRunOpened` - a durable run record opened. */
487
+ EventCategory["DeviceRunOpened"] = "device-run.opened";
488
+ /** Mirrors `deviceRunsCapability.events.onRunClosed` - a durable run record closed. */
489
+ EventCategory["DeviceRunClosed"] = "device-run.closed";
486
490
  /**
487
491
  * Cap event fired by every device that registers the `event-emitter`
488
492
  * capability. Mirrors `eventEmitterCapability.events.onEvent`. Carries
@@ -6021,7 +6025,7 @@ var ZodIssueCode = {
6021
6025
  var ZodFirstPartyTypeKind;
6022
6026
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6023
6027
  //#endregion
6024
- //#region ../types/dist/sleep-CSYuxssh.mjs
6028
+ //#region ../types/dist/sleep-BKzhQTSm.mjs
6025
6029
  /**
6026
6030
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6027
6031
  * window to float samples (D455).
@@ -9787,6 +9791,7 @@ var CAP_NAMES = Object.freeze([
9787
9791
  "device-ops",
9788
9792
  "device-provider",
9789
9793
  "device-removal-hook",
9794
+ "device-runs",
9790
9795
  "device-state",
9791
9796
  "device-status",
9792
9797
  "dishwasher",
@@ -11733,7 +11738,7 @@ Object.freeze({
11733
11738
  * can answer "may a rule actuate this?" without importing the schema barrel
11734
11739
  * (~144MB RSS per runner, D28).
11735
11740
  *
11736
- * Coverage: 98 device-scoped capabilities.
11741
+ * Coverage: 99 device-scoped capabilities.
11737
11742
  */
11738
11743
  var DEVICE_SCOPED_CAPS = new Set([
11739
11744
  "accessories",
@@ -11765,6 +11770,7 @@ var DEVICE_SCOPED_CAPS = new Set([
11765
11770
  "device-discovery",
11766
11771
  "device-extension",
11767
11772
  "device-ops",
11773
+ "device-runs",
11768
11774
  "device-status",
11769
11775
  "dishwasher",
11770
11776
  "doorbell",
@@ -20951,6 +20957,14 @@ var APPLIANCE_CAP_VOCABULARY = {
20951
20957
  }
20952
20958
  } }
20953
20959
  },
20960
+ "device-runs": {
20961
+ scope: "device",
20962
+ noun: t("Runs", "Esecuzioni"),
20963
+ events: {
20964
+ onRunOpened: { notOperatorFacing: "the durable record of a run that the running-state start flip already announces" },
20965
+ onRunClosed: { notOperatorFacing: "the durable record of a run that the running-state finish flip already announces" }
20966
+ }
20967
+ },
20954
20968
  update: {
20955
20969
  scope: "device",
20956
20970
  noun: t("Firmware update", "Aggiornamento firmware"),
@@ -49321,6 +49335,101 @@ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly())
49321
49335
  kind: "mutation",
49322
49336
  auth: "admin"
49323
49337
  });
49338
+ /**
49339
+ * device-runs - the durable record of ONE run of a device: a washing cycle, a
49340
+ * dishwasher cycle, later a mow or a clean (D992).
49341
+ *
49342
+ * A run is a DOCUMENT (opened at one instant, closed at another, carrying what
49343
+ * was measured over it), never a sample - device-history keeps the numbers over
49344
+ * time and its `device-runs` provider keeps these documents beside them, because
49345
+ * the energy of a run is a question about device-history's own series. The
49346
+ * record is written from the `running-state` flip on `DeviceStateChanged`; it
49347
+ * survives a restart (the open row is on disk) and a missed flip (boot compares
49348
+ * the open rows against the live snapshots).
49349
+ *
49350
+ * Every measurement is `number | null` and `null` means "could not be
49351
+ * measured", never `0` (D393). A run closed by the boot reconcile because the
49352
+ * device stopped while nobody was watching has `outcome: 'unknown'`.
49353
+ */
49354
+ var DeviceRunKindSchema = _enum([
49355
+ "appliance",
49356
+ "mower",
49357
+ "vacuum"
49358
+ ]);
49359
+ var DeviceRunStateSchema = _enum(["open", "closed"]);
49360
+ var DeviceRunOutcomeSchema = _enum([
49361
+ "completed",
49362
+ "aborted",
49363
+ "error",
49364
+ "unknown"
49365
+ ]);
49366
+ /** What opened or closed the run. `reconcile` is the boot comparison against live state. */
49367
+ var DeviceRunSourceSchema = _enum([
49368
+ "running-state",
49369
+ "activity",
49370
+ "reconcile"
49371
+ ]);
49372
+ /** How the energy of a run was obtained; `null` when it could not be. */
49373
+ var DeviceRunEnergyMethodSchema = _enum(["counter-delta", "history-integral"]);
49374
+ var DeviceRunPhaseSchema = object({
49375
+ phase: string(),
49376
+ at: number()
49377
+ });
49378
+ /** The kind-specific block; a later phase adds a branch, nothing else changes. */
49379
+ var DeviceRunDetailSchema = discriminatedUnion("kind", [object({
49380
+ kind: literal("appliance"),
49381
+ /** kWh used over the run. */
49382
+ energyKwh: number().nullable().meta(readingMeta("energy")),
49383
+ energyMethod: DeviceRunEnergyMethodSchema.nullable(),
49384
+ /** Highest power seen while the run was open. */
49385
+ peakW: number().nullable().meta(readingMeta("power")),
49386
+ /** Time-weighted mean power while the run was open. */
49387
+ avgW: number().nullable().meta(readingMeta("power")),
49388
+ /** The program the appliance said it ran when the run opened. */
49389
+ program: string().nullable(),
49390
+ remainingAtStartSec: number().nullable().meta(readingMeta("duration")),
49391
+ /** The last phase the device reported before the run closed. */
49392
+ finalPhase: string().nullable(),
49393
+ /**
49394
+ * The meter's energy counter when the run opened; `null` when the meter had
49395
+ * not said (or the run was opened late, by the boot reconcile). It lives in
49396
+ * the row so a run that outlives a restart still ends with `end - start`.
49397
+ */
49398
+ energyStartKwh: number().nullable().meta(readingMeta("energy")),
49399
+ /** Milliseconds of power readings behind `avgW` - the weight a restart resumes the mean with. */
49400
+ powerObservedMs: number()
49401
+ })]);
49402
+ var DeviceRunSchema = object({
49403
+ /** `${deviceId}:${startedAt}`. */
49404
+ runId: string(),
49405
+ deviceId: number().int(),
49406
+ kind: DeviceRunKindSchema,
49407
+ state: DeviceRunStateSchema,
49408
+ startedAt: number(),
49409
+ endedAt: number().nullable(),
49410
+ durationMs: number().nullable(),
49411
+ outcome: DeviceRunOutcomeSchema.nullable(),
49412
+ startSource: DeviceRunSourceSchema,
49413
+ endSource: DeviceRunSourceSchema.nullable(),
49414
+ /** Where the device's running bit came from (`running-state.source`); `null` when it did not say. */
49415
+ runningSource: _enum(["native", "assigned"]).nullable(),
49416
+ phases: array(DeviceRunPhaseSchema),
49417
+ detail: DeviceRunDetailSchema
49418
+ });
49419
+ DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, method(object({
49420
+ deviceId: number().int(),
49421
+ outcome: DeviceRunOutcomeSchema.optional(),
49422
+ atFrom: number().optional(),
49423
+ atTo: number().optional(),
49424
+ limit: number().int().positive().max(200).default(50),
49425
+ cursor: string().optional()
49426
+ }), object({
49427
+ runs: array(DeviceRunSchema).readonly(),
49428
+ nextCursor: string().nullable()
49429
+ })), method(object({
49430
+ deviceId: number().int(),
49431
+ runId: string()
49432
+ }), DeviceRunSchema.nullable()), method(object({ deviceId: number().int() }), DeviceRunSchema.nullable());
49324
49433
  var DeviceCaStatusSchema = discriminatedUnion("state", [
49325
49434
  object({ state: literal("absent") }),
49326
49435
  object({
@@ -49456,8 +49565,8 @@ method(object({}), object({
49456
49565
  });
49457
49566
  var KeychainKeySourceSchema = object({
49458
49567
  kind: _enum([
49459
- "config-file",
49460
- "previous-config-file",
49568
+ "mounted-file",
49569
+ "previous-mounted-file",
49461
49570
  "platform",
49462
49571
  "default-file"
49463
49572
  ]),
@@ -67966,10 +68075,7 @@ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSc
67966
68075
  }), InstallPackageResultSchema, {
67967
68076
  kind: "mutation",
67968
68077
  auth: "admin"
67969
- }), method(object({ packageName: string() }), InstallPackageResultSchema, {
67970
- kind: "mutation",
67971
- auth: "admin"
67972
- }), method(_void(), boolean()), method(_void(), array(unknown()).readonly()), method(object({
68078
+ }), method(object({
67973
68079
  packageName: string().min(1),
67974
68080
  nodeId: string().optional(),
67975
68081
  everywhere: boolean().optional()
@@ -83581,13 +83687,6 @@ Object.freeze({
83581
83687
  access: "view",
83582
83688
  role: "admin"
83583
83689
  },
83584
- "addons.installFromWorkspace": {
83585
- capName: "addons",
83586
- capScope: "system",
83587
- addonId: null,
83588
- access: "create",
83589
- role: "admin"
83590
- },
83591
83690
  "addons.installPackage": {
83592
83691
  capName: "addons",
83593
83692
  capScope: "system",
@@ -83595,13 +83694,6 @@ Object.freeze({
83595
83694
  access: "create",
83596
83695
  role: "admin"
83597
83696
  },
83598
- "addons.isWorkspaceAvailable": {
83599
- capName: "addons",
83600
- capScope: "system",
83601
- addonId: null,
83602
- access: "view",
83603
- role: "admin"
83604
- },
83605
83697
  "addons.list": {
83606
83698
  capName: "addons",
83607
83699
  capScope: "system",
@@ -83651,13 +83743,6 @@ Object.freeze({
83651
83743
  access: "view",
83652
83744
  role: "admin"
83653
83745
  },
83654
- "addons.listWorkspacePackages": {
83655
- capName: "addons",
83656
- capScope: "system",
83657
- addonId: null,
83658
- access: "view",
83659
- role: "admin"
83660
- },
83661
83746
  "addons.onAddonLogs": {
83662
83747
  capName: "addons",
83663
83748
  capScope: "system",
@@ -86325,6 +86410,27 @@ Object.freeze({
86325
86410
  access: "create",
86326
86411
  role: "admin"
86327
86412
  },
86413
+ "deviceRuns.getCurrentRun": {
86414
+ capName: "device-runs",
86415
+ capScope: "device",
86416
+ addonId: null,
86417
+ access: "view",
86418
+ role: "viewer"
86419
+ },
86420
+ "deviceRuns.getRun": {
86421
+ capName: "device-runs",
86422
+ capScope: "device",
86423
+ addonId: null,
86424
+ access: "view",
86425
+ role: "viewer"
86426
+ },
86427
+ "deviceRuns.listRuns": {
86428
+ capName: "device-runs",
86429
+ capScope: "device",
86430
+ addonId: null,
86431
+ access: "view",
86432
+ role: "viewer"
86433
+ },
86328
86434
  "deviceState.claimFields": {
86329
86435
  capName: "device-state",
86330
86436
  capScope: "system",
@@ -94530,6 +94636,21 @@ Object.freeze({
94530
94636
  form: "single",
94531
94637
  optional: false
94532
94638
  }],
94639
+ "deviceRuns.getCurrentRun": [{
94640
+ name: "deviceId",
94641
+ form: "single",
94642
+ optional: false
94643
+ }],
94644
+ "deviceRuns.getRun": [{
94645
+ name: "deviceId",
94646
+ form: "single",
94647
+ optional: false
94648
+ }],
94649
+ "deviceRuns.listRuns": [{
94650
+ name: "deviceId",
94651
+ form: "single",
94652
+ optional: false
94653
+ }],
94533
94654
  "deviceState.claimFields": [{
94534
94655
  name: "deviceId",
94535
94656
  form: "single",
@@ -99067,6 +99188,46 @@ var NC_TEMPLATE_VARS = [
99067
99188
  fields: [...RULE_TEXT],
99068
99189
  kinds: ["sensor"]
99069
99190
  },
99191
+ {
99192
+ name: "duration",
99193
+ label: "Cycle duration",
99194
+ description: "How long a finished appliance cycle ran, e.g. \"52 minutes\" or \"1 h 12 min\"; empty when the start is unknown.",
99195
+ example: "52 minuti",
99196
+ group: "sensor",
99197
+ families: ["rule"],
99198
+ fields: [...RULE_TEXT],
99199
+ kinds: ["sensor"]
99200
+ },
99201
+ {
99202
+ name: "energy",
99203
+ label: "Cycle energy",
99204
+ description: "Energy an appliance used over its finished cycle, e.g. \"0.84 kWh\"; empty without a power meter.",
99205
+ example: "0,84 kWh",
99206
+ group: "sensor",
99207
+ families: ["rule"],
99208
+ fields: [...RULE_TEXT],
99209
+ kinds: ["sensor"]
99210
+ },
99211
+ {
99212
+ name: "afterDuration",
99213
+ label: "\"after <duration>\" fragment",
99214
+ description: "Leading space included; empty when the cycle duration is unknown.",
99215
+ example: " dopo 52 minuti",
99216
+ group: "sensor",
99217
+ families: ["rule"],
99218
+ fields: [...RULE_TEXT],
99219
+ kinds: ["sensor"]
99220
+ },
99221
+ {
99222
+ name: "usedEnergy",
99223
+ label: "\"used <energy>\" fragment",
99224
+ description: "Leading space included; empty when the energy is unknown.",
99225
+ example: " e ha consumato 0,84 kWh",
99226
+ group: "sensor",
99227
+ families: ["rule"],
99228
+ fields: [...RULE_TEXT],
99229
+ kinds: ["sensor"]
99230
+ },
99070
99231
  {
99071
99232
  name: "ai",
99072
99233
  label: "AI sentence",
@@ -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-RvEPUqvS.js");
5
+ const require_clip_model_registry = require("../clip-model-registry-C3N1NpST.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, _a as normalizeNodeId, _r as embeddingModelFailedError, a as CLIP_EMBEDDING_STEP_ID, br as embeddingRequirementsUnavailableError, gr as embeddingEncoderCapability, i as CLIP_TEXT_MODELS, l as resolveClusterModelPin, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, ra as BaseAddon, rn as PoolMemoryWatchdog, si as parseProcStatus, t as BUILTIN_CLIP_MODELS, yr as embeddingRequirementsFailedError } from "../clip-model-registry-CVajwmEk.mjs";
1
+ import { Si as resolvePoolMemoryPolicy, _a as normalizeNodeId, _r as embeddingModelFailedError, a as CLIP_EMBEDDING_STEP_ID, br as embeddingRequirementsUnavailableError, gr as embeddingEncoderCapability, i as CLIP_TEXT_MODELS, l as resolveClusterModelPin, n as DEFAULT_CLIP_MODEL, r as CLIP_IMAGE_MODELS, ra as BaseAddon, rn as PoolMemoryWatchdog, si as parseProcStatus, t as BUILTIN_CLIP_MODELS, yr as embeddingRequirementsFailedError } from "../clip-model-registry-ELaSS9jq.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";