boneIO 1.2.0.dev6__py3-none-any.whl → 1.2.0.dev7__py3-none-any.whl

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 (91) hide show
  1. boneio/components/input/detectors.py +14 -2
  2. boneio/core/manager/manager.py +48 -14
  3. boneio/core/manager/remote.py +106 -6
  4. boneio/core/remote/esphome.py +8 -0
  5. boneio/core/remote/wled.py +7 -6
  6. boneio/schema/actions.yaml +31 -7
  7. boneio/version.py +1 -1
  8. boneio/webui/frontend-dist/assets/cssMode-D2_GdEHn.js +4 -0
  9. boneio/webui/frontend-dist/assets/editor.worker-B4pQIWZD.js +12 -0
  10. boneio/webui/frontend-dist/assets/{freemarker2-cdPkYRmQ.js → freemarker2-Ccev9DQ3.js} +1 -1
  11. boneio/webui/frontend-dist/assets/{handlebars-Cfxm9RW_.js → handlebars-CSWuYUii.js} +1 -1
  12. boneio/webui/frontend-dist/assets/{html-BHdohU2S.js → html-BeCDD7uj.js} +1 -1
  13. boneio/webui/frontend-dist/assets/htmlMode-Csqim4tI.js +4 -0
  14. boneio/webui/frontend-dist/assets/{index-B_8cgKDq.js → index-C6eDye5h.js} +245 -245
  15. boneio/webui/frontend-dist/assets/{index-BmuRpNYW.css → index-CyjBlAI7.css} +1 -1
  16. boneio/webui/frontend-dist/assets/{javascript-cpZp1UNX.js → javascript-CNjo7h5s.js} +1 -1
  17. boneio/webui/frontend-dist/assets/{json.worker-DaRII17c.js → json.worker-aFakAbRR.js} +22 -22
  18. boneio/webui/frontend-dist/assets/{jsonMode-B0FgVMkj.js → jsonMode-CrofIOf5.js} +1 -1
  19. boneio/webui/frontend-dist/assets/{liquid-Z_DgQ0VL.js → liquid-DhQWiRQL.js} +1 -1
  20. boneio/webui/frontend-dist/assets/{mdx-B8hjkANT.js → mdx-B7NfGq9x.js} +1 -1
  21. boneio/webui/frontend-dist/assets/{python-B-sOgkv5.js → python-CfAzolFq.js} +1 -1
  22. boneio/webui/frontend-dist/assets/{razor-32kHacmJ.js → razor-nVU9Xllg.js} +1 -1
  23. boneio/webui/frontend-dist/assets/{tsMode-B4q7c15W.js → tsMode-DUyiY9xo.js} +1 -1
  24. boneio/webui/frontend-dist/assets/{typescript-C5K4aTtA.js → typescript-Cz5XSgIr.js} +1 -1
  25. boneio/webui/frontend-dist/assets/workbox-window.prod.es5-BIl4cyR9.js +2 -0
  26. boneio/webui/frontend-dist/assets/{xml-BR1__-Hi.js → xml-Bf4znVSR.js} +1 -1
  27. boneio/webui/frontend-dist/assets/{yaml-Bp8ZLmkj.js → yaml-KWLRG-vP.js} +1 -1
  28. boneio/webui/frontend-dist/assets/{yaml.worker-BTE-_K6g.js → yaml.worker-DBeHcBRc.js} +200 -200
  29. boneio/webui/frontend-dist/index.html +2 -2
  30. boneio/webui/frontend-dist/schem/adc.schema.json +8 -8
  31. boneio/webui/frontend-dist/schem/areas.schema.json +4 -4
  32. boneio/webui/frontend-dist/schem/binary_sensor.schema.json +86 -48
  33. boneio/webui/frontend-dist/schem/boneio.schema.json +2 -2
  34. boneio/webui/frontend-dist/schem/config.schema.json +598 -427
  35. boneio/webui/frontend-dist/schem/cover.schema.json +4 -4
  36. boneio/webui/frontend-dist/schem/ds2482.schema.json +4 -4
  37. boneio/webui/frontend-dist/schem/event.schema.json +288 -155
  38. boneio/webui/frontend-dist/schem/ina219.schema.json +14 -14
  39. boneio/webui/frontend-dist/schem/lm75.schema.json +10 -10
  40. boneio/webui/frontend-dist/schem/logger.schema.json +2 -2
  41. boneio/webui/frontend-dist/schem/mcp23017.schema.json +6 -6
  42. boneio/webui/frontend-dist/schem/mcp9808.schema.json +10 -10
  43. boneio/webui/frontend-dist/schem/modbus.schema.json +8 -8
  44. boneio/webui/frontend-dist/schem/modbus_devices.schema.json +22 -22
  45. boneio/webui/frontend-dist/schem/mqtt.schema.json +6 -6
  46. boneio/webui/frontend-dist/schem/oled.schema.json +8 -8
  47. boneio/webui/frontend-dist/schem/output.schema.json +10 -10
  48. boneio/webui/frontend-dist/schem/output_group.schema.json +6 -6
  49. boneio/webui/frontend-dist/schem/pca9685.schema.json +6 -6
  50. boneio/webui/frontend-dist/schem/pcf8575.schema.json +6 -6
  51. boneio/webui/frontend-dist/schem/remote_devices.schema.json +64 -64
  52. boneio/webui/frontend-dist/schem/sensor.schema.json +8 -8
  53. boneio/webui/frontend-dist/schem/virtual_energy_sensor.schema.json +4 -4
  54. boneio/webui/frontend-dist/schem/web.schema.json +12 -12
  55. boneio/webui/frontend-dist/sw.js +1 -1
  56. boneio/webui/routes/system.py +88 -14
  57. boneio/webui/schema/adc.schema.json +8 -8
  58. boneio/webui/schema/areas.schema.json +4 -4
  59. boneio/webui/schema/binary_sensor.schema.json +86 -48
  60. boneio/webui/schema/boneio.schema.json +2 -2
  61. boneio/webui/schema/config.schema.json +598 -427
  62. boneio/webui/schema/cover.schema.json +4 -4
  63. boneio/webui/schema/ds2482.schema.json +4 -4
  64. boneio/webui/schema/event.schema.json +288 -155
  65. boneio/webui/schema/ina219.schema.json +14 -14
  66. boneio/webui/schema/lm75.schema.json +10 -10
  67. boneio/webui/schema/logger.schema.json +2 -2
  68. boneio/webui/schema/mcp23017.schema.json +6 -6
  69. boneio/webui/schema/mcp9808.schema.json +10 -10
  70. boneio/webui/schema/modbus.schema.json +8 -8
  71. boneio/webui/schema/modbus_devices.schema.json +22 -22
  72. boneio/webui/schema/mqtt.schema.json +6 -6
  73. boneio/webui/schema/oled.schema.json +8 -8
  74. boneio/webui/schema/output.schema.json +10 -10
  75. boneio/webui/schema/output_group.schema.json +6 -6
  76. boneio/webui/schema/pca9685.schema.json +6 -6
  77. boneio/webui/schema/pcf8575.schema.json +6 -6
  78. boneio/webui/schema/remote_devices.schema.json +64 -64
  79. boneio/webui/schema/sensor.schema.json +8 -8
  80. boneio/webui/schema/virtual_energy_sensor.schema.json +4 -4
  81. boneio/webui/schema/web.schema.json +12 -12
  82. {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/METADATA +1 -1
  83. {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/RECORD +87 -87
  84. boneio/webui/frontend-dist/assets/cssMode-CvZwGOXM.js +0 -4
  85. boneio/webui/frontend-dist/assets/editor.worker-DsAeyiJ5.js +0 -12
  86. boneio/webui/frontend-dist/assets/htmlMode-D09isE-q.js +0 -4
  87. boneio/webui/frontend-dist/assets/workbox-window.prod.es5-vqzQaGvo.js +0 -2
  88. {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/WHEEL +0 -0
  89. {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/entry_points.txt +0 -0
  90. {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/licenses/LICENSE +0 -0
  91. {boneio-1.2.0.dev6.dist-info → boneio-1.2.0.dev7.dist-info}/top_level.txt +0 -0
@@ -470,7 +470,7 @@ class MultiClickDetector:
470
470
  elif event.event_type is event.Type.RISING_EDGE:
471
471
  # Button released (RISING_EDGE on BeagleBone with pull-up)
472
472
 
473
- # Software debounce
473
+ # Software debounce (release-vs-release)
474
474
  if self._state.last_release_ts and (timestamp_s - self._state.last_release_ts) < self._debounce_seconds:
475
475
  delta_ms = (timestamp_s - self._state.last_release_ts) * 1000
476
476
  _LOGGER.debug(
@@ -479,8 +479,20 @@ class MultiClickDetector:
479
479
  delta_ms,
480
480
  )
481
481
  return
482
+
483
+ # Cross-debounce: ignore release too close to press (bounce on rising edge)
484
+ if self._state.last_press_ts and (timestamp_s - self._state.last_press_ts) < self._debounce_seconds:
485
+ delta_ms = (timestamp_s - self._state.last_press_ts) * 1000
486
+ _LOGGER.debug(
487
+ "Ignoring bounced release on %s (%.3f ms since press, debounce %.3f ms)",
488
+ self._name,
489
+ delta_ms,
490
+ self._debounce_seconds * 1000,
491
+ )
492
+ return
482
493
 
483
- _LOGGER.debug("RELEASED: %s (%s)", self._name, self._pin)
494
+ press_duration_ms = (timestamp_s - self._state.last_press_ts) * 1000 if self._state.last_press_ts else 0
495
+ _LOGGER.debug("RELEASED: %s (%s) after %.1f ms", self._name, self._pin, press_duration_ms)
484
496
  self._state.last_release_ts = timestamp_s
485
497
 
486
498
  _LOGGER.debug(
@@ -440,7 +440,12 @@ class Manager:
440
440
  parsed_action[key] = action_definition[key]
441
441
  if action_definition.get("repeat"):
442
442
  parsed_action["repeat"] = True
443
- parsed_action["repeat_interval"] = action_definition.get("repeat_interval", 1000)
443
+ ri = action_definition.get("repeat_interval", 1000)
444
+ # TimePeriod object from schema validation -> convert to ms
445
+ if hasattr(ri, "total_milliseconds"):
446
+ parsed_action["repeat_interval"] = ri.total_milliseconds
447
+ else:
448
+ parsed_action["repeat_interval"] = ri
444
449
 
445
450
  parsed_actions = {}
446
451
  for click_type in actions:
@@ -552,6 +557,15 @@ class Manager:
552
557
  "output_id": output_id,
553
558
  "action_output": action_output,
554
559
  }
560
+ # Copy optional light/WLED parameters
561
+ for opt_key in (
562
+ "brightness", "color_temp", "rgb", "transition",
563
+ "effect", "palette", "effect_speed", "effect_intensity",
564
+ "colors", "presets",
565
+ ):
566
+ val = action_definition.get(opt_key)
567
+ if val is not None:
568
+ parsed_action[opt_key] = val
555
569
  _copy_long_press_meta(parsed_action, action_definition)
556
570
  parsed_actions[click_type].append(parsed_action)
557
571
  continue
@@ -724,19 +738,39 @@ class Manager:
724
738
  remote_device_id = action_definition.get("remote_device")
725
739
  output_id = action_definition.get("output_id")
726
740
  action_output = action_definition.get("action_output", "TOGGLE")
727
- await self.remote_devices.control_output(
728
- device_id=remote_device_id,
729
- output_id=output_id,
730
- action=action_output,
731
- brightness=action_definition.get("brightness"),
732
- color_temp=action_definition.get("color_temp"),
733
- rgb=action_definition.get("rgb"),
734
- transition=action_definition.get("transition"),
735
- effect=action_definition.get("effect"),
736
- palette=action_definition.get("palette"),
737
- effect_speed=action_definition.get("effect_speed"),
738
- effect_intensity=action_definition.get("effect_intensity"),
739
- )
741
+
742
+ if action_output == "CYCLE_COLOR":
743
+ await self.remote_devices.cycle_color(
744
+ device_id=remote_device_id,
745
+ output_id=output_id,
746
+ colors=action_definition.get("colors", []),
747
+ action_idx=idx,
748
+ transition=action_definition.get("transition"),
749
+ )
750
+
751
+ elif action_output == "CYCLE_PRESET":
752
+ await self.remote_devices.cycle_preset(
753
+ device_id=remote_device_id,
754
+ output_id=output_id,
755
+ presets=action_definition.get("presets", []),
756
+ action_idx=idx,
757
+ transition=action_definition.get("transition"),
758
+ )
759
+
760
+ else:
761
+ await self.remote_devices.control_output(
762
+ device_id=remote_device_id,
763
+ output_id=output_id,
764
+ action=action_output,
765
+ brightness=action_definition.get("brightness"),
766
+ color_temp=action_definition.get("color_temp"),
767
+ rgb=action_definition.get("rgb"),
768
+ transition=action_definition.get("transition"),
769
+ effect=action_definition.get("effect"),
770
+ palette=action_definition.get("palette"),
771
+ effect_speed=action_definition.get("effect_speed"),
772
+ effect_intensity=action_definition.get("effect_intensity"),
773
+ )
740
774
 
741
775
  elif action == REMOTE_COVER:
742
776
  # Control cover on remote device (BoneIO MQTT or ESPHome API)
@@ -64,6 +64,9 @@ class RemoteDeviceManager:
64
64
  self._autodiscovered_devices: dict[str, MQTTRemoteDevice] = {}
65
65
  # Track devices that manage this boneIO (received via discovery/managed_by topic)
66
66
  self._managed_by_devices: dict[str, dict[str, Any]] = {}
67
+ # Cycle state for CYCLE_COLOR and CYCLE_PRESET actions
68
+ # Key: "device_id:output_id:type:action_idx", Value: current index
69
+ self._cycle_state: dict[str, int] = {}
67
70
 
68
71
  if remote_devices_config:
69
72
  self._configure_devices(remote_devices_config)
@@ -335,14 +338,18 @@ class RemoteDeviceManager:
335
338
  """Stop all persistent connections.
336
339
 
337
340
  This should be called during application shutdown.
341
+ Closes ESPHome connections and WLED aiohttp sessions.
338
342
  """
339
343
  for device_id, device in self._devices.items():
340
- if isinstance(device, ESPHomeRemoteDevice):
341
- try:
344
+ try:
345
+ if isinstance(device, ESPHomeRemoteDevice):
342
346
  await device.disconnect()
343
347
  _LOGGER.info("Stopped connection for ESPHome device '%s'", device_id)
344
- except Exception as e:
345
- _LOGGER.error("Failed to stop connection for ESPHome device '%s': %s", device_id, e)
348
+ elif isinstance(device, WLEDRemoteDevice):
349
+ await device.close()
350
+ _LOGGER.info("Closed session for WLED device '%s'", device_id)
351
+ except Exception as e:
352
+ _LOGGER.error("Failed to stop connection for device '%s': %s", device_id, e)
346
353
 
347
354
  def get_device(self, device_id: str) -> RemoteDevice | None:
348
355
  """Get remote device by ID.
@@ -372,7 +379,7 @@ class RemoteDeviceManager:
372
379
  color_temp: int | None = None,
373
380
  rgb: list[int] | tuple[int, int, int] | None = None,
374
381
  transition: float | None = None,
375
- effect: int | None = None,
382
+ effect: int | str | None = None,
376
383
  palette: int | None = None,
377
384
  effect_speed: int | None = None,
378
385
  effect_intensity: int | None = None,
@@ -391,7 +398,7 @@ class RemoteDeviceManager:
391
398
  color_temp: Color temperature in mireds - only for ESPHome lights
392
399
  rgb: RGB color as [R, G, B] list or tuple (0-255 each) - for ESPHome/WLED lights
393
400
  transition: Transition time in seconds - for ESPHome/WLED lights
394
- effect: WLED effect ID
401
+ effect: Effect name (str for ESPHome) or effect ID (int for WLED)
395
402
  palette: WLED color palette ID
396
403
  effect_speed: WLED effect speed (0-255)
397
404
  effect_intensity: WLED effect intensity (0-255)
@@ -413,6 +420,8 @@ class RemoteDeviceManager:
413
420
  rgb_tuple: tuple[int, int, int] | None = None
414
421
  if rgb and len(rgb) >= 3:
415
422
  rgb_tuple = (int(rgb[0]), int(rgb[1]), int(rgb[2]))
423
+ # For ESPHome, effect must be a string
424
+ esphome_effect = str(effect) if effect is not None else None
416
425
  return await device.control_light(
417
426
  light_id=output_id,
418
427
  action=action,
@@ -420,6 +429,7 @@ class RemoteDeviceManager:
420
429
  color_temp=color_temp,
421
430
  rgb=rgb_tuple,
422
431
  transition=transition if transition is not None else 0.0,
432
+ effect=esphome_effect,
423
433
  )
424
434
  # Otherwise treat as switch
425
435
  _LOGGER.debug("Controlling ESPHome switch '%s' on device '%s'", output_id, device_id)
@@ -456,6 +466,96 @@ class RemoteDeviceManager:
456
466
  message_bus=self._message_bus,
457
467
  )
458
468
 
469
+ async def cycle_color(
470
+ self,
471
+ device_id: str,
472
+ output_id: str,
473
+ colors: list[list[int]],
474
+ action_idx: int = 0,
475
+ transition: float | None = None,
476
+ ) -> bool:
477
+ """Cycle through a list of RGB colors on a remote device light.
478
+
479
+ Each call advances to the next color in the list, wrapping around.
480
+
481
+ Args:
482
+ device_id: ID of the remote device
483
+ output_id: ID of the light to control
484
+ colors: List of RGB colors, each as [R, G, B] (0-255)
485
+ action_idx: Action index for unique cycle state tracking
486
+ transition: Transition time in seconds
487
+
488
+ Returns:
489
+ True if command was sent successfully
490
+ """
491
+ if not colors:
492
+ _LOGGER.warning("CYCLE_COLOR: no colors defined for %s:%s", device_id, output_id)
493
+ return False
494
+
495
+ cycle_key = f"{device_id}:{output_id}:color:{action_idx}"
496
+ cycle_idx = self._cycle_state.get(cycle_key, 0) % len(colors)
497
+ rgb = colors[cycle_idx]
498
+ self._cycle_state[cycle_key] = cycle_idx + 1
499
+
500
+ _LOGGER.debug(
501
+ "CYCLE_COLOR: %s:%s -> color %d/%d = %s",
502
+ device_id, output_id, cycle_idx + 1, len(colors), rgb
503
+ )
504
+
505
+ return await self.control_output(
506
+ device_id=device_id,
507
+ output_id=output_id,
508
+ action="ON",
509
+ rgb=rgb,
510
+ transition=transition,
511
+ )
512
+
513
+ async def cycle_preset(
514
+ self,
515
+ device_id: str,
516
+ output_id: str,
517
+ presets: list[str | int],
518
+ action_idx: int = 0,
519
+ transition: float | None = None,
520
+ ) -> bool:
521
+ """Cycle through a list of effects/presets on a remote device light.
522
+
523
+ Each call advances to the next preset in the list, wrapping around.
524
+ For ESPHome: presets are effect name strings.
525
+ For WLED: presets are effect IDs (integers).
526
+
527
+ Args:
528
+ device_id: ID of the remote device
529
+ output_id: ID of the light to control
530
+ presets: List of effect names (str) or effect IDs (int)
531
+ action_idx: Action index for unique cycle state tracking
532
+ transition: Transition time in seconds
533
+
534
+ Returns:
535
+ True if command was sent successfully
536
+ """
537
+ if not presets:
538
+ _LOGGER.warning("CYCLE_PRESET: no presets defined for %s:%s", device_id, output_id)
539
+ return False
540
+
541
+ cycle_key = f"{device_id}:{output_id}:preset:{action_idx}"
542
+ cycle_idx = self._cycle_state.get(cycle_key, 0) % len(presets)
543
+ preset = presets[cycle_idx]
544
+ self._cycle_state[cycle_key] = cycle_idx + 1
545
+
546
+ _LOGGER.debug(
547
+ "CYCLE_PRESET: %s:%s -> preset %d/%d = %s",
548
+ device_id, output_id, cycle_idx + 1, len(presets), preset
549
+ )
550
+
551
+ return await self.control_output(
552
+ device_id=device_id,
553
+ output_id=output_id,
554
+ action="ON",
555
+ effect=preset,
556
+ transition=transition,
557
+ )
558
+
459
559
  async def control_cover(
460
560
  self,
461
561
  device_id: str,
@@ -505,6 +505,9 @@ class ESPHomeRemoteDevice(RemoteDevice):
505
505
  if (mode & LightColorCapability.RGB) and (mode & LightColorCapability.WHITE):
506
506
  supports_rgbw = True
507
507
 
508
+ # Get effects list from LightInfo
509
+ effects_list = list(getattr(entity, 'effects', []))
510
+
508
511
  light_data = {
509
512
  "id": entity.object_id,
510
513
  "name": entity.name,
@@ -515,6 +518,7 @@ class ESPHomeRemoteDevice(RemoteDevice):
515
518
  "supports_rgbw": supports_rgbw,
516
519
  "min_mireds": getattr(entity, 'min_mireds', None),
517
520
  "max_mireds": getattr(entity, 'max_mireds', None),
521
+ "effects": effects_list,
518
522
  }
519
523
 
520
524
  result["lights"].append(light_data)
@@ -625,6 +629,7 @@ class ESPHomeRemoteDevice(RemoteDevice):
625
629
  color_temp: int | None = None,
626
630
  rgb: tuple[int, int, int] | None = None,
627
631
  transition: float = 0.0,
632
+ effect: str | None = None,
628
633
  ) -> bool:
629
634
  """Control a light on the ESPHome device.
630
635
 
@@ -635,6 +640,7 @@ class ESPHomeRemoteDevice(RemoteDevice):
635
640
  color_temp: Color temperature in mireds
636
641
  rgb: RGB color tuple (0-255 each)
637
642
  transition: Transition time in seconds
643
+ effect: Effect name string (e.g. "Rainbow", "Strobe")
638
644
 
639
645
  Returns:
640
646
  True if command was sent successfully
@@ -669,6 +675,8 @@ class ESPHomeRemoteDevice(RemoteDevice):
669
675
  cmd_kwargs["color_temperature"] = color_temp
670
676
  if rgb is not None:
671
677
  cmd_kwargs["rgb"] = tuple(c / 255.0 for c in rgb)
678
+ if effect is not None:
679
+ cmd_kwargs["effect"] = effect
672
680
  self._client.light_command(light_key, **cmd_kwargs)
673
681
 
674
682
  elif action_upper == "TOGGLE":
@@ -135,6 +135,13 @@ class WLEDRemoteDevice(RemoteDevice):
135
135
  return seg
136
136
  return None
137
137
 
138
+ async def close(self) -> None:
139
+ """Close aiohttp session."""
140
+ if self._session and not self._session.closed:
141
+ await self._session.close()
142
+ self._session = None
143
+ _LOGGER.debug("Closed aiohttp session for WLED '%s'", self._name)
144
+
138
145
  async def _get_session(self) -> aiohttp.ClientSession:
139
146
  """Get or create aiohttp session."""
140
147
  if self._session is None or self._session.closed:
@@ -425,12 +432,6 @@ class WLEDRemoteDevice(RemoteDevice):
425
432
  _LOGGER.error("WLED discovery unexpected error for %s: %s", self._host, e)
426
433
  return {"error": str(e)}
427
434
 
428
- async def close(self) -> None:
429
- """Close HTTP session."""
430
- if self._session and not self._session.closed:
431
- await self._session.close()
432
- self._session = None
433
-
434
435
  def to_dict(self) -> dict[str, Any]:
435
436
  """Convert to dictionary representation.
436
437
 
@@ -64,7 +64,7 @@ schema:
64
64
  action: ['output', 'output_over_mqtt', 'remote_output']
65
65
  forbidden_if:
66
66
  action: ['cover', 'mqtt', 'cover_over_mqtt', 'remote_cover']
67
- allowed: ['TOGGLE', 'ON', 'OFF', 'BRIGHTNESS_UP', 'BRIGHTNESS_DOWN', 'SET_BRIGHTNESS']
67
+ allowed: ['TOGGLE', 'ON', 'OFF', 'BRIGHTNESS_UP', 'BRIGHTNESS_DOWN', 'SET_BRIGHTNESS', 'CYCLE_COLOR', 'CYCLE_PRESET']
68
68
  coerce: action_field
69
69
  default: TOGGLE
70
70
  case_insensitive: true
@@ -75,6 +75,8 @@ schema:
75
75
  - BRIGHTNESS_UP: Increase brightness by 10%
76
76
  - BRIGHTNESS_DOWN: Decrease brightness by 10%
77
77
  - SET_BRIGHTNESS: Set specific brightness (requires brightness field)
78
+ - CYCLE_COLOR: Cycle through a list of RGB colors on each press (requires colors field)
79
+ - CYCLE_PRESET: Cycle through a list of effects/presets on each press (requires presets field)
78
80
  action_mqtt_msg:
79
81
  type: string
80
82
  required_if:
@@ -166,6 +168,28 @@ schema:
166
168
  label: Transition Time (seconds)
167
169
  description: "Time in seconds to transition to the new state. Only for ESPHome lights."
168
170
 
171
+ # Cycle color/preset support
172
+ colors:
173
+ type: list
174
+ required: False
175
+ meta:
176
+ label: Color List for CYCLE_COLOR
177
+ description: |
178
+ List of RGB colors to cycle through on each press.
179
+ Each color is a list of [R, G, B] values (0-255).
180
+ Only used when action_output is CYCLE_COLOR.
181
+ Example: [[255, 0, 0], [0, 255, 0], [0, 0, 255]]
182
+ presets:
183
+ type: list
184
+ required: False
185
+ meta:
186
+ label: Preset/Effect List for CYCLE_PRESET
187
+ description: |
188
+ List of effect names (ESPHome) or effect IDs (WLED) to cycle through on each press.
189
+ For ESPHome: list of effect name strings, e.g. ["Rainbow", "Strobe", "Color Wipe"]
190
+ For WLED: list of effect IDs (integers), e.g. [0, 9, 47]
191
+ Only used when action_output is CYCLE_PRESET.
192
+
169
193
  # Repeat support for long press actions
170
194
  repeat:
171
195
  type: boolean
@@ -178,13 +202,13 @@ schema:
178
202
  Only effective for actions under the 'long' click type.
179
203
  Example: brightness_up with repeat will increase brightness continuously while holding.
180
204
  repeat_interval:
181
- type: integer
205
+ type: timeperiod
206
+ coerce: positive_time_period
182
207
  required: False
183
- default: 1000
184
- min: 200
208
+ default: 800ms
185
209
  meta:
186
- label: Repeat Interval (ms)
210
+ label: Repeat Interval
187
211
  description: |
188
- Minimum interval in milliseconds between repeated executions.
189
- Only used when repeat is true. Default: 1000ms (1 second).
212
+ Minimum interval between repeated executions.
213
+ Only used when repeat is true. Default: 800ms.
190
214
  Minimum: 200ms (matches periodic event interval).
boneio/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  # flake8: noqa
2
- __version__ = "1.2.0dev6"
2
+ __version__ = "1.2.0dev7"
@@ -0,0 +1,4 @@
1
+ import{m as et}from"./index-C6eDye5h.js";var tt=Object.defineProperty,rt=Object.getOwnPropertyDescriptor,nt=Object.getOwnPropertyNames,it=Object.prototype.hasOwnProperty,ot=(e,n,i,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of nt(n))!it.call(e,t)&&t!==i&&tt(e,t,{get:()=>n[t],enumerable:!(r=rt(n,t))||r.enumerable});return e},at=(e,n,i)=>(ot(e,n,"default"),i),d={};at(d,et);var st=120*1e3,ut=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>st&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...e){let n;return this._getClient().then(i=>{n=i}).then(i=>{if(this._worker)return this._worker.withSyncedResources(e)}).then(i=>n)}},T;(function(e){function n(i){return typeof i=="string"}e.is=n})(T||(T={}));var O;(function(e){function n(i){return typeof i=="string"}e.is=n})(O||(O={}));var Y;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})(Y||(Y={}));var M;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647;function n(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=n})(M||(M={}));var w;(function(e){function n(r,t){return r===Number.MAX_VALUE&&(r=M.MAX_VALUE),t===Number.MAX_VALUE&&(t=M.MAX_VALUE),{line:r,character:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&a.uinteger(t.line)&&a.uinteger(t.character)}e.is=i})(w||(w={}));var h;(function(e){function n(r,t,o,s){if(a.uinteger(r)&&a.uinteger(t)&&a.uinteger(o)&&a.uinteger(s))return{start:w.create(r,t),end:w.create(o,s)};if(w.is(r)&&w.is(t))return{start:r,end:t};throw new Error(`Range#create called with invalid arguments[${r}, ${t}, ${o}, ${s}]`)}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&w.is(t.start)&&w.is(t.end)}e.is=i})(h||(h={}));var C;(function(e){function n(r,t){return{uri:r,range:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(a.string(t.uri)||a.undefined(t.uri))}e.is=i})(C||(C={}));var Z;(function(e){function n(r,t,o,s){return{targetUri:r,targetRange:t,targetSelectionRange:o,originSelectionRange:s}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.targetRange)&&a.string(t.targetUri)&&h.is(t.targetSelectionRange)&&(h.is(t.originSelectionRange)||a.undefined(t.originSelectionRange))}e.is=i})(Z||(Z={}));var S;(function(e){function n(r,t,o,s){return{red:r,green:t,blue:o,alpha:s}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.numberRange(t.red,0,1)&&a.numberRange(t.green,0,1)&&a.numberRange(t.blue,0,1)&&a.numberRange(t.alpha,0,1)}e.is=i})(S||(S={}));var K;(function(e){function n(r,t){return{range:r,color:t}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&h.is(t.range)&&S.is(t.color)}e.is=i})(K||(K={}));var ee;(function(e){function n(r,t,o){return{label:r,textEdit:t,additionalTextEdits:o}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.undefined(t.textEdit)||E.is(t))&&(a.undefined(t.additionalTextEdits)||a.typedArray(t.additionalTextEdits,E.is))}e.is=i})(ee||(ee={}));var A;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(A||(A={}));var te;(function(e){function n(r,t,o,s,u,f){const c={startLine:r,endLine:t};return a.defined(o)&&(c.startCharacter=o),a.defined(s)&&(c.endCharacter=s),a.defined(u)&&(c.kind=u),a.defined(f)&&(c.collapsedText=f),c}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.uinteger(t.startLine)&&a.uinteger(t.startLine)&&(a.undefined(t.startCharacter)||a.uinteger(t.startCharacter))&&(a.undefined(t.endCharacter)||a.uinteger(t.endCharacter))&&(a.undefined(t.kind)||a.string(t.kind))}e.is=i})(te||(te={}));var U;(function(e){function n(r,t){return{location:r,message:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&C.is(t.location)&&a.string(t.message)}e.is=i})(U||(U={}));var x;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(x||(x={}));var re;(function(e){e.Unnecessary=1,e.Deprecated=2})(re||(re={}));var ne;(function(e){function n(i){const r=i;return a.objectLiteral(r)&&a.string(r.href)}e.is=n})(ne||(ne={}));var y;(function(e){function n(r,t,o,s,u,f){let c={range:r,message:t};return a.defined(o)&&(c.severity=o),a.defined(s)&&(c.code=s),a.defined(u)&&(c.source=u),a.defined(f)&&(c.relatedInformation=f),c}e.create=n;function i(r){var t;let o=r;return a.defined(o)&&h.is(o.range)&&a.string(o.message)&&(a.number(o.severity)||a.undefined(o.severity))&&(a.integer(o.code)||a.string(o.code)||a.undefined(o.code))&&(a.undefined(o.codeDescription)||a.string((t=o.codeDescription)===null||t===void 0?void 0:t.href))&&(a.string(o.source)||a.undefined(o.source))&&(a.undefined(o.relatedInformation)||a.typedArray(o.relatedInformation,U.is))}e.is=i})(y||(y={}));var I;(function(e){function n(r,t,...o){let s={title:r,command:t};return a.defined(o)&&o.length>0&&(s.arguments=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.title)&&a.string(t.command)}e.is=i})(I||(I={}));var E;(function(e){function n(o,s){return{range:o,newText:s}}e.replace=n;function i(o,s){return{range:{start:o,end:o},newText:s}}e.insert=i;function r(o){return{range:o,newText:""}}e.del=r;function t(o){const s=o;return a.objectLiteral(s)&&a.string(s.newText)&&h.is(s.range)}e.is=t})(E||(E={}));var V;(function(e){function n(r,t,o){const s={label:r};return t!==void 0&&(s.needsConfirmation=t),o!==void 0&&(s.description=o),s}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&a.string(t.label)&&(a.boolean(t.needsConfirmation)||t.needsConfirmation===void 0)&&(a.string(t.description)||t.description===void 0)}e.is=i})(V||(V={}));var L;(function(e){function n(i){const r=i;return a.string(r)}e.is=n})(L||(L={}));var ie;(function(e){function n(o,s,u){return{range:o,newText:s,annotationId:u}}e.replace=n;function i(o,s,u){return{range:{start:o,end:o},newText:s,annotationId:u}}e.insert=i;function r(o,s){return{range:o,newText:"",annotationId:s}}e.del=r;function t(o){const s=o;return E.is(s)&&(V.is(s.annotationId)||L.is(s.annotationId))}e.is=t})(ie||(ie={}));var W;(function(e){function n(r,t){return{textDocument:r,edits:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&B.is(t.textDocument)&&Array.isArray(t.edits)}e.is=i})(W||(W={}));var H;(function(e){function n(r,t,o){let s={kind:"create",uri:r};return t!==void 0&&(t.overwrite!==void 0||t.ignoreIfExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="create"&&a.string(t.uri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(H||(H={}));var X;(function(e){function n(r,t,o,s){let u={kind:"rename",oldUri:r,newUri:t};return o!==void 0&&(o.overwrite!==void 0||o.ignoreIfExists!==void 0)&&(u.options=o),s!==void 0&&(u.annotationId=s),u}e.create=n;function i(r){let t=r;return t&&t.kind==="rename"&&a.string(t.oldUri)&&a.string(t.newUri)&&(t.options===void 0||(t.options.overwrite===void 0||a.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||a.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(X||(X={}));var $;(function(e){function n(r,t,o){let s={kind:"delete",uri:r};return t!==void 0&&(t.recursive!==void 0||t.ignoreIfNotExists!==void 0)&&(s.options=t),o!==void 0&&(s.annotationId=o),s}e.create=n;function i(r){let t=r;return t&&t.kind==="delete"&&a.string(t.uri)&&(t.options===void 0||(t.options.recursive===void 0||a.boolean(t.options.recursive))&&(t.options.ignoreIfNotExists===void 0||a.boolean(t.options.ignoreIfNotExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})($||($={}));var z;(function(e){function n(i){let r=i;return r&&(r.changes!==void 0||r.documentChanges!==void 0)&&(r.documentChanges===void 0||r.documentChanges.every(t=>a.string(t.kind)?H.is(t)||X.is(t)||$.is(t):W.is(t)))}e.is=n})(z||(z={}));var oe;(function(e){function n(r){return{uri:r}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)}e.is=i})(oe||(oe={}));var ae;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.integer(t.version)}e.is=i})(ae||(ae={}));var B;(function(e){function n(r,t){return{uri:r,version:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&(t.version===null||a.integer(t.version))}e.is=i})(B||(B={}));var se;(function(e){function n(r,t,o,s){return{uri:r,languageId:t,version:o,text:s}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.string(t.uri)&&a.string(t.languageId)&&a.integer(t.version)&&a.string(t.text)}e.is=i})(se||(se={}));var q;(function(e){e.PlainText="plaintext",e.Markdown="markdown";function n(i){const r=i;return r===e.PlainText||r===e.Markdown}e.is=n})(q||(q={}));var P;(function(e){function n(i){const r=i;return a.objectLiteral(i)&&q.is(r.kind)&&a.string(r.value)}e.is=n})(P||(P={}));var v;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(v||(v={}));var Q;(function(e){e.PlainText=1,e.Snippet=2})(Q||(Q={}));var ue;(function(e){e.Deprecated=1})(ue||(ue={}));var ce;(function(e){function n(r,t,o){return{newText:r,insert:t,replace:o}}e.create=n;function i(r){const t=r;return t&&a.string(t.newText)&&h.is(t.insert)&&h.is(t.replace)}e.is=i})(ce||(ce={}));var de;(function(e){e.asIs=1,e.adjustIndentation=2})(de||(de={}));var le;(function(e){function n(i){const r=i;return r&&(a.string(r.detail)||r.detail===void 0)&&(a.string(r.description)||r.description===void 0)}e.is=n})(le||(le={}));var fe;(function(e){function n(i){return{label:i}}e.create=n})(fe||(fe={}));var ge;(function(e){function n(i,r){return{items:i||[],isIncomplete:!!r}}e.create=n})(ge||(ge={}));var F;(function(e){function n(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=n;function i(r){const t=r;return a.string(t)||a.objectLiteral(t)&&a.string(t.language)&&a.string(t.value)}e.is=i})(F||(F={}));var he;(function(e){function n(i){let r=i;return!!r&&a.objectLiteral(r)&&(P.is(r.contents)||F.is(r.contents)||a.typedArray(r.contents,F.is))&&(i.range===void 0||h.is(i.range))}e.is=n})(he||(he={}));var ve;(function(e){function n(i,r){return r?{label:i,documentation:r}:{label:i}}e.create=n})(ve||(ve={}));var pe;(function(e){function n(i,r,...t){let o={label:i};return a.defined(r)&&(o.documentation=r),a.defined(t)?o.parameters=t:o.parameters=[],o}e.create=n})(pe||(pe={}));var R;(function(e){e.Text=1,e.Read=2,e.Write=3})(R||(R={}));var me;(function(e){function n(i,r){let t={range:i};return a.number(r)&&(t.kind=r),t}e.create=n})(me||(me={}));var p;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(p||(p={}));var _e;(function(e){e.Deprecated=1})(_e||(_e={}));var be;(function(e){function n(i,r,t,o,s){let u={name:i,kind:r,location:{uri:o,range:t}};return s&&(u.containerName=s),u}e.create=n})(be||(be={}));var we;(function(e){function n(i,r,t,o){return o!==void 0?{name:i,kind:r,location:{uri:t,range:o}}:{name:i,kind:r,location:{uri:t}}}e.create=n})(we||(we={}));var ke;(function(e){function n(r,t,o,s,u,f){let c={name:r,detail:t,kind:o,range:s,selectionRange:u};return f!==void 0&&(c.children=f),c}e.create=n;function i(r){let t=r;return t&&a.string(t.name)&&a.number(t.kind)&&h.is(t.range)&&h.is(t.selectionRange)&&(t.detail===void 0||a.string(t.detail))&&(t.deprecated===void 0||a.boolean(t.deprecated))&&(t.children===void 0||Array.isArray(t.children))&&(t.tags===void 0||Array.isArray(t.tags))}e.is=i})(ke||(ke={}));var xe;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(xe||(xe={}));var j;(function(e){e.Invoked=1,e.Automatic=2})(j||(j={}));var Ie;(function(e){function n(r,t,o){let s={diagnostics:r};return t!=null&&(s.only=t),o!=null&&(s.triggerKind=o),s}e.create=n;function i(r){let t=r;return a.defined(t)&&a.typedArray(t.diagnostics,y.is)&&(t.only===void 0||a.typedArray(t.only,a.string))&&(t.triggerKind===void 0||t.triggerKind===j.Invoked||t.triggerKind===j.Automatic)}e.is=i})(Ie||(Ie={}));var Ee;(function(e){function n(r,t,o){let s={title:r},u=!0;return typeof t=="string"?(u=!1,s.kind=t):I.is(t)?s.command=t:s.edit=t,u&&o!==void 0&&(s.kind=o),s}e.create=n;function i(r){let t=r;return t&&a.string(t.title)&&(t.diagnostics===void 0||a.typedArray(t.diagnostics,y.is))&&(t.kind===void 0||a.string(t.kind))&&(t.edit!==void 0||t.command!==void 0)&&(t.command===void 0||I.is(t.command))&&(t.isPreferred===void 0||a.boolean(t.isPreferred))&&(t.edit===void 0||z.is(t.edit))}e.is=i})(Ee||(Ee={}));var Le;(function(e){function n(r,t){let o={range:r};return a.defined(t)&&(o.data=t),o}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.command)||I.is(t.command))}e.is=i})(Le||(Le={}));var Ae;(function(e){function n(r,t){return{tabSize:r,insertSpaces:t}}e.create=n;function i(r){let t=r;return a.defined(t)&&a.uinteger(t.tabSize)&&a.boolean(t.insertSpaces)}e.is=i})(Ae||(Ae={}));var Re;(function(e){function n(r,t,o){return{range:r,target:t,data:o}}e.create=n;function i(r){let t=r;return a.defined(t)&&h.is(t.range)&&(a.undefined(t.target)||a.string(t.target))}e.is=i})(Re||(Re={}));var Pe;(function(e){function n(r,t){return{range:r,parent:t}}e.create=n;function i(r){let t=r;return a.objectLiteral(t)&&h.is(t.range)&&(t.parent===void 0||e.is(t.parent))}e.is=i})(Pe||(Pe={}));var De;(function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"})(De||(De={}));var Me;(function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"})(Me||(Me={}));var Ce;(function(e){function n(i){const r=i;return a.objectLiteral(r)&&(r.resultId===void 0||typeof r.resultId=="string")&&Array.isArray(r.data)&&(r.data.length===0||typeof r.data[0]=="number")}e.is=n})(Ce||(Ce={}));var ye;(function(e){function n(r,t){return{range:r,text:t}}e.create=n;function i(r){const t=r;return t!=null&&h.is(t.range)&&a.string(t.text)}e.is=i})(ye||(ye={}));var Fe;(function(e){function n(r,t,o){return{range:r,variableName:t,caseSensitiveLookup:o}}e.create=n;function i(r){const t=r;return t!=null&&h.is(t.range)&&a.boolean(t.caseSensitiveLookup)&&(a.string(t.variableName)||t.variableName===void 0)}e.is=i})(Fe||(Fe={}));var je;(function(e){function n(r,t){return{range:r,expression:t}}e.create=n;function i(r){const t=r;return t!=null&&h.is(t.range)&&(a.string(t.expression)||t.expression===void 0)}e.is=i})(je||(je={}));var Ne;(function(e){function n(r,t){return{frameId:r,stoppedLocation:t}}e.create=n;function i(r){const t=r;return a.defined(t)&&h.is(r.stoppedLocation)}e.is=i})(Ne||(Ne={}));var G;(function(e){e.Type=1,e.Parameter=2;function n(i){return i===1||i===2}e.is=n})(G||(G={}));var J;(function(e){function n(r){return{value:r}}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&(t.tooltip===void 0||a.string(t.tooltip)||P.is(t.tooltip))&&(t.location===void 0||C.is(t.location))&&(t.command===void 0||I.is(t.command))}e.is=i})(J||(J={}));var Oe;(function(e){function n(r,t,o){const s={position:r,label:t};return o!==void 0&&(s.kind=o),s}e.create=n;function i(r){const t=r;return a.objectLiteral(t)&&w.is(t.position)&&(a.string(t.label)||a.typedArray(t.label,J.is))&&(t.kind===void 0||G.is(t.kind))&&t.textEdits===void 0||a.typedArray(t.textEdits,E.is)&&(t.tooltip===void 0||a.string(t.tooltip)||P.is(t.tooltip))&&(t.paddingLeft===void 0||a.boolean(t.paddingLeft))&&(t.paddingRight===void 0||a.boolean(t.paddingRight))}e.is=i})(Oe||(Oe={}));var Se;(function(e){function n(i){return{kind:"snippet",value:i}}e.createSnippet=n})(Se||(Se={}));var Ue;(function(e){function n(i,r,t,o){return{insertText:i,filterText:r,range:t,command:o}}e.create=n})(Ue||(Ue={}));var Ve;(function(e){function n(i){return{items:i}}e.create=n})(Ve||(Ve={}));var We;(function(e){e.Invoked=0,e.Automatic=1})(We||(We={}));var He;(function(e){function n(i,r){return{range:i,text:r}}e.create=n})(He||(He={}));var Xe;(function(e){function n(i,r){return{triggerKind:i,selectedCompletionInfo:r}}e.create=n})(Xe||(Xe={}));var $e;(function(e){function n(i){const r=i;return a.objectLiteral(r)&&O.is(r.uri)&&a.string(r.name)}e.is=n})($e||($e={}));var ze;(function(e){function n(o,s,u,f){return new ct(o,s,u,f)}e.create=n;function i(o){let s=o;return!!(a.defined(s)&&a.string(s.uri)&&(a.undefined(s.languageId)||a.string(s.languageId))&&a.uinteger(s.lineCount)&&a.func(s.getText)&&a.func(s.positionAt)&&a.func(s.offsetAt))}e.is=i;function r(o,s){let u=o.getText(),f=t(s,(g,_)=>{let b=g.range.start.line-_.range.start.line;return b===0?g.range.start.character-_.range.start.character:b}),c=u.length;for(let g=f.length-1;g>=0;g--){let _=f[g],b=o.offsetAt(_.range.start),l=o.offsetAt(_.range.end);if(l<=c)u=u.substring(0,b)+_.newText+u.substring(l,u.length);else throw new Error("Overlapping edit");c=b}return u}e.applyEdits=r;function t(o,s){if(o.length<=1)return o;const u=o.length/2|0,f=o.slice(0,u),c=o.slice(u);t(f,s),t(c,s);let g=0,_=0,b=0;for(;g<f.length&&_<c.length;)s(f[g],c[_])<=0?o[b++]=f[g++]:o[b++]=c[_++];for(;g<f.length;)o[b++]=f[g++];for(;_<c.length;)o[b++]=c[_++];return o}})(ze||(ze={}));var ct=class{constructor(e,n,i,r){this._uri=e,this._languageId=n,this._version=i,this._content=r,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let n=this.offsetAt(e.start),i=this.offsetAt(e.end);return this._content.substring(n,i)}return this._content}update(e,n){this._content=e.text,this._version=n,this._lineOffsets=void 0}getLineOffsets(){if(this._lineOffsets===void 0){let e=[],n=this._content,i=!0;for(let r=0;r<n.length;r++){i&&(e.push(r),i=!1);let t=n.charAt(r);i=t==="\r"||t===`
2
+ `,t==="\r"&&r+1<n.length&&n.charAt(r+1)===`
3
+ `&&r++}i&&n.length>0&&e.push(n.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let n=this.getLineOffsets(),i=0,r=n.length;if(r===0)return w.create(0,e);for(;i<r;){let o=Math.floor((i+r)/2);n[o]>e?r=o:i=o+1}let t=i-1;return w.create(t,e-n[t])}offsetAt(e){let n=this.getLineOffsets();if(e.line>=n.length)return this._content.length;if(e.line<0)return 0;let i=n[e.line],r=e.line+1<n.length?n[e.line+1]:this._content.length;return Math.max(Math.min(i+e.character,r),i)}get lineCount(){return this.getLineOffsets().length}},a;(function(e){const n=Object.prototype.toString;function i(l){return typeof l<"u"}e.defined=i;function r(l){return typeof l>"u"}e.undefined=r;function t(l){return l===!0||l===!1}e.boolean=t;function o(l){return n.call(l)==="[object String]"}e.string=o;function s(l){return n.call(l)==="[object Number]"}e.number=s;function u(l,N,Ke){return n.call(l)==="[object Number]"&&N<=l&&l<=Ke}e.numberRange=u;function f(l){return n.call(l)==="[object Number]"&&-2147483648<=l&&l<=2147483647}e.integer=f;function c(l){return n.call(l)==="[object Number]"&&0<=l&&l<=2147483647}e.uinteger=c;function g(l){return n.call(l)==="[object Function]"}e.func=g;function _(l){return l!==null&&typeof l=="object"}e.objectLiteral=_;function b(l,N){return Array.isArray(l)&&l.every(N)}e.typedArray=b})(a||(a={}));var dt=class{constructor(e,n,i){this._languageId=e,this._worker=n,this._disposables=[],this._listener=Object.create(null);const r=o=>{let s=o.getLanguageId();if(s!==this._languageId)return;let u;this._listener[o.uri.toString()]=o.onDidChangeContent(()=>{window.clearTimeout(u),u=window.setTimeout(()=>this._doValidate(o.uri,s),500)}),this._doValidate(o.uri,s)},t=o=>{d.editor.setModelMarkers(o,this._languageId,[]);let s=o.uri.toString(),u=this._listener[s];u&&(u.dispose(),delete this._listener[s])};this._disposables.push(d.editor.onDidCreateModel(r)),this._disposables.push(d.editor.onWillDisposeModel(t)),this._disposables.push(d.editor.onDidChangeModelLanguage(o=>{t(o.model),r(o.model)})),this._disposables.push(i(o=>{d.editor.getModels().forEach(s=>{s.getLanguageId()===this._languageId&&(t(s),r(s))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(t);for(let o in this._listener)this._listener[o].dispose()}}),d.editor.getModels().forEach(r)}dispose(){this._disposables.forEach(e=>e&&e.dispose()),this._disposables.length=0}_doValidate(e,n){this._worker(e).then(i=>i.doValidation(e.toString())).then(i=>{const r=i.map(o=>ft(e,o));let t=d.editor.getModel(e);t&&t.getLanguageId()===n&&d.editor.setModelMarkers(t,n,r)}).then(void 0,i=>{console.error(i)})}};function lt(e){switch(e){case x.Error:return d.MarkerSeverity.Error;case x.Warning:return d.MarkerSeverity.Warning;case x.Information:return d.MarkerSeverity.Info;case x.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function ft(e,n){let i=typeof n.code=="number"?String(n.code):n.code;return{severity:lt(n.severity),startLineNumber:n.range.start.line+1,startColumn:n.range.start.character+1,endLineNumber:n.range.end.line+1,endColumn:n.range.end.character+1,message:n.message,code:i,source:n.source}}var gt=class{constructor(e,n){this._worker=e,this._triggerCharacters=n}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.doComplete(t.toString(),k(n))).then(o=>{if(!o)return;const s=e.getWordUntilPosition(n),u=new d.Range(n.lineNumber,s.startColumn,n.lineNumber,s.endColumn),f=o.items.map(c=>{const g={label:c.label,insertText:c.insertText||c.label,sortText:c.sortText,filterText:c.filterText,documentation:c.documentation,detail:c.detail,command:pt(c.command),range:u,kind:vt(c.kind)};return c.textEdit&&(ht(c.textEdit)?g.range={insert:m(c.textEdit.insert),replace:m(c.textEdit.replace)}:g.range=m(c.textEdit.range),g.insertText=c.textEdit.newText),c.additionalTextEdits&&(g.additionalTextEdits=c.additionalTextEdits.map(D)),c.insertTextFormat===Q.Snippet&&(g.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),g});return{isIncomplete:o.isIncomplete,suggestions:f}})}};function k(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function Qe(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function m(e){if(e)return new d.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function ht(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function vt(e){const n=d.languages.CompletionItemKind;switch(e){case v.Text:return n.Text;case v.Method:return n.Method;case v.Function:return n.Function;case v.Constructor:return n.Constructor;case v.Field:return n.Field;case v.Variable:return n.Variable;case v.Class:return n.Class;case v.Interface:return n.Interface;case v.Module:return n.Module;case v.Property:return n.Property;case v.Unit:return n.Unit;case v.Value:return n.Value;case v.Enum:return n.Enum;case v.Keyword:return n.Keyword;case v.Snippet:return n.Snippet;case v.Color:return n.Color;case v.File:return n.File;case v.Reference:return n.Reference}return n.Property}function D(e){if(e)return{range:m(e.range),text:e.newText}}function pt(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var mt=class{constructor(e){this._worker=e}provideHover(e,n,i){let r=e.uri;return this._worker(r).then(t=>t.doHover(r.toString(),k(n))).then(t=>{if(t)return{range:m(t.range),contents:bt(t.contents)}})}};function _t(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function Be(e){return typeof e=="string"?{value:e}:_t(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+`
4
+ `+e.value+"\n```\n"}}function bt(e){if(e)return Array.isArray(e)?e.map(Be):[Be(e)]}var wt=class{constructor(e){this._worker=e}provideDocumentHighlights(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.findDocumentHighlights(r.toString(),k(n))).then(t=>{if(t)return t.map(o=>({range:m(o.range),kind:kt(o.kind)}))})}};function kt(e){switch(e){case R.Read:return d.languages.DocumentHighlightKind.Read;case R.Write:return d.languages.DocumentHighlightKind.Write;case R.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var xt=class{constructor(e){this._worker=e}provideDefinition(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.findDefinition(r.toString(),k(n))).then(t=>{if(t)return[Ge(t)]})}};function Ge(e){return{uri:d.Uri.parse(e.uri),range:m(e.range)}}var It=class{constructor(e){this._worker=e}provideReferences(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.findReferences(t.toString(),k(n))).then(o=>{if(o)return o.map(Ge)})}},Et=class{constructor(e){this._worker=e}provideRenameEdits(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.doRename(t.toString(),k(n),i)).then(o=>Lt(o))}};function Lt(e){if(!e||!e.changes)return;let n=[];for(let i in e.changes){const r=d.Uri.parse(i);for(let t of e.changes[i])n.push({resource:r,versionId:void 0,textEdit:{range:m(t.range),text:t.newText}})}return{edits:n}}var At=class{constructor(e){this._worker=e}provideDocumentSymbols(e,n){const i=e.uri;return this._worker(i).then(r=>r.findDocumentSymbols(i.toString())).then(r=>{if(r)return r.map(t=>Rt(t)?Je(t):{name:t.name,detail:"",containerName:t.containerName,kind:Te(t.kind),range:m(t.location.range),selectionRange:m(t.location.range),tags:[]})})}};function Rt(e){return"children"in e}function Je(e){return{name:e.name,detail:e.detail??"",kind:Te(e.kind),range:m(e.range),selectionRange:m(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(n=>Je(n))}}function Te(e){let n=d.languages.SymbolKind;switch(e){case p.File:return n.File;case p.Module:return n.Module;case p.Namespace:return n.Namespace;case p.Package:return n.Package;case p.Class:return n.Class;case p.Method:return n.Method;case p.Property:return n.Property;case p.Field:return n.Field;case p.Constructor:return n.Constructor;case p.Enum:return n.Enum;case p.Interface:return n.Interface;case p.Function:return n.Function;case p.Variable:return n.Variable;case p.Constant:return n.Constant;case p.String:return n.String;case p.Number:return n.Number;case p.Boolean:return n.Boolean;case p.Array:return n.Array}return n.Function}var Nt=class{constructor(e){this._worker=e}provideLinks(e,n){const i=e.uri;return this._worker(i).then(r=>r.findDocumentLinks(i.toString())).then(r=>{if(r)return{links:r.map(t=>({range:m(t.range),url:t.target}))}})}},Pt=class{constructor(e){this._worker=e}provideDocumentFormattingEdits(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.format(r.toString(),null,Ye(n)).then(o=>{if(!(!o||o.length===0))return o.map(D)}))}},Dt=class{constructor(e){this._worker=e,this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(e,n,i,r){const t=e.uri;return this._worker(t).then(o=>o.format(t.toString(),Qe(n),Ye(i)).then(s=>{if(!(!s||s.length===0))return s.map(D)}))}};function Ye(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var Mt=class{constructor(e){this._worker=e}provideDocumentColors(e,n){const i=e.uri;return this._worker(i).then(r=>r.findDocumentColors(i.toString())).then(r=>{if(r)return r.map(t=>({color:t.color,range:m(t.range)}))})}provideColorPresentations(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.getColorPresentations(r.toString(),n.color,Qe(n.range))).then(t=>{if(t)return t.map(o=>{let s={label:o.label};return o.textEdit&&(s.textEdit=D(o.textEdit)),o.additionalTextEdits&&(s.additionalTextEdits=o.additionalTextEdits.map(D)),s})})}},Ct=class{constructor(e){this._worker=e}provideFoldingRanges(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.getFoldingRanges(r.toString(),n)).then(t=>{if(t)return t.map(o=>{const s={start:o.startLine+1,end:o.endLine+1};return typeof o.kind<"u"&&(s.kind=yt(o.kind)),s})})}};function yt(e){switch(e){case A.Comment:return d.languages.FoldingRangeKind.Comment;case A.Imports:return d.languages.FoldingRangeKind.Imports;case A.Region:return d.languages.FoldingRangeKind.Region}}var Ft=class{constructor(e){this._worker=e}provideSelectionRanges(e,n,i){const r=e.uri;return this._worker(r).then(t=>t.getSelectionRanges(r.toString(),n.map(k))).then(t=>{if(t)return t.map(o=>{const s=[];for(;o;)s.push({range:m(o.range)}),o=o.parent;return s})})}};function Ot(e){const n=[],i=[],r=new ut(e);n.push(r);const t=(...s)=>r.getLanguageServiceWorker(...s);function o(){const{languageId:s,modeConfiguration:u}=e;Ze(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new gt(t,["/","-",":"]))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new mt(t))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new wt(t))),u.definitions&&i.push(d.languages.registerDefinitionProvider(s,new xt(t))),u.references&&i.push(d.languages.registerReferenceProvider(s,new It(t))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new At(t))),u.rename&&i.push(d.languages.registerRenameProvider(s,new Et(t))),u.colors&&i.push(d.languages.registerColorProvider(s,new Mt(t))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new Ct(t))),u.diagnostics&&i.push(new dt(s,t,e.onDidChange)),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new Ft(t))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new Pt(t))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new Dt(t)))}return o(),n.push(qe(i)),qe(n)}function qe(e){return{dispose:()=>Ze(e)}}function Ze(e){for(;e.length;)e.pop().dispose()}export{gt as CompletionAdapter,xt as DefinitionAdapter,dt as DiagnosticsAdapter,Mt as DocumentColorAdapter,Pt as DocumentFormattingEditProvider,wt as DocumentHighlightAdapter,Nt as DocumentLinkAdapter,Dt as DocumentRangeFormattingEditProvider,At as DocumentSymbolAdapter,Ct as FoldingRangeAdapter,mt as HoverAdapter,It as ReferenceAdapter,Et as RenameAdapter,Ft as SelectionRangeAdapter,ut as WorkerManager,k as fromPosition,Qe as fromRange,Ot as setupMode,m as toRange,D as toTextEdit};