From 941608cdded0fd38cea75c7b92fe13e357e0b472 Mon Sep 17 00:00:00 2001 From: SHL0MS Date: Thu, 9 Apr 2026 21:40:16 -0400 Subject: [PATCH 001/372] feat(skills): add creative divergence strategies for experimental output Adds opt-in creative thinking frameworks to ascii-video, p5js, and manim-video skills, based on Lluminate (joelsimon.net/lluminate). Only engaged when the user explicitly asks for creative, experimental, or unconventional output. Straightforward requests are unaffected. Each skill gets 2-3 strategies matched to its domain: - ascii-video: Forced Connections, Conceptual Blending, Oblique Strategies - p5js: Conceptual Blending, SCAMPER, Distance Association - manim-video: SCAMPER, Assumption Reversal Strategies sourced from creativity research (Boden, Eno, de Bono, Koestler, Fauconnier & Turner, Osborn), formalized for LLM prompting by Lluminate. --- skills/creative/ascii-video/SKILL.md | 27 ++++++++++++++++++++++ skills/creative/manim-video/SKILL.md | 23 +++++++++++++++++++ skills/creative/p5js/SKILL.md | 34 ++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/skills/creative/ascii-video/SKILL.md b/skills/creative/ascii-video/SKILL.md index b12261e16..704a56116 100644 --- a/skills/creative/ascii-video/SKILL.md +++ b/skills/creative/ascii-video/SKILL.md @@ -203,3 +203,30 @@ For segmented videos (quotes, scenes, chapters), render each as a separate clip | `references/inputs.md` | Audio analysis (FFT, bands, beats), video sampling, image conversion, text/lyrics, TTS integration (ElevenLabs, voice assignment, audio mixing) | | `references/optimization.md` | Hardware detection, quality profiles, vectorized patterns, parallel rendering, memory management, performance budgets | | `references/troubleshooting.md` | NumPy broadcasting traps, blend mode pitfalls, multiprocessing/pickling, brightness diagnostics, ffmpeg issues, font problems, common mistakes | + +--- + +## Creative Divergence (use only when user requests experimental/creative/unique output) + +If the user asks for creative, experimental, surprising, or unconventional output, select the strategy that best fits and reason through its steps BEFORE generating code. + +- **Forced Connections** — when the user wants cross-domain inspiration ("make it look organic," "industrial aesthetic") +- **Conceptual Blending** — when the user names two things to combine ("ocean meets music," "space + calligraphy") +- **Oblique Strategies** — when the user is maximally open ("surprise me," "something I've never seen") + +### Forced Connections +1. Pick a domain unrelated to the visual goal (weather systems, microbiology, architecture, fluid dynamics, textile weaving) +2. List its core visual/structural elements (erosion → gradual reveal; mitosis → splitting duplication; weaving → interlocking patterns) +3. Map those elements onto ASCII characters and animation patterns +4. Synthesize — what does "erosion" or "crystallization" look like in a character grid? + +### Conceptual Blending +1. Name two distinct visual/conceptual spaces (e.g., ocean waves + sheet music) +2. Map correspondences (crests = high notes, troughs = rests, foam = staccato) +3. Blend selectively — keep the most interesting mappings, discard forced ones +4. Develop emergent properties that exist only in the blend + +### Oblique Strategies +1. Draw one: "Honor thy error as a hidden intention" / "Use an old idea" / "What would your closest friend do?" / "Emphasize the flaws" / "Turn it upside down" / "Only a part, not the whole" / "Reverse" +2. Interpret the directive against the current ASCII animation challenge +3. Apply the lateral insight to the visual design before writing code diff --git a/skills/creative/manim-video/SKILL.md b/skills/creative/manim-video/SKILL.md index 35c09bc7b..6edab8e74 100644 --- a/skills/creative/manim-video/SKILL.md +++ b/skills/creative/manim-video/SKILL.md @@ -239,3 +239,26 @@ Always iterate at `-ql`. Only render `-qh` for final output. | `references/paper-explainer.md` | Turning research papers into animations — workflow, templates, domain patterns | | `references/decorations.md` | SurroundingRectangle, Brace, arrows, DashedLine, Angle, annotation lifecycle | | `references/production-quality.md` | Pre-code, pre-render, post-render checklists, spatial layout, color, tempo | + +--- + +## Creative Divergence (use only when user requests experimental/creative/unique output) + +If the user asks for creative, experimental, or unconventional explanatory approaches, select a strategy and reason through it BEFORE designing the animation. + +- **SCAMPER** — when the user wants a fresh take on a standard explanation +- **Assumption Reversal** — when the user wants to challenge how something is typically taught + +### SCAMPER Transformation +Take a standard mathematical/technical visualization and transform it: +- **Substitute**: replace the standard visual metaphor (number line → winding path, matrix → city grid) +- **Combine**: merge two explanation approaches (algebraic + geometric simultaneously) +- **Reverse**: derive backward — start from the result and deconstruct to axioms +- **Modify**: exaggerate a parameter to show why it matters (10x the learning rate, 1000x the sample size) +- **Eliminate**: remove all notation — explain purely through animation and spatial relationships + +### Assumption Reversal +1. List what's "standard" about how this topic is visualized (left-to-right, 2D, discrete steps, formal notation) +2. Pick the most fundamental assumption +3. Reverse it (right-to-left derivation, 3D embedding of a 2D concept, continuous morphing instead of steps, zero notation) +4. Explore what the reversal reveals that the standard approach hides diff --git a/skills/creative/p5js/SKILL.md b/skills/creative/p5js/SKILL.md index ecb048cec..1b8e61804 100644 --- a/skills/creative/p5js/SKILL.md +++ b/skills/creative/p5js/SKILL.md @@ -511,3 +511,37 @@ When building p5.js sketches: | `references/export-pipeline.md` | `saveCanvas()`, `saveGif()`, `saveFrames()`, deterministic headless capture, ffmpeg frame-to-video, CCapture.js, SVG export, per-clip architecture, platform export (fxhash), video gotchas | | `references/troubleshooting.md` | Performance profiling, per-pixel budgets, common mistakes, browser compatibility, WebGL debugging, font loading issues, pixel density traps, memory leaks, CORS | | `templates/viewer.html` | Interactive viewer template: seed navigation (prev/next/random/jump), parameter sliders, download PNG, responsive canvas. Start from this for explorable generative art | + +--- + +## Creative Divergence (use only when user requests experimental/creative/unique output) + +If the user asks for creative, experimental, surprising, or unconventional output, select the strategy that best fits and reason through its steps BEFORE generating code. + +- **Conceptual Blending** — when the user names two things to combine or wants hybrid aesthetics +- **SCAMPER** — when the user wants a twist on a known generative art pattern +- **Distance Association** — when the user gives a single concept and wants exploration ("make something about time") + +### Conceptual Blending +1. Name two distinct visual systems (e.g., particle physics + handwriting) +2. Map correspondences (particles = ink drops, forces = pen pressure, fields = letterforms) +3. Blend selectively — keep mappings that produce interesting emergent visuals +4. Code the blend as a unified system, not two systems side-by-side + +### SCAMPER Transformation +Take a known generative pattern (flow field, particle system, L-system, cellular automata) and systematically transform it: +- **Substitute**: replace circles with text characters, lines with gradients +- **Combine**: merge two patterns (flow field + voronoi) +- **Adapt**: apply a 2D pattern to a 3D projection +- **Modify**: exaggerate scale, warp the coordinate space +- **Purpose**: use a physics sim for typography, a sorting algorithm for color +- **Eliminate**: remove the grid, remove color, remove symmetry +- **Reverse**: run the simulation backward, invert the parameter space + +### Distance Association +1. Anchor on the user's concept (e.g., "loneliness") +2. Generate associations at three distances: + - Close (obvious): empty room, single figure, silence + - Medium (interesting): one fish in a school swimming the wrong way, a phone with no notifications, the gap between subway cars + - Far (abstract): prime numbers, asymptotic curves, the color of 3am +3. Develop the medium-distance associations — they're specific enough to visualize but unexpected enough to be interesting From bff64858f971849a04f44dba3463e9c5df59e8b4 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Fri, 10 Apr 2026 23:23:35 +0000 Subject: [PATCH 002/372] perf(daytona): bulk upload files in single HTTP call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FileSyncManager now accepts an optional bulk_upload_fn callback. When provided, all changed files are uploaded in one call instead of iterating one-by-one with individual HTTP POSTs. DaytonaEnvironment wires this to sandbox.fs.upload_files() which batches everything into a single multipart POST — ~580 files goes from ~5 min to <2s on init. Parent directories are pre-created in one mkdir -p call. Fixes #7362 (item 1). --- tools/environments/daytona.py | 27 ++++++++++++++++++++++++++- tools/environments/file_sync.py | 13 ++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/tools/environments/daytona.py b/tools/environments/daytona.py index 89ca041b8..490e5bed4 100644 --- a/tools/environments/daytona.py +++ b/tools/environments/daytona.py @@ -16,7 +16,7 @@ BaseEnvironment, _ThreadedProcessHandle, ) -from tools.environments.file_sync import FileSyncManager, iter_sync_files, quoted_rm_command +from tools.environments.file_sync import BulkUploadFn, FileSyncManager, iter_sync_files, quoted_rm_command logger = logging.getLogger(__name__) @@ -129,6 +129,7 @@ def __init__( get_files_fn=lambda: iter_sync_files(f"{self._remote_home}/.hermes"), upload_fn=self._daytona_upload, delete_fn=self._daytona_delete, + bulk_upload_fn=self._daytona_bulk_upload, ) self._sync_manager.sync(force=True) self.init_session() @@ -139,6 +140,30 @@ def _daytona_upload(self, host_path: str, remote_path: str) -> None: self._sandbox.process.exec(f"mkdir -p {parent}") self._sandbox.fs.upload_file(host_path, remote_path) + def _daytona_bulk_upload(self, files: list[tuple[str, str]]) -> None: + """Upload many files in a single HTTP call via Daytona SDK. + + Uses ``sandbox.fs.upload_files()`` which batches all files into one + multipart POST, avoiding per-file TLS/HTTP overhead (~580 files + goes from ~5 min to <2 s). + """ + from daytona.common.filesystem import FileUpload + + if not files: + return + + # Pre-create all unique parent directories in one shell call + parents = sorted({str(Path(remote).parent) for _, remote in files}) + if parents: + mkdir_cmd = "mkdir -p " + " ".join(shlex.quote(p) for p in parents) + self._sandbox.process.exec(mkdir_cmd) + + uploads = [ + FileUpload(source=host_path, destination=remote_path) + for host_path, remote_path in files + ] + self._sandbox.fs.upload_files(uploads) + def _daytona_delete(self, remote_paths: list[str]) -> None: """Batch-delete remote files via SDK exec.""" self._sandbox.process.exec(quoted_rm_command(remote_paths)) diff --git a/tools/environments/file_sync.py b/tools/environments/file_sync.py index fb5559a93..29b45f858 100644 --- a/tools/environments/file_sync.py +++ b/tools/environments/file_sync.py @@ -21,6 +21,7 @@ # Transport callbacks provided by each backend UploadFn = Callable[[str, str], None] # (host_path, remote_path) -> raises on failure +BulkUploadFn = Callable[[list[tuple[str, str]]], None] # [(host_path, remote_path), ...] -> raises on failure DeleteFn = Callable[[list[str]], None] # (remote_paths) -> raises on failure GetFilesFn = Callable[[], list[tuple[str, str]]] # () -> [(host_path, remote_path), ...] @@ -76,9 +77,11 @@ def __init__( upload_fn: UploadFn, delete_fn: DeleteFn, sync_interval: float = _SYNC_INTERVAL_SECONDS, + bulk_upload_fn: BulkUploadFn | None = None, ): self._get_files_fn = get_files_fn self._upload_fn = upload_fn + self._bulk_upload_fn = bulk_upload_fn self._delete_fn = delete_fn self._synced_files: dict[str, tuple[float, int]] = {} # remote_path -> (mtime, size) self._last_sync_time: float = 0.0 # monotonic; 0 ensures first sync runs @@ -129,9 +132,13 @@ def sync(self, *, force: bool = False) -> None: logger.debug("file_sync: deleting %d stale remote file(s)", len(to_delete)) try: - for host_path, remote_path in to_upload: - self._upload_fn(host_path, remote_path) - logger.debug("file_sync: uploaded %s -> %s", host_path, remote_path) + if to_upload and self._bulk_upload_fn is not None: + self._bulk_upload_fn(to_upload) + logger.debug("file_sync: bulk-uploaded %d file(s)", len(to_upload)) + else: + for host_path, remote_path in to_upload: + self._upload_fn(host_path, remote_path) + logger.debug("file_sync: uploaded %s -> %s", host_path, remote_path) if to_delete: self._delete_fn(to_delete) From ac30abd89e45f72010f0076980eb0343cf0d2efb Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Fri, 10 Apr 2026 23:25:11 +0000 Subject: [PATCH 003/372] fix(config): bridge container resource settings to env vars Add terminal.container_cpu, container_memory, container_disk, and container_persistent to the _config_to_env_sync dict so that `hermes config set terminal.container_memory 8192` correctly writes TERMINAL_CONTAINER_MEMORY=8192 to ~/.hermes/.env. Previously these YAML keys had no effect because terminal_tool.py reads only env vars and the bridge was missing these mappings. Fixes #7362 (item 2). --- hermes_cli/config.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hermes_cli/config.py b/hermes_cli/config.py index 3b519551b..a818ed420 100644 --- a/hermes_cli/config.py +++ b/hermes_cli/config.py @@ -2783,6 +2783,10 @@ def set_config_value(key: str, value: str): "terminal.timeout": "TERMINAL_TIMEOUT", "terminal.sandbox_dir": "TERMINAL_SANDBOX_DIR", "terminal.persistent_shell": "TERMINAL_PERSISTENT_SHELL", + "terminal.container_cpu": "TERMINAL_CONTAINER_CPU", + "terminal.container_memory": "TERMINAL_CONTAINER_MEMORY", + "terminal.container_disk": "TERMINAL_CONTAINER_DISK", + "terminal.container_persistent": "TERMINAL_CONTAINER_PERSISTENT", } if key in _config_to_env_sync: save_env_value(_config_to_env_sync[key], str(value)) From 223a0623ee16fb1a49504378bc88a0cfb7b78769 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Fri, 10 Apr 2026 23:25:39 +0000 Subject: [PATCH 004/372] fix(daytona): use logger.warning instead of warnings.warn for disk cap warnings.warn() is suppressed/invisible when running as a gateway or agent. Switch to logger.warning() so the disk cap message actually appears in logs. Fixes #7362 (item 3). --- tools/environments/daytona.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/environments/daytona.py b/tools/environments/daytona.py index 490e5bed4..55636db13 100644 --- a/tools/environments/daytona.py +++ b/tools/environments/daytona.py @@ -9,7 +9,6 @@ import math import shlex import threading -import warnings from pathlib import Path from tools.environments.base import ( @@ -63,10 +62,9 @@ def __init__( memory_gib = max(1, math.ceil(memory / 1024)) disk_gib = max(1, math.ceil(disk / 1024)) if disk_gib > 10: - warnings.warn( - f"Daytona: requested disk ({disk_gib}GB) exceeds platform limit (10GB). " - f"Capping to 10GB.", - stacklevel=2, + logger.warning( + "Daytona: requested disk (%dGB) exceeds platform limit (10GB). " + "Capping to 10GB.", disk_gib, ) disk_gib = 10 resources = Resources(cpu=cpu, memory=memory_gib, disk=disk_gib) From 97bb64dbbff85ea045b083ce8c25777a47b96970 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Fri, 10 Apr 2026 23:29:16 +0000 Subject: [PATCH 005/372] test(file_sync): add tests for bulk_upload_fn callback Cover the three key behaviors: - bulk_upload_fn is called instead of per-file upload_fn - Fallback to upload_fn when bulk_upload_fn is None - Rollback on bulk upload failure retries all files --- tests/tools/test_file_sync.py | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/tools/test_file_sync.py b/tests/tools/test_file_sync.py index 283b192e0..7f1e3e1e8 100644 --- a/tests/tools/test_file_sync.py +++ b/tests/tools/test_file_sync.py @@ -255,3 +255,57 @@ def test_file_disappears_between_list_and_upload(self, tmp_path): mgr.sync(force=True) upload.assert_not_called() # _file_mtime_key returns None, skipped + + +class TestBulkUpload: + """Tests for the optional bulk_upload_fn callback.""" + + def test_bulk_upload_used_when_provided(self, tmp_files): + """When bulk_upload_fn is set, it's called instead of per-file upload_fn.""" + upload = MagicMock() + bulk_upload = MagicMock() + mgr = FileSyncManager( + get_files_fn=_make_get_files(tmp_files), + upload_fn=upload, + delete_fn=MagicMock(), + bulk_upload_fn=bulk_upload, + ) + + mgr.sync(force=True) + upload.assert_not_called() + bulk_upload.assert_called_once() + # All 3 files passed as a list of (host, remote) tuples + files_arg = bulk_upload.call_args[0][0] + assert len(files_arg) == 3 + + def test_fallback_to_upload_fn_when_no_bulk(self, tmp_files): + """Without bulk_upload_fn, per-file upload_fn is used (backwards compat).""" + upload = MagicMock() + mgr = FileSyncManager( + get_files_fn=_make_get_files(tmp_files), + upload_fn=upload, + delete_fn=MagicMock(), + bulk_upload_fn=None, + ) + + mgr.sync(force=True) + assert upload.call_count == 3 + + def test_bulk_upload_rollback_on_failure(self, tmp_files): + """Bulk upload failure rolls back synced state so next sync retries.""" + bulk_upload = MagicMock(side_effect=RuntimeError("upload failed")) + mgr = FileSyncManager( + get_files_fn=_make_get_files(tmp_files), + upload_fn=MagicMock(), + delete_fn=MagicMock(), + bulk_upload_fn=bulk_upload, + ) + + mgr.sync(force=True) # fails, should rollback + + # State rolled back: next sync should retry all files + bulk_upload.side_effect = None + bulk_upload.reset_mock() + mgr.sync(force=True) + bulk_upload.assert_called_once() + assert len(bulk_upload.call_args[0][0]) == 3 From 830040f937e59829c3c9f17802bfa62edf29c46f Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Sat, 11 Apr 2026 00:43:10 +0000 Subject: [PATCH 006/372] fix: remove unused BulkUploadFn import from daytona.py --- tools/environments/daytona.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/environments/daytona.py b/tools/environments/daytona.py index 55636db13..5fe074681 100644 --- a/tools/environments/daytona.py +++ b/tools/environments/daytona.py @@ -15,7 +15,7 @@ BaseEnvironment, _ThreadedProcessHandle, ) -from tools.environments.file_sync import BulkUploadFn, FileSyncManager, iter_sync_files, quoted_rm_command +from tools.environments.file_sync import FileSyncManager, iter_sync_files, quoted_rm_command logger = logging.getLogger(__name__) From a8fd7257b1738f89eadbe7015a613da64a2e02b1 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:15:47 -0700 Subject: [PATCH 007/372] feat(gateway): WSL-aware gateway with smart systemd detection (#7510) - Add shared is_wsl() to hermes_constants (like is_termux) - Update supports_systemd_services() to verify systemd is actually running on WSL before returning True - Add WSL-specific guidance in gateway install/start/setup/status for both cases: WSL+systemd and WSL without systemd - Improve help strings: 'run' now says recommended for WSL/Docker, 'start'/'install' now mention systemd/launchd explicitly - Add WSL gateway FAQ section with tmux/nohup/Task Scheduler tips - Update CLI commands docs with WSL tip - Deduplicate _is_wsl() from clipboard.py to shared hermes_constants - Fix clipboard tests to reset hermes_constants cache - 20 new WSL-specific tests covering detection, systemd check, supports_systemd_services integration, and command output Motivated by user feedback: took 1 hour to figure out run vs start on WSL, Telegram bot kept disconnecting due to flaky WSL systemd. --- hermes_cli/clipboard.py | 18 +- hermes_cli/gateway.py | 77 ++++++- hermes_cli/main.py | 6 +- hermes_constants.py | 21 ++ tests/hermes_cli/test_gateway_wsl.py | 279 +++++++++++++++++++++++++ tests/tools/test_clipboard.py | 7 +- website/docs/reference/cli-commands.md | 12 +- website/docs/reference/faq.md | 36 ++++ 8 files changed, 421 insertions(+), 35 deletions(-) create mode 100644 tests/hermes_cli/test_gateway_wsl.py diff --git a/hermes_cli/clipboard.py b/hermes_cli/clipboard.py index 622c087f3..fd81ed4c8 100644 --- a/hermes_cli/clipboard.py +++ b/hermes_cli/clipboard.py @@ -19,10 +19,9 @@ import sys from pathlib import Path -logger = logging.getLogger(__name__) +from hermes_constants import is_wsl as _is_wsl -# Cache WSL detection (checked once per process) -_wsl_detected: bool | None = None +logger = logging.getLogger(__name__) def save_clipboard_image(dest: Path) -> bool: @@ -217,19 +216,6 @@ def _windows_save(dest: Path) -> bool: # ── Linux ──────────────────────────────────────────────────────────────── -def _is_wsl() -> bool: - """Detect if running inside WSL (1 or 2).""" - global _wsl_detected - if _wsl_detected is not None: - return _wsl_detected - try: - with open("/proc/version", "r") as f: - _wsl_detected = "microsoft" in f.read().lower() - except Exception: - _wsl_detected = False - return _wsl_detected - - def _linux_save(dest: Path) -> bool: """Try clipboard backends in priority order: WSL → Wayland → X11.""" if _is_wsl(): diff --git a/hermes_cli/gateway.py b/hermes_cli/gateway.py index 548f7b452..609bb5b9b 100644 --- a/hermes_cli/gateway.py +++ b/hermes_cli/gateway.py @@ -226,11 +226,33 @@ def is_linux() -> bool: return sys.platform.startswith('linux') -from hermes_constants import is_termux +from hermes_constants import is_termux, is_wsl + + +def _wsl_systemd_operational() -> bool: + """Check if systemd is actually running as PID 1 on WSL. + + WSL2 with ``systemd=true`` in wsl.conf has working systemd. + WSL2 without it (or WSL1) does not — systemctl commands fail. + """ + try: + result = subprocess.run( + ["systemctl", "is-system-running"], + capture_output=True, text=True, timeout=5, + ) + # "running", "degraded", "starting" all mean systemd is PID 1 + status = result.stdout.strip().lower() + return status in ("running", "degraded", "starting", "initializing") + except (FileNotFoundError, subprocess.TimeoutExpired, OSError): + return False def supports_systemd_services() -> bool: - return is_linux() and not is_termux() + if not is_linux() or is_termux(): + return False + if is_wsl(): + return _wsl_systemd_operational() + return True def is_macos() -> bool: @@ -2244,7 +2266,8 @@ def gateway_setup(): print() if supports_systemd_services() or is_macos(): platform_name = "systemd" if supports_systemd_services() else "launchd" - if prompt_yes_no(f" Install the gateway as a {platform_name} service? (runs in background, starts on boot)", True): + wsl_note = " (note: services may not survive WSL restarts)" if is_wsl() else "" + if prompt_yes_no(f" Install the gateway as a {platform_name} service?{wsl_note} (runs in background, starts on boot)", True): try: installed_scope = None did_install = False @@ -2269,16 +2292,21 @@ def gateway_setup(): print_info(" You can install later: hermes gateway install") if supports_systemd_services(): print_info(" Or as a boot-time service: sudo hermes gateway install --system") - print_info(" Or run in foreground: hermes gateway") + print_info(" Or run in foreground: hermes gateway run") + elif is_wsl(): + print_info(" WSL detected but systemd is not running.") + print_info(" Run in foreground: hermes gateway run") + print_info(" For persistence: tmux new -s hermes 'hermes gateway run'") + print_info(" To enable systemd: add systemd=true to /etc/wsl.conf, then 'wsl --shutdown'") else: if is_termux(): from hermes_constants import display_hermes_home as _dhh print_info(" Termux does not use systemd/launchd services.") - print_info(" Run in foreground: hermes gateway") - print_info(f" Or start it manually in the background (best effort): nohup hermes gateway >{_dhh()}/logs/gateway.log 2>&1 &") + print_info(" Run in foreground: hermes gateway run") + print_info(f" Or start it manually in the background (best effort): nohup hermes gateway run >{_dhh()}/logs/gateway.log 2>&1 &") else: print_info(" Service install not supported on this platform.") - print_info(" Run in foreground: hermes gateway") + print_info(" Run in foreground: hermes gateway run") else: print() print_info("No platforms configured. Run 'hermes gateway setup' when ready.") @@ -2319,9 +2347,23 @@ def gateway_command(args): print("Run manually: hermes gateway") sys.exit(1) if supports_systemd_services(): + if is_wsl(): + print_warning("WSL detected — systemd services may not survive WSL restarts.") + print_info(" Consider running in foreground instead: hermes gateway run") + print_info(" Or use tmux/screen for persistence: tmux new -s hermes 'hermes gateway run'") + print() systemd_install(force=force, system=system, run_as_user=run_as_user) elif is_macos(): launchd_install(force) + elif is_wsl(): + print("WSL detected but systemd is not running.") + print("Either enable systemd (add systemd=true to /etc/wsl.conf and restart WSL)") + print("or run the gateway in foreground mode:") + print() + print(" hermes gateway run # direct foreground") + print(" tmux new -s hermes 'hermes gateway run' # persistent via tmux") + print(" nohup hermes gateway run > ~/.hermes/logs/gateway.log 2>&1 & # background") + sys.exit(1) else: print("Service installation not supported on this platform.") print("Run manually: hermes gateway run") @@ -2354,6 +2396,16 @@ def gateway_command(args): systemd_start(system=system) elif is_macos(): launchd_start() + elif is_wsl(): + print("WSL detected but systemd is not available.") + print("Run the gateway in foreground mode instead:") + print() + print(" hermes gateway run # direct foreground") + print(" tmux new -s hermes 'hermes gateway run' # persistent via tmux") + print(" nohup hermes gateway run > ~/.hermes/logs/gateway.log 2>&1 & # background") + print() + print("To enable systemd: add systemd=true to /etc/wsl.conf and run 'wsl --shutdown' from PowerShell.") + sys.exit(1) else: print("Not supported on this platform.") sys.exit(1) @@ -2488,6 +2540,10 @@ def gateway_command(args): if is_termux(): print("Termux note:") print(" Android may stop background jobs when Termux is suspended") + elif is_wsl(): + print("WSL note:") + print(" The gateway is running in foreground/manual mode (recommended for WSL).") + print(" Use tmux or screen for persistence across terminal closes.") else: print("To install as a service:") print(" hermes gateway install") @@ -2502,9 +2558,12 @@ def gateway_command(args): print(f" {line}") print() print("To start:") - print(" hermes gateway # Run in foreground") + print(" hermes gateway run # Run in foreground") if is_termux(): - print(" nohup hermes gateway > ~/.hermes/logs/gateway.log 2>&1 & # Best-effort background start") + print(" nohup hermes gateway run > ~/.hermes/logs/gateway.log 2>&1 & # Best-effort background start") + elif is_wsl(): + print(" tmux new -s hermes 'hermes gateway run' # persistent via tmux") + print(" nohup hermes gateway run > ~/.hermes/logs/gateway.log 2>&1 & # background") else: print(" hermes gateway install # Install as user service") print(" sudo hermes gateway install --system # Install as boot-time system service") diff --git a/hermes_cli/main.py b/hermes_cli/main.py index e1c8cb1cc..81850fdfe 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -4447,7 +4447,7 @@ def main(): gateway_subparsers = gateway_parser.add_subparsers(dest="gateway_command") # gateway run (default) - gateway_run = gateway_subparsers.add_parser("run", help="Run gateway in foreground") + gateway_run = gateway_subparsers.add_parser("run", help="Run gateway in foreground (recommended for WSL, Docker, Termux)") gateway_run.add_argument("-v", "--verbose", action="count", default=0, help="Increase stderr log verbosity (-v=INFO, -vv=DEBUG)") gateway_run.add_argument("-q", "--quiet", action="store_true", @@ -4456,7 +4456,7 @@ def main(): help="Replace any existing gateway instance (useful for systemd)") # gateway start - gateway_start = gateway_subparsers.add_parser("start", help="Start gateway service") + gateway_start = gateway_subparsers.add_parser("start", help="Start the installed systemd/launchd background service") gateway_start.add_argument("--system", action="store_true", help="Target the Linux system-level gateway service") # gateway stop @@ -4474,7 +4474,7 @@ def main(): gateway_status.add_argument("--system", action="store_true", help="Target the Linux system-level gateway service") # gateway install - gateway_install = gateway_subparsers.add_parser("install", help="Install gateway as service") + gateway_install = gateway_subparsers.add_parser("install", help="Install gateway as a systemd/launchd background service") gateway_install.add_argument("--force", action="store_true", help="Force reinstall") gateway_install.add_argument("--system", action="store_true", help="Install as a Linux system-level service (starts at boot)") gateway_install.add_argument("--run-as-user", dest="run_as_user", help="User account the Linux system service should run as") diff --git a/hermes_constants.py b/hermes_constants.py index 09274a8ef..7d149f404 100644 --- a/hermes_constants.py +++ b/hermes_constants.py @@ -168,6 +168,27 @@ def is_termux() -> bool: return bool(os.getenv("TERMUX_VERSION") or "com.termux/files/usr" in prefix) +_wsl_detected: bool | None = None + + +def is_wsl() -> bool: + """Return True when running inside WSL (Windows Subsystem for Linux). + + Checks ``/proc/version`` for the ``microsoft`` marker that both WSL1 + and WSL2 inject. Result is cached for the process lifetime. + Import-safe — no heavy deps. + """ + global _wsl_detected + if _wsl_detected is not None: + return _wsl_detected + try: + with open("/proc/version", "r") as f: + _wsl_detected = "microsoft" in f.read().lower() + except Exception: + _wsl_detected = False + return _wsl_detected + + OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1" OPENROUTER_MODELS_URL = f"{OPENROUTER_BASE_URL}/models" diff --git a/tests/hermes_cli/test_gateway_wsl.py b/tests/hermes_cli/test_gateway_wsl.py new file mode 100644 index 000000000..ea5bf40ca --- /dev/null +++ b/tests/hermes_cli/test_gateway_wsl.py @@ -0,0 +1,279 @@ +"""Tests for WSL detection and WSL-aware gateway behavior.""" + +import io +import subprocess +import sys +from types import SimpleNamespace +from unittest.mock import patch, MagicMock, mock_open + +import pytest + +import hermes_cli.gateway as gateway +import hermes_constants + + +# ============================================================================= +# is_wsl() in hermes_constants +# ============================================================================= + +class TestIsWsl: + """Test the shared is_wsl() utility.""" + + def setup_method(self): + # Reset cached value between tests + hermes_constants._wsl_detected = None + + def test_detects_wsl2(self): + fake_content = ( + "Linux version 5.15.146.1-microsoft-standard-WSL2 " + "(gcc (GCC) 11.2.0) #1 SMP Thu Jan 11 04:09:03 UTC 2024\n" + ) + with patch("builtins.open", mock_open(read_data=fake_content)): + assert hermes_constants.is_wsl() is True + + def test_detects_wsl1(self): + fake_content = ( + "Linux version 4.4.0-19041-Microsoft " + "(Microsoft@Microsoft.com) (gcc version 5.4.0) #1\n" + ) + with patch("builtins.open", mock_open(read_data=fake_content)): + assert hermes_constants.is_wsl() is True + + def test_native_linux(self): + fake_content = ( + "Linux version 6.5.0-44-generic (buildd@lcy02-amd64-015) " + "(x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0) #44\n" + ) + with patch("builtins.open", mock_open(read_data=fake_content)): + assert hermes_constants.is_wsl() is False + + def test_no_proc_version(self): + with patch("builtins.open", side_effect=FileNotFoundError): + assert hermes_constants.is_wsl() is False + + def test_result_is_cached(self): + """After first detection, subsequent calls return the cached value.""" + hermes_constants._wsl_detected = True + # Even with open raising, cached value is returned + with patch("builtins.open", side_effect=FileNotFoundError): + assert hermes_constants.is_wsl() is True + + +# ============================================================================= +# _wsl_systemd_operational() in gateway +# ============================================================================= + +class TestWslSystemdOperational: + """Test the WSL systemd check.""" + + def test_running(self, monkeypatch): + monkeypatch.setattr( + gateway.subprocess, "run", + lambda *a, **kw: SimpleNamespace( + returncode=0, stdout="running\n", stderr="" + ), + ) + assert gateway._wsl_systemd_operational() is True + + def test_degraded(self, monkeypatch): + monkeypatch.setattr( + gateway.subprocess, "run", + lambda *a, **kw: SimpleNamespace( + returncode=1, stdout="degraded\n", stderr="" + ), + ) + assert gateway._wsl_systemd_operational() is True + + def test_starting(self, monkeypatch): + monkeypatch.setattr( + gateway.subprocess, "run", + lambda *a, **kw: SimpleNamespace( + returncode=1, stdout="starting\n", stderr="" + ), + ) + assert gateway._wsl_systemd_operational() is True + + def test_offline_no_systemd(self, monkeypatch): + monkeypatch.setattr( + gateway.subprocess, "run", + lambda *a, **kw: SimpleNamespace( + returncode=1, stdout="offline\n", stderr="" + ), + ) + assert gateway._wsl_systemd_operational() is False + + def test_systemctl_not_found(self, monkeypatch): + monkeypatch.setattr( + gateway.subprocess, "run", + MagicMock(side_effect=FileNotFoundError), + ) + assert gateway._wsl_systemd_operational() is False + + def test_timeout(self, monkeypatch): + monkeypatch.setattr( + gateway.subprocess, "run", + MagicMock(side_effect=subprocess.TimeoutExpired("systemctl", 5)), + ) + assert gateway._wsl_systemd_operational() is False + + +# ============================================================================= +# supports_systemd_services() WSL integration +# ============================================================================= + +class TestSupportsSystemdServicesWSL: + """Test that supports_systemd_services() handles WSL correctly.""" + + def test_wsl_with_systemd(self, monkeypatch): + """WSL + working systemd → True.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "_wsl_systemd_operational", lambda: True) + assert gateway.supports_systemd_services() is True + + def test_wsl_without_systemd(self, monkeypatch): + """WSL + no systemd → False.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "_wsl_systemd_operational", lambda: False) + assert gateway.supports_systemd_services() is False + + def test_native_linux(self, monkeypatch): + """Native Linux (not WSL) → True without checking systemd.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: False) + assert gateway.supports_systemd_services() is True + + def test_termux_still_excluded(self, monkeypatch): + """Termux → False regardless of WSL status.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: True) + assert gateway.supports_systemd_services() is False + + +# ============================================================================= +# WSL messaging in gateway commands +# ============================================================================= + +class TestGatewayCommandWSLMessages: + """Test that WSL users see appropriate guidance.""" + + def test_install_wsl_no_systemd(self, monkeypatch, capsys): + """hermes gateway install on WSL without systemd shows guidance.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "supports_systemd_services", lambda: False) + monkeypatch.setattr(gateway, "is_macos", lambda: False) + monkeypatch.setattr(gateway, "is_managed", lambda: False) + + args = SimpleNamespace( + gateway_command="install", force=False, system=False, + run_as_user=None, + ) + with pytest.raises(SystemExit) as exc_info: + gateway.gateway_command(args) + assert exc_info.value.code == 1 + + out = capsys.readouterr().out + assert "WSL detected" in out + assert "systemd is not running" in out + assert "hermes gateway run" in out + assert "tmux" in out + + def test_start_wsl_no_systemd(self, monkeypatch, capsys): + """hermes gateway start on WSL without systemd shows guidance.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "supports_systemd_services", lambda: False) + monkeypatch.setattr(gateway, "is_macos", lambda: False) + + args = SimpleNamespace(gateway_command="start", system=False) + with pytest.raises(SystemExit) as exc_info: + gateway.gateway_command(args) + assert exc_info.value.code == 1 + + out = capsys.readouterr().out + assert "WSL detected" in out + assert "hermes gateway run" in out + assert "wsl.conf" in out + + def test_install_wsl_with_systemd_warns(self, monkeypatch, capsys): + """hermes gateway install on WSL with systemd shows warning but proceeds.""" + monkeypatch.setattr(gateway, "is_linux", lambda: True) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "supports_systemd_services", lambda: True) + monkeypatch.setattr(gateway, "is_macos", lambda: False) + monkeypatch.setattr(gateway, "is_managed", lambda: False) + + # Mock systemd_install to capture call + install_called = [] + monkeypatch.setattr( + gateway, "systemd_install", + lambda **kwargs: install_called.append(kwargs), + ) + + args = SimpleNamespace( + gateway_command="install", force=False, system=False, + run_as_user=None, + ) + gateway.gateway_command(args) + + out = capsys.readouterr().out + assert "WSL detected" in out + assert "may not survive WSL restarts" in out + assert len(install_called) == 1 # install still proceeded + + def test_status_wsl_running_manual(self, monkeypatch, capsys): + """hermes gateway status on WSL with manual process shows WSL note.""" + monkeypatch.setattr(gateway, "supports_systemd_services", lambda: False) + monkeypatch.setattr(gateway, "is_macos", lambda: False) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "find_gateway_pids", lambda: [12345]) + monkeypatch.setattr(gateway, "_runtime_health_lines", lambda: []) + # Stub out the systemd unit path check + monkeypatch.setattr( + gateway, "get_systemd_unit_path", + lambda system=False: SimpleNamespace(exists=lambda: False), + ) + monkeypatch.setattr( + gateway, "get_launchd_plist_path", + lambda: SimpleNamespace(exists=lambda: False), + ) + + args = SimpleNamespace(gateway_command="status", deep=False, system=False) + gateway.gateway_command(args) + + out = capsys.readouterr().out + assert "WSL note" in out + assert "tmux or screen" in out + + def test_status_wsl_not_running(self, monkeypatch, capsys): + """hermes gateway status on WSL with no process shows WSL start advice.""" + monkeypatch.setattr(gateway, "supports_systemd_services", lambda: False) + monkeypatch.setattr(gateway, "is_macos", lambda: False) + monkeypatch.setattr(gateway, "is_termux", lambda: False) + monkeypatch.setattr(gateway, "is_wsl", lambda: True) + monkeypatch.setattr(gateway, "find_gateway_pids", lambda: []) + monkeypatch.setattr(gateway, "_runtime_health_lines", lambda: []) + monkeypatch.setattr( + gateway, "get_systemd_unit_path", + lambda system=False: SimpleNamespace(exists=lambda: False), + ) + monkeypatch.setattr( + gateway, "get_launchd_plist_path", + lambda: SimpleNamespace(exists=lambda: False), + ) + + args = SimpleNamespace(gateway_command="status", deep=False, system=False) + gateway.gateway_command(args) + + out = capsys.readouterr().out + assert "hermes gateway run" in out + assert "tmux" in out diff --git a/tests/tools/test_clipboard.py b/tests/tools/test_clipboard.py index e8171fe1b..fab80b4bc 100644 --- a/tests/tools/test_clipboard.py +++ b/tests/tools/test_clipboard.py @@ -205,9 +205,9 @@ def fake_run(cmd, **kw): class TestIsWsl: def setup_method(self): - # Reset cached value before each test - import hermes_cli.clipboard as cb - cb._wsl_detected = None + # _is_wsl is now hermes_constants.is_wsl — reset its cache + import hermes_constants + hermes_constants._wsl_detected = None def test_wsl2_detected(self): content = "Linux version 5.15.0 (microsoft-standard-WSL2)" @@ -229,6 +229,7 @@ def test_proc_version_missing(self): assert _is_wsl() is False def test_result_is_cached(self): + import hermes_constants content = "Linux version 5.15.0 (microsoft-standard-WSL2)" with patch("builtins.open", mock_open(read_data=content)) as m: assert _is_wsl() is True diff --git a/website/docs/reference/cli-commands.md b/website/docs/reference/cli-commands.md index 132da079c..c430d3ba8 100644 --- a/website/docs/reference/cli-commands.md +++ b/website/docs/reference/cli-commands.md @@ -140,15 +140,19 @@ Subcommands: | Subcommand | Description | |------------|-------------| -| `run` | Run the gateway in the foreground. | -| `start` | Start the installed gateway service. | -| `stop` | Stop the service. | +| `run` | Run the gateway in the foreground. Recommended for WSL, Docker, and Termux. | +| `start` | Start the installed systemd/launchd background service. | +| `stop` | Stop the service (or foreground process). | | `restart` | Restart the service. | | `status` | Show service status. | -| `install` | Install as a user service (`systemd` on Linux, `launchd` on macOS). | +| `install` | Install as a systemd (Linux) or launchd (macOS) background service. | | `uninstall` | Remove the installed service. | | `setup` | Interactive messaging-platform setup. | +:::tip WSL users +Use `hermes gateway run` instead of `hermes gateway start` — WSL's systemd support is unreliable. Wrap it in tmux for persistence: `tmux new -s hermes 'hermes gateway run'`. See [WSL FAQ](/docs/reference/faq#wsl-gateway-keeps-disconnecting-or-hermes-gateway-start-fails) for details. +::: + ## `hermes setup` ```bash diff --git a/website/docs/reference/faq.md b/website/docs/reference/faq.md index 6db208718..6950fb1e9 100644 --- a/website/docs/reference/faq.md +++ b/website/docs/reference/faq.md @@ -375,6 +375,42 @@ lsof -i :8080 hermes config show ``` +#### WSL: Gateway keeps disconnecting or `hermes gateway start` fails + +**Cause:** WSL's systemd support is unreliable. Many WSL2 installations don't have systemd enabled, and even when enabled, services may not survive WSL restarts or Windows idle shutdowns. + +**Solution:** Use foreground mode instead of the systemd service: + +```bash +# Option 1: Direct foreground (simplest) +hermes gateway run + +# Option 2: Persistent via tmux (survives terminal close) +tmux new -s hermes 'hermes gateway run' +# Reattach later: tmux attach -t hermes + +# Option 3: Background via nohup +nohup hermes gateway run > ~/.hermes/logs/gateway.log 2>&1 & +``` + +If you want to try systemd anyway, make sure it's enabled: + +1. Open `/etc/wsl.conf` (create it if it doesn't exist) +2. Add: + ```ini + [boot] + systemd=true + ``` +3. From PowerShell: `wsl --shutdown` +4. Reopen your WSL terminal +5. Verify: `systemctl is-system-running` should say "running" or "degraded" + +:::tip Auto-start on Windows boot +For reliable auto-start, use Windows Task Scheduler to launch WSL + the gateway on login: +1. Create a task that runs `wsl -d Ubuntu -- bash -lc 'hermes gateway run'` +2. Set it to trigger on user logon +::: + #### macOS: Node.js / ffmpeg / other tools not found by gateway **Cause:** launchd services inherit a minimal PATH (`/usr/bin:/bin:/usr/sbin:/sbin`) that doesn't include Homebrew, nvm, cargo, or other user-installed tool directories. This commonly breaks the WhatsApp bridge (`node not found`) or voice transcription (`ffmpeg not found`). From 1850747172c5fa99ce0e4cfb31cf39525a15160f Mon Sep 17 00:00:00 2001 From: alt-glitch Date: Sat, 11 Apr 2026 06:46:19 +0530 Subject: [PATCH 008/372] refactor(matrix): swap matrix-nio for mautrix-python dependency matrix-nio pulls in peewee -> atomicwrites (sdist-only, archived, missing build-system metadata) which breaks nix flake builds. mautrix-python publishes wheels, has a leaner dep tree, and its [encryption] extra uses the same python-olm without the problematic transitive chain. --- pyproject.toml | 2 +- tests/test_project_metadata.py | 8 ++-- uv.lock | 77 ++++++++++------------------------ 3 files changed, 27 insertions(+), 60 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9e84d676a..28a4a300a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ dev = ["debugpy>=1.8.0,<2", "pytest>=9.0.2,<10", "pytest-asyncio>=1.3.0,<2", "py messaging = ["python-telegram-bot[webhooks]>=22.6,<23", "discord.py[voice]>=2.7.1,<3", "aiohttp>=3.13.3,<4", "slack-bolt>=1.18.0,<2", "slack-sdk>=3.27.0,<4"] cron = ["croniter>=6.0.0,<7"] slack = ["slack-bolt>=1.18.0,<2", "slack-sdk>=3.27.0,<4"] -matrix = ["matrix-nio[e2e]>=0.24.0,<1", "Markdown>=3.6,<4"] +matrix = ["mautrix[encryption]>=0.20,<1", "Markdown>=3.6,<4"] cli = ["simple-term-menu>=1.0,<2"] tts-premium = ["elevenlabs>=1.0,<2"] voice = [ diff --git a/tests/test_project_metadata.py b/tests/test_project_metadata.py index 2d7d0f100..e3cc97ce7 100644 --- a/tests/test_project_metadata.py +++ b/tests/test_project_metadata.py @@ -12,10 +12,10 @@ def _load_optional_dependencies(): def test_matrix_extra_linux_only_in_all(): - """matrix-nio[e2e] depends on python-olm which is upstream-broken on modern - macOS (archived libolm, C++ errors with Clang 21+). The [matrix] extra is - included in [all] but gated to Linux via a platform marker so that - ``hermes update`` doesn't fail on macOS.""" + """mautrix[encryption] depends on python-olm which is upstream-broken on + modern macOS (archived libolm, C++ errors with Clang 21+). The [matrix] + extra is included in [all] but gated to Linux via a platform marker so + that ``hermes update`` doesn't fail on macOS.""" optional_dependencies = _load_optional_dependencies() assert "matrix" in optional_dependencies diff --git a/uv.lock b/uv.lock index ab6e7d84a..c70d3e77e 100644 --- a/uv.lock +++ b/uv.lock @@ -152,19 +152,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/99/84ba7273339d0f3dfa57901b846489d2e5c2cd731470167757f1935fffbd/aiohttp_retry-2.9.1-py3-none-any.whl", hash = "sha256:66d2759d1921838256a05a3f80ad7e724936f083e35be5abb5e16eed6be6dc54", size = 9981, upload-time = "2024-11-06T10:44:52.917Z" }, ] -[[package]] -name = "aiohttp-socks" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "python-socks" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1f/cc/e5bbd54f76bd56291522251e47267b645dac76327b2657ade9545e30522c/aiohttp_socks-0.11.0.tar.gz", hash = "sha256:0afe51638527c79077e4bd6e57052c87c4824233d6e20bb061c53766421b10f0", size = 11196, upload-time = "2025-12-09T13:35:52.564Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/7d/4b633d709b8901d59444d2e512b93e72fe62d2b492a040097c3f7ba017bb/aiohttp_socks-0.11.0-py3-none-any.whl", hash = "sha256:9aacce57c931b8fbf8f6d333cf3cafe4c35b971b35430309e167a35a8aab9ec1", size = 10556, upload-time = "2025-12-09T13:35:50.18Z" }, -] - [[package]] name = "aiosignal" version = "1.4.0" @@ -253,12 +240,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] -[[package]] -name = "atomicwrites" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", size = 14227, upload-time = "2022-07-08T18:31:40.459Z" } - [[package]] name = "atroposlib" version = "0.4.0" @@ -376,6 +357,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/0a/0896b829a39b5669a2d811e1a79598de661693685cd62b31f11d0c18e65b/av-17.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dba98603fc4665b4f750de86fbaf6c0cfaece970671a9b529e0e3d1711e8367e", size = 22071058, upload-time = "2026-03-14T14:38:43.663Z" }, ] +[[package]] +name = "base58" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/45/8ae61209bb9015f516102fa559a2914178da1d5868428bd86a1b4421141d/base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c", size = 6528, upload-time = "2021-10-30T22:12:17.858Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/45/ec96b29162a402fc4c1c5512d114d7b3787b9d1c2ec241d9568b4816ee23/base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2", size = 5621, upload-time = "2021-10-30T22:12:16.658Z" }, +] + [[package]] name = "blinker" version = "1.9.0" @@ -1692,7 +1682,7 @@ all = [ { name = "honcho-ai" }, { name = "lark-oapi" }, { name = "markdown", marker = "sys_platform == 'linux'" }, - { name = "matrix-nio", extra = ["e2e"], marker = "sys_platform == 'linux'" }, + { name = "mautrix", extra = ["encryption"], marker = "sys_platform == 'linux'" }, { name = "mcp" }, { name = "mistralai" }, { name = "modal" }, @@ -1738,7 +1728,7 @@ honcho = [ ] matrix = [ { name = "markdown" }, - { name = "matrix-nio", extra = ["e2e"] }, + { name = "mautrix", extra = ["encryption"] }, ] mcp = [ { name = "mcp" }, @@ -1846,7 +1836,7 @@ requires-dist = [ { name = "jinja2", specifier = ">=3.1.5,<4" }, { name = "lark-oapi", marker = "extra == 'feishu'", specifier = ">=1.5.3,<2" }, { name = "markdown", marker = "extra == 'matrix'", specifier = ">=3.6,<4" }, - { name = "matrix-nio", extras = ["e2e"], marker = "extra == 'matrix'", specifier = ">=0.24.0,<1" }, + { name = "mautrix", extras = ["encryption"], marker = "extra == 'matrix'", specifier = ">=0.20,<1" }, { name = "mcp", marker = "extra == 'dev'", specifier = ">=1.2.0,<2" }, { name = "mcp", marker = "extra == 'mcp'", specifier = ">=1.2.0,<2" }, { name = "mistralai", marker = "extra == 'mistral'", specifier = ">=2.3.0,<3" }, @@ -2601,30 +2591,25 @@ wheels = [ ] [[package]] -name = "matrix-nio" -version = "0.25.2" +name = "mautrix" +version = "0.21.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiofiles" }, { name = "aiohttp" }, - { name = "aiohttp-socks" }, - { name = "h11" }, - { name = "h2" }, - { name = "jsonschema" }, - { name = "pycryptodome" }, - { name = "unpaddedbase64" }, + { name = "attrs" }, + { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/50/c20129fd6f0e1aad3510feefd3229427fc8163a111f3911ed834e414116b/matrix_nio-0.25.2.tar.gz", hash = "sha256:8ef8180c374e12368e5c83a692abfb3bab8d71efcd17c5560b5c40c9b6f2f600", size = 155480, upload-time = "2024-10-04T07:51:41.62Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/a7/8d6d0589e211ecf3a72ce4b28cc32c857c4043d1a6963d63ac9f726af653/mautrix-0.21.0.tar.gz", hash = "sha256:a14e0582e114cb241f282f9e717014608f36c03f1dc59afcd71b4e81780ffe2e", size = 254726, upload-time = "2025-11-17T13:53:09.996Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/0f/8b958d46e23ed4f69d2cffd63b46bb097a1155524e2e7f5c4279c8691c4a/matrix_nio-0.25.2-py3-none-any.whl", hash = "sha256:9c2880004b0e475db874456c0f79b7dd2b6285073a7663bcaca29e0754a67495", size = 181982, upload-time = "2024-10-04T07:51:39.451Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d6/d4b3ae380dacdc9fb07bc3eb7dd17f43b8a7ce391465a184d1094acb66c1/mautrix-0.21.0-py3-none-any.whl", hash = "sha256:1cba30d69f46351918a3b8bc4e5657465cac8470d42ddd2287a742653cab7194", size = 334131, upload-time = "2025-11-17T13:53:08.117Z" }, ] [package.optional-dependencies] -e2e = [ - { name = "atomicwrites" }, - { name = "cachetools" }, - { name = "peewee" }, +encryption = [ + { name = "base58" }, + { name = "pycryptodome" }, { name = "python-olm" }, + { name = "unpaddedbase64" }, ] [[package]] @@ -3337,15 +3322,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/3e/2218fa29637781b8e7ac35a928108ff2614ddd40879389d3af2caa725af5/parallel_web-0.4.2-py3-none-any.whl", hash = "sha256:aa3a4a9aecc08972c5ce9303271d4917903373dff4dd277d9a3e30f9cff53346", size = 144012, upload-time = "2026-03-09T22:24:33.979Z" }, ] -[[package]] -name = "peewee" -version = "3.19.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/b0/79462b42e89764998756e0557f2b58a15610a5b4512fbbcccae58fba7237/peewee-3.19.0.tar.gz", hash = "sha256:f88292a6f0d7b906cb26bca9c8599b8f4d8920ebd36124400d0cbaaaf915511f", size = 974035, upload-time = "2026-01-07T17:24:59.597Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/41/19c65578ef9a54b3083253c68a607f099642747168fe00f3a2bceb7c3a34/peewee-3.19.0-py3-none-any.whl", hash = "sha256:de220b94766e6008c466e00ce4ba5299b9a832117d9eb36d45d0062f3cfd7417", size = 411885, upload-time = "2026-01-07T17:24:58.33Z" }, -] - [[package]] name = "pillow" version = "12.1.1" @@ -4008,15 +3984,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/93/f6729f10149305262194774d6c8b438c0b084740cf239f48ab97b4df02fa/python_olm-3.2.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a5e68a2f4b5a2bfa5fdb5dbfa22396a551730df6c4a572235acaa96e997d3f", size = 297000, upload-time = "2023-11-28T19:25:31.045Z" }, ] -[[package]] -name = "python-socks" -version = "2.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/0b/cd77011c1bc01b76404f7aba07fca18aca02a19c7626e329b40201217624/python_socks-2.8.1.tar.gz", hash = "sha256:698daa9616d46dddaffe65b87db222f2902177a2d2b2c0b9a9361df607ab3687", size = 38909, upload-time = "2026-02-16T05:24:00.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/fe/9a58cb6eec633ff6afae150ca53c16f8cc8b65862ccb3d088051efdfceb7/python_socks-2.8.1-py3-none-any.whl", hash = "sha256:28232739c4988064e725cdbcd15be194743dd23f1c910f784163365b9d7be035", size = 55087, upload-time = "2026-02-16T05:23:59.147Z" }, -] - [[package]] name = "python-telegram-bot" version = "22.6" From 8053d48c8df8d931d6ec21bb563d7dfa6434b3c5 Mon Sep 17 00:00:00 2001 From: alt-glitch Date: Sat, 11 Apr 2026 06:51:43 +0530 Subject: [PATCH 009/372] refactor(matrix): rewrite adapter from matrix-nio to mautrix-python Translate all nio SDK calls to mautrix equivalents while preserving the adapter structure, business logic, and all features (E2EE, reactions, threading, mention gating, text batching, media caching, voice MSC3245). Key changes: - nio.AsyncClient -> mautrix.client.Client + HTTPAPI + MemoryStateStore - Manual E2EE key management -> OlmMachine with auto key lifecycle - isinstance(resp, nio.XxxResponse) -> mautrix returns values directly - add_event_callback per type -> single ROOM_MESSAGE handler with msgtype dispatch - Room state (member_count, display_name) via async state store lookups - Upload/download return ContentURI/bytes directly (no wrapper objects) --- gateway/platforms/matrix.py | 1381 ++++++++++++++--------------------- gateway/run.py | 2 +- hermes_cli/gateway.py | 2 +- hermes_cli/setup.py | 4 +- 4 files changed, 565 insertions(+), 824 deletions(-) diff --git a/gateway/platforms/matrix.py b/gateway/platforms/matrix.py index 053a5e619..6c1041cf2 100644 --- a/gateway/platforms/matrix.py +++ b/gateway/platforms/matrix.py @@ -1,8 +1,8 @@ """Matrix gateway adapter. Connects to any Matrix homeserver (self-hosted or matrix.org) via the -matrix-nio Python SDK. Supports optional end-to-end encryption (E2EE) -when installed with ``pip install "matrix-nio[e2e]"``. +mautrix Python SDK. Supports optional end-to-end encryption (E2EE) +when installed with ``pip install "mautrix[encryption]"``. Environment variables: MATRIX_HOMESERVER Homeserver URL (e.g. https://matrix.example.org) @@ -24,7 +24,6 @@ from __future__ import annotations import asyncio -import io import json import logging import mimetypes @@ -59,26 +58,22 @@ # Grace period: ignore messages older than this many seconds before startup. _STARTUP_GRACE_SECONDS = 5 -# E2EE key export file for persistence across restarts. -_KEY_EXPORT_FILE = _STORE_DIR / "exported_keys.txt" -_KEY_EXPORT_PASSPHRASE = "hermes-matrix-e2ee-keys" - # Pending undecrypted events: cap and TTL for retry buffer. _MAX_PENDING_EVENTS = 100 _PENDING_EVENT_TTL = 300 # seconds — stop retrying after 5 min _E2EE_INSTALL_HINT = ( - "Install with: pip install 'matrix-nio[e2e]' " + "Install with: pip install 'mautrix[encryption]' " "(requires libolm C library)" ) def _check_e2ee_deps() -> bool: - """Return True if matrix-nio E2EE dependencies (python-olm) are available.""" + """Return True if mautrix E2EE dependencies (python-olm) are available.""" try: - from nio.crypto import ENCRYPTION_ENABLED - return bool(ENCRYPTION_ENABLED) + from mautrix.crypto import OlmMachine # noqa: F401 + return True except (ImportError, AttributeError): return False @@ -96,11 +91,11 @@ def check_matrix_requirements() -> bool: logger.warning("Matrix: MATRIX_HOMESERVER not set") return False try: - import nio # noqa: F401 + import mautrix # noqa: F401 except ImportError: logger.warning( - "Matrix: matrix-nio not installed. " - "Run: pip install 'matrix-nio[e2e]'" + "Matrix: mautrix not installed. " + "Run: pip install 'mautrix[encryption]'" ) return False @@ -152,7 +147,7 @@ def __init__(self, config: PlatformConfig): or os.getenv("MATRIX_DEVICE_ID", "") ) - self._client: Any = None # nio.AsyncClient + self._client: Any = None # mautrix.client.Client self._sync_task: Optional[asyncio.Task] = None self._closing = False self._startup_ts: float = 0.0 @@ -167,7 +162,7 @@ def __init__(self, config: PlatformConfig): self._processed_events_set: set = set() # Buffer for undecrypted events pending key receipt. - # Each entry: (room, event, timestamp) + # Each entry: (room_id, event, timestamp) self._pending_megolm: list = [] # Thread participation tracking (for require_mention bypass) @@ -208,199 +203,157 @@ def _is_duplicate_event(self, event_id) -> bool: async def connect(self) -> bool: """Connect to the Matrix homeserver and start syncing.""" - import nio + from mautrix.api import HTTPAPI + from mautrix.client import Client + from mautrix.client.state_store import MemoryStateStore, MemorySyncStore + from mautrix.types import EventType, UserID if not self._homeserver: logger.error("Matrix: homeserver URL not configured") return False - # Determine store path and ensure it exists. - store_path = str(_STORE_DIR) + # Ensure store dir exists for E2EE key persistence. _STORE_DIR.mkdir(parents=True, exist_ok=True) + # Create the HTTP API layer. + api = HTTPAPI( + base_url=self._homeserver, + token=self._access_token or "", + ) + # Create the client. - # When a stable device_id is configured, pass it to the constructor - # so matrix-nio binds to it from the start (important for E2EE - # crypto-store persistence across restarts). - ctor_device_id = self._device_id or None - if self._encryption: - if not _check_e2ee_deps(): - logger.error( - "Matrix: MATRIX_ENCRYPTION=true but E2EE dependencies are missing. %s. " - "Refusing to connect — encrypted rooms would silently fail.", - _E2EE_INSTALL_HINT, - ) - return False - try: - client = nio.AsyncClient( - self._homeserver, - self._user_id or "", - device_id=ctor_device_id, - store_path=store_path, - ) - logger.info( - "Matrix: E2EE enabled (store: %s%s)", - store_path, - f", device_id={self._device_id}" if self._device_id else "", - ) - except Exception as exc: - logger.error( - "Matrix: failed to create E2EE client: %s. %s", - exc, _E2EE_INSTALL_HINT, - ) - return False - else: - client = nio.AsyncClient( - self._homeserver, - self._user_id or "", - device_id=ctor_device_id, - ) + state_store = MemoryStateStore() + sync_store = MemorySyncStore() + client = Client( + mxid=UserID(self._user_id) if self._user_id else UserID(""), + device_id=self._device_id or None, + api=api, + state_store=state_store, + sync_store=sync_store, + ) self._client = client # Authenticate. if self._access_token: - client.access_token = self._access_token - - # With access-token auth, always resolve whoami so we validate the - # token and learn the device_id. The device_id matters for E2EE: - # without it, matrix-nio can send plain messages but may fail to - # decrypt inbound encrypted events or encrypt outbound room sends. - resp = await client.whoami() - if isinstance(resp, nio.WhoamiResponse): + api.token = self._access_token + + # Validate the token and learn user_id / device_id. + try: + resp = await client.whoami() resolved_user_id = getattr(resp, "user_id", "") or self._user_id resolved_device_id = getattr(resp, "device_id", "") if resolved_user_id: - self._user_id = resolved_user_id + self._user_id = str(resolved_user_id) + client.mxid = UserID(self._user_id) - # Prefer the user-configured device_id (MATRIX_DEVICE_ID) so - # the bot reuses a stable identity across restarts. Fall back - # to whatever whoami returned. + # Prefer user-configured device_id for stable E2EE identity. effective_device_id = self._device_id or resolved_device_id - - # restore_login() is the matrix-nio path that binds the access - # token to a specific device and loads the crypto store. - if effective_device_id and hasattr(client, "restore_login"): - client.restore_login( - self._user_id or resolved_user_id, - effective_device_id, - self._access_token, - ) - else: - if self._user_id: - client.user_id = self._user_id - if effective_device_id: - client.device_id = effective_device_id - client.access_token = self._access_token - if self._encryption: - logger.warning( - "Matrix: access-token login did not restore E2EE state; " - "encrypted rooms may fail until a device_id is available. " - "Set MATRIX_DEVICE_ID to a stable value." - ) + if effective_device_id: + client.device_id = effective_device_id logger.info( "Matrix: using access token for %s%s", self._user_id or "(unknown user)", f" (device {effective_device_id})" if effective_device_id else "", ) - else: + except Exception as exc: logger.error( - "Matrix: whoami failed — check MATRIX_ACCESS_TOKEN and MATRIX_HOMESERVER" + "Matrix: whoami failed — check MATRIX_ACCESS_TOKEN and MATRIX_HOMESERVER: %s", + exc, ) - await client.close() return False elif self._password and self._user_id: - resp = await client.login( - self._password, - device_name="Hermes Agent", - ) - if isinstance(resp, nio.LoginResponse): + try: + resp = await client.login( + identifier=self._user_id, + password=self._password, + device_name="Hermes Agent", + device_id=self._device_id or None, + ) + # login() stores the token automatically. + if resp and hasattr(resp, "device_id"): + client.device_id = resp.device_id logger.info("Matrix: logged in as %s", self._user_id) - else: - logger.error("Matrix: login failed — %s", getattr(resp, "message", resp)) - await client.close() + except Exception as exc: + logger.error("Matrix: login failed — %s", exc) return False else: logger.error("Matrix: need MATRIX_ACCESS_TOKEN or MATRIX_USER_ID + MATRIX_PASSWORD") - await client.close() return False - # If E2EE is enabled, load the crypto store. - if self._encryption and getattr(client, "olm", None): + # Set up E2EE if requested. + if self._encryption: + if not _check_e2ee_deps(): + logger.error( + "Matrix: MATRIX_ENCRYPTION=true but E2EE dependencies are missing. %s. " + "Refusing to connect — encrypted rooms would silently fail.", + _E2EE_INSTALL_HINT, + ) + return False try: - if client.should_upload_keys: - await client.keys_upload() - logger.info("Matrix: E2EE crypto initialized") + from mautrix.crypto import OlmMachine + from mautrix.crypto.store import MemoryCryptoStore + + crypto_store = MemoryCryptoStore() + olm = OlmMachine(client, crypto_store, state_store) + + # Set trust policy: accept unverified devices so senders + # share Megolm session keys with us automatically. + from mautrix.types import TrustState + olm.share_keys_min_trust = TrustState.UNVERIFIED + olm.send_keys_min_trust = TrustState.UNVERIFIED + + await olm.load() + client.crypto = olm + logger.info( + "Matrix: E2EE enabled (store: %s%s)", + str(_STORE_DIR), + f", device_id={client.device_id}" if client.device_id else "", + ) except Exception as exc: - logger.warning("Matrix: crypto init issue: %s", exc) + logger.error( + "Matrix: failed to create E2EE client: %s. %s", + exc, _E2EE_INSTALL_HINT, + ) + return False - # Import previously exported Megolm keys (survives restarts). - if _KEY_EXPORT_FILE.exists(): - try: - await client.import_keys( - str(_KEY_EXPORT_FILE), _KEY_EXPORT_PASSPHRASE, - ) - logger.info("Matrix: imported Megolm keys from backup") - except Exception as exc: - logger.debug("Matrix: could not import keys: %s", exc) - elif self._encryption: - # E2EE was requested but the crypto store failed to load — - # this means encrypted rooms will silently not work. Hard-fail. - logger.error( - "Matrix: E2EE requested but crypto store is not loaded — " - "cannot decrypt or encrypt messages. %s", - _E2EE_INSTALL_HINT, - ) - await client.close() - return False + # Register event handlers. + from mautrix.client import InternalEventType as IntEvt - # Register event callbacks. - client.add_event_callback(self._on_room_message, nio.RoomMessageText) - client.add_event_callback(self._on_room_message_media, nio.RoomMessageImage) - client.add_event_callback(self._on_room_message_media, nio.RoomMessageAudio) - client.add_event_callback(self._on_room_message_media, nio.RoomMessageVideo) - client.add_event_callback(self._on_room_message_media, nio.RoomMessageFile) - for encrypted_media_cls in ( - getattr(nio, "RoomEncryptedImage", None), - getattr(nio, "RoomEncryptedAudio", None), - getattr(nio, "RoomEncryptedVideo", None), - getattr(nio, "RoomEncryptedFile", None), - ): - if encrypted_media_cls is not None: - client.add_event_callback(self._on_room_message_media, encrypted_media_cls) - client.add_event_callback(self._on_invite, nio.InviteMemberEvent) - - # Reaction events (m.reaction). - if hasattr(nio, "ReactionEvent"): - client.add_event_callback(self._on_reaction, nio.ReactionEvent) - else: - # Older matrix-nio versions: use UnknownEvent fallback. - client.add_event_callback(self._on_unknown_event, nio.UnknownEvent) + client.add_event_handler(EventType.ROOM_MESSAGE, self._on_room_message) + client.add_event_handler(EventType.REACTION, self._on_reaction) + client.add_event_handler(IntEvt.INVITE, self._on_invite) - # If E2EE: handle encrypted events. - if self._encryption and hasattr(client, "olm"): - client.add_event_callback( - self._on_room_message, nio.MegolmEvent - ) + if self._encryption and getattr(client, "crypto", None): + client.add_event_handler(EventType.ROOM_ENCRYPTED, self._on_encrypted_event) # Initial sync to catch up, then start background sync. self._startup_ts = time.time() self._closing = False - # Do an initial sync to populate room state. - resp = await client.sync(timeout=10000, full_state=True) - if isinstance(resp, nio.SyncResponse): - self._joined_rooms = set(resp.rooms.join.keys()) - logger.info( - "Matrix: initial sync complete, joined %d rooms", - len(self._joined_rooms), - ) - # Build DM room cache from m.direct account data. - await self._refresh_dm_cache() - await self._run_e2ee_maintenance() - else: - logger.warning("Matrix: initial sync returned %s", type(resp).__name__) + try: + sync_data = await client.sync(timeout=10000, full_state=True) + if isinstance(sync_data, dict): + rooms_join = sync_data.get("rooms", {}).get("join", {}) + self._joined_rooms = set(rooms_join.keys()) + logger.info( + "Matrix: initial sync complete, joined %d rooms", + len(self._joined_rooms), + ) + # Build DM room cache from m.direct account data. + await self._refresh_dm_cache() + else: + logger.warning("Matrix: initial sync returned unexpected type %s", type(sync_data).__name__) + except Exception as exc: + logger.warning("Matrix: initial sync error: %s", exc) + + # Share keys after initial sync if E2EE is enabled. + if self._encryption and getattr(client, "crypto", None): + try: + await client.crypto.share_keys() + except Exception as exc: + logger.warning("Matrix: initial key share failed: %s", exc) # Start the sync loop. self._sync_task = asyncio.create_task(self._sync_loop()) @@ -418,20 +371,11 @@ async def disconnect(self) -> None: except (asyncio.CancelledError, Exception): pass - # Export Megolm keys before closing so the next restart can decrypt - # events that used sessions from this run. - if self._client and self._encryption and getattr(self._client, "olm", None): - try: - _STORE_DIR.mkdir(parents=True, exist_ok=True) - await self._client.export_keys( - str(_KEY_EXPORT_FILE), _KEY_EXPORT_PASSPHRASE, - ) - logger.info("Matrix: exported Megolm keys for next restart") - except Exception as exc: - logger.debug("Matrix: could not export keys on disconnect: %s", exc) - if self._client: - await self._client.close() + try: + await self._client.api.session.close() + except Exception: + pass self._client = None logger.info("Matrix: disconnected") @@ -444,7 +388,7 @@ async def send( metadata: Optional[Dict[str, Any]] = None, ) -> SendResult: """Send a message to a Matrix room.""" - import nio + from mautrix.types import EventType, RoomID if not content: return SendResult(success=True) @@ -482,52 +426,38 @@ async def send( relates_to["m.in_reply_to"] = {"event_id": reply_to} msg_content["m.relates_to"] = relates_to - async def _room_send_once(*, ignore_unverified_devices: bool = False): - return await asyncio.wait_for( - self._client.room_send( - chat_id, - "m.room.message", + try: + event_id = await asyncio.wait_for( + self._client.send_message_event( + RoomID(chat_id), + EventType.ROOM_MESSAGE, msg_content, - ignore_unverified_devices=ignore_unverified_devices, ), timeout=45, ) - - try: - resp = await _room_send_once(ignore_unverified_devices=False) - except Exception as exc: - retryable = isinstance(exc, asyncio.TimeoutError) - olm_unverified = getattr(nio, "OlmUnverifiedDeviceError", None) - send_retry = getattr(nio, "SendRetryError", None) - if isinstance(olm_unverified, type) and isinstance(exc, olm_unverified): - retryable = True - if isinstance(send_retry, type) and isinstance(exc, send_retry): - retryable = True - - if not retryable: - logger.error("Matrix: failed to send to %s: %s", chat_id, exc) - return SendResult(success=False, error=str(exc)) - - logger.warning( - "Matrix: initial encrypted send to %s failed (%s); " - "retrying after E2EE maintenance with ignored unverified devices", - chat_id, - exc, - ) - await self._run_e2ee_maintenance() - try: - resp = await _room_send_once(ignore_unverified_devices=True) - except Exception as retry_exc: - logger.error("Matrix: failed to send to %s after retry: %s", chat_id, retry_exc) - return SendResult(success=False, error=str(retry_exc)) - - if isinstance(resp, nio.RoomSendResponse): - last_event_id = resp.event_id + last_event_id = str(event_id) logger.info("Matrix: sent event %s to %s", last_event_id, chat_id) - else: - err = getattr(resp, "message", str(resp)) - logger.error("Matrix: failed to send to %s: %s", chat_id, err) - return SendResult(success=False, error=err) + except Exception as exc: + # On E2EE errors, retry after sharing keys. + if self._encryption and getattr(self._client, "crypto", None): + try: + await self._client.crypto.share_keys() + event_id = await asyncio.wait_for( + self._client.send_message_event( + RoomID(chat_id), + EventType.ROOM_MESSAGE, + msg_content, + ), + timeout=45, + ) + last_event_id = str(event_id) + logger.info("Matrix: sent event %s to %s (after key share)", last_event_id, chat_id) + continue + except Exception as retry_exc: + logger.error("Matrix: failed to send to %s after retry: %s", chat_id, retry_exc) + return SendResult(success=False, error=str(retry_exc)) + logger.error("Matrix: failed to send to %s: %s", chat_id, exc) + return SendResult(success=False, error=str(exc)) return SendResult(success=True, message_id=last_event_id) @@ -537,14 +467,32 @@ async def get_chat_info(self, chat_id: str) -> Dict[str, Any]: chat_type = "group" if self._client: - room = self._client.rooms.get(chat_id) - if room: - name = room.display_name or room.canonical_alias or chat_id - # Use DM cache. - if self._dm_rooms.get(chat_id, False): - chat_type = "dm" - elif room.member_count == 2: - chat_type = "dm" + # Try state store for member count. + state_store = getattr(self._client, "state_store", None) + if state_store: + try: + members = await state_store.get_members( + chat_id, + ) + if members and len(members) == 2: + chat_type = "dm" + except Exception: + pass + + # Use DM cache. + if self._dm_rooms.get(chat_id, False): + chat_type = "dm" + + # Try to get room name from state. + try: + from mautrix.types import EventType as ET, RoomID + name_evt = await self._client.get_state_event( + RoomID(chat_id), ET.ROOM_NAME, + ) + if name_evt and hasattr(name_evt, "name") and name_evt.name: + name = name_evt.name + except Exception: + pass return {"name": name, "type": chat_type} @@ -558,7 +506,8 @@ async def send_typing( """Send a typing indicator.""" if self._client: try: - await self._client.room_typing(chat_id, typing_state=True, timeout=30000) + from mautrix.types import RoomID + await self._client.set_typing(RoomID(chat_id), timeout=30000) except Exception: pass @@ -566,7 +515,7 @@ async def edit_message( self, chat_id: str, message_id: str, content: str ) -> SendResult: """Edit an existing message (via m.replace).""" - import nio + from mautrix.types import EventType, RoomID formatted = self.format_message(content) msg_content: Dict[str, Any] = { @@ -589,10 +538,13 @@ async def edit_message( msg_content["format"] = "org.matrix.custom.html" msg_content["formatted_body"] = f"* {html}" - resp = await self._client.room_send(chat_id, "m.room.message", msg_content) - if isinstance(resp, nio.RoomSendResponse): - return SendResult(success=True, message_id=resp.event_id) - return SendResult(success=False, error=getattr(resp, "message", str(resp))) + try: + event_id = await self._client.send_message_event( + RoomID(chat_id), EventType.ROOM_MESSAGE, msg_content, + ) + return SendResult(success=True, message_id=str(event_id)) + except Exception as exc: + return SendResult(success=False, error=str(exc)) async def send_image( self, @@ -665,7 +617,7 @@ async def send_voice( ) -> SendResult: """Upload an audio file as a voice message (MSC3245 native voice).""" return await self._send_local_file( - chat_id, audio_path, "m.audio", caption, reply_to, + chat_id, audio_path, "m.audio", caption, reply_to, metadata=metadata, is_voice=True ) @@ -703,29 +655,24 @@ async def _upload_and_send( is_voice: bool = False, ) -> SendResult: """Upload bytes to Matrix and send as a media message.""" - import nio + from mautrix.types import EventType, RoomID # Upload to homeserver. - # nio expects a DataProvider (callable) or file-like object, not raw bytes. - # nio.upload() returns a tuple (UploadResponse|UploadError, Optional[Dict]) - resp, maybe_encryption_info = await self._client.upload( - io.BytesIO(data), - content_type=content_type, - filename=filename, - filesize=len(data), - ) - if not isinstance(resp, nio.UploadResponse): - err = getattr(resp, "message", str(resp)) - logger.error("Matrix: upload failed: %s", err) - return SendResult(success=False, error=err) - - mxc_url = resp.content_uri + try: + mxc_url = await self._client.upload_media( + data, + mime_type=content_type, + filename=filename, + ) + except Exception as exc: + logger.error("Matrix: upload failed: %s", exc) + return SendResult(success=False, error=str(exc)) # Build media message content. msg_content: Dict[str, Any] = { "msgtype": msgtype, "body": caption or filename, - "url": mxc_url, + "url": str(mxc_url), "info": { "mimetype": content_type, "size": len(data), @@ -749,10 +696,13 @@ async def _upload_and_send( relates_to["is_falling_back"] = True msg_content["m.relates_to"] = relates_to - resp2 = await self._client.room_send(room_id, "m.room.message", msg_content) - if isinstance(resp2, nio.RoomSendResponse): - return SendResult(success=True, message_id=resp2.event_id) - return SendResult(success=False, error=getattr(resp2, "message", str(resp2))) + try: + event_id = await self._client.send_message_event( + RoomID(room_id), EventType.ROOM_MESSAGE, msg_content, + ) + return SendResult(success=True, message_id=str(event_id)) + except Exception as exc: + return SendResult(success=False, error=str(exc)) async def _send_local_file( self, @@ -784,37 +734,32 @@ async def _send_local_file( async def _sync_loop(self) -> None: """Continuously sync with the homeserver.""" - import nio - while not self._closing: try: - resp = await self._client.sync(timeout=30000) - if isinstance(resp, nio.SyncError): - if self._closing: - return - err_msg = str(getattr(resp, "message", resp)).lower() - if "m_unknown_token" in err_msg or "m_forbidden" in err_msg or "401" in err_msg: - logger.error( - "Matrix: permanent auth error from sync: %s — stopping sync", - getattr(resp, "message", resp), - ) - return - logger.warning( - "Matrix: sync returned %s: %s — retrying in 5s", - type(resp).__name__, - getattr(resp, "message", resp), - ) - await asyncio.sleep(5) - continue + sync_data = await self._client.sync(timeout=30000) + if isinstance(sync_data, dict): + # Update joined rooms from sync response. + rooms_join = sync_data.get("rooms", {}).get("join", {}) + if rooms_join: + self._joined_rooms.update(rooms_join.keys()) + + # Share keys periodically if E2EE is enabled. + if self._encryption and getattr(self._client, "crypto", None): + try: + await self._client.crypto.share_keys() + except Exception as exc: + logger.warning("Matrix: E2EE key share failed: %s", exc) + + # Retry any buffered undecrypted events. + if self._pending_megolm: + await self._retry_pending_decryptions() - await self._run_e2ee_maintenance() except asyncio.CancelledError: return except Exception as exc: if self._closing: return - # Detect permanent auth/permission failures that will never - # succeed on retry — stop syncing instead of looping forever. + # Detect permanent auth/permission failures. err_str = str(exc).lower() if "401" in err_str or "403" in err_str or "unauthorized" in err_str or "forbidden" in err_str: logger.error("Matrix: permanent auth error: %s — stopping sync", exc) @@ -822,98 +767,19 @@ async def _sync_loop(self) -> None: logger.warning("Matrix: sync error: %s — retrying in 5s", exc) await asyncio.sleep(5) - async def _run_e2ee_maintenance(self) -> None: - """Run matrix-nio E2EE housekeeping between syncs. - - Hermes uses a custom sync loop instead of matrix-nio's sync_forever(), - so we need to explicitly drive the key management work that sync_forever() - normally handles for encrypted rooms. - - Also auto-trusts all devices (so senders share session keys with us) - and retries decryption for any buffered MegolmEvents. - """ - client = self._client - if not client or not self._encryption or not getattr(client, "olm", None): - return - - did_query_keys = client.should_query_keys - - tasks = [asyncio.create_task(client.send_to_device_messages())] - - if client.should_upload_keys: - tasks.append(asyncio.create_task(client.keys_upload())) - - if did_query_keys: - tasks.append(asyncio.create_task(client.keys_query())) - - if client.should_claim_keys: - users = client.get_users_for_key_claiming() - if users: - tasks.append(asyncio.create_task(client.keys_claim(users))) - - for task in asyncio.as_completed(tasks): - try: - await task - except asyncio.CancelledError: - raise - except Exception as exc: - logger.warning("Matrix: E2EE maintenance task failed: %s", exc) - - # After key queries, auto-trust all devices so senders share keys with - # us. For a bot this is the right default — we want to decrypt - # everything, not enforce manual verification. - if did_query_keys: - self._auto_trust_devices() - - # Retry any buffered undecrypted events now that new keys may have - # arrived (from key requests, key queries, or to-device forwarding). - if self._pending_megolm: - await self._retry_pending_decryptions() - - def _auto_trust_devices(self) -> None: - """Trust/verify all unverified devices we know about. - - When other clients see our device as verified, they proactively share - Megolm session keys with us. Without this, many clients will refuse - to include an unverified device in key distributions. - """ - client = self._client - if not client: - return - - device_store = getattr(client, "device_store", None) - if not device_store: - return - - own_device = getattr(client, "device_id", None) - trusted_count = 0 - - try: - # DeviceStore.__iter__ yields OlmDevice objects directly. - for device in device_store: - if getattr(device, "device_id", None) == own_device: - continue - if not getattr(device, "verified", False): - client.verify_device(device) - trusted_count += 1 - except Exception as exc: - logger.debug("Matrix: auto-trust error: %s", exc) - - if trusted_count: - logger.info("Matrix: auto-trusted %d new device(s)", trusted_count) - async def _retry_pending_decryptions(self) -> None: - """Retry decrypting buffered MegolmEvents after new keys arrive.""" - import nio - + """Retry decrypting buffered encrypted events after new keys arrive.""" client = self._client if not client or not self._pending_megolm: return + crypto = getattr(client, "crypto", None) + if not crypto: + return now = time.time() still_pending: list = [] - for room, event, ts in self._pending_megolm: + for room_id, event, ts in self._pending_megolm: # Drop events that have aged past the TTL. if now - ts > _PENDING_EVENT_TTL: logger.debug( @@ -923,39 +789,23 @@ async def _retry_pending_decryptions(self) -> None: continue try: - decrypted = client.decrypt_event(event) + decrypted = await crypto.decrypt_megolm_event(event) except Exception: - # Still missing the key — keep in buffer. - still_pending.append((room, event, ts)) + still_pending.append((room_id, event, ts)) continue - if isinstance(decrypted, nio.MegolmEvent): - # decrypt_event returned the same undecryptable event. - still_pending.append((room, event, ts)) + if decrypted is None or decrypted is event: + still_pending.append((room_id, event, ts)) continue logger.info( - "Matrix: decrypted buffered event %s (%s)", + "Matrix: decrypted buffered event %s", getattr(event, "event_id", "?"), - type(decrypted).__name__, ) - # Route to the appropriate handler based on decrypted type. + # Route to the appropriate handler. try: - if isinstance(decrypted, nio.RoomMessageText): - await self._on_room_message(room, decrypted) - elif isinstance( - decrypted, - (nio.RoomMessageImage, nio.RoomMessageAudio, - nio.RoomMessageVideo, nio.RoomMessageFile), - ): - await self._on_room_message_media(room, decrypted) - else: - logger.debug( - "Matrix: decrypted event %s has unhandled type %s", - getattr(event, "event_id", "?"), - type(decrypted).__name__, - ) + await self._on_room_message(decrypted) except Exception as exc: logger.warning( "Matrix: error processing decrypted event %s: %s", @@ -968,62 +818,78 @@ async def _retry_pending_decryptions(self) -> None: # Event callbacks # ------------------------------------------------------------------ - async def _on_room_message(self, room: Any, event: Any) -> None: - """Handle incoming text messages (and decrypted megolm events).""" - import nio + async def _on_room_message(self, event: Any) -> None: + """Handle incoming room message events (text, media).""" + room_id = str(getattr(event, "room_id", "")) + sender = str(getattr(event, "sender", "")) # Ignore own messages. - if event.sender == self._user_id: + if sender == self._user_id: return - # Deduplicate by event ID (nio can fire the same event more than once). - if self._is_duplicate_event(getattr(event, "event_id", None)): + # Deduplicate by event ID. + event_id = str(getattr(event, "event_id", "")) + if self._is_duplicate_event(event_id): return # Startup grace: ignore old messages from initial sync. - event_ts = getattr(event, "server_timestamp", 0) / 1000.0 + event_ts = getattr(event, "timestamp", 0) / 1000.0 if getattr(event, "timestamp", 0) else 0 + # Also check server_timestamp for compatibility. + if not event_ts: + event_ts = getattr(event, "server_timestamp", 0) / 1000.0 if getattr(event, "server_timestamp", 0) else 0 if event_ts and event_ts < self._startup_ts - _STARTUP_GRACE_SECONDS: return - # Handle undecryptable MegolmEvents: request the missing session key - # and buffer the event for retry once the key arrives. - if isinstance(event, nio.MegolmEvent): - logger.warning( - "Matrix: could not decrypt event %s in %s — requesting key", - event.event_id, room.room_id, - ) + # Extract content from the event. + content = getattr(event, "content", None) + if content is None: + return - # Ask other devices in the room to forward the session key. - try: - resp = await self._client.request_room_key(event) - if hasattr(resp, "event_id") or not isinstance(resp, Exception): - logger.debug( - "Matrix: room key request sent for session %s", - getattr(event, "session_id", "?"), - ) - except Exception as exc: - logger.debug("Matrix: room key request failed: %s", exc) + # Get msgtype — either from content object or raw dict. + if hasattr(content, "msgtype"): + msgtype = str(content.msgtype) + elif isinstance(content, dict): + msgtype = content.get("msgtype", "") + else: + msgtype = "" - # Buffer for retry on next maintenance cycle. - self._pending_megolm.append((room, event, time.time())) - if len(self._pending_megolm) > _MAX_PENDING_EVENTS: - self._pending_megolm = self._pending_megolm[-_MAX_PENDING_EVENTS:] - return + # Determine source content dict for relation/thread extraction. + if isinstance(content, dict): + source_content = content + elif hasattr(content, "serialize"): + source_content = content.serialize() + else: + source_content = {} - # Skip edits (m.replace relation). - source_content = getattr(event, "source", {}).get("content", {}) relates_to = source_content.get("m.relates_to", {}) + + # Skip edits (m.replace relation). if relates_to.get("rel_type") == "m.replace": return - body = getattr(event, "body", "") or "" + # Dispatch by msgtype. + media_msgtypes = ("m.image", "m.audio", "m.video", "m.file") + if msgtype in media_msgtypes: + await self._handle_media_message(room_id, sender, event_id, event_ts, source_content, relates_to, msgtype) + elif msgtype in ("m.text", "m.notice"): + await self._handle_text_message(room_id, sender, event_id, event_ts, source_content, relates_to) + + async def _handle_text_message( + self, + room_id: str, + sender: str, + event_id: str, + event_ts: float, + source_content: dict, + relates_to: dict, + ) -> None: + """Process a text message event.""" + body = source_content.get("body", "") or "" if not body: return # Determine chat type. - is_dm = self._dm_rooms.get(room.room_id, False) - if not is_dm and room.member_count == 2: - is_dm = True + is_dm = await self._is_dm_room(room_id) chat_type = "dm" if is_dm else "group" # Thread support. @@ -1036,7 +902,7 @@ async def _on_room_message(self, room: Any, event: Any) -> None: free_rooms_raw = os.getenv("MATRIX_FREE_RESPONSE_ROOMS", "") free_rooms = {r.strip() for r in free_rooms_raw.split(",") if r.strip()} require_mention = os.getenv("MATRIX_REQUIRE_MENTION", "true").lower() not in ("false", "0", "no") - is_free_room = room.room_id in free_rooms + is_free_room = room_id in free_rooms in_bot_thread = bool(thread_id and thread_id in self._bot_participated_threads) formatted_body = source_content.get("formatted_body") @@ -1044,22 +910,22 @@ async def _on_room_message(self, room: Any, event: Any) -> None: if not self._is_bot_mentioned(body, formatted_body): return - # DM mention-thread: when enabled, @mentioning bot in a DM creates a thread. + # DM mention-thread. if is_dm and not thread_id: dm_mention_threads = os.getenv("MATRIX_DM_MENTION_THREADS", "false").lower() in ("true", "1", "yes") if dm_mention_threads and self._is_bot_mentioned(body, source_content.get("formatted_body")): - thread_id = event.event_id + thread_id = event_id self._track_thread(thread_id) - # Strip mention from body when present (including in DMs). + # Strip mention from body. if self._is_bot_mentioned(body, source_content.get("formatted_body")): body = self._strip_mention(body) - # Auto-thread: create a thread for non-DM, non-threaded messages. + # Auto-thread. if not is_dm and not thread_id: auto_thread = os.getenv("MATRIX_AUTO_THREAD", "true").lower() in ("true", "1", "yes") if auto_thread: - thread_id = event.event_id + thread_id = event_id self._track_thread(thread_id) # Reply-to detection. @@ -1068,7 +934,7 @@ async def _on_room_message(self, room: Any, event: Any) -> None: if in_reply_to: reply_to = in_reply_to.get("event_id") - # Strip reply fallback from body (Matrix prepends "> ..." lines). + # Strip reply fallback from body. if reply_to and body.startswith("> "): lines = body.split("\n") stripped = [] @@ -1089,11 +955,12 @@ async def _on_room_message(self, room: Any, event: Any) -> None: if body.startswith(("!", "/")): msg_type = MessageType.COMMAND + display_name = await self._get_display_name(room_id, sender) source = self.build_source( - chat_id=room.room_id, + chat_id=room_id, chat_type=chat_type, - user_id=event.sender, - user_name=self._get_display_name(room, event.sender), + user_id=sender, + user_name=display_name, thread_id=thread_id, ) @@ -1101,218 +968,105 @@ async def _on_room_message(self, room: Any, event: Any) -> None: text=body, message_type=msg_type, source=source, - raw_message=getattr(event, "source", {}), - message_id=event.event_id, + raw_message=source_content, + message_id=event_id, reply_to_message_id=reply_to, ) if thread_id: self._track_thread(thread_id) - # Acknowledge receipt so the room shows as read (fire-and-forget). - self._background_read_receipt(room.room_id, event.event_id) + # Acknowledge receipt (fire-and-forget). + self._background_read_receipt(room_id, event_id) - # Only batch plain text messages — commands dispatch immediately. + # Batch plain text messages — commands dispatch immediately. if msg_type == MessageType.TEXT and self._text_batch_delay_seconds > 0: self._enqueue_text_event(msg_event) else: await self.handle_message(msg_event) - # ------------------------------------------------------------------ - # Text message aggregation (handles Matrix client-side splits) - # ------------------------------------------------------------------ - - def _text_batch_key(self, event: MessageEvent) -> str: - """Session-scoped key for text message batching.""" - from gateway.session import build_session_key - return build_session_key( - event.source, - group_sessions_per_user=self.config.extra.get("group_sessions_per_user", True), - thread_sessions_per_user=self.config.extra.get("thread_sessions_per_user", False), - ) - - def _enqueue_text_event(self, event: MessageEvent) -> None: - """Buffer a text event and reset the flush timer. - - When a Matrix client splits a long message, the chunks arrive within - a few hundred milliseconds. This merges them into a single event - before dispatching. - """ - key = self._text_batch_key(event) - existing = self._pending_text_batches.get(key) - chunk_len = len(event.text or "") - if existing is None: - event._last_chunk_len = chunk_len # type: ignore[attr-defined] - self._pending_text_batches[key] = event - else: - if event.text: - existing.text = f"{existing.text}\n{event.text}" if existing.text else event.text - existing._last_chunk_len = chunk_len # type: ignore[attr-defined] - # Merge any media that might be attached - if event.media_urls: - existing.media_urls.extend(event.media_urls) - existing.media_types.extend(event.media_types) - - # Cancel any pending flush and restart the timer - prior_task = self._pending_text_batch_tasks.get(key) - if prior_task and not prior_task.done(): - prior_task.cancel() - self._pending_text_batch_tasks[key] = asyncio.create_task( - self._flush_text_batch(key) - ) - - async def _flush_text_batch(self, key: str) -> None: - """Wait for the quiet period then dispatch the aggregated text. - - Uses a longer delay when the latest chunk is near Matrix's ~4000-char - split point, since a continuation chunk is almost certain. - """ - current_task = asyncio.current_task() - try: - pending = self._pending_text_batches.get(key) - last_len = getattr(pending, "_last_chunk_len", 0) if pending else 0 - if last_len >= self._SPLIT_THRESHOLD: - delay = self._text_batch_split_delay_seconds - else: - delay = self._text_batch_delay_seconds - await asyncio.sleep(delay) - event = self._pending_text_batches.pop(key, None) - if not event: - return - logger.info( - "[Matrix] Flushing text batch %s (%d chars)", - key, len(event.text or ""), - ) - await self.handle_message(event) - finally: - if self._pending_text_batch_tasks.get(key) is current_task: - self._pending_text_batch_tasks.pop(key, None) - - async def _on_room_message_media(self, room: Any, event: Any) -> None: - """Handle incoming media messages (images, audio, video, files).""" - import nio - - # Ignore own messages. - if event.sender == self._user_id: - return - - # Deduplicate by event ID. - if self._is_duplicate_event(getattr(event, "event_id", None)): - return - - # Startup grace. - event_ts = getattr(event, "server_timestamp", 0) / 1000.0 - if event_ts and event_ts < self._startup_ts - _STARTUP_GRACE_SECONDS: - return - - body = getattr(event, "body", "") or "" - url = getattr(event, "url", "") + async def _handle_media_message( + self, + room_id: str, + sender: str, + event_id: str, + event_ts: float, + source_content: dict, + relates_to: dict, + msgtype: str, + ) -> None: + """Process a media message event (image, audio, video, file).""" + body = source_content.get("body", "") or "" + url = source_content.get("url", "") # Convert mxc:// to HTTP URL for downstream processing. http_url = "" if url and url.startswith("mxc://"): http_url = self._mxc_to_http(url) - # Determine message type from event class. - # Use the MIME type from the event's content info when available, - # falling back to category-level MIME types for downstream matching - # (gateway/run.py checks startswith("image/"), startswith("audio/"), etc.) - source_content = getattr(event, "source", {}).get("content", {}) - if not isinstance(source_content, dict): - source_content = {} - event_content = getattr(event, "content", {}) - if not isinstance(event_content, dict): - event_content = {} - content_info = event_content.get("info") if isinstance(event_content, dict) else {} - if not isinstance(content_info, dict) or not content_info: - content_info = source_content.get("info", {}) if isinstance(source_content, dict) else {} - event_mimetype = ( - (content_info.get("mimetype") if isinstance(content_info, dict) else None) - or getattr(event, "mimetype", "") - or "" - ) - # For encrypted media, the URL may be in file.url instead of event.url. - file_content = source_content.get("file", {}) if isinstance(source_content, dict) else {} + # Extract MIME type from content info. + content_info = source_content.get("info", {}) + if not isinstance(content_info, dict): + content_info = {} + event_mimetype = content_info.get("mimetype", "") + + # For encrypted media, the URL may be in file.url. + file_content = source_content.get("file", {}) if not url and isinstance(file_content, dict): url = file_content.get("url", "") or "" if url and url.startswith("mxc://"): http_url = self._mxc_to_http(url) + is_encrypted_media = bool(file_content and isinstance(file_content, dict) and file_content.get("url")) + media_type = "application/octet-stream" msg_type = MessageType.DOCUMENT - - # Safely resolve encrypted media classes — they may not exist on older - # nio versions, and in test environments nio may be mocked (MagicMock - # auto-attributes are not valid types for isinstance). - def _safe_isinstance(obj, cls_name): - cls = getattr(nio, cls_name, None) - if cls is None or not isinstance(cls, type): - return False - return isinstance(obj, cls) - - is_encrypted_image = _safe_isinstance(event, "RoomEncryptedImage") - is_encrypted_audio = _safe_isinstance(event, "RoomEncryptedAudio") - is_encrypted_video = _safe_isinstance(event, "RoomEncryptedVideo") - is_encrypted_file = _safe_isinstance(event, "RoomEncryptedFile") - is_encrypted_media = any((is_encrypted_image, is_encrypted_audio, is_encrypted_video, is_encrypted_file)) is_voice_message = False - if isinstance(event, nio.RoomMessageImage) or is_encrypted_image: + if msgtype == "m.image": msg_type = MessageType.PHOTO media_type = event_mimetype or "image/png" - elif isinstance(event, nio.RoomMessageAudio) or is_encrypted_audio: + elif msgtype == "m.audio": if source_content.get("org.matrix.msc3245.voice") is not None: is_voice_message = True msg_type = MessageType.VOICE else: msg_type = MessageType.AUDIO media_type = event_mimetype or "audio/ogg" - elif isinstance(event, nio.RoomMessageVideo) or is_encrypted_video: + elif msgtype == "m.video": msg_type = MessageType.VIDEO media_type = event_mimetype or "video/mp4" elif event_mimetype: media_type = event_mimetype - # Cache media locally when downstream tools need a real file path: - # - photos (vision tools can't access MXC URLs) - # - voice messages (transcription tools need local files) - # - any encrypted media (HTTP fallback would point at ciphertext) + # Cache media locally when downstream tools need a real file path. cached_path = None should_cache_locally = ( msg_type == MessageType.PHOTO or is_voice_message or is_encrypted_media ) if should_cache_locally and url: try: - if is_voice_message: - download_resp = await self._client.download(mxc=url) - else: - download_resp = await self._client.download(url) - file_bytes = getattr(download_resp, "body", None) + from mautrix.types import ContentURI + file_bytes = await self._client.download_media(ContentURI(url)) if file_bytes is not None: if is_encrypted_media: - from nio.crypto.attachments import decrypt_attachment + from mautrix.crypto.attachments import decrypt_attachment - hashes_value = getattr(event, "hashes", None) - if hashes_value is None and isinstance(file_content, dict): - hashes_value = file_content.get("hashes") + hashes_value = file_content.get("hashes") if isinstance(file_content, dict) else None hash_value = hashes_value.get("sha256") if isinstance(hashes_value, dict) else None - key_value = getattr(event, "key", None) - if key_value is None and isinstance(file_content, dict): - key_value = file_content.get("key") + key_value = file_content.get("key") if isinstance(file_content, dict) else None if isinstance(key_value, dict): key_value = key_value.get("k") - iv_value = getattr(event, "iv", None) - if iv_value is None and isinstance(file_content, dict): - iv_value = file_content.get("iv") + iv_value = file_content.get("iv") if isinstance(file_content, dict) else None if key_value and hash_value and iv_value: file_bytes = decrypt_attachment(file_bytes, key_value, hash_value, iv_value) else: logger.warning( "[Matrix] Encrypted media event missing decryption metadata for %s", - event.event_id, + event_id, ) file_bytes = None @@ -1344,13 +1098,10 @@ def _safe_isinstance(obj, cls_name): except Exception as e: logger.warning("[Matrix] Failed to cache media: %s", e) - is_dm = self._dm_rooms.get(room.room_id, False) - if not is_dm and room.member_count == 2: - is_dm = True + is_dm = await self._is_dm_room(room_id) chat_type = "dm" if is_dm else "group" # Thread/reply detection. - relates_to = source_content.get("m.relates_to", {}) thread_id = None if relates_to.get("rel_type") == "m.thread": thread_id = relates_to.get("event_id") @@ -1360,7 +1111,7 @@ def _safe_isinstance(obj, cls_name): free_rooms_raw = os.getenv("MATRIX_FREE_RESPONSE_ROOMS", "") free_rooms = {r.strip() for r in free_rooms_raw.split(",") if r.strip()} require_mention = os.getenv("MATRIX_REQUIRE_MENTION", "true").lower() not in ("false", "0", "no") - is_free_room = room.room_id in free_rooms + is_free_room = room_id in free_rooms in_bot_thread = bool(thread_id and thread_id in self._bot_participated_threads) if require_mention and not is_free_room and not in_bot_thread: @@ -1368,29 +1119,30 @@ def _safe_isinstance(obj, cls_name): if not self._is_bot_mentioned(body, formatted_body): return - # DM mention-thread: when enabled, @mentioning bot in a DM creates a thread. + # DM mention-thread. if is_dm and not thread_id: dm_mention_threads = os.getenv("MATRIX_DM_MENTION_THREADS", "false").lower() in ("true", "1", "yes") if dm_mention_threads and self._is_bot_mentioned(body, source_content.get("formatted_body")): - thread_id = event.event_id + thread_id = event_id self._track_thread(thread_id) - # Strip mention from body when present (including in DMs). + # Strip mention from body. if self._is_bot_mentioned(body, source_content.get("formatted_body")): body = self._strip_mention(body) - # Auto-thread: create a thread for non-DM, non-threaded messages. + # Auto-thread. if not is_dm and not thread_id: auto_thread = os.getenv("MATRIX_AUTO_THREAD", "true").lower() in ("true", "1", "yes") if auto_thread: - thread_id = event.event_id + thread_id = event_id self._track_thread(thread_id) + display_name = await self._get_display_name(room_id, sender) source = self.build_source( - chat_id=room.room_id, + chat_id=room_id, chat_type=chat_type, - user_id=event.sender, - user_name=self._get_display_name(room, event.sender), + user_id=sender, + user_name=display_name, thread_id=thread_id, ) @@ -1402,8 +1154,8 @@ def _safe_isinstance(obj, cls_name): text=body, message_type=msg_type, source=source, - raw_message=getattr(event, "source", {}), - message_id=event.event_id, + raw_message=source_content, + message_id=event_id, media_urls=media_urls, media_types=media_types, ) @@ -1411,43 +1163,44 @@ def _safe_isinstance(obj, cls_name): if thread_id: self._track_thread(thread_id) - # Acknowledge receipt so the room shows as read (fire-and-forget). - self._background_read_receipt(room.room_id, event.event_id) + self._background_read_receipt(room_id, event_id) await self.handle_message(msg_event) - async def _on_invite(self, room: Any, event: Any) -> None: - """Auto-join rooms when invited.""" - import nio + async def _on_encrypted_event(self, event: Any) -> None: + """Handle encrypted events that could not be auto-decrypted.""" + room_id = str(getattr(event, "room_id", "")) + event_id = str(getattr(event, "event_id", "")) - if not isinstance(event, nio.InviteMemberEvent): + if self._is_duplicate_event(event_id): return - # Only process invites directed at us. - if event.state_key != self._user_id: - return + logger.warning( + "Matrix: could not decrypt event %s in %s — buffering for retry", + event_id, room_id, + ) - if event.membership != "invite": - return + self._pending_megolm.append((room_id, event, time.time())) + if len(self._pending_megolm) > _MAX_PENDING_EVENTS: + self._pending_megolm = self._pending_megolm[-_MAX_PENDING_EVENTS:] + + async def _on_invite(self, event: Any) -> None: + """Auto-join rooms when invited.""" + from mautrix.types import RoomID + + room_id = str(getattr(event, "room_id", "")) logger.info( - "Matrix: invited to %s by %s — joining", - room.room_id, event.sender, + "Matrix: invited to %s — joining", + room_id, ) try: - resp = await self._client.join(room.room_id) - if isinstance(resp, nio.JoinResponse): - self._joined_rooms.add(room.room_id) - logger.info("Matrix: joined %s", room.room_id) - # Refresh DM cache since new room may be a DM. - await self._refresh_dm_cache() - else: - logger.warning( - "Matrix: failed to join %s: %s", - room.room_id, getattr(resp, "message", resp), - ) + await self._client.join_room(RoomID(room_id)) + self._joined_rooms.add(room_id) + logger.info("Matrix: joined %s", room_id) + await self._refresh_dm_cache() except Exception as exc: - logger.warning("Matrix: error joining %s: %s", room.room_id, exc) + logger.warning("Matrix: error joining %s: %s", room_id, exc) # ------------------------------------------------------------------ # Reactions (send, receive, processing lifecycle) @@ -1459,7 +1212,7 @@ async def _send_reaction( """Send an emoji reaction to a message in a room. Returns the reaction event_id on success, None on failure. """ - import nio + from mautrix.types import EventType, RoomID if not self._client: return None @@ -1471,15 +1224,11 @@ async def _send_reaction( } } try: - resp = await self._client.room_send( - room_id, "m.reaction", content, - ignore_unverified_devices=True, + resp_event_id = await self._client.send_message_event( + RoomID(room_id), EventType.REACTION, content, ) - if isinstance(resp, nio.RoomSendResponse): - logger.debug("Matrix: sent reaction %s to %s", emoji, event_id) - return resp.event_id - logger.debug("Matrix: reaction send failed: %s", resp) - return None + logger.debug("Matrix: sent reaction %s to %s", emoji, event_id) + return str(resp_event_id) except Exception as exc: logger.debug("Matrix: reaction send error: %s", exc) return None @@ -1513,7 +1262,6 @@ async def on_processing_complete( return if outcome == ProcessingOutcome.CANCELLED: return - # Remove the eyes reaction first, if we tracked its event_id. reaction_key = (room_id, msg_id) if reaction_key in self._pending_reactions: eyes_event_id = self._pending_reactions.pop(reaction_key) @@ -1525,42 +1273,91 @@ async def on_processing_complete( "\u2705" if outcome == ProcessingOutcome.SUCCESS else "\u274c", ) - async def _on_reaction(self, room: Any, event: Any) -> None: + async def _on_reaction(self, event: Any) -> None: """Handle incoming reaction events.""" - if event.sender == self._user_id: + sender = str(getattr(event, "sender", "")) + if sender == self._user_id: return - if self._is_duplicate_event(getattr(event, "event_id", None)): + event_id = str(getattr(event, "event_id", "")) + if self._is_duplicate_event(event_id): return - # Log for now; future: trigger agent actions based on emoji. - reacts_to = getattr(event, "reacts_to", "") - key = getattr(event, "key", "") - logger.info( - "Matrix: reaction %s from %s on %s in %s", - key, event.sender, reacts_to, room.room_id, + + room_id = str(getattr(event, "room_id", "")) + content = getattr(event, "content", None) + if content: + relates_to = content.get("m.relates_to", {}) if isinstance(content, dict) else getattr(content, "relates_to", {}) + reacts_to = "" + key = "" + if isinstance(relates_to, dict): + reacts_to = relates_to.get("event_id", "") + key = relates_to.get("key", "") + elif hasattr(relates_to, "event_id"): + reacts_to = str(getattr(relates_to, "event_id", "")) + key = str(getattr(relates_to, "key", "")) + logger.info( + "Matrix: reaction %s from %s on %s in %s", + key, sender, reacts_to, room_id, + ) + + # ------------------------------------------------------------------ + # Text message aggregation (handles Matrix client-side splits) + # ------------------------------------------------------------------ + + def _text_batch_key(self, event: MessageEvent) -> str: + """Session-scoped key for text message batching.""" + from gateway.session import build_session_key + return build_session_key( + event.source, + group_sessions_per_user=self.config.extra.get("group_sessions_per_user", True), + thread_sessions_per_user=self.config.extra.get("thread_sessions_per_user", False), ) - async def _on_unknown_event(self, room: Any, event: Any) -> None: - """Fallback handler for events not natively parsed by matrix-nio. + def _enqueue_text_event(self, event: MessageEvent) -> None: + """Buffer a text event and reset the flush timer.""" + key = self._text_batch_key(event) + existing = self._pending_text_batches.get(key) + chunk_len = len(event.text or "") + if existing is None: + event._last_chunk_len = chunk_len # type: ignore[attr-defined] + self._pending_text_batches[key] = event + else: + if event.text: + existing.text = f"{existing.text}\n{event.text}" if existing.text else event.text + existing._last_chunk_len = chunk_len # type: ignore[attr-defined] + if event.media_urls: + existing.media_urls.extend(event.media_urls) + existing.media_types.extend(event.media_types) - Catches m.reaction on older nio versions that lack ReactionEvent. - """ - source = getattr(event, "source", {}) - if source.get("type") != "m.reaction": - return - content = source.get("content", {}) - relates_to = content.get("m.relates_to", {}) - if relates_to.get("rel_type") != "m.annotation": - return - if source.get("sender") == self._user_id: - return - logger.info( - "Matrix: reaction %s from %s on %s in %s", - relates_to.get("key", "?"), - source.get("sender", "?"), - relates_to.get("event_id", "?"), - room.room_id, + prior_task = self._pending_text_batch_tasks.get(key) + if prior_task and not prior_task.done(): + prior_task.cancel() + self._pending_text_batch_tasks[key] = asyncio.create_task( + self._flush_text_batch(key) ) + async def _flush_text_batch(self, key: str) -> None: + """Wait for the quiet period then dispatch the aggregated text.""" + current_task = asyncio.current_task() + try: + pending = self._pending_text_batches.get(key) + last_len = getattr(pending, "_last_chunk_len", 0) if pending else 0 + if last_len >= self._SPLIT_THRESHOLD: + delay = self._text_batch_split_delay_seconds + else: + delay = self._text_batch_delay_seconds + await asyncio.sleep(delay) + event = self._pending_text_batches.pop(key, None) + if not event: + return + logger.info( + "[Matrix] Flushing text batch %s (%d chars)", + key, len(event.text or ""), + ) + await self.handle_message(event) + finally: + if self._pending_text_batch_tasks.get(key) is current_task: + self._pending_text_batch_tasks.pop(key, None) + # ------------------------------------------------------------------ # Read receipts # ------------------------------------------------------------------ @@ -1575,25 +1372,16 @@ async def _send() -> None: asyncio.ensure_future(_send()) async def send_read_receipt(self, room_id: str, event_id: str) -> bool: - """Send a read receipt (m.read) for an event. - - Also sets the fully-read marker so the room is marked as read - in all clients. - """ + """Send a read receipt (m.read) for an event.""" if not self._client: return False try: - if hasattr(self._client, "room_read_markers"): - await self._client.room_read_markers( - room_id, - fully_read_event=event_id, - read_event=event_id, - ) - else: - # Fallback for older matrix-nio. - await self._client.room_send( - room_id, "m.receipt", {"event_id": event_id}, - ) + from mautrix.types import EventID, RoomID + await self._client.set_read_markers( + RoomID(room_id), + fully_read_event=EventID(event_id), + read_receipt=EventID(event_id), + ) logger.debug("Matrix: sent read receipt for %s in %s", event_id, room_id) return True except Exception as exc: @@ -1608,19 +1396,15 @@ async def redact_message( self, room_id: str, event_id: str, reason: str = "", ) -> bool: """Redact (delete) a message or event from a room.""" - import nio - if not self._client: return False try: - resp = await self._client.room_redact( - room_id, event_id, reason=reason, + from mautrix.types import EventID, RoomID + await self._client.redact( + RoomID(room_id), EventID(event_id), reason=reason or None, ) - if isinstance(resp, nio.RoomRedactResponse): - logger.info("Matrix: redacted %s in %s", event_id, room_id) - return True - logger.warning("Matrix: redact failed: %s", resp) - return False + logger.info("Matrix: redacted %s in %s", event_id, room_id) + return True except Exception as exc: logger.warning("Matrix: redact error: %s", exc) return False @@ -1635,40 +1419,39 @@ async def fetch_room_history( limit: int = 50, start: str = "", ) -> list: - """Fetch recent messages from a room. - - Returns a list of dicts with keys: event_id, sender, body, - timestamp, type. Uses the ``room_messages()`` API. - """ - import nio - + """Fetch recent messages from a room.""" if not self._client: return [] try: - resp = await self._client.room_messages( - room_id, - start=start or "", + from mautrix.types import PaginationDirection, RoomID, SyncToken + resp = await self._client.get_messages( + RoomID(room_id), + direction=PaginationDirection.BACKWARD, + from_token=SyncToken(start) if start else None, limit=limit, - direction=nio.Api.MessageDirection.back - if hasattr(nio.Api, "MessageDirection") - else "b", ) except Exception as exc: - logger.warning("Matrix: room_messages failed for %s: %s", room_id, exc) + logger.warning("Matrix: get_messages failed for %s: %s", room_id, exc) return [] - if not isinstance(resp, nio.RoomMessagesResponse): - logger.warning("Matrix: room_messages returned %s", type(resp).__name__) + if not resp: return [] + events = getattr(resp, "chunk", []) or (resp.get("chunk", []) if isinstance(resp, dict) else []) messages = [] - for event in reversed(resp.chunk): - body = getattr(event, "body", "") or "" + for event in reversed(events): + body = "" + content = getattr(event, "content", None) + if content: + if hasattr(content, "body"): + body = content.body or "" + elif isinstance(content, dict): + body = content.get("body", "") messages.append({ - "event_id": getattr(event, "event_id", ""), - "sender": getattr(event, "sender", ""), + "event_id": str(getattr(event, "event_id", "")), + "sender": str(getattr(event, "sender", "")), "body": body, - "timestamp": getattr(event, "server_timestamp", 0), + "timestamp": getattr(event, "timestamp", 0) or getattr(event, "server_timestamp", 0), "type": type(event).__name__, }) return messages @@ -1685,56 +1468,41 @@ async def create_room( is_direct: bool = False, preset: str = "private_chat", ) -> Optional[str]: - """Create a new Matrix room. - - Args: - name: Human-readable room name. - topic: Room topic. - invite: List of user IDs to invite. - is_direct: Mark as a DM room. - preset: One of private_chat, public_chat, trusted_private_chat. - - Returns the room_id on success, None on failure. - """ - import nio - + """Create a new Matrix room.""" if not self._client: return None try: - resp = await self._client.room_create( + from mautrix.types import RoomCreatePreset, UserID + preset_enum = { + "private_chat": RoomCreatePreset.PRIVATE, + "public_chat": RoomCreatePreset.PUBLIC, + "trusted_private_chat": RoomCreatePreset.TRUSTED_PRIVATE, + }.get(preset, RoomCreatePreset.PRIVATE) + invitees = [UserID(u) for u in (invite or [])] + room_id = await self._client.create_room( name=name or None, topic=topic or None, - invite=invite or [], + invitees=invitees, is_direct=is_direct, - preset=getattr( - nio.Api.RoomPreset if hasattr(nio.Api, "RoomPreset") else type("", (), {}), - preset, None, - ) or preset, + preset=preset_enum, ) - if isinstance(resp, nio.RoomCreateResponse): - room_id = resp.room_id - self._joined_rooms.add(room_id) - logger.info("Matrix: created room %s (%s)", room_id, name or "unnamed") - return room_id - logger.warning("Matrix: room_create failed: %s", resp) - return None + room_id_str = str(room_id) + self._joined_rooms.add(room_id_str) + logger.info("Matrix: created room %s (%s)", room_id_str, name or "unnamed") + return room_id_str except Exception as exc: - logger.warning("Matrix: room_create error: %s", exc) + logger.warning("Matrix: create_room error: %s", exc) return None async def invite_user(self, room_id: str, user_id: str) -> bool: """Invite a user to a room.""" - import nio - if not self._client: return False try: - resp = await self._client.room_invite(room_id, user_id) - if isinstance(resp, nio.RoomInviteResponse): - logger.info("Matrix: invited %s to %s", user_id, room_id) - return True - logger.warning("Matrix: invite failed: %s", resp) - return False + from mautrix.types import RoomID, UserID + await self._client.invite_user(RoomID(room_id), UserID(user_id)) + logger.info("Matrix: invited %s to %s", user_id, room_id) + return True except Exception as exc: logger.warning("Matrix: invite error: %s", exc) return False @@ -1753,13 +1521,21 @@ async def set_presence(self, state: str = "online", status_msg: str = "") -> boo logger.warning("Matrix: invalid presence state %r", state) return False try: - if hasattr(self._client, "set_presence"): - await self._client.set_presence(state, status_msg=status_msg or None) - logger.debug("Matrix: presence set to %s", state) - return True + from mautrix.types import PresenceState + presence_map = { + "online": PresenceState.ONLINE, + "offline": PresenceState.OFFLINE, + "unavailable": PresenceState.UNAVAILABLE, + } + await self._client.set_presence( + presence=presence_map[state], + status=status_msg or None, + ) + logger.debug("Matrix: presence set to %s", state) + return True except Exception as exc: logger.debug("Matrix: set_presence failed: %s", exc) - return False + return False # ------------------------------------------------------------------ # Emote & notice message types @@ -1769,7 +1545,7 @@ async def send_emote( self, chat_id: str, text: str, metadata: Optional[Dict[str, Any]] = None, ) -> SendResult: """Send an emote message (/me style action).""" - import nio + from mautrix.types import EventType, RoomID if not self._client or not text: return SendResult(success=False, error="No client or empty text") @@ -1784,13 +1560,10 @@ async def send_emote( msg_content["formatted_body"] = html try: - resp = await self._client.room_send( - chat_id, "m.room.message", msg_content, - ignore_unverified_devices=True, + event_id = await self._client.send_message_event( + RoomID(chat_id), EventType.ROOM_MESSAGE, msg_content, ) - if isinstance(resp, nio.RoomSendResponse): - return SendResult(success=True, message_id=resp.event_id) - return SendResult(success=False, error=str(resp)) + return SendResult(success=True, message_id=str(event_id)) except Exception as exc: return SendResult(success=False, error=str(exc)) @@ -1798,7 +1571,7 @@ async def send_notice( self, chat_id: str, text: str, metadata: Optional[Dict[str, Any]] = None, ) -> SendResult: """Send a notice message (bot-appropriate, non-alerting).""" - import nio + from mautrix.types import EventType, RoomID if not self._client or not text: return SendResult(success=False, error="No client or empty text") @@ -1813,13 +1586,10 @@ async def send_notice( msg_content["formatted_body"] = html try: - resp = await self._client.room_send( - chat_id, "m.room.message", msg_content, - ignore_unverified_devices=True, + event_id = await self._client.send_message_event( + RoomID(chat_id), EventType.ROOM_MESSAGE, msg_content, ) - if isinstance(resp, nio.RoomSendResponse): - return SendResult(success=True, message_id=resp.event_id) - return SendResult(success=False, error=str(resp)) + return SendResult(success=True, message_id=str(event_id)) except Exception as exc: return SendResult(success=False, error=str(exc)) @@ -1827,18 +1597,28 @@ async def send_notice( # Helpers # ------------------------------------------------------------------ - async def _refresh_dm_cache(self) -> None: - """Refresh the DM room cache from m.direct account data. + async def _is_dm_room(self, room_id: str) -> bool: + """Check if a room is a DM.""" + if self._dm_rooms.get(room_id, False): + return True + # Fallback: check member count via state store. + state_store = getattr(self._client, "state_store", None) if self._client else None + if state_store: + try: + members = await state_store.get_members(room_id) + if members and len(members) == 2: + return True + except Exception: + pass + return False - Tries the account_data API first, then falls back to parsing - the sync response's account_data for robustness. - """ + async def _refresh_dm_cache(self) -> None: + """Refresh the DM room cache from m.direct account data.""" if not self._client: return dm_data: Optional[Dict] = None - # Primary: try the dedicated account data endpoint. try: resp = await self._client.get_account_data("m.direct") if hasattr(resp, "content"): @@ -1846,21 +1626,7 @@ async def _refresh_dm_cache(self) -> None: elif isinstance(resp, dict): dm_data = resp except Exception as exc: - logger.debug("Matrix: get_account_data('m.direct') failed: %s — trying sync fallback", exc) - - # Fallback: parse from the client's account_data store (populated by sync). - if dm_data is None: - try: - # matrix-nio stores account data events on the client object - ad = getattr(self._client, "account_data", None) - if ad and isinstance(ad, dict) and "m.direct" in ad: - event = ad["m.direct"] - if hasattr(event, "content"): - dm_data = event.content - elif isinstance(event, dict): - dm_data = event - except Exception: - pass + logger.debug("Matrix: get_account_data('m.direct') failed: %s", exc) if dm_data is None: return @@ -1868,7 +1634,7 @@ async def _refresh_dm_cache(self) -> None: dm_room_ids: Set[str] = set() for user_id, rooms in dm_data.items(): if isinstance(rooms, list): - dm_room_ids.update(rooms) + dm_room_ids.update(str(r) for r in rooms) self._dm_rooms = { rid: (rid in dm_room_ids) @@ -1925,15 +1691,12 @@ def _is_bot_mentioned(self, body: str, formatted_body: Optional[str] = None) -> """Return True if the bot is mentioned in the message.""" if not body and not formatted_body: return False - # Check for full @user:server in body if self._user_id and self._user_id in body: return True - # Check for localpart with word boundaries (case-insensitive) if self._user_id and ":" in self._user_id: localpart = self._user_id.split(":")[0].lstrip("@") if localpart and re.search(r'\b' + re.escape(localpart) + r'\b', body, re.IGNORECASE): return True - # Check formatted_body for Matrix pill if formatted_body and self._user_id: if f"matrix.to/#/{self._user_id}" in formatted_body: return True @@ -1941,22 +1704,24 @@ def _is_bot_mentioned(self, body: str, formatted_body: Optional[str] = None) -> def _strip_mention(self, body: str) -> str: """Remove bot mention from message body.""" - # Remove full @user:server if self._user_id: body = body.replace(self._user_id, "") - # If still contains localpart mention, remove it if self._user_id and ":" in self._user_id: localpart = self._user_id.split(":")[0].lstrip("@") if localpart: body = re.sub(r'\b' + re.escape(localpart) + r'\b', '', body, flags=re.IGNORECASE) return body.strip() - def _get_display_name(self, room: Any, user_id: str) -> str: + async def _get_display_name(self, room_id: str, user_id: str) -> str: """Get a user's display name in a room, falling back to user_id.""" - if room and hasattr(room, "users"): - user = room.users.get(user_id) - if user and getattr(user, "display_name", None): - return user.display_name + state_store = getattr(self._client, "state_store", None) if self._client else None + if state_store: + try: + member = await state_store.get_member(room_id, user_id) + if member and getattr(member, "displayname", None): + return member.displayname + except Exception: + pass # Strip the @...:server format to just the localpart. if user_id.startswith("@") and ":" in user_id: return user_id[1:].split(":")[0] @@ -1964,13 +1729,9 @@ def _get_display_name(self, room: Any, user_id: str) -> str: def _mxc_to_http(self, mxc_url: str) -> str: """Convert mxc://server/media_id to an HTTP download URL.""" - # mxc://matrix.org/abc123 → https://matrix.org/_matrix/client/v1/media/download/matrix.org/abc123 - # Uses the authenticated client endpoint (spec v1.11+) instead of the - # deprecated /_matrix/media/v3/download/ path. if not mxc_url.startswith("mxc://"): return mxc_url parts = mxc_url[6:] # strip mxc:// - # Use our homeserver for download (federation handles the rest). return f"{self._homeserver}/_matrix/client/v1/media/download/{parts}" def _markdown_to_html(self, text: str) -> str: @@ -1988,16 +1749,12 @@ def _markdown_to_html(self, text: str) -> str: md = _md.Markdown( extensions=["fenced_code", "tables", "nl2br", "sane_lists"], ) - # Remove the raw HTML preprocessor so + + diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 000000000..d9aa7a951 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,3835 @@ +{ + "name": "web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.2.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.577.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + "tailwindcss": "^4.2.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.2.0", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.56.1", + "vite": "^7.3.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "tailwindcss": "4.2.1" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.0.tgz", + "integrity": "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/type-utils": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.57.0.tgz", + "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.57.0.tgz", + "integrity": "sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.0", + "@typescript-eslint/types": "^8.57.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.57.0.tgz", + "integrity": "sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.0.tgz", + "integrity": "sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.57.0.tgz", + "integrity": "sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.0.tgz", + "integrity": "sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.0.tgz", + "integrity": "sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.0", + "@typescript-eslint/tsconfig-utils": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/visitor-keys": "8.57.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.57.0.tgz", + "integrity": "sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.0", + "@typescript-eslint/types": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.0.tgz", + "integrity": "sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz", + "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.7.tgz", + "integrity": "sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001778", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001778.tgz", + "integrity": "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz", + "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": "^9 || ^10" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.577.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", + "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.57.0.tgz", + "integrity": "sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.0", + "@typescript-eslint/parser": "8.57.0", + "@typescript-eslint/typescript-estree": "8.57.0", + "@typescript-eslint/utils": "8.57.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 000000000..87dbfdb79 --- /dev/null +++ b/web/package.json @@ -0,0 +1,36 @@ +{ + "name": "web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/vite": "^4.2.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.577.0", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "tailwind-merge": "^3.5.0", + "tailwindcss": "^4.2.1" + }, + "devDependencies": { + "@eslint/js": "^9.39.4", + "@types/node": "^24.12.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^5.2.0", + "eslint": "^9.39.4", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.4.0", + "typescript": "~5.9.3", + "typescript-eslint": "^8.56.1", + "vite": "^7.3.1" + } +} diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7a949324da9d03b448247867439b632a216d884d GIT binary patch literal 8482 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 literal 0 HcmV?d00001 diff --git a/web/public/fonts/Collapse-Regular.woff2 b/web/public/fonts/Collapse-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0d2e477cc1e2618ddcd7e6eedc06b40a2f837c95 GIT binary patch literal 62816 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 ZjHNx0dVHpbV)n^3kG*g44fWp4>>qBYn704` literal 0 HcmV?d00001 diff --git a/web/public/fonts/CourierPrime-Bold.woff2 b/web/public/fonts/CourierPrime-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4f6d5e9c863cad49d54112e119f708ed9f644d74 GIT binary patch literal 11588 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 W$IF>aZ(pA4YyQ(diTN+Q1ONc)ajHWA literal 0 HcmV?d00001 diff --git a/web/public/fonts/Mondwest-Regular.woff2 b/web/public/fonts/Mondwest-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..02a3658cf7da2e9e6f9cd9bbb2d9bff7d66d50fa GIT binary patch literal 23828 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 bE8FfG@{?I8GX;IV?cwqjUBA5C0{{R3GfF_6 literal 0 HcmV?d00001 diff --git a/web/public/fonts/RulesCompressed-Medium.woff2 b/web/public/fonts/RulesCompressed-Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1a352536b2a85813cb456a2e550dca7f97214fa0 GIT binary patch literal 38848 zcmV)AK*YayPew8T0RR910GGf34FCWD0j>Z50GDI{0U4P900000000000000000000 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 literal 0 HcmV?d00001 diff --git a/web/public/fonts/RulesExpanded-Bold.woff2 b/web/public/fonts/RulesExpanded-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d85515dbd6a3c2e49a696d4723d5d14d8e7972c3 GIT binary patch literal 35012 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 literal 0 HcmV?d00001 diff --git a/web/src/App.tsx b/web/src/App.tsx new file mode 100644 index 000000000..6a3073224 --- /dev/null +++ b/web/src/App.tsx @@ -0,0 +1,117 @@ +import { useState, useEffect } from "react"; +import { Activity, BarChart3, Clock, FileText, KeyRound, MessageSquare, Package, Settings } from "lucide-react"; +import StatusPage from "@/pages/StatusPage"; +import ConfigPage from "@/pages/ConfigPage"; +import EnvPage from "@/pages/EnvPage"; +import SessionsPage from "@/pages/SessionsPage"; +import LogsPage from "@/pages/LogsPage"; +import AnalyticsPage from "@/pages/AnalyticsPage"; +import CronPage from "@/pages/CronPage"; +import SkillsPage from "@/pages/SkillsPage"; + +const NAV_ITEMS = [ + { id: "status", label: "Status", icon: Activity }, + { id: "sessions", label: "Sessions", icon: MessageSquare }, + { id: "analytics", label: "Analytics", icon: BarChart3 }, + { id: "logs", label: "Logs", icon: FileText }, + { id: "cron", label: "Cron", icon: Clock }, + { id: "skills", label: "Skills", icon: Package }, + { id: "config", label: "Config", icon: Settings }, + { id: "env", label: "Keys", icon: KeyRound }, +] as const; + +type PageId = (typeof NAV_ITEMS)[number]["id"]; + +const PAGE_COMPONENTS: Record = { + status: StatusPage, + sessions: SessionsPage, + analytics: AnalyticsPage, + logs: LogsPage, + cron: CronPage, + skills: SkillsPage, + config: ConfigPage, + env: EnvPage, +}; + +export default function App() { + const [page, setPage] = useState("status"); + const [animKey, setAnimKey] = useState(0); + + useEffect(() => { + setAnimKey((k) => k + 1); + }, [page]); + + const PageComponent = PAGE_COMPONENTS[page]; + + return ( +

+ {/* Global grain + warm glow (matches landing page) */} +
+
+ + {/* ---- Header with grid-border nav ---- */} +
+
+ {/* Brand */} +
+ + Hermes
Agent +
+
+ + {/* Nav grid — Mondwest labels like the landing page nav */} + + + {/* Version badge */} +
+ + Web UI + +
+
+
+ +
+ +
+ + {/* ---- Footer ---- */} +
+
+ + Hermes Agent + + + Nous Research + +
+
+
+ ); +} diff --git a/web/src/components/AutoField.tsx b/web/src/components/AutoField.tsx new file mode 100644 index 000000000..67f6739e9 --- /dev/null +++ b/web/src/components/AutoField.tsx @@ -0,0 +1,151 @@ +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Select } from "@/components/ui/select"; +import { Switch } from "@/components/ui/switch"; + +function FieldHint({ schema, schemaKey }: { schema: Record; schemaKey: string }) { + const keyPath = schemaKey.includes(".") ? schemaKey : ""; + const description = schema.description ? String(schema.description) : ""; + + if (!keyPath && !description) return null; + + return ( +
+ {keyPath && {keyPath}} + {description && {description}} +
+ ); +} + +export function AutoField({ + schemaKey, + schema, + value, + onChange, +}: AutoFieldProps) { + const rawLabel = schemaKey.split(".").pop() ?? schemaKey; + const label = rawLabel.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()); + + if (schema.type === "boolean") { + return ( +
+
+ + +
+ +
+ ); + } + + if (schema.type === "select") { + const options = (schema.options as string[]) ?? []; + return ( +
+ + + +
+ ); + } + + if (schema.type === "number") { + return ( +
+ + + { + const raw = e.target.value; + if (raw === "") { + onChange(0); + return; + } + const n = Number(raw); + if (!Number.isNaN(n)) { + onChange(n); + } + }} + /> +
+ ); + } + + if (schema.type === "text") { + return ( +
+ + +