From b1ee794316b686bdda29b9b5dbb118afa201be4d Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 22 Jul 2026 14:14:32 -0500 Subject: [PATCH] feat: introduce half-duplex mode and push-to-talk functionality for LXST telephony, improve call statistics and API endpoints --- CHANGELOG.md | 1 + docs/agents/skills/lxst-telephony/SKILL.md | 12 +- docs/en/audio-calls.md | 8 +- meshchatx.rsm | Bin 161752 -> 161861 bytes meshchatx/meshchat.py | 127 + meshchatx/src/backend/config_manager.py | 5 + .../src/backend/data/licenses_backend.json | 384 +- .../src/backend/data/licenses_frontend.json | 7392 ++++++++--------- meshchatx/src/backend/telephone_manager.py | 133 +- meshchatx/src/backend/web_audio_bridge.py | 14 + .../frontend/components/call/CallOverlay.vue | 86 +- .../src/frontend/components/call/CallPage.vue | 254 +- meshchatx/src/frontend/locales/en.json | 18 + tests/backend/http_api_response_registry.py | 6 + tests/backend/http_api_response_schemas.py | 10 + tests/backend/test_call_codec2_regressions.py | 4 +- .../backend/test_telephone_audio_profiles.py | 4 +- tests/backend/test_telephone_csrf_methods.py | 11 + tests/backend/test_telephone_duplex_ptt.py | 83 + tests/frontend/CallPage.test.js | 43 +- 20 files changed, 4682 insertions(+), 3913 deletions(-) create mode 100644 tests/backend/test_telephone_duplex_ptt.py diff --git a/CHANGELOG.md b/CHANGELOG.md index e6fb188e..d3b846ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ All notable changes to this project will be documented in this file. - Remote management allow-list for identities that may query this instance with rnstatus/rnpath - Post-install prompts for existing users after upgrades - Coolify-oriented Docker Compose with resource limits for deployments +- LXST telephony half-duplex mode, live duplex switching, push-to-talk (packetizer squelch), and richer in-call stats (rates plus mute state on the active call) ### Changed diff --git a/docs/agents/skills/lxst-telephony/SKILL.md b/docs/agents/skills/lxst-telephony/SKILL.md index 88024227..3d49fa0f 100644 --- a/docs/agents/skills/lxst-telephony/SKILL.md +++ b/docs/agents/skills/lxst-telephony/SKILL.md @@ -28,11 +28,21 @@ LXST runs over Reticulum Links. Address callees by identity/destination hash. No 2. Do not block the whole UI on real-time ACK over constrained links. Show recoverable call states. 3. Auth-guard WS mutators that start or answer calls when password auth is enabled. 4. Keep audio paths identity-scoped. No shared in-memory call tables across identities. +5. Prefer half duplex + PTT (LXST packetizer squelch) on scarce links instead of always full duplex. ## Verification ```bash -uv run pytest tests/backend/test_lxst_telephony_adversarial.py -q --tb=short +uv run pytest tests/backend/test_lxst_telephony_adversarial.py tests/backend/test_telephone_duplex_ptt.py -q --tb=short ``` Also: `reticulum-design-gates`, `auth-csrf-ws-security`, `identity-switch-teardown`. + +## LXST 0.5 duplex / PTT + +| Control | LXST API | MeshChatX surface | +| ------------------ | ------------------------------------------ | ---------------------------------------------------- | +| Full / half duplex | `Telephone.switch_mode`, `Profiles.MODE_*` | `POST /api/v1/telephone/switch-call-mode/{mode_id}` | +| PTT (half duplex) | `squelch_transmit` / `unsquelch_transmit` | `POST /api/v1/telephone/ptt` with `{"active": bool}` | +| Mute mic / speaker | `mute_transmit` / `mute_receive` | existing mute endpoints | +| Live stats | RNS Link counters on `active_call` | `/api/v1/telephone/status` `tx_*` / `rx_*` / `*_bps` | diff --git a/docs/en/audio-calls.md b/docs/en/audio-calls.md index 1f0892a9..8032089c 100644 --- a/docs/en/audio-calls.md +++ b/docs/en/audio-calls.md @@ -15,10 +15,16 @@ From **Call** or a contact entry you can: - **Dial** another identity by hash - **Answer** or **decline** inbound rings - **Hang up** an active session -- **Mute** transmit or receive paths +- **Mute** microphone (transmit) or speaker (receive) +- Switch **full duplex** or **half duplex** during a live call +- Use **push-to-talk** while in half duplex (hold the PTT control or Space) + +Half duplex uses LXST packetizer squelch so idle airtime stays low on constrained links. Full duplex keeps both directions open. Call state changes arrive over the WebSocket (`telephone_ringing`, `telephone_call_established`, `telephone_call_ended`, and related events). +While connected, the Call screen shows link stats (packets, bytes, approximate bitrates, path hops, and interface). + ## Audio path The frontend loads Codec2 assets for voice encoding (`Codec2Loader.js`). Browser and Electron builds use a Web Audio bridge at `/ws/telephone/audio`. Packaged desktop builds bundle the backend that negotiates LXST sessions. diff --git a/meshchatx.rsm b/meshchatx.rsm index a5b6df838db3be3849627d66101d4fe9c17838d8..cbbd71b66e9af8f7a42ef73fbf55894440d091d5 100644 GIT binary patch delta 1560 zcmW-hU8s~*6o&iEqGKmGSel-S6b-{r_TSojZHjY7vTlMfh>+7Cd#$y1lxB*SViyr* zAQ2{`j{T74RdrPjafG}vh=?G(=?5cGp&KbuQiu?3jWaOA%=dk3ul2sqyMFz9?A!BW zy=A+Pe)9XOpEln5z$^c3-QC{2?xQF6eR=iL-E!dGgJ0kI-?67o@BeW1#N6Q3jS&nj7#FH(%@7BUOu0!Y4NYUBW|1xV zl5G&5BUlsi@aXu8&IR3n3695Hrg7+L!r|D zctidrB50*`)EP8w7%FP)vttL)Qz?ackO-RJooa4}~e|)UxZ9;Srny--) zl~#;1`m)TN*&2={$wo*nQ1QkG{pDh(ePAxrt6vPYi(J~=79Z75eQP%b`-ito_BXd1hT}37dtxf-GZ~$Jt3D>$ zR+^6LN-5EDG*YssTAh*XJp#MHg`{z@3EZ_=`$yhCKdm59^;ju|)Yv(bQwT|I#hge2 zrK*`{12hrgSJZMPf_FlkyfUixskJ8*syd+G8Ab z46#zHB%qk4<}DLPH&}C1cSrxkr%R?~1Z~S?LsWMFlPB*4k*UT~(5Z77lOpN$!{~ge zO0X2v(2-Vy?#6CX3*9z+`m@uoO*@g|ePa+)xB+v5C^<2b5e1H^Kn5RJNokaAiU^`9 z0A!XHq`&3l*~)=(R>c+aj2zOcw%Ib8)IX+gv@Xo|)Jy z!5R@2ui;?bu5R(*=Uv@`9)?t{jGUnmjgsh7E1CjqRI;RytIgJcWaa{1d&!ELQ++8L zTdKWQYIf~g-M;zLx)4lF3T&VpQv@H;)?|Z*k{D8Q$)psbwnb8d>hFTG%fVrBwb{X% zgWbZ}Rqu5>XQq^7;OrrLQN2ATsM!ayUPG=~A1#Ykl@`?pl*%F|I*uqB4LxwM<-6|o z!HXBWiNW~A?vH7G$k{|S1ab}3JWX&QRF%-_KsvsoVlq1gmqb@UCJlsRTdl5-FerPv zg`;xw2J0?$+ovdGuWN`PMuL`5MzGbEY%*B`scghzWRwP7A}Xy?T8c5P=-;Ufj$h~| z4_xeSoF^}D-dJ}$yLsET*>5g&J12V@6iYGaW-_9Q!3GVKbM#)c36Qjh}G=)QFt aOQ#DHgp8wrO84N@#GJ*m`zPi+_}u?rh~n`8 delta 1416 zcmW-hU8q)75Qf=@5{_A+qBou{gty!~XtpVwLl|c}JQ5T_<%&Z@w$O8MZpdSLe z5ijJEzA_{XLaZq4K&P98F7m1%2`b2*ROf`!sSidzg=?Sr;pF>IJxoku>Q*S9s1IJC)St4^83nvZrp$L zp;tfOFtzUaPp^CN=)#4=-yd9ZV6^&{Ju?d*-O;8_z1AhX;Zs&$$ zXTJLP!>>O%uxIzwa|_4M?z?7`xy2e>fsCSz3Xzhu;8Z+EM#+RFbPk*-aZeRH6-kx7 z@6l10xzCoZ$B}aY9IC`w1HVqYPM=s+dTUO5D zUE8jj+`f6Zd+wWi*RB}(=6dN8NhB!>nJS7o`QphMZiB&;cDfs#LPf z!6Oe(kL+&sCHvxY^A3?aLeuOulw{3TyTL;Uy>_Nndq4`!MPLvuJ(Vy%ux<6+&+^zX zyXXzGr(nG(VOV@x$bwb4lD*`LIU`$i` zt8RLH_fxx;iZ*i6dk_f3-D{$bxuk49A!#enoJQ-IeD++Vc&^^+W|Ll$VA`;6cSr&}g$*Dubs`*WC4KHjP(PB`*I8DyQWCk&$oO-rUwFW6#0t1BHs&*$z zrPz>#%|EtzVt|RiG~7H{a&cIgRWwJ;uwXmIF0|NY``y{fs0qP$?I^BwZ_Kc>wZqtB zwJ8N#8Lh<0k(0x!$&(j{rIW3fhUe$;&*9lMqgVn%_0A-k9B|(3Dv$_kaiA6|KwCT& exSM}DGgXe!z>bnYLU5D&mru>iPc5IiXXk&D7Pbcf diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py index be3a8ba9..5fcf07ca 100644 --- a/meshchatx/meshchat.py +++ b/meshchatx/meshchat.py @@ -10807,6 +10807,12 @@ class ReticulumMeshChat: "profile", ) else None, + "call_mode_id": self.telephone_manager.get_active_mode_id(), + "is_half_duplex": self.telephone_manager.is_half_duplex(), + "is_ptt_active": bool(self.telephone_manager.ptt_active), + "is_transmit_squelched": self.telephone_manager.is_transmit_squelched(), + "is_mic_muted": self.telephone_manager.transmit_muted, + "is_speaker_muted": self.telephone_manager.receive_muted, "is_recording": self.telephone_manager.is_recording, "is_voicemail": self.voicemail_manager.is_recording, "call_start_time": self.telephone_manager.call_start_time, @@ -10815,15 +10821,40 @@ class ReticulumMeshChat: "rx_bytes": 0, "tx_packets": 0, "rx_packets": 0, + "tx_bps": 0, + "rx_bps": 0, "path_hops": None, "path_interface": None, } + from LXST.Primitives.Telephony import Profiles + + mode_id = active_call["call_mode_id"] + with contextlib.suppress(Exception): + active_call["call_mode_name"] = Profiles.mode_name(mode_id) + active_call["call_mode_abbrev"] = Profiles.mode_abbrevation(mode_id) link = getattr(self.telephone_manager, "call_stats", {}).get("link") if link: active_call["tx_bytes"] = getattr(link, "txbytes", 0) active_call["rx_bytes"] = getattr(link, "rxbytes", 0) active_call["tx_packets"] = getattr(link, "tx", 0) active_call["rx_packets"] = getattr(link, "rx", 0) + started_at = getattr(self.telephone_manager, "call_stats", {}).get( + "started_at", + ) + if not started_at: + started_at = self.telephone_manager.call_start_time + elapsed = ( + max(0.001, time.time() - float(started_at)) + if started_at + else 0.0 + ) + if elapsed > 0: + active_call["tx_bps"] = int( + (active_call["tx_bytes"] * 8) / elapsed, + ) + active_call["rx_bps"] = int( + (active_call["rx_bytes"] * 8) / elapsed, + ) # Best-effort direct link metadata fallback. if active_call["path_hops"] is None: for hop_attr in ["hops", "hop_count", "path_hops"]: @@ -10890,6 +10921,9 @@ class ReticulumMeshChat: "active_call": active_call, "is_mic_muted": self.telephone_manager.transmit_muted, "is_speaker_muted": self.telephone_manager.receive_muted, + "preferred_call_mode_id": self.telephone_manager.resolve_call_mode_id( + self.telephone_manager.preferred_mode_id, + ), "missed_calls_unread_count": self.database.misc.get_unread_notification_count_by_type( "telephone_missed_call", ), @@ -11030,6 +11064,87 @@ class ReticulumMeshChat: await asyncio.to_thread(self.telephone_manager.unmute_receive) return web.json_response({"message": "Speaker unmuted"}) + @routes.get("/api/v1/telephone/call-modes") + async def telephone_call_modes(request): + from LXST.Primitives.Telephony import Profiles + + modes = [ + { + "id": mode_id, + "name": Profiles.mode_name(mode_id), + "abbrev": Profiles.mode_abbrevation(mode_id), + "is_half_duplex": mode_id == Profiles.MODE_HALF_DUPLEX, + } + for mode_id in Profiles.available_modes() + ] + return web.json_response( + { + "default_call_mode_id": Profiles.DEFAULT_MODE, + "call_modes": modes, + }, + ) + + @routes.post("/api/v1/telephone/switch-call-mode/{mode_id}") + async def telephone_switch_call_mode(request): + mode_id = request.match_info.get("mode_id") + try: + if self.telephone_manager.telephone is None: + return web.json_response( + {"message": "Telephone not initialized"}, + status=400, + ) + resolved = await asyncio.to_thread( + self.telephone_manager.apply_preferred_mode, + int(mode_id), + ) + self.config.telephone_call_mode_id.set(resolved) + from LXST.Primitives.Telephony import Profiles + + return web.json_response( + { + "message": f"Switched to mode {resolved}", + "mode_id": resolved, + "mode_name": Profiles.mode_name(resolved), + "is_half_duplex": resolved == Profiles.MODE_HALF_DUPLEX, + "is_ptt_active": bool(self.telephone_manager.ptt_active), + }, + ) + except Exception as e: + return web.json_response({"message": str(e)}, status=500) + + @routes.post("/api/v1/telephone/ptt") + async def telephone_ptt(request): + if self.telephone_manager.telephone is None: + return web.json_response( + {"message": "Telephone not initialized"}, + status=400, + ) + try: + data = await request.json() + except Exception: + data = {} + active = ( + bool(data.get("active", False)) if isinstance(data, dict) else False + ) + ok = await asyncio.to_thread(self.telephone_manager.set_ptt_active, active) + if not ok and active: + return web.json_response( + { + "message": "PTT requires an established half-duplex call", + "is_ptt_active": bool(self.telephone_manager.ptt_active), + "is_half_duplex": self.telephone_manager.is_half_duplex(), + }, + status=400, + ) + return web.json_response( + { + "message": "ok", + "is_ptt_active": bool(self.telephone_manager.ptt_active), + "is_half_duplex": self.telephone_manager.is_half_duplex(), + "is_transmit_squelched": self.telephone_manager.is_transmit_squelched(), + }, + ) + # get call history @routes.get("/api/v1/telephone/history") async def telephone_history(request): @@ -19688,6 +19803,17 @@ class ReticulumMeshChat: profile_id, ) + if "telephone_call_mode_id" in data: + mode_id = self._coerce_int(data["telephone_call_mode_id"]) + if mode_id is None: + mode_id = self.config.telephone_call_mode_id.get() + self.config.telephone_call_mode_id.set(mode_id) + if self.telephone_manager: + await asyncio.to_thread( + self.telephone_manager.apply_preferred_mode, + mode_id, + ) + if "telephone_web_audio_enabled" in data: self.config.telephone_web_audio_enabled.set( self._parse_bool(data["telephone_web_audio_enabled"]), @@ -21429,6 +21555,7 @@ class ReticulumMeshChat: "telephone_allow_calls_from_contacts_only": ctx.config.telephone_allow_calls_from_contacts_only.get(), "telephone_announce_enabled": ctx.config.telephone_announce_enabled.get(), "telephone_audio_profile_id": ctx.config.telephone_audio_profile_id.get(), + "telephone_call_mode_id": ctx.config.telephone_call_mode_id.get(), "telephone_web_audio_enabled": ctx.config.telephone_web_audio_enabled.get(), "telephone_web_audio_allow_fallback": ctx.config.telephone_web_audio_allow_fallback.get(), "call_recording_enabled": ctx.config.call_recording_enabled.get(), diff --git a/meshchatx/src/backend/config_manager.py b/meshchatx/src/backend/config_manager.py index ac4810e8..96012ec3 100644 --- a/meshchatx/src/backend/config_manager.py +++ b/meshchatx/src/backend/config_manager.py @@ -276,6 +276,11 @@ class ConfigManager: "telephone_audio_profile_id", 64, # LXST Profiles.DEFAULT_PROFILE (Medium Quality / Opus) ) + self.telephone_call_mode_id = self.IntConfig( + self, + "telephone_call_mode_id", + 1, # LXST Profiles.MODE_FULL_DUPLEX + ) self.telephone_web_audio_enabled = self.BoolConfig( self, "telephone_web_audio_enabled", diff --git a/meshchatx/src/backend/data/licenses_backend.json b/meshchatx/src/backend/data/licenses_backend.json index 728e1f3d..f372a171 100644 --- a/meshchatx/src/backend/data/licenses_backend.json +++ b/meshchatx/src/backend/data/licenses_backend.json @@ -1,194 +1,194 @@ [ - { - "name": "aiohappyeyeballs", - "version": "2.6.1", - "author": "J. Nick Koston", - "license": "PSF-2.0" - }, - { - "name": "aiohttp", - "version": "3.14.1", - "author": "—", - "license": "Apache-2.0 AND MIT" - }, - { - "name": "aiohttp-session", - "version": "2.12.1", - "author": "Andrew Svetlov", - "license": "Apache 2" - }, - { - "name": "aiosignal", - "version": "1.4.0", - "author": "aiohttp team ", - "license": "Apache 2.0" - }, - { - "name": "attrs", - "version": "26.1.0", - "author": "Hynek Schlawack ", - "license": "MIT" - }, - { - "name": "audioop-lts", - "version": "0.2.2", - "author": "—", - "license": "PSF-2.0" - }, - { - "name": "bcrypt", - "version": "5.0.0", - "author": "The Python Cryptographic Authority developers ", - "license": "Apache-2.0" - }, - { - "name": "bleak", - "version": "3.0.2", - "author": "Henrik Blidh", - "license": "MIT" - }, - { - "name": "cbor2", - "version": "6.1.1", - "author": "Alex Grönholm ", - "license": "MIT" - }, - { - "name": "cffi", - "version": "2.0.0", - "author": "Armin Rigo, Maciej Fijalkowski", - "license": "MIT" - }, - { - "name": "cryptography", - "version": "49.0.0", - "author": "The Python Cryptographic Authority and individual contributors ", - "license": "Apache-2.0 OR BSD-3-Clause" - }, - { - "name": "dbus-fast", - "version": "5.0.22", - "author": "Bluetooth Devices Authors", - "license": "MIT" - }, - { - "name": "frozenlist", - "version": "1.8.0", - "author": "aiohttp team ", - "license": "Apache-2.0" - }, - { - "name": "idna", - "version": "3.18", - "author": "Kim Davies ", - "license": "BSD-3-Clause" - }, - { - "name": "lxmf", - "version": "1.1.0", - "author": "Mark Qvist", - "license": "Reticulum License" - }, - { - "name": "lxmfy", - "version": "2.0.1", - "author": "Quad4 ", - "license": "BSD-0-Clause" - }, - { - "name": "lxst", - "version": "0.5.0", - "author": "Mark Qvist", - "license": "Other/Proprietary License" - }, - { - "name": "miniaudio", - "version": "1.71", - "author": "Irmen de Jong ", - "license": "MIT" - }, - { - "name": "multidict", - "version": "6.7.1", - "author": "Andrew Svetlov", - "license": "Apache License 2.0" - }, - { - "name": "numpy", - "version": "2.4.6", - "author": "Travis E. Oliphant et al.", - "license": "BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0" - }, - { - "name": "ply", - "version": "3.11", - "author": "David Beazley", - "license": "BSD" - }, - { - "name": "propcache", - "version": "0.4.1", - "author": "Andrew Svetlov", - "license": "Apache-2.0" - }, - { - "name": "psutil", - "version": "7.2.2", - "author": "Giampaolo Rodola", - "license": "BSD-3-Clause" - }, - { - "name": "pycodec2", - "version": "4.1.1", - "author": "Grzegorz Milka", - "license": "OSI Approved :: BSD License" - }, - { - "name": "pycparser", - "version": "3.0", - "author": "Eli Bendersky ", - "license": "BSD-3-Clause" - }, - { - "name": "pyserial", - "version": "3.5", - "author": "Chris Liechti", - "license": "BSD" - }, - { - "name": "reticulum-meshchatx", - "version": "4.8.0", - "author": "Quad4", - "license": "0BSD AND MIT" - }, - { - "name": "rns", - "version": "1.4.0", - "author": "Mark Qvist", - "license": "Reticulum License" - }, - { - "name": "rns-filesync", - "version": "1.0.0", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "wasmtime", - "version": "46.0.1", - "author": "The Wasmtime Project Developers ", - "license": "Apache-2.0 WITH LLVM-exception" - }, - { - "name": "websockets", - "version": "16.0", - "author": "Aymeric Augustin ", - "license": "BSD-3-Clause" - }, - { - "name": "yarl", - "version": "1.23.0", - "author": "Andrew Svetlov", - "license": "Apache-2.0" - } + { + "name": "aiohappyeyeballs", + "version": "2.6.1", + "author": "J. Nick Koston", + "license": "PSF-2.0" + }, + { + "name": "aiohttp", + "version": "3.14.1", + "author": "—", + "license": "Apache-2.0 AND MIT" + }, + { + "name": "aiohttp-session", + "version": "2.12.1", + "author": "Andrew Svetlov", + "license": "Apache 2" + }, + { + "name": "aiosignal", + "version": "1.4.0", + "author": "aiohttp team ", + "license": "Apache 2.0" + }, + { + "name": "attrs", + "version": "26.1.0", + "author": "Hynek Schlawack ", + "license": "MIT" + }, + { + "name": "audioop-lts", + "version": "0.2.2", + "author": "—", + "license": "PSF-2.0" + }, + { + "name": "bcrypt", + "version": "5.0.0", + "author": "The Python Cryptographic Authority developers ", + "license": "Apache-2.0" + }, + { + "name": "bleak", + "version": "3.0.2", + "author": "Henrik Blidh", + "license": "MIT" + }, + { + "name": "cbor2", + "version": "6.1.1", + "author": "Alex Grönholm ", + "license": "MIT" + }, + { + "name": "cffi", + "version": "2.0.0", + "author": "Armin Rigo, Maciej Fijalkowski", + "license": "MIT" + }, + { + "name": "cryptography", + "version": "49.0.0", + "author": "The Python Cryptographic Authority and individual contributors ", + "license": "Apache-2.0 OR BSD-3-Clause" + }, + { + "name": "dbus-fast", + "version": "5.0.22", + "author": "Bluetooth Devices Authors", + "license": "MIT" + }, + { + "name": "frozenlist", + "version": "1.8.0", + "author": "aiohttp team ", + "license": "Apache-2.0" + }, + { + "name": "idna", + "version": "3.18", + "author": "Kim Davies ", + "license": "BSD-3-Clause" + }, + { + "name": "lxmf", + "version": "1.1.0", + "author": "Mark Qvist", + "license": "Reticulum License" + }, + { + "name": "lxmfy", + "version": "2.0.1", + "author": "Quad4 ", + "license": "BSD-0-Clause" + }, + { + "name": "lxst", + "version": "0.5.0", + "author": "Mark Qvist", + "license": "Other/Proprietary License" + }, + { + "name": "miniaudio", + "version": "1.71", + "author": "Irmen de Jong ", + "license": "MIT" + }, + { + "name": "multidict", + "version": "6.7.1", + "author": "Andrew Svetlov", + "license": "Apache License 2.0" + }, + { + "name": "numpy", + "version": "2.4.6", + "author": "Travis E. Oliphant et al.", + "license": "BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0" + }, + { + "name": "ply", + "version": "3.11", + "author": "David Beazley", + "license": "BSD" + }, + { + "name": "propcache", + "version": "0.4.1", + "author": "Andrew Svetlov", + "license": "Apache-2.0" + }, + { + "name": "psutil", + "version": "7.2.2", + "author": "Giampaolo Rodola", + "license": "BSD-3-Clause" + }, + { + "name": "pycodec2", + "version": "4.1.1", + "author": "Grzegorz Milka", + "license": "OSI Approved :: BSD License" + }, + { + "name": "pycparser", + "version": "3.0", + "author": "Eli Bendersky ", + "license": "BSD-3-Clause" + }, + { + "name": "pyserial", + "version": "3.5", + "author": "Chris Liechti", + "license": "BSD" + }, + { + "name": "reticulum-meshchatx", + "version": "4.8.0", + "author": "Quad4", + "license": "0BSD AND MIT" + }, + { + "name": "rns", + "version": "1.4.0", + "author": "Mark Qvist", + "license": "Reticulum License" + }, + { + "name": "rns-filesync", + "version": "1.0.0", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "wasmtime", + "version": "46.0.1", + "author": "The Wasmtime Project Developers ", + "license": "Apache-2.0 WITH LLVM-exception" + }, + { + "name": "websockets", + "version": "16.0", + "author": "Aymeric Augustin ", + "license": "BSD-3-Clause" + }, + { + "name": "yarl", + "version": "1.23.0", + "author": "Andrew Svetlov", + "license": "Apache-2.0" + } ] diff --git a/meshchatx/src/backend/data/licenses_frontend.json b/meshchatx/src/backend/data/licenses_frontend.json index 26d2cc83..6f40a641 100644 --- a/meshchatx/src/backend/data/licenses_frontend.json +++ b/meshchatx/src/backend/data/licenses_frontend.json @@ -1,3698 +1,3698 @@ [ - { - "name": "@asamuzakjp/css-color", - "version": "5.1.11", - "author": "asamuzaK", - "license": "MIT" - }, - { - "name": "@asamuzakjp/dom-selector", - "version": "7.1.1", - "author": "asamuzaK", - "license": "MIT" - }, - { - "name": "@asamuzakjp/generational-cache", - "version": "1.0.1", - "author": "asamuzaK", - "license": "MIT" - }, - { - "name": "@asamuzakjp/nwsapi", - "version": "2.3.9", - "author": "Diego Perini", - "license": "MIT" - }, - { - "name": "@babel/helper-string-parser", - "version": "7.27.1", - "author": "The Babel Team", - "license": "MIT" - }, - { - "name": "@babel/helper-validator-identifier", - "version": "7.28.5", - "author": "The Babel Team", - "license": "MIT" - }, - { - "name": "@babel/parser", - "version": "7.29.0", - "author": "The Babel Team", - "license": "MIT" - }, - { - "name": "@babel/types", - "version": "7.29.0", - "author": "The Babel Team", - "license": "MIT" - }, - { - "name": "@bcoe/v8-coverage", - "version": "1.0.2", - "author": "Charles Samborski", - "license": "MIT" - }, - { - "name": "@bramus/specificity", - "version": "2.4.2", - "author": "Bramus Van Damme", - "license": "MIT" - }, - { - "name": "@csstools/color-helpers", - "version": "6.0.2", - "author": "—", - "license": "MIT-0" - }, - { - "name": "@csstools/css-calc", - "version": "3.2.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@csstools/css-color-parser", - "version": "4.1.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@csstools/css-parser-algorithms", - "version": "4.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@csstools/css-syntax-patches-for-csstree", - "version": "1.1.3", - "author": "—", - "license": "MIT-0" - }, - { - "name": "@csstools/css-tokenizer", - "version": "4.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@egjs/hammerjs", - "version": "2.0.17", - "author": "—", - "license": "MIT" - }, - { - "name": "@electron-internal/extract-zip", - "version": "1.0.1", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "@electron/asar", - "version": "3.4.1", - "author": "—", - "license": "MIT" - }, - { - "name": "@electron/fuses", - "version": "1.8.0", - "author": "Electron Community", - "license": "MIT" - }, - { - "name": "@electron/get", - "version": "3.1.0", - "author": "Samuel Attard", - "license": "MIT" - }, - { - "name": "@electron/notarize", - "version": "2.5.0", - "author": "Samuel Attard", - "license": "MIT" - }, - { - "name": "@electron/osx-sign", - "version": "1.3.3", - "author": "electron", - "license": "BSD-2-Clause" - }, - { - "name": "@electron/rebuild", - "version": "4.0.4", - "author": "—", - "license": "MIT" - }, - { - "name": "@electron/universal", - "version": "2.0.3", - "author": "Samuel Attard", - "license": "MIT" - }, - { - "name": "@electron/windows-sign", - "version": "1.1.2", - "author": "Felix Rieseberg", - "license": "BSD-2-Clause" - }, - { - "name": "@epic-web/invariant", - "version": "1.0.0", - "author": "Kent C. Dodds", - "license": "MIT" - }, - { - "name": "@eslint-community/eslint-utils", - "version": "4.8.0", - "author": "Toru Nagashima", - "license": "MIT" - }, - { - "name": "@eslint-community/regexpp", - "version": "4.12.2", - "author": "Toru Nagashima", - "license": "MIT" - }, - { - "name": "@eslint/config-array", - "version": "0.21.2", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@eslint/config-helpers", - "version": "0.4.2", - "author": "—", - "license": "Apache-2.0" - }, - { - "name": "@eslint/core", - "version": "0.17.0", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@eslint/eslintrc", - "version": "3.3.6", - "author": "Nicholas C. Zakas", - "license": "MIT" - }, - { - "name": "@eslint/js", - "version": "9.39.5", - "author": "—", - "license": "MIT" - }, - { - "name": "@eslint/object-schema", - "version": "2.1.7", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@eslint/plugin-kit", - "version": "0.4.1", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@exodus/bytes", - "version": "1.15.0", - "author": "Exodus Movement, Inc.", - "license": "MIT" - }, - { - "name": "@fontsource/noto-sans", - "version": "5.3.0", - "author": "Google Inc.", - "license": "OFL-1.1" - }, - { - "name": "@gar/promise-retry", - "version": "1.0.3", - "author": "—", - "license": "MIT" - }, - { - "name": "@humanfs/core", - "version": "0.19.2", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@humanfs/node", - "version": "0.16.8", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@humanfs/types", - "version": "0.15.0", - "author": "Nicholas C. Zakas", - "license": "Apache-2.0" - }, - { - "name": "@humanwhocodes/module-importer", - "version": "1.0.1", - "author": "Nicholas C. Zaks", - "license": "Apache-2.0" - }, - { - "name": "@humanwhocodes/retry", - "version": "0.4.3", - "author": "Nicholas C. Zaks", - "license": "Apache-2.0" - }, - { - "name": "@intlify/core-base", - "version": "11.4.7", - "author": "kazuya kawaguchi", - "license": "MIT" - }, - { - "name": "@intlify/devtools-types", - "version": "11.4.7", - "author": "kazuya kawaguchi", - "license": "MIT" - }, - { - "name": "@intlify/message-compiler", - "version": "11.4.7", - "author": "kazuya kawaguchi", - "license": "MIT" - }, - { - "name": "@intlify/shared", - "version": "11.4.7", - "author": "kazuya kawaguchi", - "license": "MIT" - }, - { - "name": "@isaacs/cliui", - "version": "8.0.2", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "@isaacs/fs-minipass", - "version": "4.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "@jridgewell/gen-mapping", - "version": "0.3.0", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@jridgewell/remapping", - "version": "2.3.5", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@jridgewell/resolve-uri", - "version": "3.0.3", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@jridgewell/set-array", - "version": "1.2.1", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@jridgewell/source-map", - "version": "0.3.3", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@jridgewell/sourcemap-codec", - "version": "1.4.10", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@jridgewell/trace-mapping", - "version": "0.3.9", - "author": "Justin Ridgewell", - "license": "MIT" - }, - { - "name": "@malept/cross-spawn-promise", - "version": "2.0.0", - "author": "Mark Lee", - "license": "Apache-2.0" - }, - { - "name": "@malept/flatpak-bundler", - "version": "0.4.0", - "author": "Matt Watson", - "license": "MIT" - }, - { - "name": "@mapbox/jsonlint-lines-primitives", - "version": "2.0.2", - "author": "Zach Carter", - "license": "Unknown" - }, - { - "name": "@mapbox/unitbezier", - "version": "0.0.1", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "@maplibre/maplibre-gl-style-spec", - "version": "24.4.1", - "author": "MapLibre", - "license": "ISC" - }, - { - "name": "@mdi/font", - "version": "7.4.47", - "author": "Austin Andrews", - "license": "Apache-2.0" - }, - { - "name": "@mdi/js", - "version": "7.4.47", - "author": "Austin Andrews", - "license": "Apache-2.0" - }, - { - "name": "@noble/hashes", - "version": "1.4.0", - "author": "Paul Miller", - "license": "MIT" - }, - { - "name": "@npmcli/agent", - "version": "4.0.2", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "@npmcli/fs", - "version": "5.0.0", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "@npmcli/redact", - "version": "4.0.0", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "@one-ini/wasm", - "version": "0.1.1", - "author": "—", - "license": "MIT" - }, - { - "name": "@oxc-parser/binding-linux-x64-gnu", - "version": "0.140.0", - "author": "Boshen and oxc contributors", - "license": "MIT" - }, - { - "name": "@oxc-project/types", - "version": "0.139.0", - "author": "Boshen and oxc contributors", - "license": "MIT" - }, - { - "name": "@oxc-resolver/binding-linux-x64-gnu", - "version": "11.24.2", - "author": "—", - "license": "MIT" - }, - { - "name": "@peculiar/asn1-schema", - "version": "2.7.0", - "author": "PeculiarVentures, LLC", - "license": "MIT" - }, - { - "name": "@peculiar/json-schema", - "version": "1.1.12", - "author": "PeculiarVentures, Inc", - "license": "MIT" - }, - { - "name": "@peculiar/utils", - "version": "2.0.3", - "author": "PeculiarVentures", - "license": "MIT" - }, - { - "name": "@peculiar/webcrypto", - "version": "1.7.1", - "author": "PeculiarVentures", - "license": "MIT" - }, - { - "name": "@petamoriken/float16", - "version": "3.9.3", - "author": "Kenta Moriuchi", - "license": "MIT" - }, - { - "name": "@pkgjs/parseargs", - "version": "0.11.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@pkgr/core", - "version": "0.3.6", - "author": "JounQin", - "license": "MIT" - }, - { - "name": "@playwright/test", - "version": "1.61.1", - "author": "Microsoft Corporation", - "license": "Apache-2.0" - }, - { - "name": "@polka/url", - "version": "1.0.0-next.24", - "author": "Luke Edwards", - "license": "MIT" - }, - { - "name": "@rolldown/binding-linux-x64-gnu", - "version": "1.1.5", - "author": "—", - "license": "MIT" - }, - { - "name": "@rolldown/pluginutils", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@sindresorhus/is", - "version": "4.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "@standard-schema/spec", - "version": "1.1.0", - "author": "Colin McDonnell", - "license": "MIT" - }, - { - "name": "@szmarczak/http-timer", - "version": "4.0.5", - "author": "Szymon Marczak", - "license": "MIT" - }, - { - "name": "@tailwindcss/forms", - "version": "0.5.11", - "author": "—", - "license": "MIT" - }, - { - "name": "@tailwindcss/node", - "version": "4.3.3", - "author": "—", - "license": "MIT" - }, - { - "name": "@tailwindcss/oxide", - "version": "4.3.3", - "author": "—", - "license": "MIT" - }, - { - "name": "@tailwindcss/oxide-linux-x64-gnu", - "version": "4.3.3", - "author": "—", - "license": "MIT" - }, - { - "name": "@tailwindcss/vite", - "version": "4.3.3", - "author": "—", - "license": "MIT" - }, - { - "name": "@tanstack/virtual-core", - "version": "3.17.6", - "author": "Tanner Linsley", - "license": "MIT" - }, - { - "name": "@tanstack/vue-virtual", - "version": "3.13.34", - "author": "Tanner Linsley", - "license": "MIT" - }, - { - "name": "@types/cacheable-request", - "version": "6.0.1", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/chai", - "version": "5.2.3", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/debug", - "version": "4.1.6", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/deep-eql", - "version": "4.0.2", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/estree", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/fs-extra", - "version": "9.0.13", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/hammerjs", - "version": "2.0.46", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/http-cache-semantics", - "version": "4.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/json-schema", - "version": "7.0.15", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/keyv", - "version": "3.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/node", - "version": "0.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/rbush", - "version": "4.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/responselike", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "@types/trusted-types", - "version": "2.0.7", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitejs/plugin-vue", - "version": "6.0.8", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vitest/coverage-v8", - "version": "4.1.10", - "author": "Anthony Fu", - "license": "MIT" - }, - { - "name": "@vitest/expect", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/mocker", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/pretty-format", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/runner", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/snapshot", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/spy", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/ui", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@vitest/utils", - "version": "4.1.10", - "author": "—", - "license": "MIT" - }, - { - "name": "@volar/language-core", - "version": "2.4.28", - "author": "—", - "license": "MIT" - }, - { - "name": "@volar/source-map", - "version": "2.4.28", - "author": "—", - "license": "MIT" - }, - { - "name": "@volar/typescript", - "version": "2.4.28", - "author": "—", - "license": "MIT" - }, - { - "name": "@vue/compiler-core", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/compiler-dom", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/compiler-sfc", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/compiler-ssr", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/devtools-api", - "version": "6.5.0", - "author": "Guillaume Chau", - "license": "MIT" - }, - { - "name": "@vue/language-core", - "version": "3.3.7", - "author": "—", - "license": "MIT" - }, - { - "name": "@vue/reactivity", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/runtime-core", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/runtime-dom", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/server-renderer", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/shared", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "@vue/test-utils", - "version": "2.4.11", - "author": "Lachlan Miller", - "license": "MIT" - }, - { - "name": "@vuetify/loader-shared", - "version": "2.1.2", - "author": "Kael Watts-Deuchar", - "license": "MIT" - }, - { - "name": "@zarrita/storage", - "version": "0.2.0", - "author": "—", - "license": "MIT" - }, - { - "name": "abbrev", - "version": "4.0.0", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "abbrev", - "version": "1.0.3", - "author": "Isaac Z. Schlueter", - "license": "Unknown" - }, - { - "name": "acorn", - "version": "0.11.0", - "author": "—", - "license": "MIT" - }, - { - "name": "acorn-jsx", - "version": "5.3.2", - "author": "—", - "license": "MIT" - }, - { - "name": "agent-base", - "version": "7.0.2", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "ajv", - "version": "6.14.0", - "author": "Evgeny Poberezkin", - "license": "MIT" - }, - { - "name": "alien-signals", - "version": "3.2.1", - "author": "—", - "license": "MIT" - }, - { - "name": "amdefine", - "version": "1.0.1", - "author": "James Burke", - "license": "BSD-3-Clause OR MIT" - }, - { - "name": "ansi-regex", - "version": "5.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "ansi-styles", - "version": "4.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "app-builder-lib", - "version": "26.15.3", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "argparse", - "version": "2.0.1", - "author": "—", - "license": "Python-2.0" - }, - { - "name": "asn1js", - "version": "3.0.10", - "author": "Yury Strozhevsky", - "license": "BSD-3-Clause" - }, - { - "name": "assertion-error", - "version": "2.0.1", - "author": "Jake Luer", - "license": "MIT" - }, - { - "name": "ast-types", - "version": "0.6.12", - "author": "Ben Newman", - "license": "MIT" - }, - { - "name": "ast-v8-to-istanbul", - "version": "1.0.0", - "author": "Ari Perkkiö", - "license": "MIT" - }, - { - "name": "async", - "version": "3.2.3", - "author": "Caolan McMahon", - "license": "MIT" - }, - { - "name": "async-exit-hook", - "version": "2.0.1", - "author": "Tapani Moilanen", - "license": "MIT" - }, - { - "name": "asynckit", - "version": "0.4.0", - "author": "Alex Indigo", - "license": "MIT" - }, - { - "name": "at-least-node", - "version": "1.0.0", - "author": "Ryan Zimmerman", - "license": "ISC" - }, - { - "name": "aws4", - "version": "1.13.2", - "author": "Michael Hart", - "license": "MIT" - }, - { - "name": "balanced-match", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "base64-js", - "version": "1.5.1", - "author": "T. Jameson Little", - "license": "MIT" - }, - { - "name": "bidi-js", - "version": "1.0.3", - "author": "Jason Johnston", - "license": "MIT" - }, - { - "name": "bluebird", - "version": "3.7.2", - "author": "Petka Antonov", - "license": "MIT" - }, - { - "name": "blueimp-canvas-to-blob", - "version": "3.29.0", - "author": "Sebastian Tschan", - "license": "MIT" - }, - { - "name": "boolbase", - "version": "1.0.0", - "author": "Felix Boehm", - "license": "ISC" - }, - { - "name": "boolean", - "version": "3.0.1", - "author": "—", - "license": "MIT" - }, - { - "name": "brace-expansion", - "version": "1.1.12", - "author": "—", - "license": "MIT" - }, - { - "name": "buffer-from", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "builder-util", - "version": "26.15.3", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "builder-util-runtime", - "version": "9.7.0", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "bytestreamjs", - "version": "2.0.1", - "author": "Yury Strozhevsky", - "license": "BSD-3-Clause" - }, - { - "name": "cacache", - "version": "20.0.4", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "cacheable-lookup", - "version": "5.0.3", - "author": "Szymon Marczak", - "license": "MIT" - }, - { - "name": "cacheable-request", - "version": "7.0.2", - "author": "Luke Childs", - "license": "MIT" - }, - { - "name": "call-bind-apply-helpers", - "version": "1.0.1", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "callsites", - "version": "3.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "chai", - "version": "6.2.2", - "author": "Jake Luer", - "license": "MIT" - }, - { - "name": "chalk", - "version": "4.1.1", - "author": "—", - "license": "MIT" - }, - { - "name": "chownr", - "version": "3.0.0", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "chromium-pickle-js", - "version": "0.2.0", - "author": "—", - "license": "MIT" - }, - { - "name": "ci-info", - "version": "4.2.0", - "author": "Thomas Watson Steen", - "license": "MIT" - }, - { - "name": "cli-table3", - "version": "0.5.0", - "author": "James Talmage", - "license": "MIT" - }, - { - "name": "cliui", - "version": "4.0.0", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "clone-response", - "version": "1.0.2", - "author": "Luke Childs", - "license": "MIT" - }, - { - "name": "code-point-at", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "color-convert", - "version": "2.0.0", - "author": "Heather Arthur", - "license": "MIT" - }, - { - "name": "color-name", - "version": "1.1.4", - "author": "DY", - "license": "MIT" - }, - { - "name": "colors", - "version": "1.1.2", - "author": "Marak Squires", - "license": "MIT" - }, - { - "name": "combined-stream", - "version": "1.0.8", - "author": "Felix Geisendörfer", - "license": "MIT" - }, - { - "name": "commander", - "version": "2.20.0", - "author": "TJ Holowaychuk", - "license": "MIT" - }, - { - "name": "compare-version", - "version": "0.1.2", - "author": "Kevin Mårtensson", - "license": "MIT" - }, - { - "name": "component-emitter", - "version": "2.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "compressorjs", - "version": "1.3.0", - "author": "Chen Fengyuan", - "license": "MIT" - }, - { - "name": "concat-map", - "version": "0.0.1", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "config-chain", - "version": "1.1.13", - "author": "Dominic Tarr", - "license": "MIT" - }, - { - "name": "convert-source-map", - "version": "2.0.0", - "author": "Thorsten Lorenz", - "license": "MIT" - }, - { - "name": "core-util-is", - "version": "1.0.0", - "author": "Isaac Z. Schlueter", - "license": "MIT" - }, - { - "name": "cross-dirname", - "version": "0.1.0", - "author": "—", - "license": "MIT" - }, - { - "name": "cross-env", - "version": "10.1.0", - "author": "Kent C. Dodds", - "license": "MIT" - }, - { - "name": "cross-spawn", - "version": "7.0.5", - "author": "André Cruz", - "license": "MIT" - }, - { - "name": "css-tree", - "version": "3.2.1", - "author": "Roman Dvornov", - "license": "MIT" - }, - { - "name": "cssesc", - "version": "3.0.0", - "author": "Mathias Bynens", - "license": "MIT" - }, - { - "name": "csstype", - "version": "3.2.3", - "author": "Fredrik Nicol", - "license": "MIT" - }, - { - "name": "data-urls", - "version": "7.0.0", - "author": "Domenic Denicola", - "license": "MIT" - }, - { - "name": "dayjs", - "version": "1.11.21", - "author": "iamkun", - "license": "MIT" - }, - { - "name": "debug", - "version": "4.3.1", - "author": "Josh Junon", - "license": "MIT" - }, - { - "name": "decamelize", - "version": "1.2.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "decimal.js", - "version": "10.6.0", - "author": "Michael Mclaughlin", - "license": "MIT" - }, - { - "name": "decompress-response", - "version": "6.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "deep-is", - "version": "0.1.4", - "author": "Thorsten Lorenz", - "license": "MIT" - }, - { - "name": "defer-to-connect", - "version": "2.0.0", - "author": "Szymon Marczak", - "license": "MIT" - }, - { - "name": "define-properties", - "version": "1.1.2", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "delayed-stream", - "version": "1.0.0", - "author": "Felix Geisendörfer", - "license": "MIT" - }, - { - "name": "detect-libc", - "version": "2.0.3", - "author": "Lovell Fuller", - "license": "Apache-2.0" - }, - { - "name": "detect-node", - "version": "2.0.4", - "author": "Ilya Kantor", - "license": "ISC" - }, - { - "name": "dijkstrajs", - "version": "1.0.1", - "author": "—", - "license": "MIT" - }, - { - "name": "dir-compare", - "version": "4.2.0", - "author": "Liviu Grigorescu", - "license": "MIT" - }, - { - "name": "dmg-builder", - "version": "26.15.3", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "dompurify", - "version": "3.4.12", - "author": "Dr.-Ing. Mario Heiderich, Cure53", - "license": "(MPL-2.0 OR Apache-2.0)" - }, - { - "name": "dotenv", - "version": "16.6.1", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "dotenv-expand", - "version": "11.0.6", - "author": "motdotla", - "license": "BSD-2-Clause" - }, - { - "name": "dunder-proto", - "version": "1.0.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "duplexer2", - "version": "0.1.4", - "author": "Conrad Pankoff", - "license": "BSD-3-Clause" - }, - { - "name": "earcut", - "version": "3.0.0", - "author": "Vladimir Agafonkin", - "license": "ISC" - }, - { - "name": "eastasianwidth", - "version": "0.2.0", - "author": "Masaki Komagata", - "license": "MIT" - }, - { - "name": "editorconfig", - "version": "1.0.3", - "author": "EditorConfig Team", - "license": "MIT" - }, - { - "name": "ejs", - "version": "3.1.10", - "author": "Matthew Eernisse", - "license": "Apache-2.0" - }, - { - "name": "electron", - "version": "42.4.0", - "author": "Electron Community", - "license": "MIT" - }, - { - "name": "electron-builder", - "version": "26.15.3", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "electron-builder-squirrel-windows", - "version": "26.15.3", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "electron-prompt", - "version": "1.7.0", - "author": "p-sam", - "license": "MIT" - }, - { - "name": "electron-publish", - "version": "26.15.3", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "electron-winstaller", - "version": "5.4.0", - "author": "—", - "license": "MIT" - }, - { - "name": "emoji-picker-element", - "version": "1.29.1", - "author": "Nolan Lawson", - "license": "Apache-2.0" - }, - { - "name": "emoji-picker-element-data", - "version": "1.8.0", - "author": "Nolan Lawson", - "license": "Apache-2.0" - }, - { - "name": "emoji-regex", - "version": "8.0.0", - "author": "Mathias Bynens", - "license": "MIT" - }, - { - "name": "end-of-stream", - "version": "1.1.0", - "author": "Mathias Buus", - "license": "MIT" - }, - { - "name": "enhanced-resolve", - "version": "5.24.1", - "author": "Tobias Koppers @sokra", - "license": "MIT" - }, - { - "name": "entities", - "version": "7.0.1", - "author": "Felix Boehm", - "license": "BSD-2-Clause" - }, - { - "name": "env-paths", - "version": "2.2.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "err-code", - "version": "2.0.2", - "author": "IndigoUnited", - "license": "MIT" - }, - { - "name": "es-abstract", - "version": "1.5.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "es-define-property", - "version": "1.0.1", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "es-errors", - "version": "1.3.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "es-module-lexer", - "version": "2.0.0", - "author": "Guy Bedford", - "license": "MIT" - }, - { - "name": "es-object-atoms", - "version": "1.0.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "es-set-tostringtag", - "version": "2.1.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "es-to-primitive", - "version": "1.1.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "es6-error", - "version": "4.1.1", - "author": "Ben Youngblood", - "license": "MIT" - }, - { - "name": "escalade", - "version": "3.1.1", - "author": "Luke Edwards", - "license": "MIT" - }, - { - "name": "escape-string-regexp", - "version": "4.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "eslint", - "version": "9.39.5", - "author": "Nicholas C. Zakas", - "license": "MIT" - }, - { - "name": "eslint-config-prettier", - "version": "10.1.8", - "author": "Simon Lydell", - "license": "MIT" - }, - { - "name": "eslint-plugin-prettier", - "version": "5.5.6", - "author": "Teddy Katz", - "license": "MIT" - }, - { - "name": "eslint-plugin-security", - "version": "3.0.1", - "author": "Node Security Project", - "license": "Apache-2.0" - }, - { - "name": "eslint-plugin-vue", - "version": "10.10.0", - "author": "Toru Nagashima", - "license": "MIT" - }, - { - "name": "eslint-scope", - "version": "8.2.0", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "eslint-visitor-keys", - "version": "3.4.3", - "author": "Toru Nagashima", - "license": "Apache-2.0" - }, - { - "name": "esmangle-evaluator", - "version": "1.0.0", - "author": "Andres Suarez", - "license": "Unknown" - }, - { - "name": "espree", - "version": "10.3.0", - "author": "Nicholas C. Zakas", - "license": "BSD-2-Clause" - }, - { - "name": "esprima-fb", - "version": "12001.1.0-dev-harmony-fb", - "author": "Ariya Hidayat", - "license": "BSD" - }, - { - "name": "esquery", - "version": "1.6.0", - "author": "Joel Feenstra", - "license": "BSD-3-Clause" - }, - { - "name": "esrecurse", - "version": "4.3.0", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "estraverse", - "version": "5.1.0", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "estree-walker", - "version": "2.0.2", - "author": "Rich Harris", - "license": "MIT" - }, - { - "name": "esutils", - "version": "2.0.3", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "execa", - "version": "0.10.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "expect-type", - "version": "1.3.0", - "author": "—", - "license": "Apache-2.0" - }, - { - "name": "exponential-backoff", - "version": "3.1.1", - "author": "Sami Sayegh", - "license": "Apache-2.0" - }, - { - "name": "fake-indexeddb", - "version": "6.2.5", - "author": "Jeremy Scheff", - "license": "Apache-2.0" - }, - { - "name": "falafel", - "version": "1.0.1", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "fast-deep-equal", - "version": "3.1.3", - "author": "Evgeny Poberezkin", - "license": "MIT" - }, - { - "name": "fast-diff", - "version": "1.1.2", - "author": "Jason Chen", - "license": "Apache-2.0" - }, - { - "name": "fast-json-stable-stringify", - "version": "2.1.0", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "fast-levenshtein", - "version": "2.0.6", - "author": "Ramesh Nair", - "license": "MIT" - }, - { - "name": "fast-uri", - "version": "4.1.1", - "author": "Vincent Le Goff", - "license": "BSD-3-Clause" - }, - { - "name": "fd-package-json", - "version": "2.0.0", - "author": "James Garbutt", - "license": "MIT" - }, - { - "name": "fdir", - "version": "6.4.3", - "author": "thecodrr", - "license": "MIT" - }, - { - "name": "fflate", - "version": "0.8.0", - "author": "Arjun Barrett", - "license": "MIT" - }, - { - "name": "file-entry-cache", - "version": "8.0.0", - "author": "Jared Wray", - "license": "MIT" - }, - { - "name": "filelist", - "version": "1.0.1", - "author": "Matthew Eernisse", - "license": "Apache-2.0" - }, - { - "name": "find-up", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "flat-cache", - "version": "4.0.1", - "author": "Jared Wray", - "license": "MIT" - }, - { - "name": "flatted", - "version": "3.4.2", - "author": "Andrea Giammarchi", - "license": "ISC" - }, - { - "name": "for-each", - "version": "0.3.3", - "author": "Raynos", - "license": "MIT" - }, - { - "name": "foreach", - "version": "2.0.6", - "author": "Manuel Stofer", - "license": "MIT" - }, - { - "name": "foreground-child", - "version": "3.1.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "form-data", - "version": "4.0.6", - "author": "Felix Geisendörfer", - "license": "MIT" - }, - { - "name": "formatly", - "version": "0.3.0", - "author": "Josh Goldberg ✨", - "license": "MIT" - }, - { - "name": "fs-extra", - "version": "7.0.1", - "author": "JP Richardson", - "license": "MIT" - }, - { - "name": "fs-minipass", - "version": "3.0.3", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "fs.realpath", - "version": "1.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "function-bind", - "version": "1.0.2", - "author": "Raynos", - "license": "MIT" - }, - { - "name": "geotiff", - "version": "3.0.5", - "author": "Fabian Schindler", - "license": "MIT" - }, - { - "name": "get-caller-file", - "version": "1.0.1", - "author": "Stefan Penner", - "license": "ISC" - }, - { - "name": "get-intrinsic", - "version": "1.2.6", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "get-stream", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "get-tsconfig", - "version": "4.14.0", - "author": "Hiroki Osame", - "license": "MIT" - }, - { - "name": "glob", - "version": "7.2.3", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "glob-parent", - "version": "6.0.2", - "author": "Gulp Team", - "license": "ISC" - }, - { - "name": "global-agent", - "version": "3.0.0", - "author": "Gajus Kuizinas", - "license": "BSD-3-Clause" - }, - { - "name": "globals", - "version": "14.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "globalthis", - "version": "1.0.1", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "gopd", - "version": "1.2.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "got", - "version": "11.8.6", - "author": "—", - "license": "MIT" - }, - { - "name": "graceful-fs", - "version": "4.1.2", - "author": "—", - "license": "ISC" - }, - { - "name": "has-flag", - "version": "4.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "has-symbols", - "version": "1.0.3", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "has-tostringtag", - "version": "1.0.2", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "hasown", - "version": "2.0.4", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "hosted-git-info", - "version": "2.8.9", - "author": "Rebecca Turner", - "license": "ISC" - }, - { - "name": "html-encoding-sniffer", - "version": "6.0.0", - "author": "Domenic Denicola", - "license": "MIT" - }, - { - "name": "html-escaper", - "version": "2.0.0", - "author": "Andrea Giammarchi", - "license": "MIT" - }, - { - "name": "http-cache-semantics", - "version": "4.1.1", - "author": "Kornel Lesiński", - "license": "BSD-2-Clause" - }, - { - "name": "http-proxy-agent", - "version": "7.0.0", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "http2-wrapper", - "version": "1.0.0-beta.5.2", - "author": "Szymon Marczak", - "license": "MIT" - }, - { - "name": "https-proxy-agent", - "version": "7.0.0", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "iconv-lite", - "version": "0.7.2", - "author": "Alexander Shtuchkin", - "license": "MIT" - }, - { - "name": "ignore", - "version": "5.3.2", - "author": "kael", - "license": "MIT" - }, - { - "name": "immediate", - "version": "3.0.5", - "author": "—", - "license": "MIT" - }, - { - "name": "import-fresh", - "version": "3.3.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "imurmurhash", - "version": "0.1.4", - "author": "Jens Taylor", - "license": "MIT" - }, - { - "name": "inflight", - "version": "1.0.4", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "inherits", - "version": "2.0.1", - "author": "—", - "license": "ISC" - }, - { - "name": "inherits", - "version": "2.0.0", - "author": "Isaac Z. Schlueter", - "license": "WTFPL2" - }, - { - "name": "ini", - "version": "1.3.6", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "inline-process-browser", - "version": "1.0.0", - "author": "Calvin W. Metcalf", - "license": "MIT" - }, - { - "name": "invert-kv", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "ip-address", - "version": "9.0.5", - "author": "Beau Gunderson", - "license": "MIT" - }, - { - "name": "is-blob", - "version": "2.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "is-callable", - "version": "1.1.1", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "is-date-object", - "version": "1.0.1", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "is-extglob", - "version": "2.1.1", - "author": "Jon Schlinkert", - "license": "MIT" - }, - { - "name": "is-fullwidth-code-point", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "is-glob", - "version": "4.0.3", - "author": "Jon Schlinkert", - "license": "MIT" - }, - { - "name": "is-potential-custom-element-name", - "version": "1.0.1", - "author": "Mathias Bynens", - "license": "MIT" - }, - { - "name": "is-regex", - "version": "1.0.3", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "is-stream", - "version": "1.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "is-symbol", - "version": "1.0.1", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "isarray", - "version": "0.0.1", - "author": "Julian Gruber", - "license": "MIT" - }, - { - "name": "isbinaryfile", - "version": "4.0.8", - "author": "—", - "license": "MIT" - }, - { - "name": "isexe", - "version": "2.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "isexe", - "version": "3.1.5", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "istanbul-lib-coverage", - "version": "3.2.2", - "author": "Krishnan Anantheswaran", - "license": "BSD-3-Clause" - }, - { - "name": "istanbul-lib-report", - "version": "3.0.1", - "author": "Krishnan Anantheswaran", - "license": "BSD-3-Clause" - }, - { - "name": "istanbul-reports", - "version": "3.2.0", - "author": "Krishnan Anantheswaran", - "license": "BSD-3-Clause" - }, - { - "name": "jackspeak", - "version": "3.1.2", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "jake", - "version": "10.8.5", - "author": "Matthew Eernisse", - "license": "Apache-2.0" - }, - { - "name": "jiti", - "version": "2.4.2", - "author": "—", - "license": "MIT" - }, - { - "name": "js-beautify", - "version": "1.14.9", - "author": "Einar Lielmanis", - "license": "MIT" - }, - { - "name": "js-tokens", - "version": "10.0.0", - "author": "Simon Lydell", - "license": "MIT" - }, - { - "name": "js-yaml", - "version": "4.2.0", - "author": "Vladimir Zapparov", - "license": "MIT" - }, - { - "name": "jsbn", - "version": "1.1.0", - "author": "Tom Wu", - "license": "MIT" - }, - { - "name": "jsdom", - "version": "29.1.1", - "author": "—", - "license": "MIT" - }, - { - "name": "json-buffer", - "version": "3.0.1", - "author": "Dominic Tarr", - "license": "MIT" - }, - { - "name": "json-schema-traverse", - "version": "0.4.1", - "author": "Evgeny Poberezkin", - "license": "MIT" - }, - { - "name": "json-stable-stringify-without-jsonify", - "version": "1.0.1", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "json-stringify-pretty-compact", - "version": "4.0.0", - "author": "Simon Lydell", - "license": "MIT" - }, - { - "name": "json-stringify-safe", - "version": "5.0.1", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "json5", - "version": "2.2.3", - "author": "Aseem Kishore", - "license": "MIT" - }, - { - "name": "jsonfile", - "version": "4.0.0", - "author": "JP Richardson", - "license": "MIT" - }, - { - "name": "jsqr", - "version": "1.4.0", - "author": "—", - "license": "Apache-2.0" - }, - { - "name": "jszip", - "version": "3.10.1", - "author": "Stuart Knightley", - "license": "(MIT OR GPL-3.0-or-later)" - }, - { - "name": "keycharm", - "version": "0.4.0", - "author": "Alex de Mulder", - "license": "(Apache-2.0 OR MIT)" - }, - { - "name": "keyv", - "version": "4.0.0", - "author": "Jared Wray", - "license": "MIT" - }, - { - "name": "knip", - "version": "6.29.0", - "author": "Lars Kappert", - "license": "ISC" - }, - { - "name": "lazy-val", - "version": "1.0.5", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "lcid", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "lerc", - "version": "3.0.0", - "author": "Esri", - "license": "Apache-2.0" - }, - { - "name": "levn", - "version": "0.4.1", - "author": "George Zahariev", - "license": "MIT" - }, - { - "name": "lie", - "version": "3.3.0", - "author": "—", - "license": "MIT" - }, - { - "name": "lightningcss", - "version": "1.32.0", - "author": "—", - "license": "MPL-2.0" - }, - { - "name": "lightningcss-linux-x64-gnu", - "version": "1.32.0", - "author": "—", - "license": "MPL-2.0" - }, - { - "name": "locate-path", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "lodash", - "version": "4.18.0", - "author": "John-David Dalton", - "license": "MIT" - }, - { - "name": "lodash.merge", - "version": "4.6.2", - "author": "John-David Dalton", - "license": "MIT" - }, - { - "name": "lowercase-keys", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "lru-cache", - "version": "6.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "lru-cache", - "version": "11.3.5", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "magic-string", - "version": "0.30.21", - "author": "Rich Harris", - "license": "MIT" - }, - { - "name": "magicast", - "version": "0.5.2", - "author": "—", - "license": "MIT" - }, - { - "name": "make-dir", - "version": "4.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "make-fetch-happen", - "version": "15.0.6", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "mapbox-to-css-font", - "version": "3.2.0", - "author": "Andreas Hocevar", - "license": "BSD-2-Clause" - }, - { - "name": "marked", - "version": "18.0.7", - "author": "Christopher Jeffrey", - "license": "MIT" - }, - { - "name": "matcher", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "math-intrinsics", - "version": "1.0.0", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "mdn-data", - "version": "2.27.1", - "author": "Mozilla Developer Network", - "license": "CC0-1.0" - }, - { - "name": "mem", - "version": "3.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "micron-parser", - "version": "0.0.0", - "author": "—", - "license": "Unknown" - }, - { - "name": "mime", - "version": "2.5.2", - "author": "Robert Kieffer", - "license": "MIT" - }, - { - "name": "mime-db", - "version": "1.52.0", - "author": "—", - "license": "MIT" - }, - { - "name": "mime-types", - "version": "2.1.35", - "author": "—", - "license": "MIT" - }, - { - "name": "mimic-fn", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "mimic-response", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "mini-svg-data-uri", - "version": "1.2.3", - "author": "Taylor “Tigt” Hunt", - "license": "MIT" - }, - { - "name": "minimatch", - "version": "3.1.4", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "minimatch", - "version": "10.2.3", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "minimist", - "version": "1.2.8", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "minipass", - "version": "3.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "minipass-collect", - "version": "2.0.1", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "minipass-fetch", - "version": "5.0.2", - "author": "GitHub Inc.", - "license": "MIT" - }, - { - "name": "minipass-flush", - "version": "1.0.7", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "minipass-pipeline", - "version": "1.2.4", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "minipass-sized", - "version": "2.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "minizlib", - "version": "3.0.1", - "author": "Isaac Z. Schlueter", - "license": "MIT" - }, - { - "name": "mrmime", - "version": "2.0.0", - "author": "Luke Edwards", - "license": "MIT" - }, - { - "name": "ms", - "version": "2.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "muggle-string", - "version": "0.4.1", - "author": "—", - "license": "MIT" - }, - { - "name": "nanoid", - "version": "3.3.12", - "author": "Andrey Sitnik", - "license": "MIT" - }, - { - "name": "natural-compare", - "version": "1.4.0", - "author": "Lauri Rooden", - "license": "MIT" - }, - { - "name": "negotiator", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "node-abi", - "version": "4.2.0", - "author": "Lukas Geiger", - "license": "MIT" - }, - { - "name": "node-api-version", - "version": "0.2.1", - "author": "Tim Fish", - "license": "MIT" - }, - { - "name": "node-gyp", - "version": "12.2.0", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "node-int64", - "version": "0.4.0", - "author": "Robert Kieffer", - "license": "MIT" - }, - { - "name": "nopt", - "version": "6.0.0", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "normalize-url", - "version": "6.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "npm-run-path", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "nth-check", - "version": "2.1.1", - "author": "Felix Boehm", - "license": "BSD-2-Clause" - }, - { - "name": "number-is-nan", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "numcodecs", - "version": "0.3.2", - "author": "Trevor Manz", - "license": "MIT" - }, - { - "name": "object-assign", - "version": "4.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "object-keys", - "version": "1.0.8", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "obug", - "version": "2.1.1", - "author": "Kevin Deng", - "license": "MIT" - }, - { - "name": "ol", - "version": "10.9.0", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "ol-mapbox-style", - "version": "13.4.1", - "author": "—", - "license": "BSD-2-Clause" - }, - { - "name": "once", - "version": "1.3.0", - "author": "Isaac Z. Schlueter", - "license": "BSD" - }, - { - "name": "optionator", - "version": "0.9.4", - "author": "George Zahariev", - "license": "MIT" - }, - { - "name": "os-locale", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "oxc-parser", - "version": "0.140.0", - "author": "Boshen and oxc contributors", - "license": "MIT" - }, - { - "name": "oxc-resolver", - "version": "11.24.2", - "author": "—", - "license": "MIT" - }, - { - "name": "p-cancelable", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "p-finally", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "p-is-promise", - "version": "1.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "p-limit", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "p-locate", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "p-map", - "version": "7.0.6", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "p-try", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "package-json-from-dist", - "version": "1.0.0", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "pako", - "version": "1.0.2", - "author": "—", - "license": "MIT" - }, - { - "name": "pako", - "version": "2.0.4", - "author": "—", - "license": "(MIT AND Zlib)" - }, - { - "name": "parent-module", - "version": "1.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "parse-headers", - "version": "2.0.2", - "author": "David Björklund", - "license": "MIT" - }, - { - "name": "parse5", - "version": "8.0.1", - "author": "Ivan Nikulin", - "license": "MIT" - }, - { - "name": "path-browserify", - "version": "1.0.1", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "path-exists", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "path-is-absolute", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "path-key", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "path-scurry", - "version": "1.11.1", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "pathe", - "version": "2.0.3", - "author": "—", - "license": "MIT" - }, - { - "name": "pbf", - "version": "4.0.1", - "author": "Konstantin Kaefer", - "license": "BSD-3-Clause" - }, - { - "name": "pe-library", - "version": "0.4.0", - "author": "jet", - "license": "MIT" - }, - { - "name": "picocolors", - "version": "1.1.1", - "author": "Alexey Raspopov", - "license": "ISC" - }, - { - "name": "picomatch", - "version": "4.0.4", - "author": "Jon Schlinkert", - "license": "MIT" - }, - { - "name": "pkijs", - "version": "3.4.0", - "author": "Yury Strozhevsky", - "license": "BSD-3-Clause" - }, - { - "name": "playwright", - "version": "1.61.1", - "author": "Microsoft Corporation", - "license": "Apache-2.0" - }, - { - "name": "playwright-core", - "version": "1.61.1", - "author": "Microsoft Corporation", - "license": "Apache-2.0" - }, - { - "name": "plist", - "version": "3.0.5", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "pngjs", - "version": "5.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "postcss", - "version": "8.5.19", - "author": "Andrey Sitnik", - "license": "MIT" - }, - { - "name": "postcss-selector-parser", - "version": "7.1.4", - "author": "—", - "license": "MIT" - }, - { - "name": "postject", - "version": "1.0.0-alpha.6", - "author": "—", - "license": "MIT" - }, - { - "name": "prelude-ls", - "version": "1.2.1", - "author": "George Zahariev", - "license": "MIT" - }, - { - "name": "prettier", - "version": "3.9.6", - "author": "James Long", - "license": "MIT" - }, - { - "name": "prettier-linter-helpers", - "version": "1.0.1", - "author": "—", - "license": "MIT" - }, - { - "name": "private", - "version": "0.1.5", - "author": "Ben Newman", - "license": "MIT" - }, - { - "name": "proc-log", - "version": "6.0.0", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "process-nextick-args", - "version": "1.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "progress", - "version": "2.0.3", - "author": "TJ Holowaychuk", - "license": "MIT" - }, - { - "name": "promise-retry", - "version": "2.0.1", - "author": "IndigoUnited", - "license": "MIT" - }, - { - "name": "proper-lockfile", - "version": "4.1.2", - "author": "André Cruz", - "license": "MIT" - }, - { - "name": "proto-list", - "version": "1.2.1", - "author": "Isaac Z. Schlueter", - "license": "MIT" - }, - { - "name": "protocol-buffers-schema", - "version": "3.6.1", - "author": "Mathias Buus", - "license": "MIT" - }, - { - "name": "pump", - "version": "3.0.0", - "author": "Mathias Buus Madsen", - "license": "MIT" - }, - { - "name": "punycode", - "version": "2.3.1", - "author": "Mathias Bynens", - "license": "MIT" - }, - { - "name": "pvtsutils", - "version": "1.3.6", - "author": "PeculiarVentures", - "license": "MIT" - }, - { - "name": "pvutils", - "version": "1.1.3", - "author": "Yury Strozhevsky", - "license": "MIT" - }, - { - "name": "qrcode", - "version": "1.5.4", - "author": "Ryan Day", - "license": "MIT" - }, - { - "name": "quick-lru", - "version": "5.1.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "quickselect", - "version": "2.0.0", - "author": "Vladimir Agafonkin", - "license": "ISC" - }, - { - "name": "rbush", - "version": "4.0.0", - "author": "Volodymyr Agafonkin", - "license": "MIT" - }, - { - "name": "read-binary-file-arch", - "version": "1.0.6", - "author": "Samuel Maddock", - "license": "MIT" - }, - { - "name": "readable-stream", - "version": "1.0.31", - "author": "—", - "license": "MIT" - }, - { - "name": "recast", - "version": "0.10.1", - "author": "Ben Newman", - "license": "MIT" - }, - { - "name": "reference-spec-reader", - "version": "0.2.0", - "author": "manzt", - "license": "MIT" - }, - { - "name": "regexp-tree", - "version": "0.1.1", - "author": "Dmitry Soshnikov", - "license": "MIT" - }, - { - "name": "require-directory", - "version": "2.1.1", - "author": "Troy Goode", - "license": "MIT" - }, - { - "name": "require-from-string", - "version": "2.0.2", - "author": "Vsevolod Strukchinsky", - "license": "MIT" - }, - { - "name": "require-main-filename", - "version": "1.0.1", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "resedit", - "version": "1.7.0", - "author": "jet", - "license": "MIT" - }, - { - "name": "resolve-alpn", - "version": "1.0.0", - "author": "Szymon Marczak", - "license": "MIT" - }, - { - "name": "resolve-from", - "version": "4.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "resolve-pkg-maps", - "version": "1.0.0", - "author": "Hiroki Osame", - "license": "MIT" - }, - { - "name": "resolve-protobuf-schema", - "version": "2.1.0", - "author": "Mathias Buus", - "license": "MIT" - }, - { - "name": "responselike", - "version": "2.0.0", - "author": "lukechilds", - "license": "MIT" - }, - { - "name": "retry", - "version": "0.12.0", - "author": "Tim Koschützki", - "license": "MIT" - }, - { - "name": "rimraf", - "version": "2.6.2", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "roarr", - "version": "2.15.3", - "author": "Gajus Kuizinas", - "license": "BSD-3-Clause" - }, - { - "name": "rolldown", - "version": "1.1.5", - "author": "—", - "license": "MIT" - }, - { - "name": "rw", - "version": "1.3.3", - "author": "Mike Bostock", - "license": "BSD-3-Clause" - }, - { - "name": "safe-buffer", - "version": "5.1.1", - "author": "Feross Aboukhadijeh", - "license": "MIT" - }, - { - "name": "safe-regex", - "version": "2.1.1", - "author": "James C.", - "license": "MIT" - }, - { - "name": "safer-buffer", - "version": "2.1.2", - "author": "Nikita Skovoroda", - "license": "MIT" - }, - { - "name": "sanitize-filename", - "version": "1.6.3", - "author": "Parsha Pourkhomami", - "license": "WTFPL OR ISC" - }, - { - "name": "sax", - "version": "1.2.4", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "saxes", - "version": "6.0.0", - "author": "Louis-Dominique Dubeau", - "license": "ISC" - }, - { - "name": "semver", - "version": "7.5.2", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "semver-compare", - "version": "1.0.0", - "author": "James Halliday", - "license": "MIT" - }, - { - "name": "serialize-error", - "version": "7.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "set-blocking", - "version": "2.0.0", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "setimmediate", - "version": "1.0.5", - "author": "YuzuJS", - "license": "MIT" - }, - { - "name": "shebang-command", - "version": "2.0.0", - "author": "Kevin Mårtensson", - "license": "MIT" - }, - { - "name": "shebang-regex", - "version": "3.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "siginfo", - "version": "2.0.0", - "author": "Emil Bay", - "license": "ISC" - }, - { - "name": "signal-exit", - "version": "3.0.0", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "simple-update-notifier", - "version": "2.0.0", - "author": "alexbrazier", - "license": "MIT" - }, - { - "name": "sirv", - "version": "3.0.2", - "author": "Luke Edwards", - "license": "MIT" - }, - { - "name": "smart-buffer", - "version": "4.2.0", - "author": "Josh Glazebrook", - "license": "MIT" - }, - { - "name": "smol-toml", - "version": "1.7.0", - "author": "Cynthia Rey", - "license": "BSD-3-Clause" - }, - { - "name": "socks", - "version": "2.8.0", - "author": "Josh Glazebrook", - "license": "MIT" - }, - { - "name": "socks-proxy-agent", - "version": "8.0.3", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "source-map", - "version": "0.6.0", - "author": "Nick Fitzgerald", - "license": "BSD-3-Clause" - }, - { - "name": "source-map", - "version": "0.3.0", - "author": "Nick Fitzgerald", - "license": "BSD" - }, - { - "name": "source-map-js", - "version": "1.0.2", - "author": "Valentin 7rulnik Semirulnik", - "license": "BSD-3-Clause" - }, - { - "name": "source-map-support", - "version": "0.5.19", - "author": "—", - "license": "MIT" - }, - { - "name": "sprintf-js", - "version": "1.1.2", - "author": "Alexandru Mărășteanu", - "license": "BSD-3-Clause" - }, - { - "name": "ssri", - "version": "13.0.1", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "stackback", - "version": "0.0.2", - "author": "Roman Shtylman", - "license": "MIT" - }, - { - "name": "stat-mode", - "version": "1.0.0", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "std-env", - "version": "4.0.0-rc.1", - "author": "—", - "license": "MIT" - }, - { - "name": "string-width", - "version": "1.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "string.prototype.trim", - "version": "1.1.2", - "author": "Jordan Harband", - "license": "MIT" - }, - { - "name": "string_decoder", - "version": "0.10.24", - "author": "—", - "license": "MIT" - }, - { - "name": "strip-ansi", - "version": "6.0.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "strip-eof", - "version": "1.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "strip-json-comments", - "version": "3.1.1", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "sumchecker", - "version": "3.0.1", - "author": "Mark Lee", - "license": "Apache-2.0" - }, - { - "name": "supports-color", - "version": "7.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "symbol-tree", - "version": "3.2.4", - "author": "Joris van der Wel", - "license": "MIT" - }, - { - "name": "synckit", - "version": "0.11.13", - "author": "JounQin", - "license": "MIT" - }, - { - "name": "tailwindcss", - "version": "4.3.3", - "author": "—", - "license": "MIT" - }, - { - "name": "tapable", - "version": "2.3.3", - "author": "Tobias Koppers @sokra", - "license": "MIT" - }, - { - "name": "tar", - "version": "7.5.21", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "temp", - "version": "0.9.0", - "author": "Bruce Williams", - "license": "MIT" - }, - { - "name": "temp-file", - "version": "3.4.0", - "author": "Vladimir Krivosheev", - "license": "MIT" - }, - { - "name": "terser", - "version": "5.49.0", - "author": "Mihai Bazon", - "license": "BSD-2-Clause" - }, - { - "name": "through2", - "version": "0.6.2", - "author": "Rod Vagg", - "license": "MIT" - }, - { - "name": "tiny-async-pool", - "version": "1.3.0", - "author": "Rafael Xavier de Souza", - "license": "MIT" - }, - { - "name": "tinybench", - "version": "2.9.0", - "author": "—", - "license": "MIT" - }, - { - "name": "tinyexec", - "version": "1.0.2", - "author": "James Garbutt", - "license": "MIT" - }, - { - "name": "tinyglobby", - "version": "0.2.12", - "author": "Superchupu", - "license": "MIT" - }, - { - "name": "tinyqueue", - "version": "3.0.0", - "author": "—", - "license": "ISC" - }, - { - "name": "tinyrainbow", - "version": "3.1.0", - "author": "—", - "license": "MIT" - }, - { - "name": "tldts", - "version": "7.0.5", - "author": "Rémi Berson", - "license": "MIT" - }, - { - "name": "tldts-core", - "version": "7.0.5", - "author": "Rémi Berson", - "license": "MIT" - }, - { - "name": "tmp", - "version": "0.2.7", - "author": "KARASZI István", - "license": "MIT" - }, - { - "name": "tmp-promise", - "version": "3.0.2", - "author": "Benjamin Gruenbaum and Collaborators.", - "license": "MIT" - }, - { - "name": "totalist", - "version": "3.0.0", - "author": "Luke Edwards", - "license": "MIT" - }, - { - "name": "tough-cookie", - "version": "6.0.1", - "author": "Jeremy Stashewsky", - "license": "BSD-3-Clause" - }, - { - "name": "tr46", - "version": "6.0.0", - "author": "Sebastian Mayr", - "license": "MIT" - }, - { - "name": "truncate-utf8-bytes", - "version": "1.0.0", - "author": "Carl Xiong", - "license": "WTFPL" - }, - { - "name": "tslib", - "version": "2.8.1", - "author": "Microsoft Corp.", - "license": "0BSD" - }, - { - "name": "type-check", - "version": "0.4.0", - "author": "George Zahariev", - "license": "MIT" - }, - { - "name": "type-fest", - "version": "0.13.1", - "author": "Sindre Sorhus", - "license": "(MIT OR CC0-1.0)" - }, - { - "name": "typescript", - "version": "6.0.3", - "author": "Microsoft Corp.", - "license": "Apache-2.0" - }, - { - "name": "unbash", - "version": "4.0.3", - "author": "Lars Kappert", - "license": "ISC" - }, - { - "name": "undici", - "version": "7.28.0", - "author": "—", - "license": "MIT" - }, - { - "name": "undici-types", - "version": "7.16.0", - "author": "—", - "license": "MIT" - }, - { - "name": "universalify", - "version": "0.1.0", - "author": "Ryan Zimmerman", - "license": "MIT" - }, - { - "name": "unreachable-branch-transform", - "version": "0.3.0", - "author": "Andres Suarez", - "license": "MIT" - }, - { - "name": "unzipit", - "version": "2.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "unzipper", - "version": "0.12.3", - "author": "Evan Oxfeld", - "license": "MIT" - }, - { - "name": "upath", - "version": "2.0.1", - "author": "Angelos Pikoulas", - "license": "MIT" - }, - { - "name": "uri-js", - "version": "4.4.1", - "author": "Gary Court", - "license": "BSD-2-Clause" - }, - { - "name": "utf8-byte-length", - "version": "1.0.1", - "author": "Carl Xiong", - "license": "WTFPL" - }, - { - "name": "util-deprecate", - "version": "1.0.1", - "author": "Nathan Rajlich", - "license": "MIT" - }, - { - "name": "uuid", - "version": "14.0.1", - "author": "—", - "license": "MIT" - }, - { - "name": "vis-data", - "version": "7.1.10", - "author": "—", - "license": "(Apache-2.0 OR MIT)" - }, - { - "name": "vis-network", - "version": "9.1.13", - "author": "—", - "license": "(Apache-2.0 OR MIT)" - }, - { - "name": "vis-util", - "version": "5.0.7", - "author": "Alex de Mulder", - "license": "(Apache-2.0 OR MIT)" - }, - { - "name": "vite", - "version": "8.1.5", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "vite-plugin-vuetify", - "version": "2.1.3", - "author": "Kael Watts-Deuchar", - "license": "MIT" - }, - { - "name": "vitest", - "version": "4.1.10", - "author": "Anthony Fu", - "license": "MIT" - }, - { - "name": "vscode-uri", - "version": "3.0.8", - "author": "Microsoft", - "license": "MIT" - }, - { - "name": "vue", - "version": "3.5.40", - "author": "Evan You", - "license": "MIT" - }, - { - "name": "vue-component-type-helpers", - "version": "3.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "vue-eslint-parser", - "version": "10.4.1", - "author": "Toru Nagashima", - "license": "MIT" - }, - { - "name": "vue-i18n", - "version": "11.4.7", - "author": "kazuya kawaguchi", - "license": "MIT" - }, - { - "name": "vue-router", - "version": "4.6.4", - "author": "Eduardo San Martin Morote", - "license": "MIT" - }, - { - "name": "vue-tsc", - "version": "3.3.7", - "author": "—", - "license": "MIT" - }, - { - "name": "vuetify", - "version": "3.12.10", - "author": "John Leider", - "license": "MIT" - }, - { - "name": "w3c-xmlserializer", - "version": "5.0.0", - "author": "—", - "license": "MIT" - }, - { - "name": "walk-up-path", - "version": "4.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "web-worker", - "version": "1.5.0", - "author": "—", - "license": "Apache-2.0" - }, - { - "name": "webcrypto-core", - "version": "1.9.2", - "author": "PeculiarVentures", - "license": "MIT" - }, - { - "name": "webidl-conversions", - "version": "8.0.1", - "author": "Domenic Denicola", - "license": "BSD-2-Clause" - }, - { - "name": "whatwg-mimetype", - "version": "5.0.0", - "author": "Domenic Denicola", - "license": "MIT" - }, - { - "name": "whatwg-url", - "version": "16.0.1", - "author": "Sebastian Mayr", - "license": "MIT" - }, - { - "name": "which", - "version": "2.0.1", - "author": "GitHub Inc.", - "license": "ISC" - }, - { - "name": "which-module", - "version": "2.0.0", - "author": "nexdrew", - "license": "ISC" - }, - { - "name": "why-is-node-running", - "version": "2.3.0", - "author": "Mathias Buus", - "license": "MIT" - }, - { - "name": "word-wrap", - "version": "1.2.5", - "author": "Jon Schlinkert", - "license": "MIT" - }, - { - "name": "wrap-ansi", - "version": "2.0.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "wrappy", - "version": "1.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "xml-name-validator", - "version": "5.0.0", - "author": "Domenic Denicola", - "license": "Apache-2.0" - }, - { - "name": "xml-utils", - "version": "1.10.2", - "author": "Daniel J. Dufour", - "license": "CC0-1.0" - }, - { - "name": "xmlbuilder", - "version": "9.0.7", - "author": "Ozgur Ozcitak", - "license": "MIT" - }, - { - "name": "xmlchars", - "version": "2.2.0", - "author": "Louis-Dominique Dubeau", - "license": "MIT" - }, - { - "name": "xtend", - "version": "4.0.0", - "author": "Raynos", - "license": "MIT" - }, - { - "name": "y18n", - "version": "5.0.5", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "yallist", - "version": "4.0.0", - "author": "Isaac Z. Schlueter", - "license": "ISC" - }, - { - "name": "yallist", - "version": "5.0.0", - "author": "Isaac Z. Schlueter", - "license": "BlueOak-1.0.0" - }, - { - "name": "yaml", - "version": "2.9.0", - "author": "Eemeli Aro", - "license": "ISC" - }, - { - "name": "yargs", - "version": "12.0.5", - "author": "—", - "license": "MIT" - }, - { - "name": "yargs-parser", - "version": "21.1.1", - "author": "Ben Coe", - "license": "ISC" - }, - { - "name": "yocto-queue", - "version": "0.1.0", - "author": "Sindre Sorhus", - "license": "MIT" - }, - { - "name": "zarrita", - "version": "0.7.1", - "author": "—", - "license": "MIT" - }, - { - "name": "zod", - "version": "4.4.3", - "author": "Colin McDonnell", - "license": "MIT" - }, - { - "name": "zstddec", - "version": "0.2.0", - "author": "Don McCurdy", - "license": "MIT AND BSD-3-Clause" - } + { + "name": "@asamuzakjp/css-color", + "version": "5.1.11", + "author": "asamuzaK", + "license": "MIT" + }, + { + "name": "@asamuzakjp/dom-selector", + "version": "7.1.1", + "author": "asamuzaK", + "license": "MIT" + }, + { + "name": "@asamuzakjp/generational-cache", + "version": "1.0.1", + "author": "asamuzaK", + "license": "MIT" + }, + { + "name": "@asamuzakjp/nwsapi", + "version": "2.3.9", + "author": "Diego Perini", + "license": "MIT" + }, + { + "name": "@babel/helper-string-parser", + "version": "7.27.1", + "author": "The Babel Team", + "license": "MIT" + }, + { + "name": "@babel/helper-validator-identifier", + "version": "7.28.5", + "author": "The Babel Team", + "license": "MIT" + }, + { + "name": "@babel/parser", + "version": "7.29.0", + "author": "The Babel Team", + "license": "MIT" + }, + { + "name": "@babel/types", + "version": "7.29.0", + "author": "The Babel Team", + "license": "MIT" + }, + { + "name": "@bcoe/v8-coverage", + "version": "1.0.2", + "author": "Charles Samborski", + "license": "MIT" + }, + { + "name": "@bramus/specificity", + "version": "2.4.2", + "author": "Bramus Van Damme", + "license": "MIT" + }, + { + "name": "@csstools/color-helpers", + "version": "6.0.2", + "author": "—", + "license": "MIT-0" + }, + { + "name": "@csstools/css-calc", + "version": "3.2.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@csstools/css-color-parser", + "version": "4.1.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@csstools/css-parser-algorithms", + "version": "4.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@csstools/css-syntax-patches-for-csstree", + "version": "1.1.3", + "author": "—", + "license": "MIT-0" + }, + { + "name": "@csstools/css-tokenizer", + "version": "4.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@egjs/hammerjs", + "version": "2.0.17", + "author": "—", + "license": "MIT" + }, + { + "name": "@electron-internal/extract-zip", + "version": "1.0.1", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "@electron/asar", + "version": "3.4.1", + "author": "—", + "license": "MIT" + }, + { + "name": "@electron/fuses", + "version": "1.8.0", + "author": "Electron Community", + "license": "MIT" + }, + { + "name": "@electron/get", + "version": "3.1.0", + "author": "Samuel Attard", + "license": "MIT" + }, + { + "name": "@electron/notarize", + "version": "2.5.0", + "author": "Samuel Attard", + "license": "MIT" + }, + { + "name": "@electron/osx-sign", + "version": "1.3.3", + "author": "electron", + "license": "BSD-2-Clause" + }, + { + "name": "@electron/rebuild", + "version": "4.0.4", + "author": "—", + "license": "MIT" + }, + { + "name": "@electron/universal", + "version": "2.0.3", + "author": "Samuel Attard", + "license": "MIT" + }, + { + "name": "@electron/windows-sign", + "version": "1.1.2", + "author": "Felix Rieseberg", + "license": "BSD-2-Clause" + }, + { + "name": "@epic-web/invariant", + "version": "1.0.0", + "author": "Kent C. Dodds", + "license": "MIT" + }, + { + "name": "@eslint-community/eslint-utils", + "version": "4.8.0", + "author": "Toru Nagashima", + "license": "MIT" + }, + { + "name": "@eslint-community/regexpp", + "version": "4.12.2", + "author": "Toru Nagashima", + "license": "MIT" + }, + { + "name": "@eslint/config-array", + "version": "0.21.2", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@eslint/config-helpers", + "version": "0.4.2", + "author": "—", + "license": "Apache-2.0" + }, + { + "name": "@eslint/core", + "version": "0.17.0", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@eslint/eslintrc", + "version": "3.3.6", + "author": "Nicholas C. Zakas", + "license": "MIT" + }, + { + "name": "@eslint/js", + "version": "9.39.5", + "author": "—", + "license": "MIT" + }, + { + "name": "@eslint/object-schema", + "version": "2.1.7", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@eslint/plugin-kit", + "version": "0.4.1", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@exodus/bytes", + "version": "1.15.0", + "author": "Exodus Movement, Inc.", + "license": "MIT" + }, + { + "name": "@fontsource/noto-sans", + "version": "5.3.0", + "author": "Google Inc.", + "license": "OFL-1.1" + }, + { + "name": "@gar/promise-retry", + "version": "1.0.3", + "author": "—", + "license": "MIT" + }, + { + "name": "@humanfs/core", + "version": "0.19.2", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@humanfs/node", + "version": "0.16.8", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@humanfs/types", + "version": "0.15.0", + "author": "Nicholas C. Zakas", + "license": "Apache-2.0" + }, + { + "name": "@humanwhocodes/module-importer", + "version": "1.0.1", + "author": "Nicholas C. Zaks", + "license": "Apache-2.0" + }, + { + "name": "@humanwhocodes/retry", + "version": "0.4.3", + "author": "Nicholas C. Zaks", + "license": "Apache-2.0" + }, + { + "name": "@intlify/core-base", + "version": "11.4.7", + "author": "kazuya kawaguchi", + "license": "MIT" + }, + { + "name": "@intlify/devtools-types", + "version": "11.4.7", + "author": "kazuya kawaguchi", + "license": "MIT" + }, + { + "name": "@intlify/message-compiler", + "version": "11.4.7", + "author": "kazuya kawaguchi", + "license": "MIT" + }, + { + "name": "@intlify/shared", + "version": "11.4.7", + "author": "kazuya kawaguchi", + "license": "MIT" + }, + { + "name": "@isaacs/cliui", + "version": "8.0.2", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "@isaacs/fs-minipass", + "version": "4.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "@jridgewell/gen-mapping", + "version": "0.3.0", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@jridgewell/remapping", + "version": "2.3.5", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@jridgewell/resolve-uri", + "version": "3.0.3", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@jridgewell/set-array", + "version": "1.2.1", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@jridgewell/source-map", + "version": "0.3.3", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@jridgewell/sourcemap-codec", + "version": "1.4.10", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@jridgewell/trace-mapping", + "version": "0.3.9", + "author": "Justin Ridgewell", + "license": "MIT" + }, + { + "name": "@malept/cross-spawn-promise", + "version": "2.0.0", + "author": "Mark Lee", + "license": "Apache-2.0" + }, + { + "name": "@malept/flatpak-bundler", + "version": "0.4.0", + "author": "Matt Watson", + "license": "MIT" + }, + { + "name": "@mapbox/jsonlint-lines-primitives", + "version": "2.0.2", + "author": "Zach Carter", + "license": "Unknown" + }, + { + "name": "@mapbox/unitbezier", + "version": "0.0.1", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "@maplibre/maplibre-gl-style-spec", + "version": "24.4.1", + "author": "MapLibre", + "license": "ISC" + }, + { + "name": "@mdi/font", + "version": "7.4.47", + "author": "Austin Andrews", + "license": "Apache-2.0" + }, + { + "name": "@mdi/js", + "version": "7.4.47", + "author": "Austin Andrews", + "license": "Apache-2.0" + }, + { + "name": "@noble/hashes", + "version": "1.4.0", + "author": "Paul Miller", + "license": "MIT" + }, + { + "name": "@npmcli/agent", + "version": "4.0.2", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "@npmcli/fs", + "version": "5.0.0", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "@npmcli/redact", + "version": "4.0.0", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "@one-ini/wasm", + "version": "0.1.1", + "author": "—", + "license": "MIT" + }, + { + "name": "@oxc-parser/binding-linux-x64-gnu", + "version": "0.140.0", + "author": "Boshen and oxc contributors", + "license": "MIT" + }, + { + "name": "@oxc-project/types", + "version": "0.139.0", + "author": "Boshen and oxc contributors", + "license": "MIT" + }, + { + "name": "@oxc-resolver/binding-linux-x64-gnu", + "version": "11.24.2", + "author": "—", + "license": "MIT" + }, + { + "name": "@peculiar/asn1-schema", + "version": "2.7.0", + "author": "PeculiarVentures, LLC", + "license": "MIT" + }, + { + "name": "@peculiar/json-schema", + "version": "1.1.12", + "author": "PeculiarVentures, Inc", + "license": "MIT" + }, + { + "name": "@peculiar/utils", + "version": "2.0.3", + "author": "PeculiarVentures", + "license": "MIT" + }, + { + "name": "@peculiar/webcrypto", + "version": "1.7.1", + "author": "PeculiarVentures", + "license": "MIT" + }, + { + "name": "@petamoriken/float16", + "version": "3.9.3", + "author": "Kenta Moriuchi", + "license": "MIT" + }, + { + "name": "@pkgjs/parseargs", + "version": "0.11.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@pkgr/core", + "version": "0.3.6", + "author": "JounQin", + "license": "MIT" + }, + { + "name": "@playwright/test", + "version": "1.61.1", + "author": "Microsoft Corporation", + "license": "Apache-2.0" + }, + { + "name": "@polka/url", + "version": "1.0.0-next.24", + "author": "Luke Edwards", + "license": "MIT" + }, + { + "name": "@rolldown/binding-linux-x64-gnu", + "version": "1.1.5", + "author": "—", + "license": "MIT" + }, + { + "name": "@rolldown/pluginutils", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@sindresorhus/is", + "version": "4.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "@standard-schema/spec", + "version": "1.1.0", + "author": "Colin McDonnell", + "license": "MIT" + }, + { + "name": "@szmarczak/http-timer", + "version": "4.0.5", + "author": "Szymon Marczak", + "license": "MIT" + }, + { + "name": "@tailwindcss/forms", + "version": "0.5.11", + "author": "—", + "license": "MIT" + }, + { + "name": "@tailwindcss/node", + "version": "4.3.3", + "author": "—", + "license": "MIT" + }, + { + "name": "@tailwindcss/oxide", + "version": "4.3.3", + "author": "—", + "license": "MIT" + }, + { + "name": "@tailwindcss/oxide-linux-x64-gnu", + "version": "4.3.3", + "author": "—", + "license": "MIT" + }, + { + "name": "@tailwindcss/vite", + "version": "4.3.3", + "author": "—", + "license": "MIT" + }, + { + "name": "@tanstack/virtual-core", + "version": "3.17.6", + "author": "Tanner Linsley", + "license": "MIT" + }, + { + "name": "@tanstack/vue-virtual", + "version": "3.13.34", + "author": "Tanner Linsley", + "license": "MIT" + }, + { + "name": "@types/cacheable-request", + "version": "6.0.1", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/chai", + "version": "5.2.3", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/debug", + "version": "4.1.6", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/deep-eql", + "version": "4.0.2", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/estree", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/fs-extra", + "version": "9.0.13", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/hammerjs", + "version": "2.0.46", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/http-cache-semantics", + "version": "4.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/json-schema", + "version": "7.0.15", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/keyv", + "version": "3.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/node", + "version": "0.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/rbush", + "version": "4.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/responselike", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "@types/trusted-types", + "version": "2.0.7", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitejs/plugin-vue", + "version": "6.0.8", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vitest/coverage-v8", + "version": "4.1.10", + "author": "Anthony Fu", + "license": "MIT" + }, + { + "name": "@vitest/expect", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/mocker", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/pretty-format", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/runner", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/snapshot", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/spy", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/ui", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@vitest/utils", + "version": "4.1.10", + "author": "—", + "license": "MIT" + }, + { + "name": "@volar/language-core", + "version": "2.4.28", + "author": "—", + "license": "MIT" + }, + { + "name": "@volar/source-map", + "version": "2.4.28", + "author": "—", + "license": "MIT" + }, + { + "name": "@volar/typescript", + "version": "2.4.28", + "author": "—", + "license": "MIT" + }, + { + "name": "@vue/compiler-core", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/compiler-dom", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/compiler-sfc", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/compiler-ssr", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/devtools-api", + "version": "6.5.0", + "author": "Guillaume Chau", + "license": "MIT" + }, + { + "name": "@vue/language-core", + "version": "3.3.7", + "author": "—", + "license": "MIT" + }, + { + "name": "@vue/reactivity", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/runtime-core", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/runtime-dom", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/server-renderer", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/shared", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "@vue/test-utils", + "version": "2.4.11", + "author": "Lachlan Miller", + "license": "MIT" + }, + { + "name": "@vuetify/loader-shared", + "version": "2.1.2", + "author": "Kael Watts-Deuchar", + "license": "MIT" + }, + { + "name": "@zarrita/storage", + "version": "0.2.0", + "author": "—", + "license": "MIT" + }, + { + "name": "abbrev", + "version": "4.0.0", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "abbrev", + "version": "1.0.3", + "author": "Isaac Z. Schlueter", + "license": "Unknown" + }, + { + "name": "acorn", + "version": "0.11.0", + "author": "—", + "license": "MIT" + }, + { + "name": "acorn-jsx", + "version": "5.3.2", + "author": "—", + "license": "MIT" + }, + { + "name": "agent-base", + "version": "7.0.2", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "ajv", + "version": "6.14.0", + "author": "Evgeny Poberezkin", + "license": "MIT" + }, + { + "name": "alien-signals", + "version": "3.2.1", + "author": "—", + "license": "MIT" + }, + { + "name": "amdefine", + "version": "1.0.1", + "author": "James Burke", + "license": "BSD-3-Clause OR MIT" + }, + { + "name": "ansi-regex", + "version": "5.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "ansi-styles", + "version": "4.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "app-builder-lib", + "version": "26.15.3", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "argparse", + "version": "2.0.1", + "author": "—", + "license": "Python-2.0" + }, + { + "name": "asn1js", + "version": "3.0.10", + "author": "Yury Strozhevsky", + "license": "BSD-3-Clause" + }, + { + "name": "assertion-error", + "version": "2.0.1", + "author": "Jake Luer", + "license": "MIT" + }, + { + "name": "ast-types", + "version": "0.6.12", + "author": "Ben Newman", + "license": "MIT" + }, + { + "name": "ast-v8-to-istanbul", + "version": "1.0.0", + "author": "Ari Perkkiö", + "license": "MIT" + }, + { + "name": "async", + "version": "3.2.3", + "author": "Caolan McMahon", + "license": "MIT" + }, + { + "name": "async-exit-hook", + "version": "2.0.1", + "author": "Tapani Moilanen", + "license": "MIT" + }, + { + "name": "asynckit", + "version": "0.4.0", + "author": "Alex Indigo", + "license": "MIT" + }, + { + "name": "at-least-node", + "version": "1.0.0", + "author": "Ryan Zimmerman", + "license": "ISC" + }, + { + "name": "aws4", + "version": "1.13.2", + "author": "Michael Hart", + "license": "MIT" + }, + { + "name": "balanced-match", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "base64-js", + "version": "1.5.1", + "author": "T. Jameson Little", + "license": "MIT" + }, + { + "name": "bidi-js", + "version": "1.0.3", + "author": "Jason Johnston", + "license": "MIT" + }, + { + "name": "bluebird", + "version": "3.7.2", + "author": "Petka Antonov", + "license": "MIT" + }, + { + "name": "blueimp-canvas-to-blob", + "version": "3.29.0", + "author": "Sebastian Tschan", + "license": "MIT" + }, + { + "name": "boolbase", + "version": "1.0.0", + "author": "Felix Boehm", + "license": "ISC" + }, + { + "name": "boolean", + "version": "3.0.1", + "author": "—", + "license": "MIT" + }, + { + "name": "brace-expansion", + "version": "1.1.12", + "author": "—", + "license": "MIT" + }, + { + "name": "buffer-from", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "builder-util", + "version": "26.15.3", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "builder-util-runtime", + "version": "9.7.0", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "bytestreamjs", + "version": "2.0.1", + "author": "Yury Strozhevsky", + "license": "BSD-3-Clause" + }, + { + "name": "cacache", + "version": "20.0.4", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "cacheable-lookup", + "version": "5.0.3", + "author": "Szymon Marczak", + "license": "MIT" + }, + { + "name": "cacheable-request", + "version": "7.0.2", + "author": "Luke Childs", + "license": "MIT" + }, + { + "name": "call-bind-apply-helpers", + "version": "1.0.1", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "callsites", + "version": "3.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "chai", + "version": "6.2.2", + "author": "Jake Luer", + "license": "MIT" + }, + { + "name": "chalk", + "version": "4.1.1", + "author": "—", + "license": "MIT" + }, + { + "name": "chownr", + "version": "3.0.0", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "chromium-pickle-js", + "version": "0.2.0", + "author": "—", + "license": "MIT" + }, + { + "name": "ci-info", + "version": "4.2.0", + "author": "Thomas Watson Steen", + "license": "MIT" + }, + { + "name": "cli-table3", + "version": "0.5.0", + "author": "James Talmage", + "license": "MIT" + }, + { + "name": "cliui", + "version": "4.0.0", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "clone-response", + "version": "1.0.2", + "author": "Luke Childs", + "license": "MIT" + }, + { + "name": "code-point-at", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "color-convert", + "version": "2.0.0", + "author": "Heather Arthur", + "license": "MIT" + }, + { + "name": "color-name", + "version": "1.1.4", + "author": "DY", + "license": "MIT" + }, + { + "name": "colors", + "version": "1.1.2", + "author": "Marak Squires", + "license": "MIT" + }, + { + "name": "combined-stream", + "version": "1.0.8", + "author": "Felix Geisendörfer", + "license": "MIT" + }, + { + "name": "commander", + "version": "2.20.0", + "author": "TJ Holowaychuk", + "license": "MIT" + }, + { + "name": "compare-version", + "version": "0.1.2", + "author": "Kevin Mårtensson", + "license": "MIT" + }, + { + "name": "component-emitter", + "version": "2.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "compressorjs", + "version": "1.3.0", + "author": "Chen Fengyuan", + "license": "MIT" + }, + { + "name": "concat-map", + "version": "0.0.1", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "config-chain", + "version": "1.1.13", + "author": "Dominic Tarr", + "license": "MIT" + }, + { + "name": "convert-source-map", + "version": "2.0.0", + "author": "Thorsten Lorenz", + "license": "MIT" + }, + { + "name": "core-util-is", + "version": "1.0.0", + "author": "Isaac Z. Schlueter", + "license": "MIT" + }, + { + "name": "cross-dirname", + "version": "0.1.0", + "author": "—", + "license": "MIT" + }, + { + "name": "cross-env", + "version": "10.1.0", + "author": "Kent C. Dodds", + "license": "MIT" + }, + { + "name": "cross-spawn", + "version": "7.0.5", + "author": "André Cruz", + "license": "MIT" + }, + { + "name": "css-tree", + "version": "3.2.1", + "author": "Roman Dvornov", + "license": "MIT" + }, + { + "name": "cssesc", + "version": "3.0.0", + "author": "Mathias Bynens", + "license": "MIT" + }, + { + "name": "csstype", + "version": "3.2.3", + "author": "Fredrik Nicol", + "license": "MIT" + }, + { + "name": "data-urls", + "version": "7.0.0", + "author": "Domenic Denicola", + "license": "MIT" + }, + { + "name": "dayjs", + "version": "1.11.21", + "author": "iamkun", + "license": "MIT" + }, + { + "name": "debug", + "version": "4.3.1", + "author": "Josh Junon", + "license": "MIT" + }, + { + "name": "decamelize", + "version": "1.2.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "decimal.js", + "version": "10.6.0", + "author": "Michael Mclaughlin", + "license": "MIT" + }, + { + "name": "decompress-response", + "version": "6.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "deep-is", + "version": "0.1.4", + "author": "Thorsten Lorenz", + "license": "MIT" + }, + { + "name": "defer-to-connect", + "version": "2.0.0", + "author": "Szymon Marczak", + "license": "MIT" + }, + { + "name": "define-properties", + "version": "1.1.2", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "delayed-stream", + "version": "1.0.0", + "author": "Felix Geisendörfer", + "license": "MIT" + }, + { + "name": "detect-libc", + "version": "2.0.3", + "author": "Lovell Fuller", + "license": "Apache-2.0" + }, + { + "name": "detect-node", + "version": "2.0.4", + "author": "Ilya Kantor", + "license": "ISC" + }, + { + "name": "dijkstrajs", + "version": "1.0.1", + "author": "—", + "license": "MIT" + }, + { + "name": "dir-compare", + "version": "4.2.0", + "author": "Liviu Grigorescu", + "license": "MIT" + }, + { + "name": "dmg-builder", + "version": "26.15.3", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "dompurify", + "version": "3.4.12", + "author": "Dr.-Ing. Mario Heiderich, Cure53", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + { + "name": "dotenv", + "version": "16.6.1", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "dotenv-expand", + "version": "11.0.6", + "author": "motdotla", + "license": "BSD-2-Clause" + }, + { + "name": "dunder-proto", + "version": "1.0.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "duplexer2", + "version": "0.1.4", + "author": "Conrad Pankoff", + "license": "BSD-3-Clause" + }, + { + "name": "earcut", + "version": "3.0.0", + "author": "Vladimir Agafonkin", + "license": "ISC" + }, + { + "name": "eastasianwidth", + "version": "0.2.0", + "author": "Masaki Komagata", + "license": "MIT" + }, + { + "name": "editorconfig", + "version": "1.0.3", + "author": "EditorConfig Team", + "license": "MIT" + }, + { + "name": "ejs", + "version": "3.1.10", + "author": "Matthew Eernisse", + "license": "Apache-2.0" + }, + { + "name": "electron", + "version": "42.4.0", + "author": "Electron Community", + "license": "MIT" + }, + { + "name": "electron-builder", + "version": "26.15.3", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "electron-builder-squirrel-windows", + "version": "26.15.3", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "electron-prompt", + "version": "1.7.0", + "author": "p-sam", + "license": "MIT" + }, + { + "name": "electron-publish", + "version": "26.15.3", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "electron-winstaller", + "version": "5.4.0", + "author": "—", + "license": "MIT" + }, + { + "name": "emoji-picker-element", + "version": "1.29.1", + "author": "Nolan Lawson", + "license": "Apache-2.0" + }, + { + "name": "emoji-picker-element-data", + "version": "1.8.0", + "author": "Nolan Lawson", + "license": "Apache-2.0" + }, + { + "name": "emoji-regex", + "version": "8.0.0", + "author": "Mathias Bynens", + "license": "MIT" + }, + { + "name": "end-of-stream", + "version": "1.1.0", + "author": "Mathias Buus", + "license": "MIT" + }, + { + "name": "enhanced-resolve", + "version": "5.24.1", + "author": "Tobias Koppers @sokra", + "license": "MIT" + }, + { + "name": "entities", + "version": "7.0.1", + "author": "Felix Boehm", + "license": "BSD-2-Clause" + }, + { + "name": "env-paths", + "version": "2.2.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "err-code", + "version": "2.0.2", + "author": "IndigoUnited", + "license": "MIT" + }, + { + "name": "es-abstract", + "version": "1.5.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "es-define-property", + "version": "1.0.1", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "es-errors", + "version": "1.3.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "es-module-lexer", + "version": "2.0.0", + "author": "Guy Bedford", + "license": "MIT" + }, + { + "name": "es-object-atoms", + "version": "1.0.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "es-set-tostringtag", + "version": "2.1.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "es-to-primitive", + "version": "1.1.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "es6-error", + "version": "4.1.1", + "author": "Ben Youngblood", + "license": "MIT" + }, + { + "name": "escalade", + "version": "3.1.1", + "author": "Luke Edwards", + "license": "MIT" + }, + { + "name": "escape-string-regexp", + "version": "4.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "eslint", + "version": "9.39.5", + "author": "Nicholas C. Zakas", + "license": "MIT" + }, + { + "name": "eslint-config-prettier", + "version": "10.1.8", + "author": "Simon Lydell", + "license": "MIT" + }, + { + "name": "eslint-plugin-prettier", + "version": "5.5.6", + "author": "Teddy Katz", + "license": "MIT" + }, + { + "name": "eslint-plugin-security", + "version": "3.0.1", + "author": "Node Security Project", + "license": "Apache-2.0" + }, + { + "name": "eslint-plugin-vue", + "version": "10.10.0", + "author": "Toru Nagashima", + "license": "MIT" + }, + { + "name": "eslint-scope", + "version": "8.2.0", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "eslint-visitor-keys", + "version": "3.4.3", + "author": "Toru Nagashima", + "license": "Apache-2.0" + }, + { + "name": "esmangle-evaluator", + "version": "1.0.0", + "author": "Andres Suarez", + "license": "Unknown" + }, + { + "name": "espree", + "version": "10.3.0", + "author": "Nicholas C. Zakas", + "license": "BSD-2-Clause" + }, + { + "name": "esprima-fb", + "version": "12001.1.0-dev-harmony-fb", + "author": "Ariya Hidayat", + "license": "BSD" + }, + { + "name": "esquery", + "version": "1.6.0", + "author": "Joel Feenstra", + "license": "BSD-3-Clause" + }, + { + "name": "esrecurse", + "version": "4.3.0", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "estraverse", + "version": "5.1.0", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "estree-walker", + "version": "2.0.2", + "author": "Rich Harris", + "license": "MIT" + }, + { + "name": "esutils", + "version": "2.0.3", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "execa", + "version": "0.10.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "expect-type", + "version": "1.3.0", + "author": "—", + "license": "Apache-2.0" + }, + { + "name": "exponential-backoff", + "version": "3.1.1", + "author": "Sami Sayegh", + "license": "Apache-2.0" + }, + { + "name": "fake-indexeddb", + "version": "6.2.5", + "author": "Jeremy Scheff", + "license": "Apache-2.0" + }, + { + "name": "falafel", + "version": "1.0.1", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "fast-deep-equal", + "version": "3.1.3", + "author": "Evgeny Poberezkin", + "license": "MIT" + }, + { + "name": "fast-diff", + "version": "1.1.2", + "author": "Jason Chen", + "license": "Apache-2.0" + }, + { + "name": "fast-json-stable-stringify", + "version": "2.1.0", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "fast-levenshtein", + "version": "2.0.6", + "author": "Ramesh Nair", + "license": "MIT" + }, + { + "name": "fast-uri", + "version": "4.1.1", + "author": "Vincent Le Goff", + "license": "BSD-3-Clause" + }, + { + "name": "fd-package-json", + "version": "2.0.0", + "author": "James Garbutt", + "license": "MIT" + }, + { + "name": "fdir", + "version": "6.4.3", + "author": "thecodrr", + "license": "MIT" + }, + { + "name": "fflate", + "version": "0.8.0", + "author": "Arjun Barrett", + "license": "MIT" + }, + { + "name": "file-entry-cache", + "version": "8.0.0", + "author": "Jared Wray", + "license": "MIT" + }, + { + "name": "filelist", + "version": "1.0.1", + "author": "Matthew Eernisse", + "license": "Apache-2.0" + }, + { + "name": "find-up", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "flat-cache", + "version": "4.0.1", + "author": "Jared Wray", + "license": "MIT" + }, + { + "name": "flatted", + "version": "3.4.2", + "author": "Andrea Giammarchi", + "license": "ISC" + }, + { + "name": "for-each", + "version": "0.3.3", + "author": "Raynos", + "license": "MIT" + }, + { + "name": "foreach", + "version": "2.0.6", + "author": "Manuel Stofer", + "license": "MIT" + }, + { + "name": "foreground-child", + "version": "3.1.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "form-data", + "version": "4.0.6", + "author": "Felix Geisendörfer", + "license": "MIT" + }, + { + "name": "formatly", + "version": "0.3.0", + "author": "Josh Goldberg ✨", + "license": "MIT" + }, + { + "name": "fs-extra", + "version": "7.0.1", + "author": "JP Richardson", + "license": "MIT" + }, + { + "name": "fs-minipass", + "version": "3.0.3", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "fs.realpath", + "version": "1.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "function-bind", + "version": "1.0.2", + "author": "Raynos", + "license": "MIT" + }, + { + "name": "geotiff", + "version": "3.0.5", + "author": "Fabian Schindler", + "license": "MIT" + }, + { + "name": "get-caller-file", + "version": "1.0.1", + "author": "Stefan Penner", + "license": "ISC" + }, + { + "name": "get-intrinsic", + "version": "1.2.6", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "get-stream", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "get-tsconfig", + "version": "4.14.0", + "author": "Hiroki Osame", + "license": "MIT" + }, + { + "name": "glob", + "version": "7.2.3", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "glob-parent", + "version": "6.0.2", + "author": "Gulp Team", + "license": "ISC" + }, + { + "name": "global-agent", + "version": "3.0.0", + "author": "Gajus Kuizinas", + "license": "BSD-3-Clause" + }, + { + "name": "globals", + "version": "14.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "globalthis", + "version": "1.0.1", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "gopd", + "version": "1.2.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "got", + "version": "11.8.6", + "author": "—", + "license": "MIT" + }, + { + "name": "graceful-fs", + "version": "4.1.2", + "author": "—", + "license": "ISC" + }, + { + "name": "has-flag", + "version": "4.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "has-symbols", + "version": "1.0.3", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "has-tostringtag", + "version": "1.0.2", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "hasown", + "version": "2.0.4", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "hosted-git-info", + "version": "2.8.9", + "author": "Rebecca Turner", + "license": "ISC" + }, + { + "name": "html-encoding-sniffer", + "version": "6.0.0", + "author": "Domenic Denicola", + "license": "MIT" + }, + { + "name": "html-escaper", + "version": "2.0.0", + "author": "Andrea Giammarchi", + "license": "MIT" + }, + { + "name": "http-cache-semantics", + "version": "4.1.1", + "author": "Kornel Lesiński", + "license": "BSD-2-Clause" + }, + { + "name": "http-proxy-agent", + "version": "7.0.0", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "http2-wrapper", + "version": "1.0.0-beta.5.2", + "author": "Szymon Marczak", + "license": "MIT" + }, + { + "name": "https-proxy-agent", + "version": "7.0.0", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "iconv-lite", + "version": "0.7.2", + "author": "Alexander Shtuchkin", + "license": "MIT" + }, + { + "name": "ignore", + "version": "5.3.2", + "author": "kael", + "license": "MIT" + }, + { + "name": "immediate", + "version": "3.0.5", + "author": "—", + "license": "MIT" + }, + { + "name": "import-fresh", + "version": "3.3.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "imurmurhash", + "version": "0.1.4", + "author": "Jens Taylor", + "license": "MIT" + }, + { + "name": "inflight", + "version": "1.0.4", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "inherits", + "version": "2.0.1", + "author": "—", + "license": "ISC" + }, + { + "name": "inherits", + "version": "2.0.0", + "author": "Isaac Z. Schlueter", + "license": "WTFPL2" + }, + { + "name": "ini", + "version": "1.3.6", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "inline-process-browser", + "version": "1.0.0", + "author": "Calvin W. Metcalf", + "license": "MIT" + }, + { + "name": "invert-kv", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "ip-address", + "version": "9.0.5", + "author": "Beau Gunderson", + "license": "MIT" + }, + { + "name": "is-blob", + "version": "2.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "is-callable", + "version": "1.1.1", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "is-date-object", + "version": "1.0.1", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "is-extglob", + "version": "2.1.1", + "author": "Jon Schlinkert", + "license": "MIT" + }, + { + "name": "is-fullwidth-code-point", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "is-glob", + "version": "4.0.3", + "author": "Jon Schlinkert", + "license": "MIT" + }, + { + "name": "is-potential-custom-element-name", + "version": "1.0.1", + "author": "Mathias Bynens", + "license": "MIT" + }, + { + "name": "is-regex", + "version": "1.0.3", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "is-stream", + "version": "1.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "is-symbol", + "version": "1.0.1", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "isarray", + "version": "0.0.1", + "author": "Julian Gruber", + "license": "MIT" + }, + { + "name": "isbinaryfile", + "version": "4.0.8", + "author": "—", + "license": "MIT" + }, + { + "name": "isexe", + "version": "2.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "isexe", + "version": "3.1.5", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "istanbul-lib-coverage", + "version": "3.2.2", + "author": "Krishnan Anantheswaran", + "license": "BSD-3-Clause" + }, + { + "name": "istanbul-lib-report", + "version": "3.0.1", + "author": "Krishnan Anantheswaran", + "license": "BSD-3-Clause" + }, + { + "name": "istanbul-reports", + "version": "3.2.0", + "author": "Krishnan Anantheswaran", + "license": "BSD-3-Clause" + }, + { + "name": "jackspeak", + "version": "3.1.2", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "jake", + "version": "10.8.5", + "author": "Matthew Eernisse", + "license": "Apache-2.0" + }, + { + "name": "jiti", + "version": "2.4.2", + "author": "—", + "license": "MIT" + }, + { + "name": "js-beautify", + "version": "1.14.9", + "author": "Einar Lielmanis", + "license": "MIT" + }, + { + "name": "js-tokens", + "version": "10.0.0", + "author": "Simon Lydell", + "license": "MIT" + }, + { + "name": "js-yaml", + "version": "4.2.0", + "author": "Vladimir Zapparov", + "license": "MIT" + }, + { + "name": "jsbn", + "version": "1.1.0", + "author": "Tom Wu", + "license": "MIT" + }, + { + "name": "jsdom", + "version": "29.1.1", + "author": "—", + "license": "MIT" + }, + { + "name": "json-buffer", + "version": "3.0.1", + "author": "Dominic Tarr", + "license": "MIT" + }, + { + "name": "json-schema-traverse", + "version": "0.4.1", + "author": "Evgeny Poberezkin", + "license": "MIT" + }, + { + "name": "json-stable-stringify-without-jsonify", + "version": "1.0.1", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "json-stringify-pretty-compact", + "version": "4.0.0", + "author": "Simon Lydell", + "license": "MIT" + }, + { + "name": "json-stringify-safe", + "version": "5.0.1", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "json5", + "version": "2.2.3", + "author": "Aseem Kishore", + "license": "MIT" + }, + { + "name": "jsonfile", + "version": "4.0.0", + "author": "JP Richardson", + "license": "MIT" + }, + { + "name": "jsqr", + "version": "1.4.0", + "author": "—", + "license": "Apache-2.0" + }, + { + "name": "jszip", + "version": "3.10.1", + "author": "Stuart Knightley", + "license": "(MIT OR GPL-3.0-or-later)" + }, + { + "name": "keycharm", + "version": "0.4.0", + "author": "Alex de Mulder", + "license": "(Apache-2.0 OR MIT)" + }, + { + "name": "keyv", + "version": "4.0.0", + "author": "Jared Wray", + "license": "MIT" + }, + { + "name": "knip", + "version": "6.29.0", + "author": "Lars Kappert", + "license": "ISC" + }, + { + "name": "lazy-val", + "version": "1.0.5", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "lcid", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "lerc", + "version": "3.0.0", + "author": "Esri", + "license": "Apache-2.0" + }, + { + "name": "levn", + "version": "0.4.1", + "author": "George Zahariev", + "license": "MIT" + }, + { + "name": "lie", + "version": "3.3.0", + "author": "—", + "license": "MIT" + }, + { + "name": "lightningcss", + "version": "1.32.0", + "author": "—", + "license": "MPL-2.0" + }, + { + "name": "lightningcss-linux-x64-gnu", + "version": "1.32.0", + "author": "—", + "license": "MPL-2.0" + }, + { + "name": "locate-path", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "lodash", + "version": "4.18.0", + "author": "John-David Dalton", + "license": "MIT" + }, + { + "name": "lodash.merge", + "version": "4.6.2", + "author": "John-David Dalton", + "license": "MIT" + }, + { + "name": "lowercase-keys", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "lru-cache", + "version": "6.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "lru-cache", + "version": "11.3.5", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "magic-string", + "version": "0.30.21", + "author": "Rich Harris", + "license": "MIT" + }, + { + "name": "magicast", + "version": "0.5.2", + "author": "—", + "license": "MIT" + }, + { + "name": "make-dir", + "version": "4.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "make-fetch-happen", + "version": "15.0.6", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "mapbox-to-css-font", + "version": "3.2.0", + "author": "Andreas Hocevar", + "license": "BSD-2-Clause" + }, + { + "name": "marked", + "version": "18.0.7", + "author": "Christopher Jeffrey", + "license": "MIT" + }, + { + "name": "matcher", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "math-intrinsics", + "version": "1.0.0", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "mdn-data", + "version": "2.27.1", + "author": "Mozilla Developer Network", + "license": "CC0-1.0" + }, + { + "name": "mem", + "version": "3.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "micron-parser", + "version": "0.0.0", + "author": "—", + "license": "Unknown" + }, + { + "name": "mime", + "version": "2.5.2", + "author": "Robert Kieffer", + "license": "MIT" + }, + { + "name": "mime-db", + "version": "1.52.0", + "author": "—", + "license": "MIT" + }, + { + "name": "mime-types", + "version": "2.1.35", + "author": "—", + "license": "MIT" + }, + { + "name": "mimic-fn", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "mimic-response", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "mini-svg-data-uri", + "version": "1.2.3", + "author": "Taylor “Tigt” Hunt", + "license": "MIT" + }, + { + "name": "minimatch", + "version": "3.1.4", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "minimatch", + "version": "10.2.3", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "minimist", + "version": "1.2.8", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "minipass", + "version": "3.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "minipass-collect", + "version": "2.0.1", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "minipass-fetch", + "version": "5.0.2", + "author": "GitHub Inc.", + "license": "MIT" + }, + { + "name": "minipass-flush", + "version": "1.0.7", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "minipass-pipeline", + "version": "1.2.4", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "minipass-sized", + "version": "2.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "minizlib", + "version": "3.0.1", + "author": "Isaac Z. Schlueter", + "license": "MIT" + }, + { + "name": "mrmime", + "version": "2.0.0", + "author": "Luke Edwards", + "license": "MIT" + }, + { + "name": "ms", + "version": "2.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "muggle-string", + "version": "0.4.1", + "author": "—", + "license": "MIT" + }, + { + "name": "nanoid", + "version": "3.3.12", + "author": "Andrey Sitnik", + "license": "MIT" + }, + { + "name": "natural-compare", + "version": "1.4.0", + "author": "Lauri Rooden", + "license": "MIT" + }, + { + "name": "negotiator", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "node-abi", + "version": "4.2.0", + "author": "Lukas Geiger", + "license": "MIT" + }, + { + "name": "node-api-version", + "version": "0.2.1", + "author": "Tim Fish", + "license": "MIT" + }, + { + "name": "node-gyp", + "version": "12.2.0", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "node-int64", + "version": "0.4.0", + "author": "Robert Kieffer", + "license": "MIT" + }, + { + "name": "nopt", + "version": "6.0.0", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "normalize-url", + "version": "6.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "npm-run-path", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "nth-check", + "version": "2.1.1", + "author": "Felix Boehm", + "license": "BSD-2-Clause" + }, + { + "name": "number-is-nan", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "numcodecs", + "version": "0.3.2", + "author": "Trevor Manz", + "license": "MIT" + }, + { + "name": "object-assign", + "version": "4.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "object-keys", + "version": "1.0.8", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "obug", + "version": "2.1.1", + "author": "Kevin Deng", + "license": "MIT" + }, + { + "name": "ol", + "version": "10.9.0", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "ol-mapbox-style", + "version": "13.4.1", + "author": "—", + "license": "BSD-2-Clause" + }, + { + "name": "once", + "version": "1.3.0", + "author": "Isaac Z. Schlueter", + "license": "BSD" + }, + { + "name": "optionator", + "version": "0.9.4", + "author": "George Zahariev", + "license": "MIT" + }, + { + "name": "os-locale", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "oxc-parser", + "version": "0.140.0", + "author": "Boshen and oxc contributors", + "license": "MIT" + }, + { + "name": "oxc-resolver", + "version": "11.24.2", + "author": "—", + "license": "MIT" + }, + { + "name": "p-cancelable", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "p-finally", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "p-is-promise", + "version": "1.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "p-limit", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "p-locate", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "p-map", + "version": "7.0.6", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "p-try", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "package-json-from-dist", + "version": "1.0.0", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "pako", + "version": "1.0.2", + "author": "—", + "license": "MIT" + }, + { + "name": "pako", + "version": "2.0.4", + "author": "—", + "license": "(MIT AND Zlib)" + }, + { + "name": "parent-module", + "version": "1.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "parse-headers", + "version": "2.0.2", + "author": "David Björklund", + "license": "MIT" + }, + { + "name": "parse5", + "version": "8.0.1", + "author": "Ivan Nikulin", + "license": "MIT" + }, + { + "name": "path-browserify", + "version": "1.0.1", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "path-exists", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "path-is-absolute", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "path-key", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "path-scurry", + "version": "1.11.1", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "pathe", + "version": "2.0.3", + "author": "—", + "license": "MIT" + }, + { + "name": "pbf", + "version": "4.0.1", + "author": "Konstantin Kaefer", + "license": "BSD-3-Clause" + }, + { + "name": "pe-library", + "version": "0.4.0", + "author": "jet", + "license": "MIT" + }, + { + "name": "picocolors", + "version": "1.1.1", + "author": "Alexey Raspopov", + "license": "ISC" + }, + { + "name": "picomatch", + "version": "4.0.4", + "author": "Jon Schlinkert", + "license": "MIT" + }, + { + "name": "pkijs", + "version": "3.4.0", + "author": "Yury Strozhevsky", + "license": "BSD-3-Clause" + }, + { + "name": "playwright", + "version": "1.61.1", + "author": "Microsoft Corporation", + "license": "Apache-2.0" + }, + { + "name": "playwright-core", + "version": "1.61.1", + "author": "Microsoft Corporation", + "license": "Apache-2.0" + }, + { + "name": "plist", + "version": "3.0.5", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "pngjs", + "version": "5.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "postcss", + "version": "8.5.19", + "author": "Andrey Sitnik", + "license": "MIT" + }, + { + "name": "postcss-selector-parser", + "version": "7.1.4", + "author": "—", + "license": "MIT" + }, + { + "name": "postject", + "version": "1.0.0-alpha.6", + "author": "—", + "license": "MIT" + }, + { + "name": "prelude-ls", + "version": "1.2.1", + "author": "George Zahariev", + "license": "MIT" + }, + { + "name": "prettier", + "version": "3.9.6", + "author": "James Long", + "license": "MIT" + }, + { + "name": "prettier-linter-helpers", + "version": "1.0.1", + "author": "—", + "license": "MIT" + }, + { + "name": "private", + "version": "0.1.5", + "author": "Ben Newman", + "license": "MIT" + }, + { + "name": "proc-log", + "version": "6.0.0", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "process-nextick-args", + "version": "1.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "progress", + "version": "2.0.3", + "author": "TJ Holowaychuk", + "license": "MIT" + }, + { + "name": "promise-retry", + "version": "2.0.1", + "author": "IndigoUnited", + "license": "MIT" + }, + { + "name": "proper-lockfile", + "version": "4.1.2", + "author": "André Cruz", + "license": "MIT" + }, + { + "name": "proto-list", + "version": "1.2.1", + "author": "Isaac Z. Schlueter", + "license": "MIT" + }, + { + "name": "protocol-buffers-schema", + "version": "3.6.1", + "author": "Mathias Buus", + "license": "MIT" + }, + { + "name": "pump", + "version": "3.0.0", + "author": "Mathias Buus Madsen", + "license": "MIT" + }, + { + "name": "punycode", + "version": "2.3.1", + "author": "Mathias Bynens", + "license": "MIT" + }, + { + "name": "pvtsutils", + "version": "1.3.6", + "author": "PeculiarVentures", + "license": "MIT" + }, + { + "name": "pvutils", + "version": "1.1.3", + "author": "Yury Strozhevsky", + "license": "MIT" + }, + { + "name": "qrcode", + "version": "1.5.4", + "author": "Ryan Day", + "license": "MIT" + }, + { + "name": "quick-lru", + "version": "5.1.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "quickselect", + "version": "2.0.0", + "author": "Vladimir Agafonkin", + "license": "ISC" + }, + { + "name": "rbush", + "version": "4.0.0", + "author": "Volodymyr Agafonkin", + "license": "MIT" + }, + { + "name": "read-binary-file-arch", + "version": "1.0.6", + "author": "Samuel Maddock", + "license": "MIT" + }, + { + "name": "readable-stream", + "version": "1.0.31", + "author": "—", + "license": "MIT" + }, + { + "name": "recast", + "version": "0.10.1", + "author": "Ben Newman", + "license": "MIT" + }, + { + "name": "reference-spec-reader", + "version": "0.2.0", + "author": "manzt", + "license": "MIT" + }, + { + "name": "regexp-tree", + "version": "0.1.1", + "author": "Dmitry Soshnikov", + "license": "MIT" + }, + { + "name": "require-directory", + "version": "2.1.1", + "author": "Troy Goode", + "license": "MIT" + }, + { + "name": "require-from-string", + "version": "2.0.2", + "author": "Vsevolod Strukchinsky", + "license": "MIT" + }, + { + "name": "require-main-filename", + "version": "1.0.1", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "resedit", + "version": "1.7.0", + "author": "jet", + "license": "MIT" + }, + { + "name": "resolve-alpn", + "version": "1.0.0", + "author": "Szymon Marczak", + "license": "MIT" + }, + { + "name": "resolve-from", + "version": "4.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "resolve-pkg-maps", + "version": "1.0.0", + "author": "Hiroki Osame", + "license": "MIT" + }, + { + "name": "resolve-protobuf-schema", + "version": "2.1.0", + "author": "Mathias Buus", + "license": "MIT" + }, + { + "name": "responselike", + "version": "2.0.0", + "author": "lukechilds", + "license": "MIT" + }, + { + "name": "retry", + "version": "0.12.0", + "author": "Tim Koschützki", + "license": "MIT" + }, + { + "name": "rimraf", + "version": "2.6.2", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "roarr", + "version": "2.15.3", + "author": "Gajus Kuizinas", + "license": "BSD-3-Clause" + }, + { + "name": "rolldown", + "version": "1.1.5", + "author": "—", + "license": "MIT" + }, + { + "name": "rw", + "version": "1.3.3", + "author": "Mike Bostock", + "license": "BSD-3-Clause" + }, + { + "name": "safe-buffer", + "version": "5.1.1", + "author": "Feross Aboukhadijeh", + "license": "MIT" + }, + { + "name": "safe-regex", + "version": "2.1.1", + "author": "James C.", + "license": "MIT" + }, + { + "name": "safer-buffer", + "version": "2.1.2", + "author": "Nikita Skovoroda", + "license": "MIT" + }, + { + "name": "sanitize-filename", + "version": "1.6.3", + "author": "Parsha Pourkhomami", + "license": "WTFPL OR ISC" + }, + { + "name": "sax", + "version": "1.2.4", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "saxes", + "version": "6.0.0", + "author": "Louis-Dominique Dubeau", + "license": "ISC" + }, + { + "name": "semver", + "version": "7.5.2", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "semver-compare", + "version": "1.0.0", + "author": "James Halliday", + "license": "MIT" + }, + { + "name": "serialize-error", + "version": "7.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "set-blocking", + "version": "2.0.0", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "setimmediate", + "version": "1.0.5", + "author": "YuzuJS", + "license": "MIT" + }, + { + "name": "shebang-command", + "version": "2.0.0", + "author": "Kevin Mårtensson", + "license": "MIT" + }, + { + "name": "shebang-regex", + "version": "3.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "siginfo", + "version": "2.0.0", + "author": "Emil Bay", + "license": "ISC" + }, + { + "name": "signal-exit", + "version": "3.0.0", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "simple-update-notifier", + "version": "2.0.0", + "author": "alexbrazier", + "license": "MIT" + }, + { + "name": "sirv", + "version": "3.0.2", + "author": "Luke Edwards", + "license": "MIT" + }, + { + "name": "smart-buffer", + "version": "4.2.0", + "author": "Josh Glazebrook", + "license": "MIT" + }, + { + "name": "smol-toml", + "version": "1.7.0", + "author": "Cynthia Rey", + "license": "BSD-3-Clause" + }, + { + "name": "socks", + "version": "2.8.0", + "author": "Josh Glazebrook", + "license": "MIT" + }, + { + "name": "socks-proxy-agent", + "version": "8.0.3", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "source-map", + "version": "0.6.0", + "author": "Nick Fitzgerald", + "license": "BSD-3-Clause" + }, + { + "name": "source-map", + "version": "0.3.0", + "author": "Nick Fitzgerald", + "license": "BSD" + }, + { + "name": "source-map-js", + "version": "1.0.2", + "author": "Valentin 7rulnik Semirulnik", + "license": "BSD-3-Clause" + }, + { + "name": "source-map-support", + "version": "0.5.19", + "author": "—", + "license": "MIT" + }, + { + "name": "sprintf-js", + "version": "1.1.2", + "author": "Alexandru Mărășteanu", + "license": "BSD-3-Clause" + }, + { + "name": "ssri", + "version": "13.0.1", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "stackback", + "version": "0.0.2", + "author": "Roman Shtylman", + "license": "MIT" + }, + { + "name": "stat-mode", + "version": "1.0.0", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "std-env", + "version": "4.0.0-rc.1", + "author": "—", + "license": "MIT" + }, + { + "name": "string-width", + "version": "1.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "string.prototype.trim", + "version": "1.1.2", + "author": "Jordan Harband", + "license": "MIT" + }, + { + "name": "string_decoder", + "version": "0.10.24", + "author": "—", + "license": "MIT" + }, + { + "name": "strip-ansi", + "version": "6.0.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "strip-eof", + "version": "1.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "strip-json-comments", + "version": "3.1.1", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "sumchecker", + "version": "3.0.1", + "author": "Mark Lee", + "license": "Apache-2.0" + }, + { + "name": "supports-color", + "version": "7.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "symbol-tree", + "version": "3.2.4", + "author": "Joris van der Wel", + "license": "MIT" + }, + { + "name": "synckit", + "version": "0.11.13", + "author": "JounQin", + "license": "MIT" + }, + { + "name": "tailwindcss", + "version": "4.3.3", + "author": "—", + "license": "MIT" + }, + { + "name": "tapable", + "version": "2.3.3", + "author": "Tobias Koppers @sokra", + "license": "MIT" + }, + { + "name": "tar", + "version": "7.5.21", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "temp", + "version": "0.9.0", + "author": "Bruce Williams", + "license": "MIT" + }, + { + "name": "temp-file", + "version": "3.4.0", + "author": "Vladimir Krivosheev", + "license": "MIT" + }, + { + "name": "terser", + "version": "5.49.0", + "author": "Mihai Bazon", + "license": "BSD-2-Clause" + }, + { + "name": "through2", + "version": "0.6.2", + "author": "Rod Vagg", + "license": "MIT" + }, + { + "name": "tiny-async-pool", + "version": "1.3.0", + "author": "Rafael Xavier de Souza", + "license": "MIT" + }, + { + "name": "tinybench", + "version": "2.9.0", + "author": "—", + "license": "MIT" + }, + { + "name": "tinyexec", + "version": "1.0.2", + "author": "James Garbutt", + "license": "MIT" + }, + { + "name": "tinyglobby", + "version": "0.2.12", + "author": "Superchupu", + "license": "MIT" + }, + { + "name": "tinyqueue", + "version": "3.0.0", + "author": "—", + "license": "ISC" + }, + { + "name": "tinyrainbow", + "version": "3.1.0", + "author": "—", + "license": "MIT" + }, + { + "name": "tldts", + "version": "7.0.5", + "author": "Rémi Berson", + "license": "MIT" + }, + { + "name": "tldts-core", + "version": "7.0.5", + "author": "Rémi Berson", + "license": "MIT" + }, + { + "name": "tmp", + "version": "0.2.7", + "author": "KARASZI István", + "license": "MIT" + }, + { + "name": "tmp-promise", + "version": "3.0.2", + "author": "Benjamin Gruenbaum and Collaborators.", + "license": "MIT" + }, + { + "name": "totalist", + "version": "3.0.0", + "author": "Luke Edwards", + "license": "MIT" + }, + { + "name": "tough-cookie", + "version": "6.0.1", + "author": "Jeremy Stashewsky", + "license": "BSD-3-Clause" + }, + { + "name": "tr46", + "version": "6.0.0", + "author": "Sebastian Mayr", + "license": "MIT" + }, + { + "name": "truncate-utf8-bytes", + "version": "1.0.0", + "author": "Carl Xiong", + "license": "WTFPL" + }, + { + "name": "tslib", + "version": "2.8.1", + "author": "Microsoft Corp.", + "license": "0BSD" + }, + { + "name": "type-check", + "version": "0.4.0", + "author": "George Zahariev", + "license": "MIT" + }, + { + "name": "type-fest", + "version": "0.13.1", + "author": "Sindre Sorhus", + "license": "(MIT OR CC0-1.0)" + }, + { + "name": "typescript", + "version": "6.0.3", + "author": "Microsoft Corp.", + "license": "Apache-2.0" + }, + { + "name": "unbash", + "version": "4.0.3", + "author": "Lars Kappert", + "license": "ISC" + }, + { + "name": "undici", + "version": "7.28.0", + "author": "—", + "license": "MIT" + }, + { + "name": "undici-types", + "version": "7.16.0", + "author": "—", + "license": "MIT" + }, + { + "name": "universalify", + "version": "0.1.0", + "author": "Ryan Zimmerman", + "license": "MIT" + }, + { + "name": "unreachable-branch-transform", + "version": "0.3.0", + "author": "Andres Suarez", + "license": "MIT" + }, + { + "name": "unzipit", + "version": "2.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "unzipper", + "version": "0.12.3", + "author": "Evan Oxfeld", + "license": "MIT" + }, + { + "name": "upath", + "version": "2.0.1", + "author": "Angelos Pikoulas", + "license": "MIT" + }, + { + "name": "uri-js", + "version": "4.4.1", + "author": "Gary Court", + "license": "BSD-2-Clause" + }, + { + "name": "utf8-byte-length", + "version": "1.0.1", + "author": "Carl Xiong", + "license": "WTFPL" + }, + { + "name": "util-deprecate", + "version": "1.0.1", + "author": "Nathan Rajlich", + "license": "MIT" + }, + { + "name": "uuid", + "version": "14.0.1", + "author": "—", + "license": "MIT" + }, + { + "name": "vis-data", + "version": "7.1.10", + "author": "—", + "license": "(Apache-2.0 OR MIT)" + }, + { + "name": "vis-network", + "version": "9.1.13", + "author": "—", + "license": "(Apache-2.0 OR MIT)" + }, + { + "name": "vis-util", + "version": "5.0.7", + "author": "Alex de Mulder", + "license": "(Apache-2.0 OR MIT)" + }, + { + "name": "vite", + "version": "8.1.5", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "vite-plugin-vuetify", + "version": "2.1.3", + "author": "Kael Watts-Deuchar", + "license": "MIT" + }, + { + "name": "vitest", + "version": "4.1.10", + "author": "Anthony Fu", + "license": "MIT" + }, + { + "name": "vscode-uri", + "version": "3.0.8", + "author": "Microsoft", + "license": "MIT" + }, + { + "name": "vue", + "version": "3.5.40", + "author": "Evan You", + "license": "MIT" + }, + { + "name": "vue-component-type-helpers", + "version": "3.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "vue-eslint-parser", + "version": "10.4.1", + "author": "Toru Nagashima", + "license": "MIT" + }, + { + "name": "vue-i18n", + "version": "11.4.7", + "author": "kazuya kawaguchi", + "license": "MIT" + }, + { + "name": "vue-router", + "version": "4.6.4", + "author": "Eduardo San Martin Morote", + "license": "MIT" + }, + { + "name": "vue-tsc", + "version": "3.3.7", + "author": "—", + "license": "MIT" + }, + { + "name": "vuetify", + "version": "3.12.10", + "author": "John Leider", + "license": "MIT" + }, + { + "name": "w3c-xmlserializer", + "version": "5.0.0", + "author": "—", + "license": "MIT" + }, + { + "name": "walk-up-path", + "version": "4.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "web-worker", + "version": "1.5.0", + "author": "—", + "license": "Apache-2.0" + }, + { + "name": "webcrypto-core", + "version": "1.9.2", + "author": "PeculiarVentures", + "license": "MIT" + }, + { + "name": "webidl-conversions", + "version": "8.0.1", + "author": "Domenic Denicola", + "license": "BSD-2-Clause" + }, + { + "name": "whatwg-mimetype", + "version": "5.0.0", + "author": "Domenic Denicola", + "license": "MIT" + }, + { + "name": "whatwg-url", + "version": "16.0.1", + "author": "Sebastian Mayr", + "license": "MIT" + }, + { + "name": "which", + "version": "2.0.1", + "author": "GitHub Inc.", + "license": "ISC" + }, + { + "name": "which-module", + "version": "2.0.0", + "author": "nexdrew", + "license": "ISC" + }, + { + "name": "why-is-node-running", + "version": "2.3.0", + "author": "Mathias Buus", + "license": "MIT" + }, + { + "name": "word-wrap", + "version": "1.2.5", + "author": "Jon Schlinkert", + "license": "MIT" + }, + { + "name": "wrap-ansi", + "version": "2.0.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "wrappy", + "version": "1.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "xml-name-validator", + "version": "5.0.0", + "author": "Domenic Denicola", + "license": "Apache-2.0" + }, + { + "name": "xml-utils", + "version": "1.10.2", + "author": "Daniel J. Dufour", + "license": "CC0-1.0" + }, + { + "name": "xmlbuilder", + "version": "9.0.7", + "author": "Ozgur Ozcitak", + "license": "MIT" + }, + { + "name": "xmlchars", + "version": "2.2.0", + "author": "Louis-Dominique Dubeau", + "license": "MIT" + }, + { + "name": "xtend", + "version": "4.0.0", + "author": "Raynos", + "license": "MIT" + }, + { + "name": "y18n", + "version": "5.0.5", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "yallist", + "version": "4.0.0", + "author": "Isaac Z. Schlueter", + "license": "ISC" + }, + { + "name": "yallist", + "version": "5.0.0", + "author": "Isaac Z. Schlueter", + "license": "BlueOak-1.0.0" + }, + { + "name": "yaml", + "version": "2.9.0", + "author": "Eemeli Aro", + "license": "ISC" + }, + { + "name": "yargs", + "version": "12.0.5", + "author": "—", + "license": "MIT" + }, + { + "name": "yargs-parser", + "version": "21.1.1", + "author": "Ben Coe", + "license": "ISC" + }, + { + "name": "yocto-queue", + "version": "0.1.0", + "author": "Sindre Sorhus", + "license": "MIT" + }, + { + "name": "zarrita", + "version": "0.7.1", + "author": "—", + "license": "MIT" + }, + { + "name": "zod", + "version": "4.4.3", + "author": "Colin McDonnell", + "license": "MIT" + }, + { + "name": "zstddec", + "version": "0.2.0", + "author": "Don McCurdy", + "license": "MIT AND BSD-3-Clause" + } ] diff --git a/meshchatx/src/backend/telephone_manager.py b/meshchatx/src/backend/telephone_manager.py index d028a14e..d7365724 100644 --- a/meshchatx/src/backend/telephone_manager.py +++ b/meshchatx/src/backend/telephone_manager.py @@ -81,6 +81,9 @@ class TelephoneManager: # Manual mute overrides in case LXST internal muting is buggy self.transmit_muted = False self.receive_muted = False + # Half-duplex PTT state. LXST squelches the packetizer when TX is idle. + self.ptt_active = False + self.call_stats = {} self.initiation_status = None self.initiation_target_hash = None @@ -90,6 +93,7 @@ class TelephoneManager: self._status_poll_interval_s = 0.1 self.is_voicemail_session_active = False self.preferred_profile_id = None + self.preferred_mode_id = None self._caller_allowed = None self._blocked_identity_hashes = None # When True, LXST must not open PulseAudio LineSource/LineSink (Docker / @@ -165,6 +169,120 @@ class TelephoneManager: self.telephone.switch_profile(self.preferred_profile_id) return self.preferred_profile_id + def resolve_call_mode_id(self, mode_id=None): + """Return a valid LXST call mode id (full or half duplex).""" + from LXST.Primitives.Telephony import Profiles + + available = set(Profiles.available_modes()) + mid = mode_id + if mid is None and self.config_manager: + with contextlib.suppress(Exception): + mid = self.config_manager.telephone_call_mode_id.get() + try: + mid = int(mid) if mid is not None else None + except (TypeError, ValueError): + mid = None + if mid not in available: + mid = Profiles.DEFAULT_MODE + return mid + + def apply_preferred_mode(self, mode_id=None): + """Store preferred duplex mode and apply it on an established call.""" + self.preferred_mode_id = self.resolve_call_mode_id(mode_id) + if ( + self.telephone + and self.telephone.active_call + and self.telephone.call_status == 6 + ): + self.switch_mode(self.preferred_mode_id) + return self.preferred_mode_id + + def switch_mode(self, mode_id): + """Switch live call duplex mode via LXST signalling and local squelch.""" + from LXST.Primitives.Telephony import Profiles + + resolved = self.resolve_call_mode_id(mode_id) + self.preferred_mode_id = resolved + if not ( + self.telephone + and self.telephone.active_call + and self.telephone.call_status == 6 + ): + return resolved + with contextlib.suppress(Exception): + self.telephone.switch_mode(resolved) + # Keep local view aligned even when LXST is mocked in tests. + with contextlib.suppress(Exception): + self.telephone.active_call.call_mode = resolved + # Half duplex starts listen-only. Full duplex keeps continuous TX open. + self.ptt_active = False + if resolved == Profiles.MODE_HALF_DUPLEX: + with contextlib.suppress(Exception): + self.telephone.squelch_transmit(True) + else: + with contextlib.suppress(Exception): + self.telephone.unsquelch_transmit(True) + return resolved + + def get_active_mode_id(self): + """Return the active call mode, preferred mode, or LXST default.""" + from LXST.Primitives.Telephony import Profiles + + if self.telephone and self.telephone.active_call: + link_mode = getattr(self.telephone.active_call, "call_mode", None) + if link_mode in Profiles.available_modes(): + return link_mode + mode = getattr(self.telephone, "active_mode", None) + if mode in Profiles.available_modes(): + return mode + if self.preferred_mode_id in Profiles.available_modes(): + return self.preferred_mode_id + return self.resolve_call_mode_id() + + def is_half_duplex(self): + from LXST.Primitives.Telephony import Profiles + + return self.get_active_mode_id() == Profiles.MODE_HALF_DUPLEX + + def is_transmit_squelched(self): + """True when LXST packetizer is squelched (half-duplex idle / PTT up).""" + if not self.telephone or not self.telephone.active_call: + return False + packetizer = getattr(self.telephone.active_call, "packetizer", None) + if packetizer is not None: + return bool(getattr(packetizer, "squelched", False)) + return self.is_half_duplex() and not self.ptt_active + + def set_ptt_active(self, active: bool): + """Push-to-talk gate for half-duplex calls (unsquelch while held).""" + if not ( + self.telephone + and self.telephone.active_call + and self.telephone.call_status == 6 + ): + self.ptt_active = False + return False + if not self.is_half_duplex(): + self.ptt_active = False + return False + want_active = bool(active) + try: + if want_active: + self.telephone.unsquelch_transmit(True) + else: + self.telephone.squelch_transmit(True) + self.ptt_active = want_active + return True + except Exception as e: + RNS.log(f"TelephoneManager: PTT squelch failed: {e}", RNS.LOG_ERROR) + return False + + def _reset_call_audio_controls(self): + self.transmit_muted = False + self.receive_muted = False + self.ptt_active = False + self.call_stats = {} + def init_telephone(self): if self.telephone is not None: return @@ -187,9 +305,10 @@ class TelephoneManager: # Increase connection timeout for slower networks self.telephone.set_connect_timeout(30) - # LXST switch_profile is a no-op without an established call. Remember the - # preferred profile and pass it into telephone.call() on outbound dial. + # LXST switch_profile / switch_mode are no-ops without an established call. + # Remember preferred values and pass them into telephone.call() on dial. self.preferred_profile_id = self.resolve_audio_profile_id() + self.preferred_mode_id = self.resolve_call_mode_id() self._install_link_table_cleanup() self.refresh_call_policy() @@ -311,11 +430,13 @@ class TelephoneManager: # Update start time to when it was actually established for duration calculation self.call_start_time = time.time() self.call_was_established = True + self.ptt_active = False # Track per-call stats from the active link (uses RNS Link counters) link = getattr(self.telephone, "active_call", None) self.call_stats = { "link": link, + "started_at": self.call_start_time, } if self.on_established_callback: @@ -328,6 +449,7 @@ class TelephoneManager: # Ensure initiation status is cleared when call ends self._update_initiation_status(None, None) + self._reset_call_audio_controls() if self.on_ended_callback: self.on_ended_callback(caller_identity) @@ -532,15 +654,18 @@ class TelephoneManager: profile_id = self.resolve_audio_profile_id(self.preferred_profile_id) self.preferred_profile_id = profile_id + mode_id = self.resolve_call_mode_id(self.preferred_mode_id) + self.preferred_mode_id = mode_id # Use a thread for the blocking LXST call, but monitor status for early exit - # if established elsewhere or timed out/hung up. Pass preferred profile so - # Codec2/Opus selection actually applies (switch_profile alone is a no-op idle). + # if established elsewhere or timed out/hung up. Pass preferred profile and + # duplex mode so Codec2/Opus and half-duplex actually apply on dial. call_task = asyncio.create_task( asyncio.to_thread( self.telephone.call, destination_identity, profile_id, + mode_id, ), ) diff --git a/meshchatx/src/backend/web_audio_bridge.py b/meshchatx/src/backend/web_audio_bridge.py index 914c215e..5a8898f8 100644 --- a/meshchatx/src/backend/web_audio_bridge.py +++ b/meshchatx/src/backend/web_audio_bridge.py @@ -345,6 +345,20 @@ class WebAudioBridge: return if getattr(self.telephone_manager, "is_voicemail_session_active", False): return + # Do not feed PCM while mic is muted or half-duplex PTT is released. + if getattr(self.telephone_manager, "transmit_muted", False) is True: + return + is_squelched = getattr( + self.telephone_manager, + "is_transmit_squelched", + None, + ) + if callable(is_squelched): + try: + if is_squelched() is True: + return + except Exception: + pass if not self.tx_source: # Hostless LineSource stand-in still accepts PCM until swap. audio_in = getattr(tele, "audio_input", None) diff --git a/meshchatx/src/frontend/components/call/CallOverlay.vue b/meshchatx/src/frontend/components/call/CallOverlay.vue index 44653fa2..6b791ccf 100644 --- a/meshchatx/src/frontend/components/call/CallOverlay.vue +++ b/meshchatx/src/frontend/components/call/CallOverlay.vue @@ -176,10 +176,30 @@ {{ formatBytes(activeCall.rx_bytes || 0) }} +
+ {{ localHalfDuplex ? $t("call.half_duplex") : $t("call.full_duplex") }} + + · {{ localPttActive ? $t("call.ptt_transmitting") : $t("call.ptt_listening") }} + +
+ + +
+ + @@ -362,6 +396,8 @@ export default { audioPlayer: null, localMicMuted: false, localSpeakerMuted: false, + localPttActive: false, + localHalfDuplex: false, }; }, computed: { @@ -387,13 +423,24 @@ export default { }, }, watch: { - activeCall(newCall, oldCall) { - if (newCall) { - if (!oldCall || newCall.hash !== oldCall.hash) { - this.localMicMuted = newCall.is_mic_muted; - this.localSpeakerMuted = newCall.is_speaker_muted; + activeCall: { + immediate: true, + handler(newCall, oldCall) { + if (newCall) { + if (!oldCall || newCall.hash !== oldCall.hash) { + this.localMicMuted = Boolean(newCall.is_mic_muted); + this.localSpeakerMuted = Boolean(newCall.is_speaker_muted); + this.localPttActive = Boolean(newCall.is_ptt_active); + this.localHalfDuplex = Boolean(newCall.is_half_duplex); + } else { + this.localPttActive = Boolean(newCall.is_ptt_active); + this.localHalfDuplex = Boolean(newCall.is_half_duplex); + } + } else { + this.localPttActive = false; + this.localHalfDuplex = false; } - } + }, }, }, mounted() { @@ -493,6 +540,33 @@ export default { ToastUtils.error(this.$t("call.failed_to_toggle_speaker")); } }, + async toggleDuplexMode() { + if (!this.activeCall || this.activeCall.status !== 6) return; + const nextMode = this.localHalfDuplex ? 1 : 2; + try { + const response = await window.api.post(`/api/v1/telephone/switch-call-mode/${nextMode}`); + this.localPttActive = Boolean(response.data?.is_ptt_active); + this.localHalfDuplex = Boolean(response.data?.is_half_duplex); + } catch { + ToastUtils.error(this.$t("call.failed_to_switch_call_mode")); + } + }, + async setPttActive(active) { + if (!this.activeCall || this.activeCall.status !== 6 || !this.localHalfDuplex) { + if (active) return; + } + const wantActive = Boolean(active); + if (this.localPttActive === wantActive) return; + this.localPttActive = wantActive; + try { + await window.api.post("/api/v1/telephone/ptt", { active: wantActive }); + } catch { + this.localPttActive = !wantActive; + if (wantActive) { + ToastUtils.error(this.$t("call.failed_to_set_ptt")); + } + } + }, async playLatestVoicemail() { if (this.isPlayingVoicemail) { if (this.audioPlayer) { diff --git a/meshchatx/src/frontend/components/call/CallPage.vue b/meshchatx/src/frontend/components/call/CallPage.vue index e76ed209..79f4bf69 100644 --- a/meshchatx/src/frontend/components/call/CallPage.vue +++ b/meshchatx/src/frontend/components/call/CallPage.vue @@ -368,7 +368,7 @@ class="rounded-xl bg-gray-50 dark:bg-zinc-800/70 border border-gray-100 dark:border-zinc-700/70 px-2 py-1.5 text-left" >
- TX Pkts + {{ $t("call.tx_packets") }}
{{ formatNumber(activeCall.tx_packets) }} @@ -378,7 +378,7 @@ class="rounded-xl bg-gray-50 dark:bg-zinc-800/70 border border-gray-100 dark:border-zinc-700/70 px-2 py-1.5 text-left" >
- RX Pkts + {{ $t("call.rx_packets") }}
{{ formatNumber(activeCall.rx_packets) }} @@ -388,7 +388,7 @@ class="rounded-xl bg-gray-50 dark:bg-zinc-800/70 border border-gray-100 dark:border-zinc-700/70 px-2 py-1.5 text-left" >
- TX Data Out + {{ $t("call.tx_data") }}
{{ formatBytes(activeCall.tx_bytes) }} @@ -398,12 +398,50 @@ class="rounded-xl bg-gray-50 dark:bg-zinc-800/70 border border-gray-100 dark:border-zinc-700/70 px-2 py-1.5 text-left" >
- RX Data In + {{ $t("call.rx_data") }}
{{ formatBytes(activeCall.rx_bytes) }}
+
+
+ {{ $t("call.tx_rate") }} +
+
+ {{ formatBitrate(activeCall.tx_bps) }} +
+
+
+
+ {{ $t("call.rx_rate") }} +
+
+ {{ formatBitrate(activeCall.rx_bps) }} +
+
+
+
+ {{ + activeCall.is_half_duplex + ? $t("call.half_duplex") + : $t("call.full_duplex") + }} + + · + {{ + localPttActive + ? $t("call.ptt_transmitting") + : $t("call.ptt_listening") + }} +
@@ -457,10 +495,25 @@ + +
+
+ {{ $t("call.ptt_spacebar_hint") }} +
@@ -724,6 +814,31 @@ +
+
+ {{ $t("call.default_duplex") }} +
+ +
@@ -2378,6 +2493,10 @@ export default { webAudioBridgeRequired: false, audioProfiles: [], selectedAudioProfileId: null, + callModes: [], + selectedCallModeId: 1, + localPttActive: false, + pttKeyHeld: false, destinationHash: "", callHistory: [], callHistorySearch: "", @@ -2486,6 +2605,9 @@ export default { isSpeakerMuted() { return this.localSpeakerMuted; }, + isHalfDuplexCall() { + return Boolean(this.activeCall && this.activeCall.status === 6 && this.activeCall.is_half_duplex); + }, elapsedTime() { if (!this.activeCall?.call_start_time) { return null; @@ -2565,6 +2687,7 @@ export default { mounted() { this.getConfig(); this.getAudioProfiles(); + this.getCallModes(); this.getStatus(); this.getHistory(); this.getVoicemails(); @@ -2601,6 +2724,10 @@ export default { this.$forceUpdate(); }, 1000); + window.addEventListener("keydown", this.onPttKeyDown); + window.addEventListener("keyup", this.onPttKeyUp); + window.addEventListener("blur", this.onPttWindowBlur); + // autofill destination hash and tab from query string const destinationHash = this.$route.query.destination_hash; if (destinationHash) { @@ -2620,6 +2747,12 @@ export default { if (this.historyInterval) clearInterval(this.historyInterval); if (this.elapsedTimeInterval) clearInterval(this.elapsedTimeInterval); if (this.endedTimeout) clearTimeout(this.endedTimeout); + window.removeEventListener("keydown", this.onPttKeyDown); + window.removeEventListener("keyup", this.onPttKeyUp); + window.removeEventListener("blur", this.onPttWindowBlur); + if (this.localPttActive) { + this.setPttActive(false); + } this.stopAudioVisualizer(); if (this.audioPlayer) { this.audioPlayer.pause(); @@ -2637,6 +2770,12 @@ export default { formatNumber(value) { return Utils.formatNumber(value || 0); }, + formatBitrate(bps) { + const rate = Number(bps) || 0; + if (rate < 1000) return `${Math.round(rate)} bps`; + if (rate < 1000000) return `${(rate / 1000).toFixed(1)} kbps`; + return `${(rate / 1000000).toFixed(2)} Mbps`; + }, formatDateTime(timestamp) { return Utils.convertUnixMillisToLocalDateTimeString(timestamp); }, @@ -3543,18 +3682,47 @@ export default { console.log(e); } }, + async getCallModes() { + try { + const response = await window.api.get("/api/v1/telephone/call-modes"); + const modes = Array.isArray(response.data.call_modes) ? response.data.call_modes : []; + this.callModes = modes; + if (response.data.default_call_mode_id != null) { + this.selectedCallModeId = response.data.default_call_mode_id; + } + } catch (e) { + console.log(e); + } + }, async getStatus() { try { const response = await window.api.get("/api/v1/telephone/status"); const oldCall = this.activeCall; const newCall = response.data.active_call; - // Sync local mute state from backend + // Sync local mute / PTT / mode state from backend if (newCall) { if (!oldCall || newCall.hash !== oldCall.hash) { - this.localMicMuted = newCall.is_mic_muted; - this.localSpeakerMuted = newCall.is_speaker_muted; + this.localMicMuted = Boolean(newCall.is_mic_muted); + this.localSpeakerMuted = Boolean(newCall.is_speaker_muted); + this.localPttActive = Boolean(newCall.is_ptt_active); + } else if (!this.isMicMuting) { + this.localMicMuted = Boolean( + newCall.is_mic_muted ?? response.data.is_mic_muted ?? this.localMicMuted + ); + this.localSpeakerMuted = Boolean( + newCall.is_speaker_muted ?? response.data.is_speaker_muted ?? this.localSpeakerMuted + ); + if (!this.pttKeyHeld) { + this.localPttActive = Boolean(newCall.is_ptt_active); + } } + if (newCall.call_mode_id != null) { + this.selectedCallModeId = newCall.call_mode_id; + } + } else { + this.localPttActive = false; + this.pttKeyHeld = false; } this.activeCall = newCall; @@ -4403,6 +4571,78 @@ export default { ToastUtils.error(this.$t("call.failed_to_switch_audio_profile")); } }, + async switchCallMode(modeId) { + try { + const response = await window.api.post(`/api/v1/telephone/switch-call-mode/${modeId}`); + const resolved = response.data?.mode_id; + if (resolved != null) { + this.selectedCallModeId = resolved; + } + this.localPttActive = Boolean(response.data?.is_ptt_active); + if (this.activeCall) { + this.activeCall.call_mode_id = resolved; + this.activeCall.is_half_duplex = Boolean(response.data?.is_half_duplex); + this.activeCall.is_ptt_active = this.localPttActive; + } + if (this.config) { + this.config.telephone_call_mode_id = resolved; + } + } catch { + ToastUtils.error(this.$t("call.failed_to_switch_call_mode")); + } + }, + isEditableEventTarget(target) { + if (!target || !(target instanceof Element)) return false; + const tag = (target.tagName || "").toLowerCase(); + if (tag === "input" || tag === "textarea" || tag === "select") return true; + return Boolean(target.isContentEditable); + }, + onPttKeyDown(event) { + if (event.code !== "Space" && event.key !== " ") return; + if (event.repeat) return; + if (this.isEditableEventTarget(event.target)) return; + if (!this.isHalfDuplexCall) return; + event.preventDefault(); + this.pttKeyHeld = true; + this.setPttActive(true); + }, + onPttKeyUp(event) { + if (event.code !== "Space" && event.key !== " ") return; + if (!this.pttKeyHeld && !this.localPttActive) return; + event.preventDefault(); + this.pttKeyHeld = false; + this.setPttActive(false); + }, + onPttWindowBlur() { + this.pttKeyHeld = false; + if (this.localPttActive) { + this.setPttActive(false); + } + }, + async setPttActive(active) { + if (!this.isHalfDuplexCall && active) { + return; + } + const wantActive = Boolean(active); + if (this.localPttActive === wantActive) { + return; + } + this.localPttActive = wantActive; + if (this.activeCall) { + this.activeCall.is_ptt_active = wantActive; + } + try { + await window.api.post("/api/v1/telephone/ptt", { active: wantActive }); + } catch { + this.localPttActive = !wantActive; + if (this.activeCall) { + this.activeCall.is_ptt_active = !wantActive; + } + if (wantActive) { + ToastUtils.error(this.$t("call.failed_to_set_ptt")); + } + } + }, async toggleMicrophone() { try { const isCurrentlyMuted = this.localMicMuted; diff --git a/meshchatx/src/frontend/locales/en.json b/meshchatx/src/frontend/locales/en.json index b015e18a..ff621b06 100644 --- a/meshchatx/src/frontend/locales/en.json +++ b/meshchatx/src/frontend/locales/en.json @@ -3547,6 +3547,24 @@ "minimize": "Minimize", "active": "Active", "default_quality": "Default Quality", + "default_duplex": "Default Duplex", + "full_duplex": "Full Duplex", + "half_duplex": "Half Duplex", + "switch_to_full_duplex": "Switch to full duplex", + "switch_to_half_duplex": "Switch to half duplex", + "ptt_hold_to_talk": "Hold to Talk", + "ptt_transmitting": "Transmitting", + "ptt_listening": "Listening", + "ptt_hold_hint": "Hold to unsquelch transmit on this half-duplex call", + "ptt_spacebar_hint": "Hold Space to talk", + "tx_packets": "TX Packets", + "rx_packets": "RX Packets", + "tx_data": "TX Data", + "rx_data": "RX Data", + "tx_rate": "TX Rate", + "rx_rate": "RX Rate", + "failed_to_switch_call_mode": "Failed to switch duplex mode", + "failed_to_set_ptt": "Failed to set push-to-talk", "active_call": "Active Call", "status": "Status", "failed_to_answer_call": "Failed to answer call", diff --git a/tests/backend/http_api_response_registry.py b/tests/backend/http_api_response_registry.py index 2b1b4922..2af5a4e2 100644 --- a/tests/backend/http_api_response_registry.py +++ b/tests/backend/http_api_response_registry.py @@ -117,6 +117,7 @@ from tests.backend.http_api_response_schemas import ( TELEMETRY_TRACKING_SCHEMA, TELEMETRY_TRUSTED_PEERS_SCHEMA, TELEPHONE_AUDIO_PROFILES_SCHEMA, + TELEPHONE_CALL_MODES_SCHEMA, TELEPHONE_CODEC2_STATUS_SCHEMA, TELEPHONE_HISTORY_SCHEMA, TELEPHONE_RECORDINGS_SCHEMA, @@ -563,6 +564,11 @@ HTTP_JSON_GET_CONTRACTS: tuple[HttpJsonContract, ...] = ( "/api/v1/telephone/audio-profiles", TELEPHONE_AUDIO_PROFILES_SCHEMA, ), + HttpJsonContract( + "GET", + "/api/v1/telephone/call-modes", + TELEPHONE_CALL_MODES_SCHEMA, + ), HttpJsonContract( "GET", "/api/v1/telephone/codec2/status", diff --git a/tests/backend/http_api_response_schemas.py b/tests/backend/http_api_response_schemas.py index 2d3fec60..c31fb87a 100644 --- a/tests/backend/http_api_response_schemas.py +++ b/tests/backend/http_api_response_schemas.py @@ -865,6 +865,16 @@ TELEPHONE_AUDIO_PROFILES_SCHEMA: dict = { "additionalProperties": True, } +TELEPHONE_CALL_MODES_SCHEMA: dict = { + "type": "object", + "required": ["call_modes"], + "properties": { + "call_modes": _ARRAY, + "default_call_mode_id": _INTEGER, + }, + "additionalProperties": True, +} + TELEPHONE_CODEC2_STATUS_SCHEMA: dict = { "type": "object", "required": ["codec2_available"], diff --git a/tests/backend/test_call_codec2_regressions.py b/tests/backend/test_call_codec2_regressions.py index 3d946ca4..a621b7ec 100644 --- a/tests/backend/test_call_codec2_regressions.py +++ b/tests/backend/test_call_codec2_regressions.py @@ -197,8 +197,9 @@ class TestAudioProfilePassthroughRegression: tm.preferred_profile_id = Profiles.BANDWIDTH_LOW seen = {} - def capture_call(identity, profile=None): + def capture_call(identity, profile=None, mode=None): seen["profile"] = profile + seen["mode"] = mode tm.telephone.call_status = 0 tm.telephone.call.side_effect = capture_call @@ -222,6 +223,7 @@ class TestAudioProfilePassthroughRegression: await tm.initiate(destination_hash, timeout_seconds=1) assert seen["profile"] == Profiles.BANDWIDTH_LOW + assert seen["mode"] == Profiles.MODE_FULL_DUPLEX def test_init_does_not_rely_on_idle_switch_profile(self, tmp_path): cfg = MagicMock() diff --git a/tests/backend/test_telephone_audio_profiles.py b/tests/backend/test_telephone_audio_profiles.py index e858fd04..2c180e9c 100644 --- a/tests/backend/test_telephone_audio_profiles.py +++ b/tests/backend/test_telephone_audio_profiles.py @@ -68,9 +68,10 @@ async def test_initiate_passes_preferred_profile_to_lxst_call(tm): tm.preferred_profile_id = Profiles.BANDWIDTH_LOW seen = {} - def capture_call(identity, profile=None): + def capture_call(identity, profile=None, mode=None): seen["identity"] = identity seen["profile"] = profile + seen["mode"] = mode tm.telephone.call_status = 0 tm.telephone.call.side_effect = capture_call @@ -93,6 +94,7 @@ async def test_initiate_passes_preferred_profile_to_lxst_call(tm): await tm.initiate(destination_hash, timeout_seconds=1) assert seen["profile"] == Profiles.BANDWIDTH_LOW + assert seen["mode"] == Profiles.MODE_FULL_DUPLEX def test_init_telephone_stores_preferred_profile_not_idle_switch(tmp_path): diff --git a/tests/backend/test_telephone_csrf_methods.py b/tests/backend/test_telephone_csrf_methods.py index fa5cd421..2c5423fa 100644 --- a/tests/backend/test_telephone_csrf_methods.py +++ b/tests/backend/test_telephone_csrf_methods.py @@ -19,6 +19,7 @@ def test_telephone_call_mutators_are_post_not_get(mock_app): "/api/v1/telephone/unmute-transmit", "/api/v1/telephone/mute-receive", "/api/v1/telephone/unmute-receive", + "/api/v1/telephone/ptt", ] for path in mutators: assert _handler(mock_app, "POST", path) is not None, path @@ -38,3 +39,13 @@ def test_telephone_call_mutators_are_post_not_get(mock_app): _handler(mock_app, "GET", "/api/v1/telephone/switch-audio-profile/{profile_id}") is None ) + assert ( + _handler(mock_app, "POST", "/api/v1/telephone/switch-call-mode/{mode_id}") + is not None + ) + assert ( + _handler(mock_app, "GET", "/api/v1/telephone/switch-call-mode/{mode_id}") + is None + ) + assert _handler(mock_app, "GET", "/api/v1/telephone/call-modes") is not None + assert _handler(mock_app, "POST", "/api/v1/telephone/call-modes") is None diff --git a/tests/backend/test_telephone_duplex_ptt.py b/tests/backend/test_telephone_duplex_ptt.py new file mode 100644 index 00000000..cc251592 --- /dev/null +++ b/tests/backend/test_telephone_duplex_ptt.py @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: 0BSD + +"""Half-duplex mode and PTT squelch controls for LXST telephony.""" + +from types import SimpleNamespace +from unittest.mock import MagicMock + +from LXST.Primitives.Telephony import Profiles + +from meshchatx.src.backend.telephone_manager import TelephoneManager + + +def _manager_with_call(mode=Profiles.MODE_HALF_DUPLEX): + tm = TelephoneManager(identity=MagicMock()) + packetizer = SimpleNamespace(squelched=mode == Profiles.MODE_HALF_DUPLEX) + active_call = SimpleNamespace(call_mode=mode, packetizer=packetizer) + telephone = MagicMock() + telephone.active_call = active_call + telephone.call_status = 6 + telephone.active_mode = mode + tm.telephone = telephone + tm.preferred_mode_id = mode + return tm, telephone, packetizer + + +def test_resolve_call_mode_defaults_to_full_duplex(): + tm = TelephoneManager(identity=MagicMock()) + assert tm.resolve_call_mode_id(None) == Profiles.MODE_FULL_DUPLEX + assert tm.resolve_call_mode_id(999) == Profiles.MODE_FULL_DUPLEX + assert ( + tm.resolve_call_mode_id(Profiles.MODE_HALF_DUPLEX) == Profiles.MODE_HALF_DUPLEX + ) + + +def test_switch_mode_half_duplex_squelches_and_clears_ptt(): + tm, telephone, _packetizer = _manager_with_call(Profiles.MODE_FULL_DUPLEX) + tm.ptt_active = True + + resolved = tm.switch_mode(Profiles.MODE_HALF_DUPLEX) + + assert resolved == Profiles.MODE_HALF_DUPLEX + telephone.switch_mode.assert_called_once_with(Profiles.MODE_HALF_DUPLEX) + telephone.squelch_transmit.assert_called_once_with(True) + assert tm.ptt_active is False + assert tm.is_half_duplex() is True + + +def test_set_ptt_active_unsquelches_only_in_half_duplex(): + tm, telephone, packetizer = _manager_with_call(Profiles.MODE_HALF_DUPLEX) + + assert tm.set_ptt_active(True) is True + telephone.unsquelch_transmit.assert_called_once_with(True) + assert tm.ptt_active is True + + packetizer.squelched = False + assert tm.is_transmit_squelched() is False + + assert tm.set_ptt_active(False) is True + telephone.squelch_transmit.assert_called_once_with(True) + assert tm.ptt_active is False + + +def test_set_ptt_active_rejected_in_full_duplex(): + tm, telephone, _packetizer = _manager_with_call(Profiles.MODE_FULL_DUPLEX) + + assert tm.set_ptt_active(True) is False + telephone.unsquelch_transmit.assert_not_called() + assert tm.ptt_active is False + + +def test_call_end_resets_mute_and_ptt_state(): + tm, _telephone, _packetizer = _manager_with_call(Profiles.MODE_HALF_DUPLEX) + tm.transmit_muted = True + tm.receive_muted = True + tm.ptt_active = True + tm.call_stats = {"link": object()} + + tm.on_telephone_call_ended(MagicMock()) + + assert tm.transmit_muted is False + assert tm.receive_muted is False + assert tm.ptt_active is False + assert tm.call_stats == {} diff --git a/tests/frontend/CallPage.test.js b/tests/frontend/CallPage.test.js index a5923014..d7505215 100644 --- a/tests/frontend/CallPage.test.js +++ b/tests/frontend/CallPage.test.js @@ -59,6 +59,16 @@ describe("CallPage.vue", () => { } if (url.includes("/api/v1/telephone/audio-profiles")) return Promise.resolve({ data: { audio_profiles: [], default_audio_profile_id: null } }); + if (url.includes("/api/v1/telephone/call-modes")) + return Promise.resolve({ + data: { + default_call_mode_id: 1, + call_modes: [ + { id: 1, name: "Full Duplex", abbrev: "FDX", is_half_duplex: false }, + { id: 2, name: "Half Duplex", abbrev: "HDX", is_half_duplex: true }, + ], + }, + }); if (url.includes("/api/v1/telephone/contacts/export")) { return Promise.resolve({ data: { contacts: [] } }); } @@ -130,6 +140,30 @@ describe("CallPage.vue", () => { expect(axiosMock.post).toHaveBeenCalledWith(expect.stringContaining("/api/v1/telephone/mute-transmit")); }); + it("switches duplex mode and drives PTT squelch", async () => { + const wrapper = mountCallPage(); + await flushPromises(); + + wrapper.vm.activeCall = { + status: 6, + is_half_duplex: false, + call_mode_id: 1, + is_ptt_active: false, + }; + axiosMock.post.mockResolvedValueOnce({ + data: { mode_id: 2, is_half_duplex: true, is_ptt_active: false }, + }); + + await wrapper.vm.switchCallMode(2); + expect(axiosMock.post).toHaveBeenCalledWith(expect.stringContaining("/api/v1/telephone/switch-call-mode/2")); + expect(wrapper.vm.activeCall.is_half_duplex).toBe(true); + + axiosMock.post.mockResolvedValueOnce({ data: { is_ptt_active: true } }); + await wrapper.vm.setPttActive(true); + expect(axiosMock.post).toHaveBeenCalledWith("/api/v1/telephone/ptt", { active: true }); + expect(wrapper.vm.localPttActive).toBe(true); + }); + it("renders tabs correctly", async () => { const wrapper = mountCallPage(); await wrapper.vm.$nextTick(); @@ -185,14 +219,15 @@ describe("CallPage.vue", () => { expect(wrapper.text()).toContain("3 hops"); expect(wrapper.text()).toContain("Default Interface"); - expect(wrapper.text()).toContain("TX Pkts"); + expect(wrapper.text()).toContain("call.tx_packets"); expect(wrapper.text()).toContain("303"); - expect(wrapper.text()).toContain("RX Pkts"); + expect(wrapper.text()).toContain("call.rx_packets"); expect(wrapper.text()).toContain("289"); - expect(wrapper.text()).toContain("TX Data Out"); + expect(wrapper.text()).toContain("call.tx_data"); expect(wrapper.text()).toContain("35 KB"); - expect(wrapper.text()).toContain("RX Data In"); + expect(wrapper.text()).toContain("call.rx_data"); expect(wrapper.text()).toContain("82 KB"); + expect(wrapper.text()).toContain("call.full_duplex"); }); it("attempts to place a call when 'Call' button is clicked", async () => {