@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
@@ -71,7 +71,8 @@ export interface AgentHealth {
71
71
  readonly hubAddress: string | null;
72
72
  readonly addons: AgentHealthAddonCounts;
73
73
  readonly cpuPercent: number;
74
- readonly memoryPercent: number;
74
+ /** `null` when the memory read failed (D393). */
75
+ readonly memoryPercent: number | null;
75
76
  /** ISO timestamp when this snapshot was generated. */
76
77
  readonly checkedAt: string;
77
78
  }
@@ -154,7 +155,10 @@ export interface AgentListItem {
154
155
  readonly status: {
155
156
  readonly activeCameras: number;
156
157
  readonly cpuPercent: number;
157
- readonly memoryPercent: number;
158
+ /** `null` when the memory read failed or was never reported (D393). */
159
+ readonly memoryPercent: number | null;
160
+ /** RSS of the node's own (core) process; absent from an agent that predates the field. */
161
+ readonly processRssBytes?: number | null;
158
162
  readonly fps: Readonly<Record<string, number>>;
159
163
  readonly errors: readonly string[];
160
164
  };
@@ -736,7 +736,7 @@ export interface TopologyNode {
736
736
  readonly isHub: boolean;
737
737
  readonly isOnline: boolean;
738
738
  readonly cpuPercent: number;
739
- readonly memoryPercent: number;
739
+ readonly memoryPercent: number | null;
740
740
  readonly uptime: number;
741
741
  readonly lastSeen: string;
742
742
  /** Local IP addresses visible on the network (non-internal, IPv4/IPv6). */
package/dist/node.js CHANGED
@@ -21,8 +21,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_composition = require("./composition-C0dlyG9U.js");
25
- const require_err_msg = require("./err-msg-COHgq7Mb.js");
24
+ const require_composition = require("./composition-CO6Sak-s.js");
25
+ const require_err_msg = require("./err-msg-EJhsFHqa.js");
26
26
  let node_crypto = require("node:crypto");
27
27
  let node_fs = require("node:fs");
28
28
  node_fs = __toESM(node_fs);
package/dist/node.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { F as compositionSourceKey, Fn as FFMPEG_RELEASE, In as getFfmpegArtifact, Jn as isSoftwareDecode, Ln as getFfmpegDownloadUrl, Mn as FFMPEG_PATH_ENV, Nn as chooseFfmpegBinary, Pn as ffmpegBinaryName, Rn as canonicalHash, Wn as buildFfmpegArgs, a as CUSTOMIZATION_BLOCK_NAME_PREFIX, zn as Fmp4BoxSplitter } from "./composition-bIBW5_13.mjs";
2
- import { t as errMsg } from "./err-msg-BCdlR2Li.mjs";
1
+ import { Bn as getFfmpegDownloadUrl, Fn as FFMPEG_PATH_ENV, Hn as Fmp4BoxSplitter, In as chooseFfmpegBinary, L as compositionSourceKey, Ln as ffmpegBinaryName, Rn as FFMPEG_RELEASE, Vn as canonicalHash, Zn as isSoftwareDecode, a as CUSTOMIZATION_BLOCK_NAME_PREFIX, qn as buildFfmpegArgs, zn as getFfmpegArtifact } from "./composition-kSuOifuG.mjs";
2
+ import { t as errMsg } from "./err-msg-DWXWc0Di.mjs";
3
3
  import { createHash, createHmac, randomUUID, timingSafeEqual } from "node:crypto";
4
4
  import * as fs from "node:fs";
5
5
  import { chmodSync, copyFileSync, createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
@@ -6055,76 +6055,6 @@ var MODEL_FORMATS = [
6055
6055
  "pt",
6056
6056
  "gguf"
6057
6057
  ];
6058
- //#endregion
6059
- //#region src/cap-call-context.ts
6060
- /**
6061
- * Per-call node pinning for `ctx.api` capability calls.
6062
- *
6063
- * A capability call normally resolves to its DEFAULT provider — a `singleton`
6064
- * cap resolves to the hub, a device-scoped cap to the device's owning node. To
6065
- * query a SPECIFIC node's provider instead (e.g. a remote agent's own
6066
- * in-process `platform-probe` hardware, which the hub cannot probe), pin the
6067
- * call to that node.
6068
- *
6069
- * The nodeId rides OUT-OF-BAND in the tRPC call context (NOT in the validated
6070
- * method args), so capability method signatures stay `nodeId`-free — node
6071
- * targeting is a property of the CALL, not of the method. The transport lifts
6072
- * it from `op.context` onto the `CapCallInput.nodeId` field (`ipcParentLink`),
6073
- * and the hub parent's `onUnownedCall` passes it to the `CapRouteResolver`,
6074
- * which classifies a pinned agent node as `agent-child-forward`
6075
- * (`$agent-cap-fwd.forward` → the agent's in-process provider).
6076
- *
6077
- * Usage at a call site:
6078
- *
6079
- * await api.platformProbe.getCapabilities.query(undefined, nodePin(nodeId))
6080
- */
6081
- /** tRPC `op.context` key carrying a per-call node pin. */
6082
- var CAP_NODE_PIN_CONTEXT_KEY = "__camstackNodePin";
6083
- /**
6084
- * Build the tRPC request options that pin a single capability call to `nodeId`.
6085
- * Pass as the second argument to `.query(input, …)` / `.mutate(input, …)`.
6086
- *
6087
- * ## The id is normalised here, and it has to be
6088
- *
6089
- * A forked addon reads its own node from `ctx.kernel.localNodeId`, and inside a
6090
- * worker that value is a RUNNER id — `hub/export-hap`, not `hub`. Routing
6091
- * compares a pin against real node ids, so such a pin matches nothing and the
6092
- * call fails with `no provider registered for cap "…"`. The local-first
6093
- * resolver already guarded against this (`localNodeId.split('/')[0]`), which
6094
- * made the hazard invisible: unpinned calls worked, and only an explicit pin —
6095
- * the thing you reach for when you specifically need THIS node — silently
6096
- * addressed a node that does not exist.
6097
- *
6098
- * Cost of it being missing: `addon-export-hap` pinned `decoder.getInfo` to its
6099
- * own node to read the host's hardware-decode backend. It never once answered,
6100
- * so every HomeKit egress transcode decoded in SOFTWARE — including 4K H.265 —
6101
- * while D67's whole premise was that the decoder addon is the authority on
6102
- * hardware. The warn said `decoding in SOFTWARE` and read as "this node has no
6103
- * hardware", which was false.
6104
- *
6105
- * Normalising in the ONE constructor fixes every caller at once, which is why
6106
- * it is here and not at the call sites.
6107
- */
6108
- function nodePin(nodeId) {
6109
- return { context: { [CAP_NODE_PIN_CONTEXT_KEY]: toNodeId(nodeId) } };
6110
- }
6111
- /**
6112
- * A runner id is `<nodeId>/<addonId>`; a node id has no slash. Taking the head
6113
- * is idempotent, so passing an already-clean id costs nothing.
6114
- */
6115
- function toNodeId(idOrRunnerId) {
6116
- const head = idOrRunnerId.split("/")[0];
6117
- return head === void 0 || head.length === 0 ? idOrRunnerId : head;
6118
- }
6119
- /**
6120
- * Read a per-call node pin out of a tRPC `op.context` (transport side).
6121
- * Returns the pinned nodeId, or `undefined` when no pin is present.
6122
- */
6123
- function readNodePin(context) {
6124
- if (context === null || typeof context !== "object") return void 0;
6125
- const value = Reflect.get(context, CAP_NODE_PIN_CONTEXT_KEY);
6126
- return typeof value === "string" ? value : void 0;
6127
- }
6128
6058
  z.object({
6129
6059
  field: z.string().min(1),
6130
6060
  on: z.literal("advance")
@@ -6146,6 +6076,7 @@ var HISTORY_UNIT_LABELS = {
6146
6076
  ppm: "ppm",
6147
6077
  ppb: "ppb",
6148
6078
  "µg/m³": "µg/m³",
6079
+ L: "L",
6149
6080
  hPa: "hPa",
6150
6081
  count: "count",
6151
6082
  ratio: "ratio",
@@ -6342,6 +6273,141 @@ function isDeviceConfigCap(def) {
6342
6273
  return def?.deviceConfig !== void 0;
6343
6274
  }
6344
6275
  //#endregion
6276
+ //#region src/cap-call-context.ts
6277
+ /**
6278
+ * Per-call node pinning for `ctx.api` capability calls.
6279
+ *
6280
+ * A capability call normally resolves to its DEFAULT provider — a `singleton`
6281
+ * cap resolves to the hub, a device-scoped cap to the device's owning node. To
6282
+ * query a SPECIFIC node's provider instead (e.g. a remote agent's own
6283
+ * in-process `platform-probe` hardware, which the hub cannot probe), pin the
6284
+ * call to that node.
6285
+ *
6286
+ * The nodeId rides OUT-OF-BAND in the tRPC call context (NOT in the validated
6287
+ * method args), so capability method signatures stay `nodeId`-free — node
6288
+ * targeting is a property of the CALL, not of the method. The transport lifts
6289
+ * it from `op.context` onto the `CapCallInput.nodeId` field (`ipcParentLink`),
6290
+ * and the hub parent's `onUnownedCall` passes it to the `CapRouteResolver`,
6291
+ * which classifies a pinned agent node as `agent-child-forward`
6292
+ * (`$agent-cap-fwd.forward` → the agent's in-process provider).
6293
+ *
6294
+ * Usage at a call site:
6295
+ *
6296
+ * await api.platformProbe.getCapabilities.query(undefined, nodePin(nodeId))
6297
+ */
6298
+ /** tRPC `op.context` key carrying a per-call node pin. */
6299
+ var CAP_NODE_PIN_CONTEXT_KEY = "__camstackNodePin";
6300
+ /**
6301
+ * Build the tRPC request options that pin a single capability call to `nodeId`.
6302
+ * Pass as the second argument to `.query(input, …)` / `.mutate(input, …)`.
6303
+ *
6304
+ * ## The id is normalised here, and it has to be
6305
+ *
6306
+ * A forked addon reads its own node from `ctx.kernel.localNodeId`, and inside a
6307
+ * worker that value is a RUNNER id — `hub/export-hap`, not `hub`. Routing
6308
+ * compares a pin against real node ids, so such a pin matches nothing and the
6309
+ * call fails with `no provider registered for cap "…"`. The local-first
6310
+ * resolver already guarded against this (`localNodeId.split('/')[0]`), which
6311
+ * made the hazard invisible: unpinned calls worked, and only an explicit pin —
6312
+ * the thing you reach for when you specifically need THIS node — silently
6313
+ * addressed a node that does not exist.
6314
+ *
6315
+ * Cost of it being missing: `addon-export-hap` pinned `decoder.getInfo` to its
6316
+ * own node to read the host's hardware-decode backend. It never once answered,
6317
+ * so every HomeKit egress transcode decoded in SOFTWARE — including 4K H.265 —
6318
+ * while D67's whole premise was that the decoder addon is the authority on
6319
+ * hardware. The warn said `decoding in SOFTWARE` and read as "this node has no
6320
+ * hardware", which was false.
6321
+ *
6322
+ * Normalising in the ONE constructor fixes every caller at once, which is why
6323
+ * it is here and not at the call sites.
6324
+ */
6325
+ function nodePin(nodeId) {
6326
+ return { context: { [CAP_NODE_PIN_CONTEXT_KEY]: toNodeId(nodeId) } };
6327
+ }
6328
+ /**
6329
+ * A runner id is `<nodeId>/<addonId>`; a node id has no slash. Taking the head
6330
+ * is idempotent, so passing an already-clean id costs nothing.
6331
+ */
6332
+ function toNodeId(idOrRunnerId) {
6333
+ const head = idOrRunnerId.split("/")[0];
6334
+ return head === void 0 || head.length === 0 ? idOrRunnerId : head;
6335
+ }
6336
+ /**
6337
+ * Read a per-call node pin out of a tRPC `op.context` (transport side).
6338
+ * Returns the pinned nodeId, or `undefined` when no pin is present.
6339
+ */
6340
+ function readNodePin(context) {
6341
+ if (context === null || typeof context !== "object") return void 0;
6342
+ const value = Reflect.get(context, CAP_NODE_PIN_CONTEXT_KEY);
6343
+ return typeof value === "string" ? value : void 0;
6344
+ }
6345
+ //#endregion
6346
+ //#region src/capabilities/addon-pages-source.cap.ts
6347
+ /**
6348
+ * `addon-pages-source` — collection cap exposing per-provider raw page
6349
+ * declarations. Every addon that contributes a UI page registers a
6350
+ * provider here. The hub-side singleton aggregator (`addon-pages` cap,
6351
+ * see `addon-pages.cap.ts`) walks this collection, stamps versioned
6352
+ * `bundleUrl` values, and returns the enriched `AddonPageInfo[]` list
6353
+ * that admin-ui consumes.
6354
+ *
6355
+ * The split exists because the public listing has a different output
6356
+ * shape than the per-provider raw declarations, and we want both ends
6357
+ * to flow through codegen instead of relying on a hand-written wrapper.
6358
+ */
6359
+ var AddonPageDeclarationSchema = z.object({
6360
+ id: z.string(),
6361
+ label: z.string(),
6362
+ icon: z.string(),
6363
+ path: z.string(),
6364
+ /**
6365
+ * Module Federation remote name — must match the `name` field on the
6366
+ * page addon's `federation()` plugin config. Used by admin-ui's
6367
+ * `<AddonPageLoader>` to call `loadRemote('<remoteName>/page')`.
6368
+ * Conventionally `addon_<id>_page` (snake_case; MF names cannot
6369
+ * contain hyphens).
6370
+ */
6371
+ remoteName: z.string(),
6372
+ /**
6373
+ * Bundle filename inside the addon's `dist/` dir served at
6374
+ * `/api/addon-pages/<addonId>/<bundle>`. With Module Federation this
6375
+ * is always `'remoteEntry.js'`; the value is kept on the metadata so
6376
+ * the static-file route can compute an mtime-based cache-buster URL
6377
+ * without a separate filesystem stat.
6378
+ */
6379
+ bundle: z.string(),
6380
+ /**
6381
+ * Sidebar section this page docks into. Well-known ids: `'detection'`,
6382
+ * `'cluster'`, `'administration'` — the page renders inside that group.
6383
+ * Any OTHER string creates (or joins) a custom section rendered after
6384
+ * the built-in groups; its label comes from `sectionLabel` (first
6385
+ * declaration wins), falling back to the id. Absent → the legacy
6386
+ * "Addon Pages" group.
6387
+ */
6388
+ section: z.string().optional(),
6389
+ /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
6390
+ sectionLabel: z.string().optional()
6391
+ });
6392
+ var addonPagesSourceCapability = {
6393
+ name: "addon-pages-source",
6394
+ scope: "system",
6395
+ mode: "collection",
6396
+ internal: true,
6397
+ methods: {
6398
+ /**
6399
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
6400
+ * `data-store-provider`) — this was reachable on the AppRouter by ANY
6401
+ * authenticated session at the default `auth: 'protected'`. The only
6402
+ * consumer, the `addon-pages-aggregator` builtin, reads it via
6403
+ * `ctx.capabilities.getCollection('addon-pages-source')` — LOCAL-PROCESS
6404
+ * only, never tRPC (per `ctx.capabilities` seeing only the local
6405
+ * process). The public, enriched listing admin-ui actually consumes is
6406
+ * the separate `addon-pages` cap, unaffected by this change.
6407
+ */
6408
+ listPages: method(z.void(), z.array(AddonPageDeclarationSchema).readonly(), { auth: "admin" }) }
6409
+ };
6410
+ //#endregion
6345
6411
  //#region src/capabilities/admin-ui.cap.ts
6346
6412
  var StaticDirOutputSchema$1 = z.object({ staticDir: z.string() });
6347
6413
  var VersionOutputSchema$1 = z.object({ version: z.string() });
@@ -6475,6 +6541,29 @@ function withoutCallerStamp(input) {
6475
6541
  */
6476
6542
  var DEVICE_CHILDREN_BATCH_MAX = 256;
6477
6543
  //#endregion
6544
+ //#region src/capabilities/pipeline-step-input.ts
6545
+ /**
6546
+ * The pipeline step-input shape and the run-result bridge, in a module that
6547
+ * imports nothing but zod and types.
6548
+ *
6549
+ * WHY A SEPARATE FILE (addon footprint, D28): both were declared in
6550
+ * `pipeline-executor.cap.ts`, whose import evaluates the whole executor schema
6551
+ * graph. An addon that only needs these two (the benchmark's `runPipelineTest`
6552
+ * action) paid ~130 MB of heap at load. `pipeline-executor.cap.ts` re-exports
6553
+ * them, so every existing import keeps working; addon server code takes them
6554
+ * from `@camstack/types/addon`.
6555
+ */
6556
+ var PipelineStepInputSchema = z.lazy(() => z.object({
6557
+ addonId: z.string(),
6558
+ modelId: z.string().optional(),
6559
+ enabled: z.boolean().default(true),
6560
+ children: z.array(PipelineStepInputSchema).optional(),
6561
+ settings: z.record(z.string(), z.unknown()).optional(),
6562
+ jumpDeviceKey: z.string().optional()
6563
+ }));
6564
+ /** Typed bridge to the recursive `FrameResult` graph; validation is structural. */
6565
+ var PipelineRunResultBridge = z.custom();
6566
+ //#endregion
6478
6567
  //#region src/capabilities/viewer-ui.cap.ts
6479
6568
  var StaticDirOutputSchema = z.object({ staticDir: z.string() });
6480
6569
  var VersionOutputSchema = z.object({ version: z.string() });
@@ -6766,6 +6855,7 @@ var CAP_NAMES = Object.freeze([
6766
6855
  "osd",
6767
6856
  "osd-manager",
6768
6857
  "pet-feeder",
6858
+ "pet-fountain",
6769
6859
  "pipeline-analytics",
6770
6860
  "pipeline-executor",
6771
6861
  "pipeline-orchestrator",
@@ -8046,6 +8136,56 @@ var CAP_STATE_LEAVES = Object.freeze({
8046
8136
  "valueType": "number"
8047
8137
  }
8048
8138
  ],
8139
+ "pet-fountain": [
8140
+ {
8141
+ "path": "waterLevel",
8142
+ "valueType": "number"
8143
+ },
8144
+ {
8145
+ "path": "waterVolume",
8146
+ "valueType": "number"
8147
+ },
8148
+ {
8149
+ "path": "empty",
8150
+ "valueType": "boolean"
8151
+ },
8152
+ {
8153
+ "path": "pumpRunning",
8154
+ "valueType": "boolean"
8155
+ },
8156
+ {
8157
+ "path": "pumpIntervalEnabled",
8158
+ "valueType": "boolean"
8159
+ },
8160
+ {
8161
+ "path": "pumpOnTime",
8162
+ "valueType": "number"
8163
+ },
8164
+ {
8165
+ "path": "pumpOffTime",
8166
+ "valueType": "number"
8167
+ },
8168
+ {
8169
+ "path": "lastDrink",
8170
+ "valueType": "number"
8171
+ },
8172
+ {
8173
+ "path": "currentHourDrink",
8174
+ "valueType": "number"
8175
+ },
8176
+ {
8177
+ "path": "last24hDrink",
8178
+ "valueType": "number"
8179
+ },
8180
+ {
8181
+ "path": "todayDrink",
8182
+ "valueType": "number"
8183
+ },
8184
+ {
8185
+ "path": "error",
8186
+ "valueType": "string"
8187
+ }
8188
+ ],
8049
8189
  "power-meter": [
8050
8190
  {
8051
8191
  "path": "power",
@@ -9271,6 +9411,14 @@ function createDeviceProxy(api, binding, opts) {
9271
9411
  setVolume: (input) => dispatch("pet-feeder", "petFeeder", "setVolume", "mutation", input),
9272
9412
  getStatus: (input) => dispatch("pet-feeder", "petFeeder", "getStatus", "query", input)
9273
9413
  };
9414
+ const petFountainInterface = {
9415
+ setPump: (input) => dispatch("pet-fountain", "petFountain", "setPump", "mutation", input),
9416
+ setPumpInterval: (input) => dispatch("pet-fountain", "petFountain", "setPumpInterval", "mutation", input),
9417
+ setPumpOnMinutes: (input) => dispatch("pet-fountain", "petFountain", "setPumpOnMinutes", "mutation", input),
9418
+ setPumpOffMinutes: (input) => dispatch("pet-fountain", "petFountain", "setPumpOffMinutes", "mutation", input),
9419
+ resetDailyConsumption: (input) => dispatch("pet-fountain", "petFountain", "resetDailyConsumption", "mutation", input),
9420
+ getStatus: (input) => dispatch("pet-fountain", "petFountain", "getStatus", "query", input)
9421
+ };
9274
9422
  const pipelineAnalyticsInterface = {
9275
9423
  getActiveTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getActiveTracks", "query", input),
9276
9424
  getTrack: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getTrack", "query", input),
@@ -9739,6 +9887,7 @@ function createDeviceProxy(api, binding, opts) {
9739
9887
  notifier: createSliceHandle(stateSource, binding.deviceId, "notifier"),
9740
9888
  numericSensor: createSliceHandle(stateSource, binding.deviceId, "numeric-sensor"),
9741
9889
  petFeeder: createSliceHandle(stateSource, binding.deviceId, "pet-feeder"),
9890
+ petFountain: createSliceHandle(stateSource, binding.deviceId, "pet-fountain"),
9742
9891
  powerMeter: createSliceHandle(stateSource, binding.deviceId, "power-meter"),
9743
9892
  presence: createSliceHandle(stateSource, binding.deviceId, "presence"),
9744
9893
  pressureSensor: createSliceHandle(stateSource, binding.deviceId, "pressure-sensor"),
@@ -9829,6 +9978,7 @@ function createDeviceProxy(api, binding, opts) {
9829
9978
  ...bound("numeric-sensor") ? { numericSensor: numericSensorInterface } : {},
9830
9979
  ...bound("osd") ? { osd: osdInterface } : {},
9831
9980
  ...bound("pet-feeder") ? { petFeeder: petFeederInterface } : {},
9981
+ ...bound("pet-fountain") ? { petFountain: petFountainInterface } : {},
9832
9982
  ...bound("pipeline-analytics") ? { pipelineAnalytics: pipelineAnalyticsInterface } : {},
9833
9983
  ...bound("power-meter") ? { powerMeter: powerMeterInterface } : {},
9834
9984
  ...bound("presence") ? { presence: presenceInterface } : {},
@@ -9892,7 +10042,7 @@ function createDeviceProxy(api, binding, opts) {
9892
10042
  * can answer "may a rule actuate this?" without importing the schema barrel
9893
10043
  * (~144MB RSS per runner, D28).
9894
10044
  *
9895
- * Coverage: 96 device-scoped capabilities.
10045
+ * Coverage: 97 device-scoped capabilities.
9896
10046
  */
9897
10047
  var DEVICE_SCOPED_CAPS = new Set([
9898
10048
  "accessories",
@@ -9958,6 +10108,7 @@ var DEVICE_SCOPED_CAPS = new Set([
9958
10108
  "numeric-sensor",
9959
10109
  "osd",
9960
10110
  "pet-feeder",
10111
+ "pet-fountain",
9961
10112
  "pipeline-analytics",
9962
10113
  "power-meter",
9963
10114
  "presence",
@@ -10290,4 +10441,4 @@ function sleepCancellable(ms, signal) {
10290
10441
  });
10291
10442
  }
10292
10443
  //#endregion
10293
- export { expandCapMethods as $, REVALIDATE_AFTER_MS as $n, isSecretMarker as $r, RecordFieldPathSchema as $t, HF_REPO as A, RecordUniqueViolationError as An, buildSecretRef as Ar, StreamSourceEntrySchema$1 as At, withoutCallerStamp as B, RECORD_CLASSES as Bn, isEvent as Br, QUANTITY_BASE as Bt, addonSliceHandleApi as C, InvalidRecordError as Cn, KeychainWriteRefusedError as Cr, CamStreamResolutionSchema as Ct, createSliceHandle as D, RecordNotFoundError as Dn, transformSecretWrite as Dr, ProfileRtspEntrySchema as Dt, createMirrorSource as E, RECORDS_ERROR_CODES as En, resolveSecretMarkers as Er, FrameHandleSchema as Et, RawStateResultSchema as F, UnknownRecordKindError as Fn, parseSecretRef as Fr, makeSourceBrokerId as Ft, adminUiCapability as G, RECORD_MAX_DATA_BYTES as Gn, dehydrateConfigField as Gr, isReadingQuantity as Gt, defineCustomActions as H, RECORD_DEFAULT_MAX_DATA_BYTES as Hn, WELL_KNOWN_TAB_MAP as Hr, baseUnitOf as Ht, deviceOpsCapability as I, asRecordsError as In, normalizeNodeId as Ir, parseProfileBrokerId as It, DEVICE_STATUS_METHOD as J, RECORD_QUERY_MAX as Jn, resolveHydratedFieldValue as Jr, defineEntryKind as Jt, DEFAULT_RUNTIME_STATE_DURABILITY as K, RECORD_MAX_INDEXES as Kn, dehydrateSchema as Kr, readingMeta as Kt, viewerUiCapability as L, recordsErrorFromMessage as Ln, createDurableState as Lr, selectAssignedProfileSlots as Lt, CAP_ADVANCE_FIELDS as M, RevConflictError as Mn, globalSecretScope as Mr, SubscribeAudioChunksInputSchema as Mt, CAP_NAMES as N, TransactRefusedError as Nn, isSecretRef as Nr, SubscribeAudioChunksResultSchema as Nt, DEFAULT_TOKEN_EXPIRY as O, RecordSecretUnavailableError as On, SECRET_REF_SCHEME as Or, ProfileSlotSchema as Ot, CAP_STATE_LEAVES as P, UnindexedFilterError as Pn, normalizeSecretOwner as Pr, makeProfileBrokerId as Pt, event as Q, resolveSecretViewsIn as Qn, isSecretFieldView as Qr, EntryDescriptorSchema as Qt, DEVICE_CHILDREN_BATCH_MAX as R, RECORD_BATCH_MAX as Rn, createEvent as Rr, DEFAULT_DISPLAY_PREFERENCE as Rt, invokeTrpcLeaf as S, ForeignSecretMarkerError as Sn, secretTreeFromSchema as Sr, CamStreamKindSchema as St, createLazyTrpcSource as T, PlaintextSecretError as Tn, isSecretRefOwnedBy as Tr, DecodedAudioChunkSchema as Tt, describeCustomActions as U, RECORD_DELETE_BATCH as Un, collectHydratedFieldEntries as Ur, displayUnitFor as Ut, customAction as V, RECORD_DATABASES as Vn, WELL_KNOWN_TABS as Vr, ReadingQuantitySchema as Vt, deviceCustomAction as W, RECORD_ID_MAX_LENGTH as Wn, collectHydratedFieldValues as Wr, historyUnitFor as Wt, HISTORY_UNIT_LABELS as X, RECORD_SETTINGS_MAX_ROWS as Xn, classifySecretWrite as Xr, createRecordsAccess as Xt, HISTORY_DEFAULT_MIN_INTERVAL_MS as Y, RECORD_SECRET_COLLECTION_PREFIX as Yn, SECRET_CLEAR as Yr, entryBody as Yt, PROVIDER_PIN_FIELD as Z, RECORD_SWEEP_INTERVAL_MS as Zn, isSecretClear as Zr, assertTransactScope as Zt, readErrorI18n as _, collectZodSecretPaths as _n, classifyStoreError as _r, AudioStreamPickSchema as _t, asJsonArray as a, collectSecretConfigKeys as ai, assertValidDeclaration as an, registerKnownSecret as ar, systemMethod as at, isDeviceScopedCap as b, DeclarationRefusedError as bn, parseSecretStatePath as br, CAM_PROFILE_ORDER as bt, asString as c, omitTransientConfig as ci, REMOVE_LEAF as cn, PEER_BYTES_CHUNK_BYTES as cr, readNodePin as ct, parseJsonUnknown as d, audioChunkBytesPerSample as di, parseSecretPath as dn, PEER_BYTES_TICKET_TTL_MS as dr, ReadinessRegistry as dt, isSecretMarkerLike as ei, RecordIndexSchema as en, createSecretsAccess as er, historyItemFieldPath as et, hfModelUrl as f, expandAudioChunkToF32le as fi, recordArrayItemPath as fn, PeerBytesTicketSchema as fr, ReadinessTimeoutError as ft, ErrorI18nPayloadSchema as g, SECRET_META as gn, BaseAddon as gr, AudioChunkFormatSchema as gt, ErrorCodeSchema as h, secretArrayPrefixes as hn, DisposerChain as hr, scopeKey as ht, asBoolean as i, collectKeychainStoredKeys as ii, StoredRecordKindDeclarationSchema as in, knownSecretCount as ir, resolveCapMount as it, RUNTIME_DEFAULTS as j, RecordsError as jn, formatSecretScope as jr, StreamSourceSchema as jt, HF_BASE_URL as k, RecordTooLargeError as kn, arrayItemFieldPath as kr, ProfileSlotStatusSchema as kt, parseJsonArray as l, schemaDeclaresAnyField as li, collectSecretLeaves as ln, PEER_BYTES_MAX_OUTSTANDING as lr, toNodeId as lt, CamstackError as m, recordSecretRef as mn, SHARE_VIEW_KINDS as mr, readinessKey as mt, sleepCancellable as n, toSecretFieldView as ni, RecordKindNameSchema as nn, clearKnownSecrets as nr, method as nt, asJsonObject as o, isKeychainStoredField as oi, declarationsOf as on, scrubKnownSecrets as or, CAP_NODE_PIN_CONTEXT_KEY as ot, BOOT_RECOVERY_BACKOFF_MS as p, isAudioChunkFormat as pi, recordSecretCollection as pn, DATAPLANE_SECRET_HEADER as pr, emitDownForOwnedCaps as pt, DEVICE_SETTINGS_CONTRIBUTION_METHODS as q, RECORD_MAX_INDEX_FIELDS as qn, hydrateSchema as qr, makeInMemoryRecords as qt, maskUrlCredentials as r, REDACTED_SECRET as ri, RecordRetentionSchema as rn, forgetKnownSecret as rr, optionalMethod as rt, asNumber as s, isSecretConfigField as si, defineRecordKinds as sn, shortSecretRefHash as sr, nodePin as st, sleep as t, makeSecretMarker as ti, RecordKindDeclarationSchema as tn, MIN_SCRUBBED_LENGTH as tr, isDeviceConfigCap as tt, parseJsonObject as u, AUDIO_CHUNK_FORMATS as ui, mapSecretLeaves as un, PEER_BYTES_STALL_MS as ur, MODEL_FORMATS as ut, userError as v, isZodSecret as vn, normalizeAddonInitResult as vr, BrokerStatsSchema as vt, createEventBusSliceSource as w, NoCallerError as wn, collectSecretMarkerRefs as wr, CameraStreamSchema as wt, createDeviceProxy as x, FilterRequiredError as xn, secretTreeFromPaths as xr, CamProfileSchema as xt, DEVICE_SCOPED_CAPS as y, BatchTooLargeError as yn, mergeSecretStatePaths as yr, BrokerStatusSchema as yt, CALLER_STAMPED_CAPABILITIES as z, RECORD_BATCH_MAX_BYTES as zn, emitReadiness as zr, DISPLAY_PREFERENCES as zt };
10444
+ export { toNodeId as $, RECORD_SECRET_COLLECTION_PREFIX as $n, SECRET_CLEAR as $r, entryBody as $t, HF_REPO as A, RECORDS_ERROR_CODES as An, resolveSecretMarkers as Ar, FrameHandleSchema as At, DEVICE_CHILDREN_BATCH_MAX as B, asRecordsError as Bn, normalizeNodeId as Br, parseProfileBrokerId as Bt, addonSliceHandleApi as C, BatchTooLargeError as Cn, mergeSecretStatePaths as Cr, BrokerStatusSchema as Ct, createSliceHandle as D, InvalidRecordError as Dn, KeychainWriteRefusedError as Dr, CamStreamResolutionSchema as Dt, createMirrorSource as E, ForeignSecretMarkerError as En, secretTreeFromSchema as Er, CamStreamKindSchema as Et, RawStateResultSchema as F, RecordsError as Fn, formatSecretScope as Fr, StreamSourceSchema as Ft, describeCustomActions as G, RECORD_DATABASES as Gn, WELL_KNOWN_TABS as Gr, ReadingQuantitySchema as Gt, withoutCallerStamp as H, RECORD_BATCH_MAX as Hn, createEvent as Hr, DEFAULT_DISPLAY_PREFERENCE as Ht, deviceOpsCapability as I, RevConflictError as In, globalSecretScope as Ir, SubscribeAudioChunksInputSchema as It, AddonPageDeclarationSchema as J, RECORD_ID_MAX_LENGTH as Jn, collectHydratedFieldValues as Jr, historyUnitFor as Jt, deviceCustomAction as K, RECORD_DEFAULT_MAX_DATA_BYTES as Kn, WELL_KNOWN_TAB_MAP as Kr, baseUnitOf as Kt, viewerUiCapability as L, TransactRefusedError as Ln, isSecretRef as Lr, SubscribeAudioChunksResultSchema as Lt, CAP_ADVANCE_FIELDS as M, RecordSecretUnavailableError as Mn, SECRET_REF_SCHEME as Mr, ProfileSlotSchema as Mt, CAP_NAMES as N, RecordTooLargeError as Nn, arrayItemFieldPath as Nr, ProfileSlotStatusSchema as Nt, DEFAULT_TOKEN_EXPIRY as O, NoCallerError as On, collectSecretMarkerRefs as Or, CameraStreamSchema as Ot, CAP_STATE_LEAVES as P, RecordUniqueViolationError as Pn, buildSecretRef as Pr, StreamSourceEntrySchema$1 as Pt, readNodePin as Q, RECORD_QUERY_MAX as Qn, resolveHydratedFieldValue as Qr, defineEntryKind as Qt, PipelineRunResultBridge as R, UnindexedFilterError as Rn, normalizeSecretOwner as Rr, makeProfileBrokerId as Rt, invokeTrpcLeaf as S, isZodSecret as Sn, normalizeAddonInitResult as Sr, BrokerStatsSchema as St, createLazyTrpcSource as T, FilterRequiredError as Tn, secretTreeFromPaths as Tr, CamProfileSchema as Tt, customAction as U, RECORD_BATCH_MAX_BYTES as Un, emitReadiness as Ur, DISPLAY_PREFERENCES as Ut, CALLER_STAMPED_CAPABILITIES as V, recordsErrorFromMessage as Vn, createDurableState as Vr, selectAssignedProfileSlots as Vt, defineCustomActions as W, RECORD_CLASSES as Wn, isEvent as Wr, QUANTITY_BASE as Wt, CAP_NODE_PIN_CONTEXT_KEY as X, RECORD_MAX_INDEXES as Xn, dehydrateSchema as Xr, readingMeta as Xt, addonPagesSourceCapability as Y, RECORD_MAX_DATA_BYTES as Yn, dehydrateConfigField as Yr, isReadingQuantity as Yt, nodePin as Z, RECORD_MAX_INDEX_FIELDS as Zn, hydrateSchema as Zr, makeInMemoryRecords as Zt, readErrorI18n as _, isAudioChunkFormat as _i, recordSecretCollection as _n, DATAPLANE_SECRET_HEADER as _r, emitDownForOwnedCaps as _t, asJsonArray as a, makeSecretMarker as ai, RecordKindDeclarationSchema as an, MIN_SCRUBBED_LENGTH as ar, PROVIDER_PIN_FIELD as at, isDeviceScopedCap as b, SECRET_META as bn, BaseAddon as br, AudioChunkFormatSchema as bt, asString as c, collectKeychainStoredKeys as ci, StoredRecordKindDeclarationSchema as cn, knownSecretCount as cr, historyItemFieldPath as ct, parseJsonUnknown as d, isSecretConfigField as di, defineRecordKinds as dn, shortSecretRefHash as dr, optionalMethod as dt, classifySecretWrite as ei, createRecordsAccess as en, RECORD_SETTINGS_MAX_ROWS as er, DEFAULT_RUNTIME_STATE_DURABILITY as et, hfModelUrl as f, omitTransientConfig as fi, REMOVE_LEAF as fn, PEER_BYTES_CHUNK_BYTES as fr, resolveCapMount as ft, ErrorI18nPayloadSchema as g, expandAudioChunkToF32le as gi, recordArrayItemPath as gn, PeerBytesTicketSchema as gr, ReadinessTimeoutError as gt, ErrorCodeSchema as h, audioChunkBytesPerSample as hi, parseSecretPath as hn, PEER_BYTES_TICKET_TTL_MS as hr, ReadinessRegistry as ht, asBoolean as i, isSecretMarkerLike as ii, RecordIndexSchema as in, createSecretsAccess as ir, HISTORY_UNIT_LABELS as it, RUNTIME_DEFAULTS as j, RecordNotFoundError as jn, transformSecretWrite as jr, ProfileRtspEntrySchema as jt, HF_BASE_URL as k, PlaintextSecretError as kn, isSecretRefOwnedBy as kr, DecodedAudioChunkSchema as kt, parseJsonArray as l, collectSecretConfigKeys as li, assertValidDeclaration as ln, registerKnownSecret as lr, isDeviceConfigCap as lt, CamstackError as m, AUDIO_CHUNK_FORMATS as mi, mapSecretLeaves as mn, PEER_BYTES_STALL_MS as mr, MODEL_FORMATS as mt, sleepCancellable as n, isSecretFieldView as ni, EntryDescriptorSchema as nn, resolveSecretViewsIn as nr, DEVICE_STATUS_METHOD as nt, asJsonObject as o, toSecretFieldView as oi, RecordKindNameSchema as on, clearKnownSecrets as or, event as ot, BOOT_RECOVERY_BACKOFF_MS as p, schemaDeclaresAnyField as pi, collectSecretLeaves as pn, PEER_BYTES_MAX_OUTSTANDING as pr, systemMethod as pt, adminUiCapability as q, RECORD_DELETE_BATCH as qn, collectHydratedFieldEntries as qr, displayUnitFor as qt, maskUrlCredentials as r, isSecretMarker as ri, RecordFieldPathSchema as rn, REVALIDATE_AFTER_MS as rr, HISTORY_DEFAULT_MIN_INTERVAL_MS as rt, asNumber as s, REDACTED_SECRET as si, RecordRetentionSchema as sn, forgetKnownSecret as sr, expandCapMethods as st, sleep as t, isSecretClear as ti, assertTransactScope as tn, RECORD_SWEEP_INTERVAL_MS as tr, DEVICE_SETTINGS_CONTRIBUTION_METHODS as tt, parseJsonObject as u, isKeychainStoredField as ui, declarationsOf as un, scrubKnownSecrets as ur, method as ut, userError as v, recordSecretRef as vn, SHARE_VIEW_KINDS as vr, readinessKey as vt, createEventBusSliceSource as w, DeclarationRefusedError as wn, parseSecretStatePath as wr, CAM_PROFILE_ORDER as wt, createDeviceProxy as x, collectZodSecretPaths as xn, classifyStoreError as xr, AudioStreamPickSchema as xt, DEVICE_SCOPED_CAPS as y, secretArrayPrefixes as yn, DisposerChain as yr, scopeKey as yt, PipelineStepInputSchema as z, UnknownRecordKindError as zn, parseSecretRef as zr, makeSourceBrokerId as zt };