@camstack/addon-pipeline-orchestrator 1.2.156 → 1.2.157

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 (37) hide show
  1. package/assets/viewer/.viewer-current-files.json +5 -5
  2. package/assets/viewer/.viewer-version +1 -1
  3. package/assets/viewer/_expo/static/js/web/Clipboard-0ad1283b2f72f6313b2d8bb1d2306893.js +8 -0
  4. package/assets/viewer/_expo/static/js/web/Haptics-a4c018f6b624c003e69527312a0499f6.js +3 -0
  5. package/assets/viewer/_expo/static/js/web/index-73eeb42ae400e1ba348734708a437d48.js +3676 -0
  6. package/assets/viewer/_expo/static/js/web/node-fs-877950a91dc1a7e99d7bbccbd5d2d76d.js +1 -0
  7. package/assets/viewer/_expo/static/js/web/node-path-80152226e0c2d06a96fc7dd4bb153d05.js +1 -0
  8. package/assets/viewer/assets/node_modules/expo-router/assets/arrow_down.017bc6ba3fc25503e5eb5e53826d48a8.png +0 -0
  9. package/assets/viewer/assets/node_modules/expo-router/assets/error.d1ea1496f9057eb392d5bbf3732a61b7.png +0 -0
  10. package/assets/viewer/assets/node_modules/expo-router/assets/file.19eeb73b9593a38f8e9f418337fc7d10.png +0 -0
  11. package/assets/viewer/assets/node_modules/expo-router/assets/forward.d8b800c443b8972542883e0b9de2bdc6.png +0 -0
  12. package/assets/viewer/assets/node_modules/expo-router/assets/pkg.ab19f4cbc543357183a20571f68380a3.png +0 -0
  13. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/back-icon-mask.0a328cd9c1afd0afe8e3b1ec5165b1b4.png +0 -0
  14. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/back-icon.35ba0eaec5a4f5ed12ca16fabeae451d.png +0 -0
  15. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55.png +0 -0
  16. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@2x.png +0 -0
  17. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@3x.png +0 -0
  18. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/clear-icon.c94f6478e7ae0cdd9f15de1fcb9e5e55@4x.png +0 -0
  19. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/close-icon.808e1b1b9b53114ec2838071a7e6daa7.png +0 -0
  20. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/close-icon.808e1b1b9b53114ec2838071a7e6daa7@2x.png +0 -0
  21. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/close-icon.808e1b1b9b53114ec2838071a7e6daa7@3x.png +0 -0
  22. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/close-icon.808e1b1b9b53114ec2838071a7e6daa7@4x.png +0 -0
  23. package/assets/viewer/assets/node_modules/expo-router/assets/react-navigation/elements/search-icon.286d67d3f74808a60a78d3ebf1a5fb57.png +0 -0
  24. package/assets/viewer/assets/node_modules/expo-router/assets/sitemap.412dd9275b6b48ad28f5e3d81bb1f626.png +0 -0
  25. package/assets/viewer/assets/node_modules/expo-router/assets/unmatched.20e71bdf79e3a97bf55fd9e164041578.png +0 -0
  26. package/assets/viewer/index.html +1 -1
  27. package/dist/_stub.js +2 -2
  28. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BqAXr9_9.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BlCdhEUD.mjs} +3 -3
  29. package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BeFrCpMD.mjs +26 -0
  30. package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CPl8KXva.mjs +26 -0
  31. package/dist/{hostInit-nP4_yUtc.mjs → hostInit-CiOO7oNa.mjs} +3 -3
  32. package/dist/index.js +307 -0
  33. package/dist/index.mjs +307 -0
  34. package/dist/remoteEntry.js +1 -1
  35. package/package.json +1 -1
  36. package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-C0S-3PxD.mjs +0 -26
  37. package/dist/_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-Cv1F4RhF.mjs +0 -26
package/dist/index.js CHANGED
@@ -28482,6 +28482,203 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
28482
28482
  deviceId: number(),
28483
28483
  status: PtzAutotrackStatusSchema
28484
28484
  });
28485
+ /**
28486
+ * `navigation` — a device-scoped capability that natively expresses the FULL
28487
+ * navigation / action surface of a robot that DRIVES ITSELF and carries an
28488
+ * on-board camera (the Dreame robot-vacuum camera is the first provider).
28489
+ *
28490
+ * Why a NEW cap rather than overloading `ptz`:
28491
+ * - `ptz` moves a *gimbal* on a fixed camera (pan/tilt/zoom of the lens). A
28492
+ * robot vacuum has no gimbal — the whole chassis drives, turns and spins.
28493
+ * The two are different physical models: PTZ is absolute-position + presets,
28494
+ * navigation is momentary drive nudges + discrete robot ACTIONS
28495
+ * (dock / spot-clean / follow-pet / go-to-point / …).
28496
+ * - This cap is the SOURCE OF TRUTH. Two consumers adapt from it rather than
28497
+ * the reverse:
28498
+ * 1. a native CamStack navigation panel (data-driven from `listActions`
28499
+ * / `getOptions`), and
28500
+ * 2. the PTZ surface — a thin adapter mimics `ptz` from `navigation` so a
28501
+ * robot camera shows up in the existing PTZ control path without every
28502
+ * PTZ provider learning about robots. The mapping lives in the adapter,
28503
+ * not here (see the addon design note):
28504
+ * ptz.continuousMove({pan,tilt}) → navigation.move({pan,tilt})
28505
+ * ptz.stop() → navigation.stop()
28506
+ * ptz.goHome() → navigation.runAction('goHome')
28507
+ * ptz.getPresets() → navigation.listActions() (id→preset)
28508
+ * ptz.goToPreset(id) → navigation.runAction(id)
28509
+ *
28510
+ * ## Continuous drive
28511
+ *
28512
+ * `move` is MOMENTARY. Fluid navigation comes from the UI (or the PTZ adapter)
28513
+ * sending `move({pan,tilt})` REPEATEDLY at ~1 Hz while a direction is held, and
28514
+ * one `stop()` on release — exactly like the robot app's remote-drive joystick.
28515
+ * The provider forwards EACH `move` to one drive write; it must NOT debounce or
28516
+ * coalesce them. The UI owns the cadence.
28517
+ *
28518
+ * ## The action dictionary
28519
+ *
28520
+ * The discrete controls (dock / locate / spot-clean / follow / flash / sounds)
28521
+ * are a DATA-DRIVEN dictionary the cap exposes via `listActions()`. Each entry
28522
+ * carries `{ id, kind, label, icon }` (plus `soundId` for sound entries) so the
28523
+ * native panel AND the PTZ mimic render buttons WITHOUT hardcoding a
28524
+ * vendor-specific list. `kind: 'action'` entries are triggered with
28525
+ * `runAction({ actionId })`; `kind: 'sound'` entries with `playSound({ soundId })`
28526
+ * (the entry carries the `soundId` to pass). The general primitives — `move`,
28527
+ * `stop`, `goToPoint` — stay as first-class methods, not dictionary entries.
28528
+ *
28529
+ * NOTE (provider wiring): the first provider (Dreame) drives this with the RAW
28530
+ * `callAction(siid,aiid,in)` / `setProperty({siid,piid,value})` MIoT primitives
28531
+ * that the currently-published `@apocaliss92/nodedreame` already exposes on
28532
+ * every device handle. A future nodedreame publish adds a typed
28533
+ * `DreameCameraController` (drive / playPetSound / spotClean / findPet / …); the
28534
+ * provider can then swap the raw calls for the typed methods with no change to
28535
+ * THIS contract.
28536
+ */
28537
+ /**
28538
+ * A momentary drive nudge. The robot MOVES (no gimbal) for as long as the caller
28539
+ * keeps sending nudges (~1 Hz); an explicit `stop` (or letting the nudges lapse)
28540
+ * halts it.
28541
+ *
28542
+ * - `pan` — turn: negative = left, positive = right, 0 = straight.
28543
+ * - `tilt` — throttle: positive = forward, negative = spin / turn-around.
28544
+ * - `speed` — optional intensity hint [0, 1]; the provider may scale the drive
28545
+ * vector by it (drivers without proportional drive ignore it).
28546
+ *
28547
+ * `pan` / `tilt` are normalized [-1, 1]. Both optional so a caller can nudge one
28548
+ * axis alone; an all-undefined nudge is a no-op.
28549
+ */
28550
+ var NavigationMoveCommandSchema = object({
28551
+ pan: number().min(-1).max(1).optional(),
28552
+ tilt: number().min(-1).max(1).optional(),
28553
+ speed: number().min(0).max(1).optional()
28554
+ });
28555
+ /**
28556
+ * The enumerated discrete actions a navigation-capable robot can perform via
28557
+ * `runAction`. This is the CLOSED vocabulary; a given device advertises the
28558
+ * subset it supports through `listActions`. Sounds are NOT here — they go through
28559
+ * `playSound` (see the `sound` dictionary entries).
28560
+ */
28561
+ var NavigationActionIdSchema = _enum([
28562
+ "goHome",
28563
+ "locate",
28564
+ "spotClean",
28565
+ "findPet",
28566
+ "personFollow",
28567
+ "stop",
28568
+ "startClean",
28569
+ "pauseClean",
28570
+ "dockWash",
28571
+ "autoEmpty",
28572
+ "flashOn",
28573
+ "flashOff"
28574
+ ]);
28575
+ /** Whether a dictionary entry is a `runAction` action or a `playSound` sound. */
28576
+ var NavigationEntryKindSchema = _enum(["action", "sound"]);
28577
+ /**
28578
+ * One entry in the navigation action dictionary — the DATA-DRIVEN unit both the
28579
+ * native panel and the PTZ mimic render as a button.
28580
+ *
28581
+ * - `id` — stable id. For `kind:'action'` it is a {@link NavigationActionId}
28582
+ * (pass to `runAction`); for `kind:'sound'` it is a namespaced id
28583
+ * (`sound:meow`) whose `soundId` is passed to `playSound`.
28584
+ * - `icon` — icon HINT (lucide-style name; the UI maps it to its own set).
28585
+ * - `label` — operator-facing English label.
28586
+ * - `soundId` — wire sound id, present only on `kind:'sound'` entries.
28587
+ * - `enabled` — per-device FEATURE FLAG. `listActions` reports it so the UI /
28588
+ * PTZ render ONLY enabled entries. Data-driven: the provider
28589
+ * flips it from config, never by editing code.
28590
+ */
28591
+ var NavigationActionEntrySchema = object({
28592
+ id: string(),
28593
+ kind: NavigationEntryKindSchema,
28594
+ label: string(),
28595
+ icon: string(),
28596
+ /** Present only on `kind:'sound'` entries — the id to pass to `playSound`. */
28597
+ soundId: number().int().optional(),
28598
+ /** Per-device feature flag — render this entry only when true. */
28599
+ enabled: boolean()
28600
+ });
28601
+ /** Coordinates for `goToPoint` — a point on the robot's live map. */
28602
+ var NavigationPointSchema = object({
28603
+ x: number(),
28604
+ y: number()
28605
+ });
28606
+ /**
28607
+ * Per-device FEATURE-FLAG report for the general (non-dictionary) primitives.
28608
+ * The cap reports which are enabled so the UI / PTZ render only the controls
28609
+ * that are turned on for THIS device. Data-driven: the provider derives these
28610
+ * from config + probe, never hardcoded in the UI. The per-DICTIONARY-entry flags
28611
+ * live on {@link NavigationActionEntrySchema.enabled}; these gate the primitives
28612
+ * that are not dictionary entries.
28613
+ *
28614
+ * - `move` / `stop` — the momentary drive joystick.
28615
+ * - `goToPoint` — send-to-map-coordinate. Ships OFF on Dreame until the
28616
+ * map-coordinate plumbing is wired.
28617
+ * - `runAction` — the discrete action buttons (dictionary `kind:'action'`).
28618
+ * - `playSound` — the sound buttons (dictionary `kind:'sound'`).
28619
+ * - `light` — the on/off fill-light toggle (works anytime).
28620
+ * - `lightMode` — the auto/manual selector + manual level slider (a
28621
+ * camera-service control; needs an active stream).
28622
+ */
28623
+ var NavigationFeaturesSchema = object({
28624
+ move: boolean(),
28625
+ stop: boolean(),
28626
+ goToPoint: boolean(),
28627
+ runAction: boolean(),
28628
+ playSound: boolean(),
28629
+ light: boolean(),
28630
+ lightMode: boolean()
28631
+ });
28632
+ /** Light mode: `auto` lets the camera choose brightness; `manual` uses `level`. */
28633
+ var NavigationLightModeSchema = _enum(["auto", "manual"]);
28634
+ /**
28635
+ * Live navigation state so the UI can reflect what the robot is doing:
28636
+ * - `mode` — coarse activity (idle / cleaning / following / …).
28637
+ * - `following` — person/pet follow is currently armed.
28638
+ * - `flash` — the on-camera fill light is on.
28639
+ * - `lightMode` — auto vs manual fill-light mode.
28640
+ * - `lightLevel` — manual fill-light level (40..100); meaningful when
28641
+ * `lightMode === 'manual'`.
28642
+ */
28643
+ var NavigationStatusSchema = object({
28644
+ mode: _enum([
28645
+ "idle",
28646
+ "cleaning",
28647
+ "spot",
28648
+ "following",
28649
+ "goto",
28650
+ "returning",
28651
+ "paused",
28652
+ "unknown"
28653
+ ]),
28654
+ following: boolean(),
28655
+ flash: boolean(),
28656
+ lightMode: NavigationLightModeSchema,
28657
+ lightLevel: number().min(40).max(100),
28658
+ /** Ms epoch when the slice was last updated. */
28659
+ lastChangedAt: number()
28660
+ });
28661
+ NavigationStatusSchema.extend({ lastFetchedAt: number() });
28662
+ DeviceType.Camera, method(NavigationMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(NavigationPointSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(NavigationActionEntrySchema)), method(object({
28663
+ deviceId: number(),
28664
+ actionId: NavigationActionIdSchema
28665
+ }), _void(), { kind: "mutation" }), method(object({
28666
+ deviceId: number(),
28667
+ soundId: number().int()
28668
+ }), _void(), { kind: "mutation" }), method(object({
28669
+ deviceId: number(),
28670
+ on: boolean()
28671
+ }), _void(), { kind: "mutation" }), method(object({
28672
+ deviceId: number(),
28673
+ mode: NavigationLightModeSchema,
28674
+ level: number().min(40).max(100).optional()
28675
+ }), _void(), { kind: "mutation" }), method(object({
28676
+ deviceId: number(),
28677
+ level: number().min(40).max(100)
28678
+ }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), NavigationFeaturesSchema), object({
28679
+ deviceId: number(),
28680
+ status: NavigationStatusSchema
28681
+ });
28485
28682
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
28486
28683
  kind: "mutation",
28487
28684
  auth: "admin"
@@ -33630,6 +33827,66 @@ Object.freeze({
33630
33827
  addonId: null,
33631
33828
  access: "create"
33632
33829
  },
33830
+ "navigation.getFeatures": {
33831
+ capName: "navigation",
33832
+ capScope: "device",
33833
+ addonId: null,
33834
+ access: "view"
33835
+ },
33836
+ "navigation.goToPoint": {
33837
+ capName: "navigation",
33838
+ capScope: "device",
33839
+ addonId: null,
33840
+ access: "create"
33841
+ },
33842
+ "navigation.listActions": {
33843
+ capName: "navigation",
33844
+ capScope: "device",
33845
+ addonId: null,
33846
+ access: "view"
33847
+ },
33848
+ "navigation.move": {
33849
+ capName: "navigation",
33850
+ capScope: "device",
33851
+ addonId: null,
33852
+ access: "create"
33853
+ },
33854
+ "navigation.playSound": {
33855
+ capName: "navigation",
33856
+ capScope: "device",
33857
+ addonId: null,
33858
+ access: "create"
33859
+ },
33860
+ "navigation.runAction": {
33861
+ capName: "navigation",
33862
+ capScope: "device",
33863
+ addonId: null,
33864
+ access: "create"
33865
+ },
33866
+ "navigation.setLightLevel": {
33867
+ capName: "navigation",
33868
+ capScope: "device",
33869
+ addonId: null,
33870
+ access: "create"
33871
+ },
33872
+ "navigation.setLightMode": {
33873
+ capName: "navigation",
33874
+ capScope: "device",
33875
+ addonId: null,
33876
+ access: "create"
33877
+ },
33878
+ "navigation.setLightOn": {
33879
+ capName: "navigation",
33880
+ capScope: "device",
33881
+ addonId: null,
33882
+ access: "create"
33883
+ },
33884
+ "navigation.stop": {
33885
+ capName: "navigation",
33886
+ capScope: "device",
33887
+ addonId: null,
33888
+ access: "create"
33889
+ },
33633
33890
  "networkAccess.getEndpoint": {
33634
33891
  capName: "network-access",
33635
33892
  capScope: "system",
@@ -37725,6 +37982,56 @@ Object.freeze({
37725
37982
  form: "single",
37726
37983
  optional: false
37727
37984
  }],
37985
+ "navigation.getFeatures": [{
37986
+ name: "deviceId",
37987
+ form: "single",
37988
+ optional: false
37989
+ }],
37990
+ "navigation.goToPoint": [{
37991
+ name: "deviceId",
37992
+ form: "single",
37993
+ optional: false
37994
+ }],
37995
+ "navigation.listActions": [{
37996
+ name: "deviceId",
37997
+ form: "single",
37998
+ optional: false
37999
+ }],
38000
+ "navigation.move": [{
38001
+ name: "deviceId",
38002
+ form: "single",
38003
+ optional: false
38004
+ }],
38005
+ "navigation.playSound": [{
38006
+ name: "deviceId",
38007
+ form: "single",
38008
+ optional: false
38009
+ }],
38010
+ "navigation.runAction": [{
38011
+ name: "deviceId",
38012
+ form: "single",
38013
+ optional: false
38014
+ }],
38015
+ "navigation.setLightLevel": [{
38016
+ name: "deviceId",
38017
+ form: "single",
38018
+ optional: false
38019
+ }],
38020
+ "navigation.setLightMode": [{
38021
+ name: "deviceId",
38022
+ form: "single",
38023
+ optional: false
38024
+ }],
38025
+ "navigation.setLightOn": [{
38026
+ name: "deviceId",
38027
+ form: "single",
38028
+ optional: false
38029
+ }],
38030
+ "navigation.stop": [{
38031
+ name: "deviceId",
38032
+ form: "single",
38033
+ optional: false
38034
+ }],
37728
38035
  "networkQuality.getDeviceStats": [{
37729
38036
  name: "deviceId",
37730
38037
  form: "single",
package/dist/index.mjs CHANGED
@@ -28454,6 +28454,203 @@ DeviceType.Camera, method(object({ deviceId: number() }), PtzAutotrackStatusSche
28454
28454
  deviceId: number(),
28455
28455
  status: PtzAutotrackStatusSchema
28456
28456
  });
28457
+ /**
28458
+ * `navigation` — a device-scoped capability that natively expresses the FULL
28459
+ * navigation / action surface of a robot that DRIVES ITSELF and carries an
28460
+ * on-board camera (the Dreame robot-vacuum camera is the first provider).
28461
+ *
28462
+ * Why a NEW cap rather than overloading `ptz`:
28463
+ * - `ptz` moves a *gimbal* on a fixed camera (pan/tilt/zoom of the lens). A
28464
+ * robot vacuum has no gimbal — the whole chassis drives, turns and spins.
28465
+ * The two are different physical models: PTZ is absolute-position + presets,
28466
+ * navigation is momentary drive nudges + discrete robot ACTIONS
28467
+ * (dock / spot-clean / follow-pet / go-to-point / …).
28468
+ * - This cap is the SOURCE OF TRUTH. Two consumers adapt from it rather than
28469
+ * the reverse:
28470
+ * 1. a native CamStack navigation panel (data-driven from `listActions`
28471
+ * / `getOptions`), and
28472
+ * 2. the PTZ surface — a thin adapter mimics `ptz` from `navigation` so a
28473
+ * robot camera shows up in the existing PTZ control path without every
28474
+ * PTZ provider learning about robots. The mapping lives in the adapter,
28475
+ * not here (see the addon design note):
28476
+ * ptz.continuousMove({pan,tilt}) → navigation.move({pan,tilt})
28477
+ * ptz.stop() → navigation.stop()
28478
+ * ptz.goHome() → navigation.runAction('goHome')
28479
+ * ptz.getPresets() → navigation.listActions() (id→preset)
28480
+ * ptz.goToPreset(id) → navigation.runAction(id)
28481
+ *
28482
+ * ## Continuous drive
28483
+ *
28484
+ * `move` is MOMENTARY. Fluid navigation comes from the UI (or the PTZ adapter)
28485
+ * sending `move({pan,tilt})` REPEATEDLY at ~1 Hz while a direction is held, and
28486
+ * one `stop()` on release — exactly like the robot app's remote-drive joystick.
28487
+ * The provider forwards EACH `move` to one drive write; it must NOT debounce or
28488
+ * coalesce them. The UI owns the cadence.
28489
+ *
28490
+ * ## The action dictionary
28491
+ *
28492
+ * The discrete controls (dock / locate / spot-clean / follow / flash / sounds)
28493
+ * are a DATA-DRIVEN dictionary the cap exposes via `listActions()`. Each entry
28494
+ * carries `{ id, kind, label, icon }` (plus `soundId` for sound entries) so the
28495
+ * native panel AND the PTZ mimic render buttons WITHOUT hardcoding a
28496
+ * vendor-specific list. `kind: 'action'` entries are triggered with
28497
+ * `runAction({ actionId })`; `kind: 'sound'` entries with `playSound({ soundId })`
28498
+ * (the entry carries the `soundId` to pass). The general primitives — `move`,
28499
+ * `stop`, `goToPoint` — stay as first-class methods, not dictionary entries.
28500
+ *
28501
+ * NOTE (provider wiring): the first provider (Dreame) drives this with the RAW
28502
+ * `callAction(siid,aiid,in)` / `setProperty({siid,piid,value})` MIoT primitives
28503
+ * that the currently-published `@apocaliss92/nodedreame` already exposes on
28504
+ * every device handle. A future nodedreame publish adds a typed
28505
+ * `DreameCameraController` (drive / playPetSound / spotClean / findPet / …); the
28506
+ * provider can then swap the raw calls for the typed methods with no change to
28507
+ * THIS contract.
28508
+ */
28509
+ /**
28510
+ * A momentary drive nudge. The robot MOVES (no gimbal) for as long as the caller
28511
+ * keeps sending nudges (~1 Hz); an explicit `stop` (or letting the nudges lapse)
28512
+ * halts it.
28513
+ *
28514
+ * - `pan` — turn: negative = left, positive = right, 0 = straight.
28515
+ * - `tilt` — throttle: positive = forward, negative = spin / turn-around.
28516
+ * - `speed` — optional intensity hint [0, 1]; the provider may scale the drive
28517
+ * vector by it (drivers without proportional drive ignore it).
28518
+ *
28519
+ * `pan` / `tilt` are normalized [-1, 1]. Both optional so a caller can nudge one
28520
+ * axis alone; an all-undefined nudge is a no-op.
28521
+ */
28522
+ var NavigationMoveCommandSchema = object({
28523
+ pan: number().min(-1).max(1).optional(),
28524
+ tilt: number().min(-1).max(1).optional(),
28525
+ speed: number().min(0).max(1).optional()
28526
+ });
28527
+ /**
28528
+ * The enumerated discrete actions a navigation-capable robot can perform via
28529
+ * `runAction`. This is the CLOSED vocabulary; a given device advertises the
28530
+ * subset it supports through `listActions`. Sounds are NOT here — they go through
28531
+ * `playSound` (see the `sound` dictionary entries).
28532
+ */
28533
+ var NavigationActionIdSchema = _enum([
28534
+ "goHome",
28535
+ "locate",
28536
+ "spotClean",
28537
+ "findPet",
28538
+ "personFollow",
28539
+ "stop",
28540
+ "startClean",
28541
+ "pauseClean",
28542
+ "dockWash",
28543
+ "autoEmpty",
28544
+ "flashOn",
28545
+ "flashOff"
28546
+ ]);
28547
+ /** Whether a dictionary entry is a `runAction` action or a `playSound` sound. */
28548
+ var NavigationEntryKindSchema = _enum(["action", "sound"]);
28549
+ /**
28550
+ * One entry in the navigation action dictionary — the DATA-DRIVEN unit both the
28551
+ * native panel and the PTZ mimic render as a button.
28552
+ *
28553
+ * - `id` — stable id. For `kind:'action'` it is a {@link NavigationActionId}
28554
+ * (pass to `runAction`); for `kind:'sound'` it is a namespaced id
28555
+ * (`sound:meow`) whose `soundId` is passed to `playSound`.
28556
+ * - `icon` — icon HINT (lucide-style name; the UI maps it to its own set).
28557
+ * - `label` — operator-facing English label.
28558
+ * - `soundId` — wire sound id, present only on `kind:'sound'` entries.
28559
+ * - `enabled` — per-device FEATURE FLAG. `listActions` reports it so the UI /
28560
+ * PTZ render ONLY enabled entries. Data-driven: the provider
28561
+ * flips it from config, never by editing code.
28562
+ */
28563
+ var NavigationActionEntrySchema = object({
28564
+ id: string(),
28565
+ kind: NavigationEntryKindSchema,
28566
+ label: string(),
28567
+ icon: string(),
28568
+ /** Present only on `kind:'sound'` entries — the id to pass to `playSound`. */
28569
+ soundId: number().int().optional(),
28570
+ /** Per-device feature flag — render this entry only when true. */
28571
+ enabled: boolean()
28572
+ });
28573
+ /** Coordinates for `goToPoint` — a point on the robot's live map. */
28574
+ var NavigationPointSchema = object({
28575
+ x: number(),
28576
+ y: number()
28577
+ });
28578
+ /**
28579
+ * Per-device FEATURE-FLAG report for the general (non-dictionary) primitives.
28580
+ * The cap reports which are enabled so the UI / PTZ render only the controls
28581
+ * that are turned on for THIS device. Data-driven: the provider derives these
28582
+ * from config + probe, never hardcoded in the UI. The per-DICTIONARY-entry flags
28583
+ * live on {@link NavigationActionEntrySchema.enabled}; these gate the primitives
28584
+ * that are not dictionary entries.
28585
+ *
28586
+ * - `move` / `stop` — the momentary drive joystick.
28587
+ * - `goToPoint` — send-to-map-coordinate. Ships OFF on Dreame until the
28588
+ * map-coordinate plumbing is wired.
28589
+ * - `runAction` — the discrete action buttons (dictionary `kind:'action'`).
28590
+ * - `playSound` — the sound buttons (dictionary `kind:'sound'`).
28591
+ * - `light` — the on/off fill-light toggle (works anytime).
28592
+ * - `lightMode` — the auto/manual selector + manual level slider (a
28593
+ * camera-service control; needs an active stream).
28594
+ */
28595
+ var NavigationFeaturesSchema = object({
28596
+ move: boolean(),
28597
+ stop: boolean(),
28598
+ goToPoint: boolean(),
28599
+ runAction: boolean(),
28600
+ playSound: boolean(),
28601
+ light: boolean(),
28602
+ lightMode: boolean()
28603
+ });
28604
+ /** Light mode: `auto` lets the camera choose brightness; `manual` uses `level`. */
28605
+ var NavigationLightModeSchema = _enum(["auto", "manual"]);
28606
+ /**
28607
+ * Live navigation state so the UI can reflect what the robot is doing:
28608
+ * - `mode` — coarse activity (idle / cleaning / following / …).
28609
+ * - `following` — person/pet follow is currently armed.
28610
+ * - `flash` — the on-camera fill light is on.
28611
+ * - `lightMode` — auto vs manual fill-light mode.
28612
+ * - `lightLevel` — manual fill-light level (40..100); meaningful when
28613
+ * `lightMode === 'manual'`.
28614
+ */
28615
+ var NavigationStatusSchema = object({
28616
+ mode: _enum([
28617
+ "idle",
28618
+ "cleaning",
28619
+ "spot",
28620
+ "following",
28621
+ "goto",
28622
+ "returning",
28623
+ "paused",
28624
+ "unknown"
28625
+ ]),
28626
+ following: boolean(),
28627
+ flash: boolean(),
28628
+ lightMode: NavigationLightModeSchema,
28629
+ lightLevel: number().min(40).max(100),
28630
+ /** Ms epoch when the slice was last updated. */
28631
+ lastChangedAt: number()
28632
+ });
28633
+ NavigationStatusSchema.extend({ lastFetchedAt: number() });
28634
+ DeviceType.Camera, method(NavigationMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(NavigationPointSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(NavigationActionEntrySchema)), method(object({
28635
+ deviceId: number(),
28636
+ actionId: NavigationActionIdSchema
28637
+ }), _void(), { kind: "mutation" }), method(object({
28638
+ deviceId: number(),
28639
+ soundId: number().int()
28640
+ }), _void(), { kind: "mutation" }), method(object({
28641
+ deviceId: number(),
28642
+ on: boolean()
28643
+ }), _void(), { kind: "mutation" }), method(object({
28644
+ deviceId: number(),
28645
+ mode: NavigationLightModeSchema,
28646
+ level: number().min(40).max(100).optional()
28647
+ }), _void(), { kind: "mutation" }), method(object({
28648
+ deviceId: number(),
28649
+ level: number().min(40).max(100)
28650
+ }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), NavigationFeaturesSchema), object({
28651
+ deviceId: number(),
28652
+ status: NavigationStatusSchema
28653
+ });
28457
28654
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
28458
28655
  kind: "mutation",
28459
28656
  auth: "admin"
@@ -33602,6 +33799,66 @@ Object.freeze({
33602
33799
  addonId: null,
33603
33800
  access: "create"
33604
33801
  },
33802
+ "navigation.getFeatures": {
33803
+ capName: "navigation",
33804
+ capScope: "device",
33805
+ addonId: null,
33806
+ access: "view"
33807
+ },
33808
+ "navigation.goToPoint": {
33809
+ capName: "navigation",
33810
+ capScope: "device",
33811
+ addonId: null,
33812
+ access: "create"
33813
+ },
33814
+ "navigation.listActions": {
33815
+ capName: "navigation",
33816
+ capScope: "device",
33817
+ addonId: null,
33818
+ access: "view"
33819
+ },
33820
+ "navigation.move": {
33821
+ capName: "navigation",
33822
+ capScope: "device",
33823
+ addonId: null,
33824
+ access: "create"
33825
+ },
33826
+ "navigation.playSound": {
33827
+ capName: "navigation",
33828
+ capScope: "device",
33829
+ addonId: null,
33830
+ access: "create"
33831
+ },
33832
+ "navigation.runAction": {
33833
+ capName: "navigation",
33834
+ capScope: "device",
33835
+ addonId: null,
33836
+ access: "create"
33837
+ },
33838
+ "navigation.setLightLevel": {
33839
+ capName: "navigation",
33840
+ capScope: "device",
33841
+ addonId: null,
33842
+ access: "create"
33843
+ },
33844
+ "navigation.setLightMode": {
33845
+ capName: "navigation",
33846
+ capScope: "device",
33847
+ addonId: null,
33848
+ access: "create"
33849
+ },
33850
+ "navigation.setLightOn": {
33851
+ capName: "navigation",
33852
+ capScope: "device",
33853
+ addonId: null,
33854
+ access: "create"
33855
+ },
33856
+ "navigation.stop": {
33857
+ capName: "navigation",
33858
+ capScope: "device",
33859
+ addonId: null,
33860
+ access: "create"
33861
+ },
33605
33862
  "networkAccess.getEndpoint": {
33606
33863
  capName: "network-access",
33607
33864
  capScope: "system",
@@ -37697,6 +37954,56 @@ Object.freeze({
37697
37954
  form: "single",
37698
37955
  optional: false
37699
37956
  }],
37957
+ "navigation.getFeatures": [{
37958
+ name: "deviceId",
37959
+ form: "single",
37960
+ optional: false
37961
+ }],
37962
+ "navigation.goToPoint": [{
37963
+ name: "deviceId",
37964
+ form: "single",
37965
+ optional: false
37966
+ }],
37967
+ "navigation.listActions": [{
37968
+ name: "deviceId",
37969
+ form: "single",
37970
+ optional: false
37971
+ }],
37972
+ "navigation.move": [{
37973
+ name: "deviceId",
37974
+ form: "single",
37975
+ optional: false
37976
+ }],
37977
+ "navigation.playSound": [{
37978
+ name: "deviceId",
37979
+ form: "single",
37980
+ optional: false
37981
+ }],
37982
+ "navigation.runAction": [{
37983
+ name: "deviceId",
37984
+ form: "single",
37985
+ optional: false
37986
+ }],
37987
+ "navigation.setLightLevel": [{
37988
+ name: "deviceId",
37989
+ form: "single",
37990
+ optional: false
37991
+ }],
37992
+ "navigation.setLightMode": [{
37993
+ name: "deviceId",
37994
+ form: "single",
37995
+ optional: false
37996
+ }],
37997
+ "navigation.setLightOn": [{
37998
+ name: "deviceId",
37999
+ form: "single",
38000
+ optional: false
38001
+ }],
38002
+ "navigation.stop": [{
38003
+ name: "deviceId",
38004
+ form: "single",
38005
+ optional: false
38006
+ }],
37700
38007
  "networkQuality.getDeviceStats": [{
37701
38008
  name: "deviceId",
37702
38009
  form: "single",
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BqAXr9_9.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BlCdhEUD.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-pipeline-orchestrator",
3
- "version": "1.2.156",
3
+ "version": "1.2.157",
4
4
  "description": "Hub-side camera-to-agent load balancer — tracks runner capacity and dispatches attachCamera calls to the optimal pipeline-runner instance",
5
5
  "keywords": [
6
6
  "camstack",