@camstack/types 1.2.443 → 1.2.445

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 (58) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/addon.d.ts +5 -1
  3. package/dist/addon.js +21 -5
  4. package/dist/addon.mjs +17 -6
  5. package/dist/automation/export-entities.d.ts +98 -0
  6. package/dist/capabilities/capability-definition.d.ts +1 -1
  7. package/dist/capabilities/composer.cap.d.ts +34 -0
  8. package/dist/capabilities/consumables.cap.d.ts +4 -5
  9. package/dist/capabilities/core-blocks.cap.d.ts +244 -0
  10. package/dist/capabilities/device-export.cap.d.ts +111 -1
  11. package/dist/capabilities/index.d.ts +6 -4
  12. package/dist/capabilities/metrics-provider.cap.d.ts +16 -16
  13. package/dist/capabilities/nodes.cap.d.ts +2 -2
  14. package/dist/capabilities/pet-fountain.cap.d.ts +138 -0
  15. package/dist/capabilities/pipeline-executor.cap.d.ts +6 -22
  16. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +2 -2
  17. package/dist/capabilities/pipeline-runner.cap.d.ts +2 -2
  18. package/dist/capabilities/pipeline-step-input.d.ts +33 -0
  19. package/dist/capabilities/server-management.cap.d.ts +28 -0
  20. package/dist/client.js +820 -799
  21. package/dist/client.mjs +820 -799
  22. package/dist/composition/composition-items.d.ts +3 -3
  23. package/dist/composition/composition-report.d.ts +17 -0
  24. package/dist/composition/composition.d.ts +68 -1
  25. package/dist/composition/index.d.ts +2 -0
  26. package/dist/composition/presets/pet-fountain.d.ts +36 -0
  27. package/dist/composition/validate-forward.d.ts +31 -0
  28. package/dist/{composition-C0dlyG9U.js → composition-CO6Sak-s.js} +49 -5
  29. package/dist/{composition-bIBW5_13.mjs → composition-kSuOifuG.mjs} +32 -6
  30. package/dist/device/cap-vocabulary/entries/appliances.d.ts +1 -1
  31. package/dist/device/device-control-resolution.d.ts +1 -1
  32. package/dist/device/device-type.d.ts +4 -0
  33. package/dist/{err-msg-BCdlR2Li.mjs → err-msg-DWXWc0Di.mjs} +4 -0
  34. package/dist/{err-msg-COHgq7Mb.js → err-msg-EJhsFHqa.js} +4 -0
  35. package/dist/generated/addon-api.d.ts +148 -32
  36. package/dist/generated/addon-cap-facts.d.ts +1 -1
  37. package/dist/generated/cap-status-types.d.ts +3 -1
  38. package/dist/generated/capability-router-map.d.ts +5 -2
  39. package/dist/generated/collection-array-methods.d.ts +2 -2
  40. package/dist/generated/customize-catalog.d.ts +1 -1
  41. package/dist/generated/device-local-state.d.ts +3 -0
  42. package/dist/generated/device-proxy.d.ts +3 -0
  43. package/dist/generated/device-scoped-caps.d.ts +1 -1
  44. package/dist/generated/history-catalog.d.ts +1 -1
  45. package/dist/generated/method-access-map.d.ts +1 -1
  46. package/dist/generated/method-device-selectors.d.ts +1 -1
  47. package/dist/generated/runtime-state-durability.d.ts +1 -1
  48. package/dist/generated/system-proxy.d.ts +2 -2
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.js +1465 -603
  51. package/dist/index.mjs +1433 -592
  52. package/dist/interfaces/agent.d.ts +6 -2
  53. package/dist/interfaces/event-bus.d.ts +1 -1
  54. package/dist/node.js +2 -2
  55. package/dist/node.mjs +2 -2
  56. package/dist/{sleep-C_u6cEAJ.mjs → sleep-6eG9C8Xl.mjs} +223 -72
  57. package/dist/{sleep-E7qAQwTE.js → sleep-UXDHn-oJ.js} +246 -71
  58. package/package.json +1 -1
@@ -10,15 +10,15 @@
10
10
  *
11
11
  * The composer sets some item fields itself: the key and label (from the
12
12
  * entry) and {@link COMPOSED_ITEM_FIXED_FIELDS}. A source for any of them is
13
- * refused by name (`item-field-reserved`) — `resettable` is fixed `false`
14
- * because `reset` is refused until commands arrive (slice 3).
13
+ * refused by name (`item-field-reserved`) — `resettable` is written from the
14
+ * item's `reset` forward (D967): `true` with one, `false` without.
15
15
  */
16
16
  import type { CapabilityDefinition } from '../capabilities/capability-definition.js';
17
17
  import { type CompositionFieldsFeature } from './composition.js';
18
18
  import type { CompositionFeatureMode } from './composition-report.js';
19
19
  import { type CompositionPlanResult } from './plan-result.js';
20
20
  import type { CapabilityLookup } from './validate-composition.js';
21
- /** Item fields the composer writes itself, with the value it writes. */
21
+ /** Item fields the composer writes itself, with the value it writes. `resettable` is the default: an item with a `reset` forward writes `true` (D967). */
22
22
  export declare const COMPOSED_ITEM_FIXED_FIELDS: {
23
23
  readonly resettable: false;
24
24
  };
@@ -4,6 +4,10 @@
4
4
  */
5
5
  import { z } from 'zod';
6
6
  export declare const CompositionProblemCodeSchema: z.ZodEnum<{
7
+ "command-input-missing": "command-input-missing";
8
+ "command-input-unknown": "command-input-unknown";
9
+ "command-method-unknown": "command-method-unknown";
10
+ "command-source-unknown": "command-source-unknown";
7
11
  cycle: "cycle";
8
12
  "duplicate-target": "duplicate-target";
9
13
  "expression-invalid": "expression-invalid";
@@ -36,6 +40,10 @@ export type CompositionProblemCode = z.infer<typeof CompositionProblemCodeSchema
36
40
  /** One refusal, named (D391). `path` points into the composition, e.g. `features[0].fields.temperature`. */
37
41
  export declare const CompositionProblemSchema: z.ZodObject<{
38
42
  code: z.ZodEnum<{
43
+ "command-input-missing": "command-input-missing";
44
+ "command-input-unknown": "command-input-unknown";
45
+ "command-method-unknown": "command-method-unknown";
46
+ "command-source-unknown": "command-source-unknown";
39
47
  cycle: "cycle";
40
48
  "duplicate-target": "duplicate-target";
41
49
  "expression-invalid": "expression-invalid";
@@ -106,6 +114,7 @@ export declare const CompositionFieldItemSchema: z.ZodObject<{
106
114
  arrayPath: z.ZodString;
107
115
  key: z.ZodString;
108
116
  label: z.ZodString;
117
+ resettable: z.ZodOptional<z.ZodBoolean>;
109
118
  }, z.core.$strip>;
110
119
  export type CompositionFieldItem = z.infer<typeof CompositionFieldItemSchema>;
111
120
  export declare const CompositionFieldPlanSchema: z.ZodObject<{
@@ -115,6 +124,7 @@ export declare const CompositionFieldPlanSchema: z.ZodObject<{
115
124
  arrayPath: z.ZodString;
116
125
  key: z.ZodString;
117
126
  label: z.ZodString;
127
+ resettable: z.ZodOptional<z.ZodBoolean>;
118
128
  }, z.core.$strip>>;
119
129
  featureIndex: z.ZodNumber;
120
130
  kind: z.ZodEnum<{
@@ -256,6 +266,10 @@ export declare const CompositionValidationSchema: z.ZodObject<{
256
266
  ok: z.ZodBoolean;
257
267
  problems: z.ZodArray<z.ZodObject<{
258
268
  code: z.ZodEnum<{
269
+ "command-input-missing": "command-input-missing";
270
+ "command-input-unknown": "command-input-unknown";
271
+ "command-method-unknown": "command-method-unknown";
272
+ "command-source-unknown": "command-source-unknown";
259
273
  cycle: "cycle";
260
274
  "duplicate-target": "duplicate-target";
261
275
  "expression-invalid": "expression-invalid";
@@ -294,6 +308,7 @@ export declare const CompositionValidationSchema: z.ZodObject<{
294
308
  arrayPath: z.ZodString;
295
309
  key: z.ZodString;
296
310
  label: z.ZodString;
311
+ resettable: z.ZodOptional<z.ZodBoolean>;
297
312
  }, z.core.$strip>>;
298
313
  featureIndex: z.ZodNumber;
299
314
  kind: z.ZodEnum<{
@@ -451,6 +466,7 @@ export declare const CompositionFieldStateSchema: z.ZodObject<{
451
466
  arrayPath: z.ZodString;
452
467
  key: z.ZodString;
453
468
  label: z.ZodString;
469
+ resettable: z.ZodOptional<z.ZodBoolean>;
454
470
  }, z.core.$strip>>;
455
471
  state: z.ZodEnum<{
456
472
  fresh: "fresh";
@@ -480,6 +496,7 @@ export declare const CompositionBlockStateSchema: z.ZodObject<{
480
496
  arrayPath: z.ZodString;
481
497
  key: z.ZodString;
482
498
  label: z.ZodString;
499
+ resettable: z.ZodOptional<z.ZodBoolean>;
483
500
  }, z.core.$strip>>;
484
501
  state: z.ZodEnum<{
485
502
  fresh: "fresh";
@@ -249,7 +249,29 @@ export declare const CompositionFieldSourceSchema: z.ZodDiscriminatedUnion<[z.Zo
249
249
  }>;
250
250
  }, z.core.$strip>], "kind">;
251
251
  export type CompositionFieldSource = z.infer<typeof CompositionFieldSourceSchema>;
252
- /** `forward`: RESERVED for slice 3. Argument mapping arrives there as an additive optional `args`. */
252
+ /** The marker of a forward argument that takes its value from the built method's input. */
253
+ export declare const FORWARD_INPUT_KEY = "$input";
254
+ /**
255
+ * One value of a forward's `args` template: a constant, `{ $input: '<field>' }`
256
+ * (the value of that field of the BUILT method's input), or a nested record of
257
+ * these — the source method may take a structured input (`control.setValue`).
258
+ */
259
+ export type CompositionForwardArg = string | number | boolean | {
260
+ readonly $input: string;
261
+ } | {
262
+ readonly [key: string]: CompositionForwardArg;
263
+ };
264
+ export declare const CompositionForwardArgSchema: z.ZodType<CompositionForwardArg>;
265
+ /** True for `{ $input: '<field>' }`. */
266
+ export declare function isForwardInputRef(value: CompositionForwardArg): value is {
267
+ readonly $input: string;
268
+ };
269
+ /**
270
+ * `forward` (D659, amended by D967): one method of a BUILT capability is one
271
+ * call of `cap.method` on `source`. Without `args` the built method's input
272
+ * passes through minus `deviceId`; with `args` the template IS the source's
273
+ * whole input. `deviceId` is always the source's own, never an argument.
274
+ */
253
275
  export declare const CompositionForwardCommandSchema: z.ZodObject<{
254
276
  kind: z.ZodLiteral<"forward">;
255
277
  source: z.ZodObject<{
@@ -258,6 +280,7 @@ export declare const CompositionForwardCommandSchema: z.ZodObject<{
258
280
  }, z.core.$strip>;
259
281
  cap: z.ZodString;
260
282
  method: z.ZodString;
283
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
261
284
  }, z.core.$strip>;
262
285
  export type CompositionForwardCommand = z.infer<typeof CompositionForwardCommandSchema>;
263
286
  export declare const CompositionCommandTargetSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -268,6 +291,7 @@ export declare const CompositionCommandTargetSchema: z.ZodDiscriminatedUnion<[z.
268
291
  }, z.core.$strip>;
269
292
  cap: z.ZodString;
270
293
  method: z.ZodString;
294
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
271
295
  }, z.core.$strip>, z.ZodObject<{
272
296
  kind: z.ZodLiteral<"code">;
273
297
  code: z.ZodString;
@@ -364,6 +388,16 @@ export declare const CompositionItemEntrySchema: z.ZodObject<{
364
388
  omit: "omit";
365
389
  }>;
366
390
  }, z.core.$strip>], "kind">>;
391
+ reset: z.ZodOptional<z.ZodObject<{
392
+ kind: z.ZodLiteral<"forward">;
393
+ source: z.ZodObject<{
394
+ addonId: z.ZodString;
395
+ stableId: z.ZodString;
396
+ }, z.core.$strip>;
397
+ cap: z.ZodString;
398
+ method: z.ZodString;
399
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
400
+ }, z.core.$strip>>;
367
401
  }, z.core.$strip>;
368
402
  export type CompositionItemEntry = z.infer<typeof CompositionItemEntrySchema>;
369
403
  export declare const CompositionFieldsFeatureSchema: z.ZodObject<{
@@ -530,6 +564,16 @@ export declare const CompositionFieldsFeatureSchema: z.ZodObject<{
530
564
  omit: "omit";
531
565
  }>;
532
566
  }, z.core.$strip>], "kind">>;
567
+ reset: z.ZodOptional<z.ZodObject<{
568
+ kind: z.ZodLiteral<"forward">;
569
+ source: z.ZodObject<{
570
+ addonId: z.ZodString;
571
+ stableId: z.ZodString;
572
+ }, z.core.$strip>;
573
+ cap: z.ZodString;
574
+ method: z.ZodString;
575
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
576
+ }, z.core.$strip>>;
533
577
  }, z.core.$strip>>>;
534
578
  commands: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
535
579
  kind: z.ZodLiteral<"forward">;
@@ -539,6 +583,7 @@ export declare const CompositionFieldsFeatureSchema: z.ZodObject<{
539
583
  }, z.core.$strip>;
540
584
  cap: z.ZodString;
541
585
  method: z.ZodString;
586
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
542
587
  }, z.core.$strip>, z.ZodObject<{
543
588
  kind: z.ZodLiteral<"code">;
544
589
  code: z.ZodString;
@@ -720,6 +765,16 @@ export declare const CompositionFeatureSchema: z.ZodDiscriminatedUnion<[z.ZodObj
720
765
  omit: "omit";
721
766
  }>;
722
767
  }, z.core.$strip>], "kind">>;
768
+ reset: z.ZodOptional<z.ZodObject<{
769
+ kind: z.ZodLiteral<"forward">;
770
+ source: z.ZodObject<{
771
+ addonId: z.ZodString;
772
+ stableId: z.ZodString;
773
+ }, z.core.$strip>;
774
+ cap: z.ZodString;
775
+ method: z.ZodString;
776
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
777
+ }, z.core.$strip>>;
723
778
  }, z.core.$strip>>>;
724
779
  commands: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
725
780
  kind: z.ZodLiteral<"forward">;
@@ -729,6 +784,7 @@ export declare const CompositionFeatureSchema: z.ZodDiscriminatedUnion<[z.ZodObj
729
784
  }, z.core.$strip>;
730
785
  cap: z.ZodString;
731
786
  method: z.ZodString;
787
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
732
788
  }, z.core.$strip>, z.ZodObject<{
733
789
  kind: z.ZodLiteral<"code">;
734
790
  code: z.ZodString;
@@ -952,6 +1008,16 @@ export declare const CompositionSchema: z.ZodObject<{
952
1008
  omit: "omit";
953
1009
  }>;
954
1010
  }, z.core.$strip>], "kind">>;
1011
+ reset: z.ZodOptional<z.ZodObject<{
1012
+ kind: z.ZodLiteral<"forward">;
1013
+ source: z.ZodObject<{
1014
+ addonId: z.ZodString;
1015
+ stableId: z.ZodString;
1016
+ }, z.core.$strip>;
1017
+ cap: z.ZodString;
1018
+ method: z.ZodString;
1019
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
1020
+ }, z.core.$strip>>;
955
1021
  }, z.core.$strip>>>;
956
1022
  commands: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodDiscriminatedUnion<[z.ZodObject<{
957
1023
  kind: z.ZodLiteral<"forward">;
@@ -961,6 +1027,7 @@ export declare const CompositionSchema: z.ZodObject<{
961
1027
  }, z.core.$strip>;
962
1028
  cap: z.ZodString;
963
1029
  method: z.ZodString;
1030
+ args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodType<CompositionForwardArg, unknown, z.core.$ZodTypeInternals<CompositionForwardArg, unknown>>>>;
964
1031
  }, z.core.$strip>, z.ZodObject<{
965
1032
  kind: z.ZodLiteral<"code">;
966
1033
  code: z.ZodString;
@@ -13,6 +13,8 @@ export * from './evaluate-field.js';
13
13
  export * from './examples.js';
14
14
  export * from './expression-kinds.js';
15
15
  export * from './presets/numeric-transforms.js';
16
+ export * from './presets/pet-fountain.js';
16
17
  export * from './state-fields.js';
17
18
  export * from './validate-composition.js';
19
+ export * from './validate-forward.js';
18
20
  export * from './cards/index.js';
@@ -0,0 +1,36 @@
1
+ import { type Composition, type CompositionSourceRef } from '../composition.js';
2
+ /** The optional filter of a fountain: its remaining days and the "filter changed" button. */
3
+ export interface PetFountainFilterSources {
4
+ /** An `enum-sensor` whose value is the days left, as a numeric string. */
5
+ readonly daysRemaining: CompositionSourceRef;
6
+ /** A `button` the filter reset presses. */
7
+ readonly changed: CompositionSourceRef;
8
+ }
9
+ /** The entities a pet fountain is built from. */
10
+ export interface PetFountainEntitySources {
11
+ /** `enum-sensor.value`: tank level, percent as text. */
12
+ readonly waterLevel: CompositionSourceRef;
13
+ /** `enum-sensor.value`: tank volume, millilitres as text. */
14
+ readonly waterVolume: CompositionSourceRef;
15
+ /** `switch`: the pump. */
16
+ readonly pump: CompositionSourceRef;
17
+ /** `switch`: the on/off duty cycle. */
18
+ readonly pumpInterval: CompositionSourceRef;
19
+ /** `control` (numeric): minutes the pump runs per cycle. */
20
+ readonly pumpOnMinutes: CompositionSourceRef;
21
+ /** `control` (numeric): minutes the pump rests per cycle. */
22
+ readonly pumpOffMinutes: CompositionSourceRef;
23
+ /** `enum-sensor.value`: the last drink, millilitres as text. */
24
+ readonly lastDrink: CompositionSourceRef;
25
+ /** `enum-sensor.value`: this hour's drinking, millilitres as text. */
26
+ readonly currentHourDrink: CompositionSourceRef;
27
+ /** `enum-sensor.value`: the rolling 24 h drinking, millilitres as text. */
28
+ readonly last24hDrink: CompositionSourceRef;
29
+ /** `enum-sensor.value`: today's drinking, millilitres as text. */
30
+ readonly todayDrink: CompositionSourceRef;
31
+ /** `button`: clears the rolling daily counters. */
32
+ readonly clearDaily: CompositionSourceRef;
33
+ /** Present when the fountain has a filter entity pair; adds a `filter` consumable. */
34
+ readonly filter?: PetFountainFilterSources;
35
+ }
36
+ export declare function petFountainFromEntitiesComposition(sources: PetFountainEntitySources): Composition;
@@ -0,0 +1,31 @@
1
+ import type { CapabilityDefinition } from '../capabilities/capability-definition.js';
2
+ import { type Composition, type CompositionFieldsFeature, type CompositionForwardCommand, type CompositionSourceRef } from './composition.js';
3
+ import type { CompositionProblem } from './composition-report.js';
4
+ import type { CapabilityLookup, CompositionSourceDescription } from './validate-composition.js';
5
+ /** A forward and where it sits in the composition, for a refusal that names the place. */
6
+ export interface PlacedForward {
7
+ /** `features[0].commands.setPump` or `features[0].items.filter.reset`. */
8
+ readonly at: string;
9
+ /** The built method it serves. */
10
+ readonly method: string;
11
+ /** Set for an item's `reset`: the item key selects the command and is not an argument. */
12
+ readonly itemKey?: string;
13
+ readonly command: CompositionForwardCommand;
14
+ }
15
+ export declare const DEVICE_ID_FIELD = "deviceId";
16
+ /** Every forward of a feature: the method commands, then each item's `reset`. */
17
+ export declare function featureForwards(feature: CompositionFieldsFeature, featureIndex: number): readonly PlacedForward[];
18
+ /** Every source a forward of an enabled feature calls, once. */
19
+ export declare function forwardSourceRefs(composition: Composition): readonly CompositionSourceRef[];
20
+ /** The methods a BUILT cap must give a command: served, and not answered by the composer itself. */
21
+ export declare function commandedMethods(def: CapabilityDefinition): readonly string[];
22
+ /** One forward against the built cap's method and the source cap's method. */
23
+ export declare function forwardProblems(built: CapabilityDefinition, forward: PlacedForward, lookupCap: CapabilityLookup): readonly CompositionProblem[];
24
+ /** A command must name a method the built cap serves and the composer does not answer itself. */
25
+ export declare function commandMethodProblems(built: CapabilityDefinition, feature: CompositionFieldsFeature, at: string): readonly CompositionProblem[];
26
+ /**
27
+ * The source DEVICES of the forwards, read: each must exist and bind the cap it
28
+ * is called on. A forward onto an unread device is refused rather than stored
29
+ * unchecked, like every other source (D391).
30
+ */
31
+ export declare function forwardSourceProblems(composition: Composition, sources: ReadonlyMap<string, CompositionSourceDescription>): readonly CompositionProblem[];
@@ -1,4 +1,4 @@
1
- const require_err_msg = require("./err-msg-COHgq7Mb.js");
1
+ const require_err_msg = require("./err-msg-EJhsFHqa.js");
2
2
  let zod = require("zod");
3
3
  let node_crypto = require("node:crypto");
4
4
  //#region src/ffmpeg/invocation.ts
@@ -3205,12 +3205,32 @@ var CompositionFieldSourceSchema = zod.z.discriminatedUnion("kind", [
3205
3205
  CompositionAggregateSourceSchema,
3206
3206
  CompositionSeriesSourceSchema
3207
3207
  ]);
3208
- /** `forward`: RESERVED for slice 3. Argument mapping arrives there as an additive optional `args`. */
3208
+ /** The marker of a forward argument that takes its value from the built method's input. */
3209
+ var FORWARD_INPUT_KEY = "$input";
3210
+ var forwardArgUnion = zod.z.union([
3211
+ zod.z.string(),
3212
+ zod.z.number(),
3213
+ zod.z.boolean(),
3214
+ zod.z.strictObject({ [FORWARD_INPUT_KEY]: zod.z.string().min(1) }),
3215
+ zod.z.record(zod.z.string().min(1), zod.z.lazy(() => forwardArgUnion))
3216
+ ]);
3217
+ var CompositionForwardArgSchema = forwardArgUnion;
3218
+ /** True for `{ $input: '<field>' }`. */
3219
+ function isForwardInputRef(value) {
3220
+ return typeof value === "object" && typeof value.$input === "string";
3221
+ }
3222
+ /**
3223
+ * `forward` (D659, amended by D967): one method of a BUILT capability is one
3224
+ * call of `cap.method` on `source`. Without `args` the built method's input
3225
+ * passes through minus `deviceId`; with `args` the template IS the source's
3226
+ * whole input. `deviceId` is always the source's own, never an argument.
3227
+ */
3209
3228
  var CompositionForwardCommandSchema = zod.z.object({
3210
3229
  kind: zod.z.literal("forward"),
3211
3230
  source: CompositionSourceRefSchema,
3212
3231
  cap: zod.z.string().min(1),
3213
- method: zod.z.string().min(1)
3232
+ method: zod.z.string().min(1),
3233
+ args: zod.z.record(zod.z.string().min(1), CompositionForwardArgSchema).optional()
3214
3234
  });
3215
3235
  var CompositionCommandTargetSchema = zod.z.discriminatedUnion("kind", [CompositionForwardCommandSchema, CompositionCodeSourceSchema]);
3216
3236
  /** An item key inside an item-array cap (`consumables.items[<key>]`). */
@@ -3225,7 +3245,13 @@ var COMPOSITION_ITEM_ARRAY_PATH = "items";
3225
3245
  */
3226
3246
  var CompositionItemEntrySchema = zod.z.object({
3227
3247
  label: zod.z.string().min(1).max(80),
3228
- fields: zod.z.record(zod.z.string().min(1), CompositionFieldSourceSchema)
3248
+ fields: zod.z.record(zod.z.string().min(1), CompositionFieldSourceSchema),
3249
+ /**
3250
+ * What the cap's `reset` does for THIS item (consumables). Present = the item
3251
+ * is resettable and a `reset` call naming its key forwards here. The item key
3252
+ * selects the command, so it is never an argument: there is no pass-through.
3253
+ */
3254
+ reset: CompositionForwardCommandSchema.optional()
3229
3255
  });
3230
3256
  var CompositionFieldsFeatureSchema = zod.z.object({
3231
3257
  kind: zod.z.literal("fields"),
@@ -3237,7 +3263,7 @@ var CompositionFieldsFeatureSchema = zod.z.object({
3237
3263
  * owns the WHOLE array field: the composed value holds exactly these items.
3238
3264
  */
3239
3265
  items: zod.z.record(zod.z.string().regex(COMPOSITION_ITEM_KEY_RE), CompositionItemEntrySchema).refine((items) => Object.keys(items).length <= 16, { message: `at most 16 items` }).optional(),
3240
- /** RESERVED for slice 3; refused by the validator when non-empty. */
3266
+ /** Method name → what serves it. Only a BUILT capability takes commands (D967). */
3241
3267
  commands: zod.z.record(zod.z.string().min(1), CompositionCommandTargetSchema).optional()
3242
3268
  });
3243
3269
  /** RESERVED for slice 3: a media / data-plane cap, whole, from one source. */
@@ -3524,6 +3550,12 @@ Object.defineProperty(exports, "CompositionFieldsFeatureSchema", {
3524
3550
  return CompositionFieldsFeatureSchema;
3525
3551
  }
3526
3552
  });
3553
+ Object.defineProperty(exports, "CompositionForwardArgSchema", {
3554
+ enumerable: true,
3555
+ get: function() {
3556
+ return CompositionForwardArgSchema;
3557
+ }
3558
+ });
3527
3559
  Object.defineProperty(exports, "CompositionForwardCommandSchema", {
3528
3560
  enumerable: true,
3529
3561
  get: function() {
@@ -3680,6 +3712,12 @@ Object.defineProperty(exports, "FFMPEG_RELEASE", {
3680
3712
  return FFMPEG_RELEASE;
3681
3713
  }
3682
3714
  });
3715
+ Object.defineProperty(exports, "FORWARD_INPUT_KEY", {
3716
+ enumerable: true,
3717
+ get: function() {
3718
+ return FORWARD_INPUT_KEY;
3719
+ }
3720
+ });
3683
3721
  Object.defineProperty(exports, "Fmp4BoxSplitter", {
3684
3722
  enumerable: true,
3685
3723
  get: function() {
@@ -4166,6 +4204,12 @@ Object.defineProperty(exports, "isApplianceKind", {
4166
4204
  return isApplianceKind;
4167
4205
  }
4168
4206
  });
4207
+ Object.defineProperty(exports, "isForwardInputRef", {
4208
+ enumerable: true,
4209
+ get: function() {
4210
+ return isForwardInputRef;
4211
+ }
4212
+ });
4169
4213
  Object.defineProperty(exports, "isHistoryHelper", {
4170
4214
  enumerable: true,
4171
4215
  get: function() {
@@ -1,4 +1,4 @@
1
- import { a as DeviceType, i as DeviceRole } from "./err-msg-BCdlR2Li.mjs";
1
+ import { a as DeviceType, i as DeviceRole } from "./err-msg-DWXWc0Di.mjs";
2
2
  import { z } from "zod";
3
3
  import { createHash } from "node:crypto";
4
4
  //#region src/ffmpeg/invocation.ts
@@ -3205,12 +3205,32 @@ var CompositionFieldSourceSchema = z.discriminatedUnion("kind", [
3205
3205
  CompositionAggregateSourceSchema,
3206
3206
  CompositionSeriesSourceSchema
3207
3207
  ]);
3208
- /** `forward`: RESERVED for slice 3. Argument mapping arrives there as an additive optional `args`. */
3208
+ /** The marker of a forward argument that takes its value from the built method's input. */
3209
+ var FORWARD_INPUT_KEY = "$input";
3210
+ var forwardArgUnion = z.union([
3211
+ z.string(),
3212
+ z.number(),
3213
+ z.boolean(),
3214
+ z.strictObject({ [FORWARD_INPUT_KEY]: z.string().min(1) }),
3215
+ z.record(z.string().min(1), z.lazy(() => forwardArgUnion))
3216
+ ]);
3217
+ var CompositionForwardArgSchema = forwardArgUnion;
3218
+ /** True for `{ $input: '<field>' }`. */
3219
+ function isForwardInputRef(value) {
3220
+ return typeof value === "object" && typeof value.$input === "string";
3221
+ }
3222
+ /**
3223
+ * `forward` (D659, amended by D967): one method of a BUILT capability is one
3224
+ * call of `cap.method` on `source`. Without `args` the built method's input
3225
+ * passes through minus `deviceId`; with `args` the template IS the source's
3226
+ * whole input. `deviceId` is always the source's own, never an argument.
3227
+ */
3209
3228
  var CompositionForwardCommandSchema = z.object({
3210
3229
  kind: z.literal("forward"),
3211
3230
  source: CompositionSourceRefSchema,
3212
3231
  cap: z.string().min(1),
3213
- method: z.string().min(1)
3232
+ method: z.string().min(1),
3233
+ args: z.record(z.string().min(1), CompositionForwardArgSchema).optional()
3214
3234
  });
3215
3235
  var CompositionCommandTargetSchema = z.discriminatedUnion("kind", [CompositionForwardCommandSchema, CompositionCodeSourceSchema]);
3216
3236
  /** An item key inside an item-array cap (`consumables.items[<key>]`). */
@@ -3225,7 +3245,13 @@ var COMPOSITION_ITEM_ARRAY_PATH = "items";
3225
3245
  */
3226
3246
  var CompositionItemEntrySchema = z.object({
3227
3247
  label: z.string().min(1).max(80),
3228
- fields: z.record(z.string().min(1), CompositionFieldSourceSchema)
3248
+ fields: z.record(z.string().min(1), CompositionFieldSourceSchema),
3249
+ /**
3250
+ * What the cap's `reset` does for THIS item (consumables). Present = the item
3251
+ * is resettable and a `reset` call naming its key forwards here. The item key
3252
+ * selects the command, so it is never an argument: there is no pass-through.
3253
+ */
3254
+ reset: CompositionForwardCommandSchema.optional()
3229
3255
  });
3230
3256
  var CompositionFieldsFeatureSchema = z.object({
3231
3257
  kind: z.literal("fields"),
@@ -3237,7 +3263,7 @@ var CompositionFieldsFeatureSchema = z.object({
3237
3263
  * owns the WHOLE array field: the composed value holds exactly these items.
3238
3264
  */
3239
3265
  items: z.record(z.string().regex(COMPOSITION_ITEM_KEY_RE), CompositionItemEntrySchema).refine((items) => Object.keys(items).length <= 16, { message: `at most 16 items` }).optional(),
3240
- /** RESERVED for slice 3; refused by the validator when non-empty. */
3266
+ /** Method name → what serves it. Only a BUILT capability takes commands (D967). */
3241
3267
  commands: z.record(z.string().min(1), CompositionCommandTargetSchema).optional()
3242
3268
  });
3243
3269
  /** RESERVED for slice 3: a media / data-plane cap, whole, from one source. */
@@ -3350,4 +3376,4 @@ function featureSources(feature) {
3350
3376
  return featureFieldEntries(feature).map((e) => e.source);
3351
3377
  }
3352
3378
  //#endregion
3353
- export { GroupTemplateIdSchema as $, validateExpressionSource as $t, composedDeviceStableId as A, sliceActiveValue as An, planResetTier as At, AGGREGATE_REDUCERS as B, AUDIO_PRESETS as Bn, wattMillisecondsToKwh as Bt, CompositionSeriesSourceSchema as C, SOURCE_CAPS as Cn, RollingWindowSchema as Ct, MAX_COMPOSITION_FIELDS_PER_FEATURE as D, evaluateSensorEdge as Dn, nextLocalMidnight as Dt, MAX_COMPOSITION_FEATURES as E, SOURCE_DEVICE_TYPES as En, maxDurationMs as Et, compositionSourceKey as F, FFMPEG_RELEASE as Fn, STATISTIC_STATS as Ft, ArithmeticHelperSpecSchema as G, buildInputArgs as Gn, isApplianceKind as Gt, ActiveCriterionSchema as H, audioPlanFromEncodeProfile as Hn, APPLIANCE_KINDS as Ht, featureFieldEntries as I, getFfmpegArtifact as In, evaluateDerivative as It, DerivativeHelperSpecSchema as J, isSoftwareDecode as Jn, cloneStatefulExpressionMemory as Jt, BINARY_AGGREGATES as K, buildVideoArgs as Kn, sourcePickForAppliance as Kt, featureSources as L, getFfmpegDownloadUrl as Ln, evaluateStatistic as Lt, compositionItemFieldPath as M, FFMPEG_PATH_ENV as Mn, rollingDurationMs as Mt, compositionReadKey as N, chooseFfmpegBinary as Nn, statisticCadenceMs as Nt, MAX_COMPOSITION_ITEMS as O, evaluateSensorLevelEdge as On, openReset as Ot, compositionSliceKey as P, ffmpegBinaryName as Pn, SERIES_KINDS as Pt, GroupHelperSpecSchema as Q, toExpressionValue as Qt, fieldReads as R, canonicalHash as Rn, integrateReading as Rt, CompositionSchema as S, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Sn, ROLLING_SPANS as St, MAX_COMPOSITION_CODE_LENGTH as T, SOURCE_CAP_CHANGED_AT_FIELD as Tn, integralCadenceMs as Tt, AggregateReducerSchema as U, buildAudioArgs as Un, APPLIANCE_TEMPLATE_ID as Ut, ARITHMETIC_OPS as V, RESTREAM_INPUT_PROBE as Vn, APPLIANCE_DEFAULTS as Vt, ApplianceHelperSpecSchema as W, buildFfmpegArgs as Wn, applianceDeviceType as Wt, ExpressionHelperSpecSchema as X, pickVideoEncoder as Xn, evaluateExpressionSource as Xt, EXPRESSION_OUTPUTS as Y, logBannerArgs as Yn, createStatefulExpressionMemory as Yt, GROUP_TEMPLATE_IDS as Z, resolveStreamMaps as Zn, evaluateStatefulExpressionCall as Zt, CompositionFromSourceSchema as _, evaluateCount as _n, HISTORY_TIERS as _t, CUSTOMIZATION_BLOCK_NAME_PREFIX as a, tokenize as an, NUMERIC_AGGREGATES as at, CompositionNewTargetSchema as b, ExpressionEvalError as bn, MIN_CUSTOM_MINUTES as bt, CompositionCodeSourceSchema as c, MAX_EXPRESSION_AST_NODES as cn, helperMembers as ct, CompositionExpressionSourceSchema as d, MAX_EXPRESSION_EVAL_STEPS as dn, CALENDAR_PERIODS as dt, createExpressionScope as en, HelperMemberSchema as et, CompositionFeatureSchema as f, MAX_EXPRESSION_SOURCE_LENGTH as fn, CalendarWindowSchema as ft, CompositionForwardCommandSchema as g, disarmRoseMemory as gn, HISTORY_SLOW_MS as gt, CompositionFieldsFeatureSchema as h, EXPRESSION_BUILTIN_NAMES as hn, HISTORY_FAST_MS as ht, COMPOSITION_ITEM_KEY_RE as i, parseExpression as in, MAX_HELPER_MEMBERS as it, compositionFeatureEnabled as j, sliceChangedAt as jn, planStatisticTier as jt, composedDeviceRef as k, isSourceCap as kn, openStatistic as kt, CompositionCommandTargetSchema as l, MAX_EXPRESSION_BINDINGS as ln, isHistoryHelper as lt, CompositionFieldSourceSchema as m, EXPRESSION_BUILTINS as mn, DEFAULT_HISTORY_RETENTION as mt, COMPOSER_ADDON_ID as n, compileExpression as nn, INTEGRAL_OUTPUTS as nt, CompositionAggregateSourceSchema as o, EXPRESSION_COMPILE_CACHE_CAPACITY as on, StatisticHelperSpecSchema as ot, CompositionFieldReadSchema as p, RESERVED_BINDING_NAMES as pn, DAY_MS as pt, DERIVATIVE_UNITS as q, invocationFromEncodeProfile as qn, EXPRESSION_INJECTED_NOW as qt, COMPOSITION_ITEM_ARRAY_PATH as r, compileExpressionSafe as rn, IntegralHelperSpecSchema as rt, CompositionBindingSchema as s, EXPRESSION_IDENTIFIER_RE as sn, ThresholdHelperSpecSchema as st, COMPOSED_DEVICE_STABLE_ID_PREFIX as t, evaluateAst as tn, HelperSpecSchema as tt, CompositionExistingTargetSchema as u, MAX_EXPRESSION_CALL_ARGS as un, CompositionSourceRefSchema as ut, CompositionItemEntrySchema as v, evaluateRose as vn, HOUR_MS as vt, CompositionTargetSchema as w, SOURCE_CAP_ACTIVE_FIELD as wn, StatisticWindowSchema as wt, CompositionPassthroughFeatureSchema as x, ExpressionParseError as xn, RESET_PERIODS as xt, CompositionLiteralBindingSchema as y, isStatefulBuiltin as yn, MINUTE_MS as yt, ACTIVE_CRITERIA as z, Fmp4BoxSplitter as zn, KWH_PER_WATT_MS as zt };
3379
+ export { ExpressionHelperSpecSchema as $, pickVideoEncoder as $n, evaluateExpressionSource as $t, MAX_COMPOSITION_ITEMS as A, evaluateSensorEdge as An, nextLocalMidnight as At, fieldReads as B, getFfmpegDownloadUrl as Bn, evaluateStatistic as Bt, CompositionSchema as C, ExpressionEvalError as Cn, MIN_CUSTOM_MINUTES as Ct, MAX_COMPOSITION_CODE_LENGTH as D, SOURCE_CAP_ACTIVE_FIELD as Dn, StatisticWindowSchema as Dt, FORWARD_INPUT_KEY as E, SOURCE_CAPS as En, RollingWindowSchema as Et, compositionReadKey as F, FFMPEG_PATH_ENV as Fn, rollingDurationMs as Ft, ActiveCriterionSchema as G, audioPlanFromEncodeProfile as Gn, APPLIANCE_KINDS as Gt, ACTIVE_CRITERIA as H, Fmp4BoxSplitter as Hn, KWH_PER_WATT_MS as Ht, compositionSliceKey as I, chooseFfmpegBinary as In, statisticCadenceMs as It, ArithmeticHelperSpecSchema as J, buildInputArgs as Jn, isApplianceKind as Jt, AggregateReducerSchema as K, buildAudioArgs as Kn, APPLIANCE_TEMPLATE_ID as Kt, compositionSourceKey as L, ffmpegBinaryName as Ln, SERIES_KINDS as Lt, composedDeviceStableId as M, isSourceCap as Mn, openStatistic as Mt, compositionFeatureEnabled as N, sliceActiveValue as Nn, planResetTier as Nt, MAX_COMPOSITION_FEATURES as O, SOURCE_CAP_CHANGED_AT_FIELD as On, integralCadenceMs as Ot, compositionItemFieldPath as P, sliceChangedAt as Pn, planStatisticTier as Pt, EXPRESSION_OUTPUTS as Q, logBannerArgs as Qn, createStatefulExpressionMemory as Qt, featureFieldEntries as R, FFMPEG_RELEASE as Rn, STATISTIC_STATS as Rt, CompositionPassthroughFeatureSchema as S, isStatefulBuiltin as Sn, MINUTE_MS as St, CompositionTargetSchema as T, DEFAULT_FIRST_SIGHTING_FRESHNESS_MS as Tn, ROLLING_SPANS as Tt, AGGREGATE_REDUCERS as U, AUDIO_PRESETS as Un, wattMillisecondsToKwh as Ut, isForwardInputRef as V, canonicalHash as Vn, integrateReading as Vt, ARITHMETIC_OPS as W, RESTREAM_INPUT_PROBE as Wn, APPLIANCE_DEFAULTS as Wt, DERIVATIVE_UNITS as X, invocationFromEncodeProfile as Xn, EXPRESSION_INJECTED_NOW as Xt, BINARY_AGGREGATES as Y, buildVideoArgs as Yn, sourcePickForAppliance as Yt, DerivativeHelperSpecSchema as Z, isSoftwareDecode as Zn, cloneStatefulExpressionMemory as Zt, CompositionForwardCommandSchema as _, EXPRESSION_BUILTINS as _n, DEFAULT_HISTORY_RETENTION as _t, CUSTOMIZATION_BLOCK_NAME_PREFIX as a, compileExpression as an, INTEGRAL_OUTPUTS as at, CompositionLiteralBindingSchema as b, evaluateCount as bn, HISTORY_TIERS as bt, CompositionCodeSourceSchema as c, tokenize as cn, NUMERIC_AGGREGATES as ct, CompositionExpressionSourceSchema as d, MAX_EXPRESSION_AST_NODES as dn, helperMembers as dt, evaluateStatefulExpressionCall as en, resolveStreamMaps as er, GROUP_TEMPLATE_IDS as et, CompositionFeatureSchema as f, MAX_EXPRESSION_BINDINGS as fn, isHistoryHelper as ft, CompositionForwardArgSchema as g, RESERVED_BINDING_NAMES as gn, DAY_MS as gt, CompositionFieldsFeatureSchema as h, MAX_EXPRESSION_SOURCE_LENGTH as hn, CalendarWindowSchema as ht, COMPOSITION_ITEM_KEY_RE as i, evaluateAst as in, HelperSpecSchema as it, composedDeviceRef as j, evaluateSensorLevelEdge as jn, openReset as jt, MAX_COMPOSITION_FIELDS_PER_FEATURE as k, SOURCE_DEVICE_TYPES as kn, maxDurationMs as kt, CompositionCommandTargetSchema as l, EXPRESSION_COMPILE_CACHE_CAPACITY as ln, StatisticHelperSpecSchema as lt, CompositionFieldSourceSchema as m, MAX_EXPRESSION_EVAL_STEPS as mn, CALENDAR_PERIODS as mt, COMPOSER_ADDON_ID as n, validateExpressionSource as nn, GroupTemplateIdSchema as nt, CompositionAggregateSourceSchema as o, compileExpressionSafe as on, IntegralHelperSpecSchema as ot, CompositionFieldReadSchema as p, MAX_EXPRESSION_CALL_ARGS as pn, CompositionSourceRefSchema as pt, ApplianceHelperSpecSchema as q, buildFfmpegArgs as qn, applianceDeviceType as qt, COMPOSITION_ITEM_ARRAY_PATH as r, createExpressionScope as rn, HelperMemberSchema as rt, CompositionBindingSchema as s, parseExpression as sn, MAX_HELPER_MEMBERS as st, COMPOSED_DEVICE_STABLE_ID_PREFIX as t, toExpressionValue as tn, GroupHelperSpecSchema as tt, CompositionExistingTargetSchema as u, EXPRESSION_IDENTIFIER_RE as un, ThresholdHelperSpecSchema as ut, CompositionFromSourceSchema as v, EXPRESSION_BUILTIN_NAMES as vn, HISTORY_FAST_MS as vt, CompositionSeriesSourceSchema as w, ExpressionParseError as wn, RESET_PERIODS as wt, CompositionNewTargetSchema as x, evaluateRose as xn, HOUR_MS as xt, CompositionItemEntrySchema as y, disarmRoseMemory as yn, HISTORY_SLOW_MS as yt, featureSources as z, getFfmpegArtifact as zn, evaluateDerivative as zt };
@@ -1,5 +1,5 @@
1
1
  import type { CapVocabularySlice } from '../types.js';
2
- type ApplianceCap = 'vacuum-control' | 'lawn-mower-control' | 'dishwasher' | 'pet-feeder' | 'media-player' | 'consumables' | 'running-state' | 'navigation' | 'script-runner' | 'automation-control' | 'notifier' | 'update';
2
+ type ApplianceCap = 'vacuum-control' | 'lawn-mower-control' | 'dishwasher' | 'pet-feeder' | 'pet-fountain' | 'media-player' | 'consumables' | 'running-state' | 'navigation' | 'script-runner' | 'automation-control' | 'notifier' | 'update';
3
3
  /** The appliance family of the vocabulary. */
4
4
  export declare const APPLIANCE_CAP_VOCABULARY: CapVocabularySlice<ApplianceCap>;
5
5
  export {};
@@ -37,7 +37,7 @@ import { DeviceType } from './device-type.js';
37
37
  * kind can back several device types (`'switch'` ← Switch + Siren, `'sensor'`
38
38
  * ← Sensor + Presence, `'dummy'` ← every placeholder/non-controllable type).
39
39
  */
40
- export type DeviceControlKind = 'cover' | 'valve' | 'humidifier' | 'water-heater' | 'switch' | 'light' | 'fan' | 'sensor' | 'thermostat' | 'climate' | 'button' | 'update' | 'lock' | 'media-player' | 'alarm' | 'control' | 'weather' | 'vacuum' | 'lawn-mower' | 'image' | 'pet-feeder' | 'dishwasher' | 'script' | 'automation' | 'dummy';
40
+ export type DeviceControlKind = 'cover' | 'valve' | 'humidifier' | 'water-heater' | 'switch' | 'light' | 'fan' | 'sensor' | 'thermostat' | 'climate' | 'button' | 'update' | 'lock' | 'media-player' | 'alarm' | 'control' | 'weather' | 'vacuum' | 'lawn-mower' | 'image' | 'pet-feeder' | 'pet-fountain' | 'dishwasher' | 'script' | 'automation' | 'dummy';
41
41
  /**
42
42
  * Exhaustive `DeviceType` → `DeviceControlKind` map. Omitting a new enum member
43
43
  * fails the build here (the single place the type→kind decision is encoded).
@@ -89,6 +89,10 @@ export declare enum DeviceType {
89
89
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
90
90
  * integrations sharing the same food/desiccant/hopper surface. */
91
91
  PetFeeder = "pet-feeder",
92
+ /** Pet water fountain — tank level, water drunk, pump and its duty cycle.
93
+ * Installed with the `pet-fountain` cap. Reaches CamStack as loose entities
94
+ * of a container and is BUILT as a composed device (D967). */
95
+ PetFountain = "pet-fountain",
92
96
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
93
97
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
94
98
  * Sources: native Bosch Home Connect, reusable by similar integrations.
@@ -90,6 +90,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
90
90
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
91
91
  * integrations sharing the same food/desiccant/hopper surface. */
92
92
  DeviceType["PetFeeder"] = "pet-feeder";
93
+ /** Pet water fountain — tank level, water drunk, pump and its duty cycle.
94
+ * Installed with the `pet-fountain` cap. Reaches CamStack as loose entities
95
+ * of a container and is BUILT as a composed device (D967). */
96
+ DeviceType["PetFountain"] = "pet-fountain";
93
97
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
94
98
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
95
99
  * Sources: native Bosch Home Connect, reusable by similar integrations.
@@ -90,6 +90,10 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
90
90
  * native PetKit (`nodepetkit` `FeederDevice`), reusable by other feeder
91
91
  * integrations sharing the same food/desiccant/hopper surface. */
92
92
  DeviceType["PetFeeder"] = "pet-feeder";
93
+ /** Pet water fountain — tank level, water drunk, pump and its duty cycle.
94
+ * Installed with the `pet-fountain` cap. Reaches CamStack as loose entities
95
+ * of a container and is BUILT as a composed device (D967). */
96
+ DeviceType["PetFountain"] = "pet-fountain";
93
97
  /** Built-in dishwasher — program lifecycle, door / remote-start gates,
94
98
  * salt and rinse-aid levels. Installed with the `dishwasher` cap.
95
99
  * Sources: native Bosch Home Connect, reusable by similar integrations.