@camstack/addon-admin-ui 1.2.494 → 1.2.496

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 (123) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/assets/{AddonAssetIcon-CgWjLKk-.js → AddonAssetIcon-DIGI0J-I.js} +1 -1
  3. package/dist/assets/{Addons-DvVQLHYU.js → Addons-BXBVaw0C.js} +1 -1
  4. package/dist/assets/{AdminPage-C0r5zsSv.js → AdminPage-rM4C_UeK.js} +1 -1
  5. package/dist/assets/{AdminSectionedPage-DwsUo4EW.js → AdminSectionedPage-hs_sRKSH.js} +1 -1
  6. package/dist/assets/{AiProfiles-CCNMFTxn.js → AiProfiles-FyDOlZrB.js} +1 -1
  7. package/dist/assets/BrokerEditorDialog-CpjjEowc.js +1 -0
  8. package/dist/assets/{Build-CtmT_R8_.js → Build-BHWi77ox.js} +1 -1
  9. package/dist/assets/{Calendars-Ao-tS0PF.js → Calendars-DpfM0tWi.js} +1 -1
  10. package/dist/assets/{Cluster-CE81o26H.js → Cluster-CGbK_RcF.js} +1 -1
  11. package/dist/assets/{CompositionBlockEditor-B8u93ElJ.js → CompositionBlockEditor-C-oGyTOT.js} +1 -1
  12. package/dist/assets/{CompositionEditorPage-6AUfHY1o.js → CompositionEditorPage--pC-fQTK.js} +1 -1
  13. package/dist/assets/{Data-CqaMZGAp.js → Data-5YjPSX0u.js} +1 -1
  14. package/dist/assets/{DeviceDetail-2kN5rJi9.js → DeviceDetail-MgYrZi-H.js} +2 -2
  15. package/dist/assets/{DeviceDoActionFields-DjenLQhb.js → DeviceDoActionFields-C8dC5weu.js} +1 -1
  16. package/dist/assets/{Devices-Dr7eLqzX.js → Devices-BDxPWKee.js} +1 -1
  17. package/dist/assets/{EmbedPlayerPage-BLEcd92w.js → EmbedPlayerPage-CXfoZEoy.js} +1 -1
  18. package/dist/assets/{HelperWizard-ORnD7Go1.js → HelperWizard-DPb6SH1D.js} +1 -1
  19. package/dist/assets/{History-C5IUXh_z.js → History-CgY-ADwx.js} +1 -1
  20. package/dist/assets/{Identity-CgLht7I_.js → Identity-CngM910j.js} +1 -1
  21. package/dist/assets/{IntegrationDetail-D4V0UFvA.js → IntegrationDetail-tLO3mmbA.js} +1 -1
  22. package/dist/assets/{IntegrationHub-DYPM9n0O.js → IntegrationHub-M6BlF8kI.js} +1 -1
  23. package/dist/assets/{Integrations-DR8lOmp_.js → Integrations-CEbaKS2K.js} +1 -1
  24. package/dist/assets/{Integrations-CZIgGa_n.js → Integrations-lFHvSwS1.js} +1 -1
  25. package/dist/assets/{Library-BGVlY4Gb.js → Library-owv8dCJn.js} +1 -1
  26. package/dist/assets/{Locations-Bs7rPoST.js → Locations-CIbPLu6Y.js} +1 -1
  27. package/dist/assets/{Logs-Chpfmf_U.js → Logs-BkVwtIoJ.js} +1 -1
  28. package/dist/assets/{MaskShapeCanvas-CEO3VTVU.js → MaskShapeCanvas-BdJHOhru.js} +1 -1
  29. package/dist/assets/{MotionZonesSettings-Dxe-b_w-.js → MotionZonesSettings-eigY1-yb.js} +1 -1
  30. package/dist/assets/{MyAccess-BzV_CLiS.js → MyAccess-kMqHvFdO.js} +1 -1
  31. package/dist/assets/{Network-CXXF6pmK.js → Network-DNgds3SY.js} +1 -1
  32. package/dist/assets/{NodeAddonsSettingsPanel-CK8tFXrH.js → NodeAddonsSettingsPanel-BTLr6xzq.js} +1 -1
  33. package/dist/assets/{Notifications-CT_wLBqJ.js → Notifications-3HA167No.js} +1 -1
  34. package/dist/assets/{Pipeline-BmVY_rER.js → Pipeline-Duxnzw0u.js} +1 -1
  35. package/dist/assets/{PrivacyMaskSettings--AmTjVWH.js → PrivacyMaskSettings-DQxuAo8I.js} +1 -1
  36. package/dist/assets/{Recordings-eoBn0hvv.js → Recordings-DNM6KFbT.js} +1 -1
  37. package/dist/assets/{ScanNetworkModal-I91r0-sE.js → ScanNetworkModal-DGxeTl6N.js} +1 -1
  38. package/dist/assets/{SceneMonitorEditor-BwCuyEh-.js → SceneMonitorEditor-D7lPRwkb.js} +1 -1
  39. package/dist/assets/{SessionsList-BOUHWu5D.js → SessionsList-v1GWS7lS.js} +1 -1
  40. package/dist/assets/{Showroom-NWNa0awE.js → Showroom-BQjG5SEZ.js} +1 -1
  41. package/dist/assets/{System-CQBZlh0y.js → System-1vAVXVvO.js} +1 -1
  42. package/dist/assets/{Terminal-BfKVG_Bt.js → Terminal-CAeZSUkp.js} +1 -1
  43. package/dist/assets/{Viewer-CkBtCp_Y.js → Viewer-CoaaY2ah.js} +1 -1
  44. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-C14xaSJf.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-Dt6nbTOI.js} +1 -1
  45. package/dist/assets/{addon-icons-context-OCEvLUMR.js → addon-icons-context-B-CR3D5Y.js} +1 -1
  46. package/dist/assets/{archive-BbyhgjWL.js → archive-Caq0fiUd.js} +1 -1
  47. package/dist/assets/{assignment-candidates-DUP2GOWL.js → assignment-candidates-oUf0MmfV.js} +1 -1
  48. package/dist/assets/{authed-media-cTjpVxGV.js → authed-media-rsowuJD_.js} +1 -1
  49. package/dist/assets/{bell-off-BSZr41wl.js → bell-off-7NO0NCk5.js} +1 -1
  50. package/dist/assets/{board-model-D7qG11hh.js → board-model-CXoBU-My.js} +1 -1
  51. package/dist/assets/{boxes-C9MrE-GD.js → boxes-CfX2DaXN.js} +1 -1
  52. package/dist/assets/circle-slash-CNw3qaX5.js +1 -0
  53. package/dist/assets/client-UkFHArbd.js +648 -0
  54. package/dist/assets/{cloud-upload-DQNky4H3.js → cloud-upload-Bha3MQZ0.js} +1 -1
  55. package/dist/assets/crop-KD442bNz.js +1 -0
  56. package/dist/assets/{device-integration-icon-C7KbduhE.js → device-integration-icon-Ca6J7BrE.js} +1 -1
  57. package/dist/assets/device-picker-model-C0bjqXeS.js +1 -0
  58. package/dist/assets/{dist-ByomGInQ.js → dist-Bm86l9VH.js} +1 -1
  59. package/dist/assets/dist-Db-bCS6Y.js +648 -0
  60. package/dist/assets/{eraser-CUFimZpD.js → eraser-DcRrD8r0.js} +1 -1
  61. package/dist/assets/{format-C6yn9uIb.js → format-B-Mz_Gp5.js} +1 -1
  62. package/dist/assets/{hard-drive-download-BObH6Vyd.js → hard-drive-download-Ds3LLqZ_.js} +1 -1
  63. package/dist/assets/{hostInit-CCQcehf1.js → hostInit-CLJxS8C0.js} +1 -1
  64. package/dist/assets/i18n-Dodsa0QQ.js +1 -0
  65. package/dist/assets/{icons-oE92iMVl.js → icons-CxLU2kUU.js} +1 -1
  66. package/dist/assets/index-BPZW59_u.css +2 -0
  67. package/dist/assets/index-DAYRmkvA.js +4 -0
  68. package/dist/assets/{key-JyYB9gnI.js → key-CPCN1bXO.js} +1 -1
  69. package/dist/assets/{key-round-CBNBBS9z.js → key-round-DSSlw3bb.js} +1 -1
  70. package/dist/assets/{layers-BSjuwfeB.js → layers-Au38YP9x.js} +1 -1
  71. package/dist/assets/{linked-devices-model-CDombuta.js → linked-devices-model-CAcKgihZ.js} +1 -1
  72. package/dist/assets/{list-ordered-BNIrg43G.js → list-ordered-BcEAxRcq.js} +1 -1
  73. package/dist/assets/{location-owned-usage-Ci-dk4hV.js → location-owned-usage-DC8YfZHt.js} +1 -1
  74. package/dist/assets/{log-in-CMkgyQRs.js → log-in-BIF-VHyB.js} +1 -1
  75. package/dist/assets/{memory-stick-wHF0f3FH.js → memory-stick-dd2TtD8X.js} +1 -1
  76. package/dist/assets/{message-square-plus-DkMEFxkw.js → message-square-plus--EqwnnsY.js} +1 -1
  77. package/dist/assets/{mf-entry-bootstrap-0-ca9b1086.js → mf-entry-bootstrap-0-d8302735.js} +2 -2
  78. package/dist/assets/{mic-off-8IZcOYj3.js → mic-off-C4AEP_LS.js} +1 -1
  79. package/dist/assets/{monitor-off-CLYkAPWS.js → monitor-off-BMFLRGf9.js} +1 -1
  80. package/dist/assets/{monitor-smartphone-BAM_Pnvy.js → monitor-smartphone-BKJ1_LnF.js} +1 -1
  81. package/dist/assets/mount-C0bjqXeS.js +1 -0
  82. package/dist/assets/{player-overlays-C0MwGGCz.js → player-overlays-DVETFMIk.js} +1 -1
  83. package/dist/assets/{recycle-C1WW7862.js → recycle-BayFw4ej.js} +1 -1
  84. package/dist/assets/remoteEntry-BkQqqD-X.js +1 -0
  85. package/dist/assets/{scan-eye-Dt5KUwOk.js → scan-eye-BrzMkZIm.js} +1 -1
  86. package/dist/assets/{scissors-BDs6D_EV.js → scissors-Cdea5FpP.js} +1 -1
  87. package/dist/assets/{search-x-D22Vg4Xu.js → search-x-D5U75yFR.js} +1 -1
  88. package/dist/assets/{send-DdEV1Nk_.js → send-DdLpBXJo.js} +1 -1
  89. package/dist/assets/{settings-2-B7DN8MZt.js → settings-2-E7MRkJ8L.js} +1 -1
  90. package/dist/assets/{sigma-B9KtLJQ5.js → sigma-DQ448qdQ.js} +1 -1
  91. package/dist/assets/{speaker-vP0Jzm3D.js → speaker-8vDFm1aL.js} +1 -1
  92. package/dist/assets/src-CJMN3ac7.js +67 -0
  93. package/dist/assets/{step-inspector-model-Dww7BytV.js → step-inspector-model-DrrErQ-Z.js} +1 -1
  94. package/dist/assets/{table-2-BTRcysei.js → table-2-BWAe4fOI.js} +1 -1
  95. package/dist/assets/{timer-reset-Byxo5HZN.js → timer-reset-BlrgM8RC.js} +1 -1
  96. package/dist/assets/{ungroup-DHuQH4zo.js → ungroup-D9nsaCkT.js} +1 -1
  97. package/dist/assets/{unlink-CLur1WlL.js → unlink-BZggCuRp.js} +1 -1
  98. package/dist/assets/{usb-6aY8GAbW.js → usb-CnowURs8.js} +1 -1
  99. package/dist/assets/{use-scenes-feed-D_SlfxL2.js → use-scenes-feed-CKTWN5k9.js} +1 -1
  100. package/dist/assets/{use-stationary-objects-C0B5p2V8.js → use-stationary-objects-CFZh0JGL.js} +1 -1
  101. package/dist/assets/useEventInvalidation-C0bjqXeS.js +1 -0
  102. package/dist/assets/{useNodeUrlSelection-BMV4SR7x.js → useNodeUrlSelection-CPhmr6x9.js} +1 -1
  103. package/dist/assets/user-round-DX7v4O3o.js +1 -0
  104. package/dist/assets/{user-x-4Hfj3QdW.js → user-x-S0MRC6zp.js} +1 -1
  105. package/dist/assets/{video-6lAlm9YD.js → video-oLlCkBIP.js} +1 -1
  106. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-rJFxt79Z.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-Ddnry646.js} +2 -2
  107. package/dist/index.html +10 -10
  108. package/dist/server/addon.js +676 -76
  109. package/package.json +1 -1
  110. package/dist/assets/BrokerEditorDialog-C0wwGmOj.js +0 -1
  111. package/dist/assets/circle-slash-kaaJHDJP.js +0 -1
  112. package/dist/assets/client-CoTSmvjZ.js +0 -358
  113. package/dist/assets/crop-CPejcRNN.js +0 -1
  114. package/dist/assets/device-picker-model-H2_vXoQ4.js +0 -1
  115. package/dist/assets/dist-yzJdpluK.js +0 -358
  116. package/dist/assets/i18n-DxqJiWy8.js +0 -1
  117. package/dist/assets/index-BVZuhx_2.js +0 -4
  118. package/dist/assets/index-DrkhFGtr.css +0 -2
  119. package/dist/assets/mount-H2_vXoQ4.js +0 -1
  120. package/dist/assets/remoteEntry-BxPdbRHH.js +0 -1
  121. package/dist/assets/src-Cxyx0zt_.js +0 -67
  122. package/dist/assets/useEventInvalidation-H2_vXoQ4.js +0 -1
  123. package/dist/assets/user-round-Cktilqeo.js +0 -1
@@ -1,6 +1,6 @@
1
1
  import path from "node:path";
2
2
  import { fileURLToPath } from "node:url";
3
- //#region ../types/dist/event-category-CT-hz5Rb.mjs
3
+ //#region ../types/dist/event-category-hdMR7CTW.mjs
4
4
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
5
5
  EventCategory["SystemBoot"] = "system.boot";
6
6
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -765,6 +765,11 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
765
765
  */
766
766
  EventCategory["AccessoriesChanged"] = "accessories.onAccessoriesChanged";
767
767
  /**
768
+ * An action run started or ended. Emitted by the `actions` surface.
769
+ * Payload: `ActionRunChanged` (`{ actionId, runId, isRunning, outcome?, lastRunAt, lastError }`).
770
+ */
771
+ EventCategory["ActionsRunChanged"] = "actions.onRunChanged";
772
+ /**
768
773
  * Progress update from a running model conversion job.
769
774
  * Payload: `{ kind: 'model-convert', phase, sessionId?, pct?, detail? }`.
770
775
  * Emitted by `addon-model-studio` on the converting node.
@@ -5443,7 +5448,7 @@ var ZodIssueCode = {
5443
5448
  var ZodFirstPartyTypeKind;
5444
5449
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5445
5450
  //#endregion
5446
- //#region ../types/dist/sleep--jXS9hWo.mjs
5451
+ //#region ../types/dist/sleep-BHjNez61.mjs
5447
5452
  /**
5448
5453
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5449
5454
  * window to float samples (D455).
@@ -8510,6 +8515,8 @@ Object.freeze({ "doorbell": "lastPressedAt" });
8510
8515
  /** Every capability name, so addon code can check a name without the schema graph. */
8511
8516
  var CAP_NAMES = Object.freeze([
8512
8517
  "accessories",
8518
+ "action-source",
8519
+ "actions",
8513
8520
  "addon-pages",
8514
8521
  "addon-pages-source",
8515
8522
  "addon-routes",
@@ -9812,6 +9819,18 @@ Object.freeze({
9812
9819
  "path": "foodLevel",
9813
9820
  "valueType": "number"
9814
9821
  },
9822
+ {
9823
+ "path": "bowlFood",
9824
+ "valueType": "number"
9825
+ },
9826
+ {
9827
+ "path": "eating",
9828
+ "valueType": "boolean"
9829
+ },
9830
+ {
9831
+ "path": "supportsMarkRefilled",
9832
+ "valueType": "boolean"
9833
+ },
9815
9834
  {
9816
9835
  "path": "food1",
9817
9836
  "valueType": "number"
@@ -15358,7 +15377,23 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
15358
15377
  kind: literal("schedule"),
15359
15378
  cron: string().min(1).max(120)
15360
15379
  }),
15361
- object({ kind: literal("manual") })
15380
+ object({ kind: literal("manual") }),
15381
+ object({
15382
+ kind: literal("detection"),
15383
+ /** Class names. A macro class (`animal`, `vehicle`, `person`, `package`)
15384
+ * matches every raw class that maps to it; any other name matches
15385
+ * exactly. */
15386
+ classes: array(string().min(1)).min(1),
15387
+ deviceIds: array(number().int().nonnegative()).min(1),
15388
+ /** The track must have visited at least one of these zones. */
15389
+ zones: array(string().min(1)).min(1).optional(),
15390
+ /** Best-so-far confidence the track must reach. */
15391
+ minScore: number().min(0).max(1).optional()
15392
+ }),
15393
+ object({
15394
+ kind: literal("interval"),
15395
+ minutes: number().int().min(1).max(1440)
15396
+ })
15362
15397
  ]);
15363
15398
  /**
15364
15399
  * One action step.
@@ -15378,28 +15413,47 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
15378
15413
  * is called. The runner still receives a number and is untouched; the
15379
15414
  * resolution is the recipe's job, not the runner's.
15380
15415
  */
15416
+ var AutomationWaitStepSchema = object({
15417
+ kind: literal("wait"),
15418
+ seconds: number().min(0).max(300)
15419
+ });
15420
+ var AutomationCapStepSchema = object({
15421
+ kind: literal("cap"),
15422
+ /**
15423
+ * One device, several same-family devices (locks / climate family / …),
15424
+ * or `{ $var }` for the device that triggered the run. An array is
15425
+ * fan-out at codegen — each id gets the same cap.method call.
15426
+ */
15427
+ deviceId: union([
15428
+ number().int(),
15429
+ array(number().int()).min(1),
15430
+ object({ $var: string().min(1) })
15431
+ ]),
15432
+ cap: string().min(1),
15433
+ method: string().min(1),
15434
+ /** Values may carry `{{vars.x}}` slots, or be exactly `{ $var: 'name' }`, which
15435
+ * SUBSTITUTE and do not evaluate (§3.2.3). Anything beyond substitution is
15436
+ * the expression leaf. */
15437
+ args: record(string(), unknown()).optional()
15438
+ });
15439
+ /**
15440
+ * The steps an internal Action may contain: cap and wait, and nothing that can
15441
+ * call back into an Action — so an Action can never reach itself (no cycles).
15442
+ */
15443
+ var ActionStepSchema = discriminatedUnion("kind", [AutomationWaitStepSchema, AutomationCapStepSchema]);
15381
15444
  var AutomationActionSchema = discriminatedUnion("kind", [
15445
+ AutomationWaitStepSchema,
15446
+ AutomationCapStepSchema,
15382
15447
  object({
15383
- kind: literal("wait"),
15384
- seconds: number().min(0).max(300)
15385
- }),
15386
- object({
15387
- kind: literal("cap"),
15388
- /**
15389
- * One device, several same-family devices (locks / climate family / …),
15390
- * or `{ $var }` for the device that triggered the run. An array is
15391
- * fan-out at codegen — each id gets the same cap.method call.
15392
- */
15393
- deviceId: union([
15394
- number().int(),
15395
- array(number().int()).min(1),
15396
- object({ $var: string().min(1) })
15397
- ]),
15398
- cap: string().min(1),
15399
- method: string().min(1),
15400
- /** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
15401
- * evaluate (§3.2.3). Anything beyond substitution is the expression leaf. */
15402
- args: record(string(), unknown()).optional()
15448
+ kind: literal("action"),
15449
+ /** An entry of the `actions` surface (`internal:<uuid>` or `<addonId>:<localId>`). */
15450
+ actionId: string().min(1),
15451
+ /** Values for the action's declared variables; the others take their default. */
15452
+ variables: record(string(), union([
15453
+ string(),
15454
+ number(),
15455
+ boolean()
15456
+ ])).optional()
15403
15457
  }),
15404
15458
  object({
15405
15459
  kind: literal("code"),
@@ -15408,10 +15462,356 @@ var AutomationActionSchema = discriminatedUnion("kind", [
15408
15462
  code: string().min(1).max(2e4)
15409
15463
  })
15410
15464
  ]);
15465
+ /**
15466
+ * How a trigger that arrives while the automation is busy (or cooling down) is
15467
+ * handled. One of the automation's execution modes, never a property of its
15468
+ * actions. Absent means `single`.
15469
+ *
15470
+ * - `single` — drop the trigger while a run is in progress (traced + logged).
15471
+ * - `restart` — abort the run in progress (at its next step boundary), start fresh.
15472
+ * - `queued` — queue up to `max` triggers, drop the rest (traced).
15473
+ * - `parallel` — up to `max` runs at once, drop the rest (traced).
15474
+ * - `cooldown` — `single`, and no new run until `minutes` after the last run
15475
+ * STARTED; persisted across a restart. A manual trigger bypasses only this
15476
+ * wait, never the single/queued limits.
15477
+ */
15478
+ var AutomationRunModeSchema = discriminatedUnion("mode", [
15479
+ object({ mode: literal("single") }),
15480
+ object({ mode: literal("restart") }),
15481
+ object({
15482
+ mode: literal("queued"),
15483
+ max: number().int().min(1).max(10)
15484
+ }),
15485
+ object({
15486
+ mode: literal("parallel"),
15487
+ max: number().int().min(1).max(10)
15488
+ }),
15489
+ object({
15490
+ mode: literal("cooldown"),
15491
+ minutes: number().int().min(1).max(1440)
15492
+ })
15493
+ ]);
15411
15494
  var AutomationRecipeSchema = object({
15412
15495
  triggers: array(AutomationTriggerSchema),
15413
15496
  conditions: AutomationConditionSchema.optional(),
15414
- actions: array(AutomationActionSchema)
15497
+ actions: array(AutomationActionSchema),
15498
+ runMode: AutomationRunModeSchema.optional(),
15499
+ /** How many run traces the automation keeps (default {@link DEFAULT_TRACE_KEEP}). */
15500
+ keepTraces: number().int().min(1).max(100).optional()
15501
+ });
15502
+ new Set([
15503
+ {
15504
+ id: "person",
15505
+ name: "Person"
15506
+ },
15507
+ {
15508
+ id: "vehicle",
15509
+ name: "Vehicle"
15510
+ },
15511
+ {
15512
+ id: "animal",
15513
+ name: "Animal"
15514
+ },
15515
+ {
15516
+ id: "package",
15517
+ name: "Package"
15518
+ }
15519
+ ].map((l) => l.id));
15520
+ var COCO_TO_MACRO = {
15521
+ mapping: {
15522
+ person: "person",
15523
+ bicycle: "vehicle",
15524
+ car: "vehicle",
15525
+ motorcycle: "vehicle",
15526
+ airplane: "vehicle",
15527
+ bus: "vehicle",
15528
+ train: "vehicle",
15529
+ truck: "vehicle",
15530
+ boat: "vehicle",
15531
+ bird: "animal",
15532
+ cat: "animal",
15533
+ dog: "animal",
15534
+ horse: "animal",
15535
+ sheep: "animal",
15536
+ cow: "animal",
15537
+ elephant: "animal",
15538
+ bear: "animal",
15539
+ zebra: "animal",
15540
+ giraffe: "animal",
15541
+ suitcase: "package",
15542
+ backpack: "package",
15543
+ handbag: "package"
15544
+ },
15545
+ preserveOriginal: false
15546
+ };
15547
+ new Set(Object.values(COCO_TO_MACRO.mapping));
15548
+ /**
15549
+ * Run traces — what an automation (or, later, an Action run) DID, node by node,
15550
+ * so the editor can paint every block green or red with its reason.
15551
+ *
15552
+ * A trace is data, not a log: it covers the WHOLE tree — the trigger stage,
15553
+ * every condition node (containers and leaves, including the ones a
15554
+ * short-circuit never reached), the run-mode verdict and every action step —
15555
+ * each addressed by a stable path (`conditions.0.1`, `actions.2`, or `steps.N`
15556
+ * for an Action run). Skipped
15557
+ * evaluations are traced too, and identical consecutive skips collapse into a
15558
+ * repeat count so a trigger that fails every 5 minutes cannot flush real runs.
15559
+ *
15560
+ * {@link AutomationStepTraceSchema} is deliberately free of automation
15561
+ * vocabulary so an Action run records the same step shape.
15562
+ */
15563
+ /** A value a trace may show: JSON primitives and short lists, nothing deeper. */
15564
+ var TraceValueSchema = union([
15565
+ string(),
15566
+ number(),
15567
+ boolean(),
15568
+ _null(),
15569
+ array(union([string(), number()]))
15570
+ ]);
15571
+ var AutomationRunOutcomeSchema = _enum([
15572
+ "ran",
15573
+ "skipped-trigger",
15574
+ "skipped-conditions",
15575
+ "skipped-cooldown",
15576
+ "skipped-overlap",
15577
+ "failed",
15578
+ "aborted"
15579
+ ]);
15580
+ /** `not-evaluated` = a short-circuit never reached the node. */
15581
+ var TraceNodeOutcomeSchema = _enum([
15582
+ "pass",
15583
+ "fail",
15584
+ "not-evaluated"
15585
+ ]);
15586
+ var AutomationTriggerTraceSchema = object({
15587
+ kind: string().min(1),
15588
+ outcome: _enum(["pass", "fail"]),
15589
+ /** Why an event was rejected ("class person not in [dog]") or what fired. */
15590
+ reason: string(),
15591
+ /** deviceId, className, trackId, score … — only what the trigger exposes. */
15592
+ vars: record(string(), TraceValueSchema)
15593
+ });
15594
+ var AutomationConditionTraceNodeSchema = object({
15595
+ /** `conditions` for the root, `conditions.<i>` for its i-th child, … */
15596
+ path: string().min(1),
15597
+ kind: _enum([
15598
+ "all",
15599
+ "any",
15600
+ "not",
15601
+ "condition",
15602
+ "expression"
15603
+ ]),
15604
+ outcome: TraceNodeOutcomeSchema,
15605
+ reason: string(),
15606
+ deviceId: number().int().optional(),
15607
+ cap: string().optional(),
15608
+ fieldPath: string().optional(),
15609
+ operator: string().optional(),
15610
+ expected: TraceValueSchema.optional(),
15611
+ /** What the mirror held; `null` when it held nothing (unknown). */
15612
+ observed: TraceValueSchema.optional()
15613
+ });
15614
+ var AutomationRunVerdictSchema = object({
15615
+ mode: AutomationRunModeSchema,
15616
+ decision: _enum([
15617
+ "run",
15618
+ "queued",
15619
+ "restart",
15620
+ "drop",
15621
+ "cooldown",
15622
+ "bypass"
15623
+ ]),
15624
+ reason: string()
15625
+ });
15626
+ /** One executed (or not-run) step — shared by automations and Action runs. */
15627
+ var AutomationStepTraceSchema = object({
15628
+ /** `actions.<i>` */
15629
+ path: string().min(1),
15630
+ kind: string().min(1),
15631
+ cap: string().optional(),
15632
+ method: string().optional(),
15633
+ deviceId: number().int().optional(),
15634
+ startedAt: number().optional(),
15635
+ endedAt: number().optional(),
15636
+ outcome: _enum([
15637
+ "ok",
15638
+ "error",
15639
+ "not-run"
15640
+ ]),
15641
+ message: string().optional()
15642
+ });
15643
+ var AutomationRunTraceSchema = object({
15644
+ runId: string().min(1),
15645
+ startedAt: number(),
15646
+ endedAt: number(),
15647
+ trigger: AutomationTriggerTraceSchema,
15648
+ conditions: array(AutomationConditionTraceNodeSchema),
15649
+ verdict: AutomationRunVerdictSchema.optional(),
15650
+ steps: array(AutomationStepTraceSchema),
15651
+ outcome: AutomationRunOutcomeSchema,
15652
+ /** How many identical consecutive skips this trace stands for (>= 1). */
15653
+ repeat: number().int().min(1),
15654
+ /** When the latest of those repeats happened. */
15655
+ lastAt: number()
15656
+ });
15657
+ /**
15658
+ * What the hub's `runs` ledger holds for one owner (`automation:<blockId>` or
15659
+ * `action:<actionId>`): the cooldown stamp and the trace ring.
15660
+ */
15661
+ var AutomationStateDocSchema = object({
15662
+ version: literal(1),
15663
+ lastRunStartedAt: number().nullable(),
15664
+ traces: array(AutomationRunTraceSchema)
15665
+ });
15666
+ /**
15667
+ * Actions — named, runnable things an operator (or an automation) can start,
15668
+ * declared as LIST ENTRIES, never as devices.
15669
+ *
15670
+ * An entry is either **internal** (a short list of cap/wait steps kept in the
15671
+ * hub's `actions` record kind) or declared by an addon through the
15672
+ * `action-source` collection (a Home Assistant script, a scene …). The one
15673
+ * surface the UI and automations talk to is the `actions` cap; it keeps no
15674
+ * catalog of its own (D3) — every `list` asks the providers live.
15675
+ *
15676
+ * This file is the data half: the entry schema, the variables an entry may
15677
+ * declare, and the pure resolution of the values a run was given. It holds no
15678
+ * runtime.
15679
+ */
15680
+ /** What a variable's value is. `select` takes one of `options`. */
15681
+ var ActionVariableTypeSchema = _enum([
15682
+ "string",
15683
+ "number",
15684
+ "boolean",
15685
+ "select"
15686
+ ]);
15687
+ var ACTION_VARIABLE_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
15688
+ var ActionVariableValueSchema = union([
15689
+ string(),
15690
+ number(),
15691
+ boolean()
15692
+ ]);
15693
+ /**
15694
+ * One declared variable. Steps reference it as `{ $var: 'name' }` (the whole
15695
+ * value) or `{{vars.name}}` (inside a string) in their args.
15696
+ */
15697
+ var ActionVariableSchema = object({
15698
+ name: string().regex(ACTION_VARIABLE_NAME_RE),
15699
+ label: string().min(1).max(120).optional(),
15700
+ type: ActionVariableTypeSchema,
15701
+ required: boolean().optional(),
15702
+ default: ActionVariableValueSchema.optional(),
15703
+ /** The allowed values of a `select`. */
15704
+ options: array(string().min(1)).min(1).optional()
15705
+ }).superRefine((v, ctx) => {
15706
+ if (v.type === "select" && v.options === void 0) ctx.addIssue({
15707
+ code: "custom",
15708
+ message: "a select variable needs options",
15709
+ path: ["options"]
15710
+ });
15711
+ if (v.default !== void 0 && variableValueError(v, v.default) !== null) ctx.addIssue({
15712
+ code: "custom",
15713
+ message: variableValueError(v, v.default) ?? "invalid default",
15714
+ path: ["default"]
15715
+ });
15716
+ });
15717
+ /** Why `value` is not a legal value for the variable, or null when it is. */
15718
+ function variableValueError(variable, value) {
15719
+ switch (variable.type) {
15720
+ case "string": return typeof value === "string" ? null : `variable "${variable.name}" must be a string`;
15721
+ case "number": return typeof value === "number" && Number.isFinite(value) ? null : `variable "${variable.name}" must be a number`;
15722
+ case "boolean": return typeof value === "boolean" ? null : `variable "${variable.name}" must be true or false`;
15723
+ case "select": return typeof value === "string" && (variable.options ?? []).includes(value) ? null : `variable "${variable.name}" must be one of ${(variable.options ?? []).join(", ")}`;
15724
+ }
15725
+ }
15726
+ var ActionSourceKindSchema = _enum(["internal", "addon"]);
15727
+ function isInternalActionId(actionId) {
15728
+ return actionId.startsWith("internal:") && actionId.length > 9;
15729
+ }
15730
+ /** The addon behind a `<addonId>:<localId>` id, or null for anything else (internal included). */
15731
+ function addonIdOfActionId(actionId) {
15732
+ if (isInternalActionId(actionId)) return null;
15733
+ const at = actionId.indexOf(":");
15734
+ return at > 0 && at < actionId.length - 1 ? actionId.slice(0, at) : null;
15735
+ }
15736
+ var ActionStatusSchema = object({
15737
+ isRunning: boolean(),
15738
+ /** Ms epoch the latest run STARTED; null when it never ran. */
15739
+ lastRunAt: number().nullable(),
15740
+ /** The latest run's failure; null on success or when it never ran. */
15741
+ lastError: string().nullable()
15742
+ });
15743
+ var ActionEntrySchema = object({
15744
+ /** `internal:<uuid>` or `<addonId>:<localId>`. */
15745
+ id: string().min(3),
15746
+ name: string().min(1).max(120),
15747
+ /** The addon that declared it; `core-blocks` for an internal one. */
15748
+ addonId: string().min(1),
15749
+ source: ActionSourceKindSchema,
15750
+ /** An addon-declared entry is edited where it was declared. */
15751
+ readOnly: boolean(),
15752
+ /** Internal only: cap and wait steps. No action-in-action, so no cycles. */
15753
+ steps: array(ActionStepSchema).min(1).max(50).optional(),
15754
+ variables: array(ActionVariableSchema).max(20).optional(),
15755
+ status: ActionStatusSchema
15756
+ }).superRefine((entry, ctx) => {
15757
+ if (entry.source === "internal") {
15758
+ if (!isInternalActionId(entry.id)) ctx.addIssue({
15759
+ code: "custom",
15760
+ message: "an internal action id is internal:<uuid>",
15761
+ path: ["id"]
15762
+ });
15763
+ return;
15764
+ }
15765
+ if (entry.steps !== void 0) ctx.addIssue({
15766
+ code: "custom",
15767
+ message: "only an internal action carries steps",
15768
+ path: ["steps"]
15769
+ });
15770
+ if (!entry.readOnly) ctx.addIssue({
15771
+ code: "custom",
15772
+ message: "an addon action is read-only here",
15773
+ path: ["readOnly"]
15774
+ });
15775
+ if (addonIdOfActionId(entry.id) === null) ctx.addIssue({
15776
+ code: "custom",
15777
+ message: "an addon action id is <addonId>:<localId>",
15778
+ path: ["id"]
15779
+ });
15780
+ });
15781
+ /** What an operator writes for an internal action. */
15782
+ var ActionInputSchema = object({
15783
+ name: string().min(1).max(120),
15784
+ steps: array(ActionStepSchema).min(1).max(50),
15785
+ variables: array(ActionVariableSchema).max(20).optional()
15786
+ });
15787
+ /** Who started a run. Absent = the operator pressed it. */
15788
+ var ActionRunOriginSchema = object({
15789
+ /** The automation block whose step started it. */
15790
+ blockId: string().min(1).optional() });
15791
+ /** `started` = the caller did not ask to wait. */
15792
+ var ActionRunOutcomeSchema = union([AutomationRunOutcomeSchema, literal("started")]);
15793
+ var ActionRunResultSchema = object({
15794
+ runId: string().min(1),
15795
+ outcome: ActionRunOutcomeSchema,
15796
+ /** Why it did not run, or what failed. */
15797
+ message: string().optional()
15798
+ });
15799
+ _enum([
15800
+ "not-found",
15801
+ "read-only",
15802
+ "invalid-variables",
15803
+ "invalid-steps",
15804
+ "not-linked",
15805
+ "busy"
15806
+ ]);
15807
+ object({
15808
+ actionId: string(),
15809
+ runId: string(),
15810
+ isRunning: boolean(),
15811
+ /** Set when the run ended. */
15812
+ outcome: AutomationRunOutcomeSchema.optional(),
15813
+ lastRunAt: number().nullable(),
15814
+ lastError: string().nullable()
15415
15815
  });
15416
15816
  /**
15417
15817
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
@@ -18955,7 +19355,18 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
18955
19355
  kind: "mutation",
18956
19356
  auth: "admin",
18957
19357
  access: "view"
18958
- });
19358
+ }), method(object({
19359
+ blockId: string().min(1),
19360
+ trace: AutomationRunTraceSchema.optional(),
19361
+ runStartedAt: number().optional(),
19362
+ keepTraces: number().int().min(1).max(100).optional()
19363
+ }), _void(), {
19364
+ kind: "mutation",
19365
+ auth: "admin"
19366
+ }), method(object({ blockId: string().min(1) }), AutomationStateDocSchema, { auth: "admin" }), method(object({ blockId: string().min(1) }), object({
19367
+ traces: array(AutomationRunTraceSchema),
19368
+ lastError: string().nullable()
19369
+ }), { auth: "admin" });
18959
19370
  /**
18960
19371
  * `custom-model-registry` — collection cap exposing operator-registered
18961
19372
  * custom detection models. Each provider (today: `addon-model-studio`)
@@ -44048,51 +44459,6 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
44048
44459
  kind: "mutation",
44049
44460
  auth: "admin"
44050
44461
  });
44051
- new Set([
44052
- {
44053
- id: "person",
44054
- name: "Person"
44055
- },
44056
- {
44057
- id: "vehicle",
44058
- name: "Vehicle"
44059
- },
44060
- {
44061
- id: "animal",
44062
- name: "Animal"
44063
- },
44064
- {
44065
- id: "package",
44066
- name: "Package"
44067
- }
44068
- ].map((l) => l.id));
44069
- var COCO_TO_MACRO = {
44070
- mapping: {
44071
- person: "person",
44072
- bicycle: "vehicle",
44073
- car: "vehicle",
44074
- motorcycle: "vehicle",
44075
- airplane: "vehicle",
44076
- bus: "vehicle",
44077
- train: "vehicle",
44078
- truck: "vehicle",
44079
- boat: "vehicle",
44080
- bird: "animal",
44081
- cat: "animal",
44082
- dog: "animal",
44083
- horse: "animal",
44084
- sheep: "animal",
44085
- cow: "animal",
44086
- elephant: "animal",
44087
- bear: "animal",
44088
- zebra: "animal",
44089
- giraffe: "animal",
44090
- suitcase: "package",
44091
- backpack: "package",
44092
- handbag: "package"
44093
- },
44094
- preserveOriginal: false
44095
- };
44096
44462
  var AUDIO_MACRO_LABELS = [
44097
44463
  {
44098
44464
  id: "speech",
@@ -56641,6 +57007,84 @@ DeviceType.Camera, method(object({ deviceId: number() }), AudioMetricsSnapshotSc
56641
57007
  * would produce more than `maxPoints` samples. */
56642
57008
  sampleEveryMs: number().int().positive().optional()
56643
57009
  }), AudioMetricsHistorySchema);
57010
+ method(object({}), array(ActionEntrySchema), { auth: "admin" }), method(object({
57011
+ actionId: string().min(1),
57012
+ variables: record(string(), ActionVariableValueSchema).optional()
57013
+ }), _void(), {
57014
+ kind: "mutation",
57015
+ auth: "admin"
57016
+ }), method(object({ actionId: string().min(1) }), _void(), {
57017
+ kind: "mutation",
57018
+ auth: "admin"
57019
+ });
57020
+ /**
57021
+ * actions — the ONE surface for runnable actions, for the UI and for
57022
+ * automations. Provided by the core-blocks builtin on the hub.
57023
+ *
57024
+ * An action is a LIST ENTRY, not a device (D883): either internal (cap and wait
57025
+ * steps, kept in the hub's `actions` record kind) or declared by an addon over
57026
+ * `action-source`. `list` asks every `action-source` provider LIVE and overlays
57027
+ * the run status from the hub's `runs` ledger; there is no catalog here to
57028
+ * drift (D3).
57029
+ *
57030
+ * **Permissions follow the camera, as linked devices do.** An action is linked
57031
+ * to cameras by the operator (`setLinks`, D356: nothing links itself). A
57032
+ * non-admin may `get` / `run` an action only through a camera they may see that
57033
+ * links it: they name the camera (`deviceId`, a top-level field so the scope
57034
+ * gate sees it) and the provider refuses an action that camera does not link.
57035
+ * An admin, and an in-process caller (an automation block), may run any action.
57036
+ * Every refusal is typed (`[not-linked] …`) and logged.
57037
+ *
57038
+ * A second `run` of an action that is already running is REFUSED — traced and
57039
+ * logged — never queued.
57040
+ */
57041
+ var ActionIdInput = object({ actionId: string().min(1) });
57042
+ var ActionLinksSchema = object({
57043
+ deviceId: number().int().nonnegative(),
57044
+ actionIds: array(string().min(1)).max(100)
57045
+ });
57046
+ method(object({}), array(ActionEntrySchema), { auth: "admin" }), method(object({
57047
+ actionId: string().min(1),
57048
+ deviceId: number().int().nonnegative().optional()
57049
+ }), object({ action: ActionEntrySchema.nullable() }), {
57050
+ role: "viewer",
57051
+ auth: "protected",
57052
+ kind: "query",
57053
+ caller: "required"
57054
+ }), method(object({
57055
+ actionId: string().min(1),
57056
+ variables: record(string(), ActionVariableValueSchema).optional(),
57057
+ wait: boolean().optional(),
57058
+ origin: ActionRunOriginSchema.optional(),
57059
+ deviceId: number().int().nonnegative().optional()
57060
+ }), ActionRunResultSchema, {
57061
+ role: "viewer",
57062
+ auth: "protected",
57063
+ kind: "mutation",
57064
+ caller: "required"
57065
+ }), method(ActionIdInput, _void(), {
57066
+ kind: "mutation",
57067
+ auth: "admin"
57068
+ }), method(ActionIdInput, object({ traces: array(AutomationRunTraceSchema) }), { auth: "admin" }), method(object({ action: ActionInputSchema }), object({ action: ActionEntrySchema }), {
57069
+ kind: "mutation",
57070
+ auth: "admin"
57071
+ }), method(object({
57072
+ actionId: string().min(1),
57073
+ action: ActionInputSchema.partial()
57074
+ }), object({ action: ActionEntrySchema }), {
57075
+ kind: "mutation",
57076
+ auth: "admin"
57077
+ }), method(ActionIdInput, _void(), {
57078
+ kind: "mutation",
57079
+ auth: "admin"
57080
+ }), method(object({ deviceId: number().int().nonnegative() }), array(ActionEntrySchema), {
57081
+ role: "viewer",
57082
+ auth: "protected",
57083
+ kind: "query"
57084
+ }), method(object({ deviceId: number().int().nonnegative() }), ActionLinksSchema, { auth: "admin" }), method(ActionLinksSchema, ActionLinksSchema, {
57085
+ kind: "mutation",
57086
+ auth: "admin"
57087
+ });
56644
57088
  object({
56645
57089
  /** Whether the automation is currently enabled. Disabled automations
56646
57090
  * ignore their trigger block — manual `trigger` still works. */
@@ -60886,10 +61330,20 @@ var PetFeederDeviceStatusSchema = _enum([
60886
61330
  ]);
60887
61331
  var gramsPortion = number().int().min(4).max(200);
60888
61332
  object({
60889
- /** Food currently in the bowl (grams). Null when the device has not
60890
- * reported a reading yet. On dual-hopper models this is the combined
60891
- * bowl reading; per-hopper levels live in `food1`/`food2`. */
61333
+ /** Food in the TANK (hopper), as the feeder's own sensor reports it
61334
+ * (`state.food`). A coarse level code, not grams — `0` is empty. The
61335
+ * amount in the bowl is `bowlFood`. On dual-hopper models this is the
61336
+ * combined reading; per-hopper levels live in `food1`/`food2`. Null when
61337
+ * the device has not reported yet. */
60892
61338
  foodLevel: number().nullable().meta(readingMeta("none")),
61339
+ /** Food in the BOWL as the feeder reports it (`state.bowl`), in the
61340
+ * feeder's own units. Null when the model reports none. */
61341
+ bowlFood: number().nullable().meta(readingMeta("none")),
61342
+ /** True while the pet is eating (`state.eating`). */
61343
+ eating: boolean(),
61344
+ /** Whether `markFoodReplenished` does anything on this model. When false
61345
+ * the client must not offer it. */
61346
+ supportsMarkRefilled: boolean(),
60893
61347
  /** Hopper-1 food level (grams) on dual-hopper feeders; null on
60894
61348
  * single-hopper models. */
60895
61349
  food1: number().nullable().meta(readingMeta("none")),
@@ -60897,8 +61351,8 @@ object({
60897
61351
  * single-hopper models. */
60898
61352
  food2: number().nullable().meta(readingMeta("none")),
60899
61353
  /** Derived low-food flag — mirrors the HA `food_level` binary_sensor
60900
- * (`device_class: problem`, on = low). True when the bowl is empty /
60901
- * below the feeder's low threshold. */
61354
+ * (`device_class: problem`, on = low). True when the tank reports empty,
61355
+ * or, on a dual-hopper model, when EITHER hopper is empty. */
60902
61356
  lowFood: boolean(),
60903
61357
  /** Battery charge 0..100 (%). Null on mains-powered models or when the
60904
61358
  * device has no battery reading. */
@@ -65646,6 +66100,104 @@ Object.freeze({
65646
66100
  access: "create",
65647
66101
  role: "admin"
65648
66102
  },
66103
+ "actions.create": {
66104
+ capName: "actions",
66105
+ capScope: "system",
66106
+ addonId: null,
66107
+ access: "create",
66108
+ role: "admin"
66109
+ },
66110
+ "actions.delete": {
66111
+ capName: "actions",
66112
+ capScope: "system",
66113
+ addonId: null,
66114
+ access: "delete",
66115
+ role: "admin"
66116
+ },
66117
+ "actions.get": {
66118
+ capName: "actions",
66119
+ capScope: "system",
66120
+ addonId: null,
66121
+ access: "view",
66122
+ role: "viewer"
66123
+ },
66124
+ "actions.getLinks": {
66125
+ capName: "actions",
66126
+ capScope: "system",
66127
+ addonId: null,
66128
+ access: "view",
66129
+ role: "admin"
66130
+ },
66131
+ "actions.getTraces": {
66132
+ capName: "actions",
66133
+ capScope: "system",
66134
+ addonId: null,
66135
+ access: "view",
66136
+ role: "admin"
66137
+ },
66138
+ "actions.list": {
66139
+ capName: "actions",
66140
+ capScope: "system",
66141
+ addonId: null,
66142
+ access: "view",
66143
+ role: "admin"
66144
+ },
66145
+ "actions.listForCamera": {
66146
+ capName: "actions",
66147
+ capScope: "system",
66148
+ addonId: null,
66149
+ access: "view",
66150
+ role: "viewer"
66151
+ },
66152
+ "actions.run": {
66153
+ capName: "actions",
66154
+ capScope: "system",
66155
+ addonId: null,
66156
+ access: "create",
66157
+ role: "viewer"
66158
+ },
66159
+ "actions.setLinks": {
66160
+ capName: "actions",
66161
+ capScope: "system",
66162
+ addonId: null,
66163
+ access: "create",
66164
+ role: "admin"
66165
+ },
66166
+ "actions.stop": {
66167
+ capName: "actions",
66168
+ capScope: "system",
66169
+ addonId: null,
66170
+ access: "create",
66171
+ role: "admin"
66172
+ },
66173
+ "actions.update": {
66174
+ capName: "actions",
66175
+ capScope: "system",
66176
+ addonId: null,
66177
+ access: "create",
66178
+ role: "admin"
66179
+ },
66180
+ "actionSource.listActions": {
66181
+ capName: "action-source",
66182
+ capScope: "system",
66183
+ addonId: null,
66184
+ access: "view",
66185
+ role: "admin"
66186
+ },
66187
+ "actionSource.runAction": {
66188
+ capName: "action-source",
66189
+ capScope: "system",
66190
+ addonId: null,
66191
+ access: "create",
66192
+ role: "admin"
66193
+ },
66194
+ "actionSource.stopAction": {
66195
+ capName: "action-source",
66196
+ capScope: "system",
66197
+ addonId: null,
66198
+ access: "create",
66199
+ role: "admin"
66200
+ },
65649
66201
  "addonPages.listPages": {
65650
66202
  capName: "addon-pages",
65651
66203
  capScope: "system",
@@ -66927,6 +67479,13 @@ Object.freeze({
66927
67479
  access: "view",
66928
67480
  role: "admin"
66929
67481
  },
67482
+ "coreBlocks.getAutomationRunState": {
67483
+ capName: "core-blocks",
67484
+ capScope: "system",
67485
+ addonId: null,
67486
+ access: "view",
67487
+ role: "admin"
67488
+ },
66930
67489
  "coreBlocks.getBlockSettings": {
66931
67490
  capName: "core-blocks",
66932
67491
  capScope: "system",
@@ -66948,6 +67507,13 @@ Object.freeze({
66948
67507
  access: "view",
66949
67508
  role: "admin"
66950
67509
  },
67510
+ "coreBlocks.getTraces": {
67511
+ capName: "core-blocks",
67512
+ capScope: "system",
67513
+ addonId: null,
67514
+ access: "view",
67515
+ role: "admin"
67516
+ },
66951
67517
  "coreBlocks.getTypeDefs": {
66952
67518
  capName: "core-blocks",
66953
67519
  capScope: "system",
@@ -66983,6 +67549,13 @@ Object.freeze({
66983
67549
  access: "create",
66984
67550
  role: "admin"
66985
67551
  },
67552
+ "coreBlocks.reportAutomationRun": {
67553
+ capName: "core-blocks",
67554
+ capScope: "system",
67555
+ addonId: null,
67556
+ access: "create",
67557
+ role: "admin"
67558
+ },
66986
67559
  "coreBlocks.restart": {
66987
67560
  capName: "core-blocks",
66988
67561
  capScope: "system",
@@ -79137,6 +79710,8 @@ var ML = "model and training machinery — no device action";
79137
79710
  var INTERNAL = "internal plumbing between addons — never operator-facing";
79138
79711
  /** Every system-scoped cap, with why it is not a device's vocabulary. */
79139
79712
  var SYSTEM_CAP_VOCABULARY = {
79713
+ "action-source": system(INTERNAL),
79714
+ actions: system("declared actions — run from the Actions page and from the cameras that link them"),
79140
79715
  "addon-pages": system(UI_PLUMBING),
79141
79716
  "addon-pages-source": system(UI_PLUMBING),
79142
79717
  "addon-routes": system(UI_PLUMBING),
@@ -79333,6 +79908,31 @@ Object.freeze({
79333
79908
  form: "single",
79334
79909
  optional: false
79335
79910
  }],
79911
+ "actions.get": [{
79912
+ name: "deviceId",
79913
+ form: "single",
79914
+ optional: true
79915
+ }],
79916
+ "actions.getLinks": [{
79917
+ name: "deviceId",
79918
+ form: "single",
79919
+ optional: false
79920
+ }],
79921
+ "actions.listForCamera": [{
79922
+ name: "deviceId",
79923
+ form: "single",
79924
+ optional: false
79925
+ }],
79926
+ "actions.run": [{
79927
+ name: "deviceId",
79928
+ form: "single",
79929
+ optional: true
79930
+ }],
79931
+ "actions.setLinks": [{
79932
+ name: "deviceId",
79933
+ form: "single",
79934
+ optional: false
79935
+ }],
79336
79936
  "addonSettings.getDeviceSettings": [{
79337
79937
  name: "deviceId",
79338
79938
  form: "single",
@@ -83435,7 +84035,7 @@ var AdminUIAddon = class extends BaseAddon {
83435
84035
  capability: adminUiCapability,
83436
84036
  provider: {
83437
84037
  getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
83438
- getVersion: async () => ({ version: "1.2.494" })
84038
+ getVersion: async () => ({ version: "1.2.496" })
83439
84039
  }
83440
84040
  }];
83441
84041
  }