From 56a0b3089184739aa24f5c1bc111aeb76a949ff8 Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Tue, 20 May 2025 22:50:55 -0500 Subject: [PATCH 01/13] added worflow as package --- workflows/pyproject.toml | 1 + workflows/tests/shadowdom-detect/app.js | 25 + workflows/tests/shadowdom-detect/index.html | 11 + .../shadow-next.workflow.json | 30 + .../shadowdom-detect/shadowdom_detect.py | 32 + workflows/uv.lock | 588 +++++++++++++++++- 6 files changed, 684 insertions(+), 3 deletions(-) create mode 100644 workflows/tests/shadowdom-detect/app.js create mode 100644 workflows/tests/shadowdom-detect/index.html create mode 100644 workflows/tests/shadowdom-detect/shadow-next.workflow.json create mode 100644 workflows/tests/shadowdom-detect/shadowdom_detect.py diff --git a/workflows/pyproject.toml b/workflows/pyproject.toml index 037b13b0..3f0c10ca 100644 --- a/workflows/pyproject.toml +++ b/workflows/pyproject.toml @@ -14,6 +14,7 @@ classifiers = [ dependencies = [ "browser-use>=0.1.46", "fastapi>=0.115.12", + "pytest>=8.3.5", "typer>=0.15.3", "uvicorn>=0.34.2", ] diff --git a/workflows/tests/shadowdom-detect/app.js b/workflows/tests/shadowdom-detect/app.js new file mode 100644 index 00000000..f2f6b0cc --- /dev/null +++ b/workflows/tests/shadowdom-detect/app.js @@ -0,0 +1,25 @@ +class InnerElement extends HTMLElement { + constructor() { + super(); + const sr = this.attachShadow({ mode: 'open' }); + sr.innerHTML = ` + + + `; + } +} +customElements.define('inner-element', InnerElement); + +class OuterElement extends HTMLElement { + constructor() { + super(); + const sr = this.attachShadow({ mode: 'open' }); + sr.innerHTML = ` + + + `; + } +} +customElements.define('outer-element', OuterElement); + +document.getElementById('__next').appendChild(new OuterElement()); \ No newline at end of file diff --git a/workflows/tests/shadowdom-detect/index.html b/workflows/tests/shadowdom-detect/index.html new file mode 100644 index 00000000..54314ffb --- /dev/null +++ b/workflows/tests/shadowdom-detect/index.html @@ -0,0 +1,11 @@ + + + + + Next.js Shadow DOM Test + + +
+ + + \ No newline at end of file diff --git a/workflows/tests/shadowdom-detect/shadow-next.workflow.json b/workflows/tests/shadowdom-detect/shadow-next.workflow.json new file mode 100644 index 00000000..556a86d3 --- /dev/null +++ b/workflows/tests/shadowdom-detect/shadow-next.workflow.json @@ -0,0 +1,30 @@ +{ + "workflow_analysis": "Test shadow DOM navigation", + "name": "Shadow DOM Next.js Test", + "description": "Navigate and interact with nested shadow DOM elements", + "version": "1.0", + "steps": [ + { + "description": "Navigate to local shadow page", + "type": "navigation", + "url": "http://localhost:8000/index.html" + }, + { + "description": "Type in inner input", + "type": "input", + "cssSelector": "outer-element >>> inner-element >>> #inner-input", + "value": "hello" + }, + { + "description": "Click inner button", + "type": "click", + "cssSelector": "outer-element >>> inner-element >>> #inner-btn" + }, + { + "description": "Click outer button", + "type": "click", + "cssSelector": "outer-element >>> #outer-btn" + } + ], + "input_schema": [] +} \ No newline at end of file diff --git a/workflows/tests/shadowdom-detect/shadowdom_detect.py b/workflows/tests/shadowdom-detect/shadowdom_detect.py new file mode 100644 index 00000000..4030fbaa --- /dev/null +++ b/workflows/tests/shadowdom-detect/shadowdom_detect.py @@ -0,0 +1,32 @@ +import asyncio +import os +from pathlib import Path +from threading import Thread +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer + +import pytest + +from workflow_use.workflow.service import Workflow + + +TEST_DIR = Path(__file__).parent / "nextjs-shadow" + + +def start_server(): + os.chdir(TEST_DIR) + server = ThreadingHTTPServer(("127.0.0.1", 8000), SimpleHTTPRequestHandler) + thread = Thread(target=server.serve_forever, daemon=True) + thread.start() + return server, thread + + +@pytest.mark.asyncio +async def test_shadow_nextjs_workflow(): + server, thread = start_server() + try: + wf_path = TEST_DIR / "shadow-next.workflow.json" + workflow = Workflow.load_from_file(str(wf_path)) + await workflow.run(close_browser_at_end=True) + finally: + server.shutdown() + thread.join() \ No newline at end of file diff --git a/workflows/uv.lock b/workflows/uv.lock index b82c3fc0..818a75ad 100644 --- a/workflows/uv.lock +++ b/workflows/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.11" resolution-markers = [ "python_full_version < '3.12'", @@ -266,7 +267,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -603,6 +604,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, +] + [[package]] name = "jiter" version = "0.9.0" @@ -1127,12 +1137,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/4f/71a8a873e8c3c3e2d3ec03a578e546f6875be8a76214d90219f752f827cd/playwright-1.52.0-py3-none-win_arm64.whl", hash = "sha256:9d0085b8de513de5fb50669f8e6677f0252ef95a9a1d2d23ccee9638e71e65cb", size = 30688972 }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, +] + [[package]] name = "portalocker" version = "2.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pywin32", marker = "platform_system == 'Windows'" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ed/d3/c6c64067759e87af98cc668c1cc75171347d0f1577fab7ca3749134e3cd4/portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f", size = 40891 } wheels = [ @@ -1547,6 +1566,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b5/61/7484cc4ad3aa7854cd4c969379a5f044261259d08f7c20b6718493b484f9/pyobjc_framework_accessibility-11.0.tar.gz", hash = "sha256:097450c641fa9ac665199762e77867f2a82775be2f749b8fa69223b828f60656", size = 44597 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/2e/babcd02cd833c0aba34e10c34a2184021b8a3c7cb45d1ae806156c2b519d/pyobjc_framework_Accessibility-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c3a751d17b288bb56a98a10b52b253b3002c885fe686b604788acac1e9739437", size = 10948 }, + { url = "https://files.pythonhosted.org/packages/e8/ea/da3f982eeaffb80efb480892106caa19a2c9c8b8954570837ddbcd983520/pyobjc_framework_Accessibility-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:34536f3d60aeda618b384b1207a8c6f9978de278ce229c3469ef14fd27a3befa", size = 10962 }, + { url = "https://files.pythonhosted.org/packages/40/d4/dd7009f30503566376a4a994909fc9e105c7964398a373ed067de6c0cf2e/pyobjc_framework_Accessibility-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:015dd93ef92a135ef916b27362f608898be059b16dc434decc0bb00c0f183632", size = 10973 }, + { url = "https://files.pythonhosted.org/packages/08/2f/bd9e1548c354f8b1c1922683b856462e468e83c76aa19229562717a3a4a1/pyobjc_framework_Accessibility-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b91e80179ebc32b2f1bbac53c6b6756c063abd4f34160d863223ab7af5d29c8c", size = 11193 }, +] [[package]] name = "pyobjc-framework-accounts" @@ -1571,6 +1596,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/68/ef/5b5f6b61907ae43509fbf1654e043115d9a64d97efdc28fbb90d06c199f6/pyobjc_framework_addressbook-11.0.tar.gz", hash = "sha256:87073c85bb342eb27faa6eceb7a0e8a4c1e32ad1f2b62bb12dafb5e7b9f15837", size = 97116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/7a/8b874a52ff57dad999330ac1f899e6df8e35cec2cad8a90d8002d3c5f196/pyobjc_framework_AddressBook-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af7de23aac7571a3b9dad5b2881d8f186653aa72903db8d7dbfd2c7b993156b9", size = 13010 }, + { url = "https://files.pythonhosted.org/packages/0c/b4/93de1195c22cbaf4996aeb6d55e79fc7d76311cacfe8fd716c70fb20e391/pyobjc_framework_AddressBook-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3b634ef80920ab9208f2937527e4a498e7afa6e2ceb639ebb483387ab5b9accc", size = 13039 }, + { url = "https://files.pythonhosted.org/packages/f9/49/43eed87c15519a95c1e3c00589c42785968f1457ec02de35a3595624245f/pyobjc_framework_AddressBook-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1037e3c80ef501c78cfd1586e628ef5fb1acad611fe8b7a201142369ab242a8b", size = 13052 }, + { url = "https://files.pythonhosted.org/packages/ab/34/1d77d243dfce2b86dfe8eb8afe667f3cc2fd6f90968ebf65d5760ee418dd/pyobjc_framework_AddressBook-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:faec97a6d06d4c468b2e6a4143e117dc56387a96aa72c91c6976985e108df358", size = 13261 }, +] [[package]] name = "pyobjc-framework-adservices" @@ -1639,6 +1670,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ba/fb/4e42573b0d3baa3fa18ec53614cf979f951313f1451e8f2e17df9429da1f/pyobjc_framework_applicationservices-11.0.tar.gz", hash = "sha256:d6ea18dfc7d5626a3ecf4ac72d510405c0d3a648ca38cae8db841acdebecf4d2", size = 224334 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/37/3d4dc6c004aaeb67bd43f7261d7c169ff45b8fc0eefbc7ba8cd6b0c881bc/pyobjc_framework_ApplicationServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61a99eef23abb704257310db4f5271137707e184768f6407030c01de4731b67b", size = 30846 }, + { url = "https://files.pythonhosted.org/packages/74/a9/7a45a67e126d32c61ea22ffd80e87ff7e05b4acf32bede6cce071fbfffc8/pyobjc_framework_ApplicationServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5fbeb425897d6129471d451ec61a29ddd5b1386eb26b1dd49cb313e34616ee21", size = 30908 }, + { url = "https://files.pythonhosted.org/packages/82/47/ab4155ec966aff2f8f0f6978b40f12255e8ef46111ca0bda7987959b4052/pyobjc_framework_ApplicationServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:59becf3cd87a4f4cedf4be02ff6cf46ed736f5c1123ce629f788aaafad91eff0", size = 30924 }, + { url = "https://files.pythonhosted.org/packages/a3/73/747aab95970e0b7b5d38c650028e5e034c0432d9451335ff790ca104f11a/pyobjc_framework_ApplicationServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:44b466e8745fb49e8ac20f29f2ffd7895b45e97aa63a844b2a80a97c3a34346f", size = 31279 }, +] [[package]] name = "pyobjc-framework-apptrackingtransparency" @@ -1663,6 +1700,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/89/5f/0bd5beded0415b53f443da804410eda6a53e1bc64f8779ed9a592719da8c/pyobjc_framework_audiovideobridging-11.0.tar.gz", hash = "sha256:dbc45b06418dd780c365956fdfd69d007436b5ee54c51e671196562eb8290ba6", size = 72418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/33/2ee33542febb40174d40ae8bbdf672b4e438a3fb41ba6a4d4a3e6800121b/pyobjc_framework_AudioVideoBridging-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d025e49ca6238be96d0a1c22942b548a8d445ef8eb71259b4769e119810f42c6", size = 10944 }, + { url = "https://files.pythonhosted.org/packages/45/ea/db8295e17b0b544b06620e4019afcc76d7b743a8f03cb8a1024b2bc118ac/pyobjc_framework_AudioVideoBridging-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d414ecffeb23cddc8e64262af170e663c93e8d462d18aa7067d4584069967859", size = 10962 }, + { url = "https://files.pythonhosted.org/packages/5c/1d/a5bc389f5ab5ba4caed14b7ce06249c354b9d88df66fafedf43211613163/pyobjc_framework_AudioVideoBridging-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e2f7a951dd7e6521a745cdd0256a14758bd6f2d878d654eb36c31e2256d7b872", size = 10970 }, + { url = "https://files.pythonhosted.org/packages/bc/ed/e7f863f38e0b069db6b0c1c338724366bf1a3f2b7e6d791651a6a72563d9/pyobjc_framework_AudioVideoBridging-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66f93d00081c48ec2d0b2a5ce8fd1eb18c5aa35bfa598f2a1d2950dcdcee6184", size = 11194 }, +] [[package]] name = "pyobjc-framework-authenticationservices" @@ -1673,6 +1716,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/31/0f/2de0d941e9c9b2eb1ce8b22eb31adc7227badfe1e53f615431d3a7fdcd48/pyobjc_framework_authenticationservices-11.0.tar.gz", hash = "sha256:6a060ce651df142e8923d1383449bc6f2c7f5eb0b517152dac609bde3901064e", size = 140036 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/16/6246cf10e2d245f4018c02f351f8eb4cc93823f6e7e4dd584ab292cda786/pyobjc_framework_AuthenticationServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e3b23478cf8995883acfe6c1a24503c84caf2f8dbe540377fe19fb787ce9b2", size = 20079 }, + { url = "https://files.pythonhosted.org/packages/b7/ca/81a55a0714e73695b536bfbcbf0f5ddf68da9485b468406f6ef887a04938/pyobjc_framework_AuthenticationServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1779f72c264f749946fcbfba0575a985c1e297d426617739a533554dbf172f9a", size = 20105 }, + { url = "https://files.pythonhosted.org/packages/0d/22/9bda1ea44702652f629bd79e254ec3e0dc9263b49849435a907050501b09/pyobjc_framework_AuthenticationServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ff992eb992d9a012ddc2199813f07fa93d3a0bc6aaff10868aa7d78f27973957", size = 20120 }, + { url = "https://files.pythonhosted.org/packages/6c/c4/872293023a277a6c171cd636047f416e1be72e3429e34985d8ad46f58714/pyobjc_framework_AuthenticationServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aacea81274d1860eca1253cad7e57ed50484e73bda4b16002d1651343e4a014f", size = 20458 }, +] [[package]] name = "pyobjc-framework-automaticassessmentconfiguration" @@ -1683,6 +1732,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/09/d5/5febfee260b88e426c7e799cc95990818feeaa9f740fb9dd516559c96520/pyobjc_framework_automaticassessmentconfiguration-11.0.tar.gz", hash = "sha256:5d3691af2b94e44ca594b6791556e15a9f0a3f9432df51cb891f5f859a65e467", size = 24420 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/3f/b593adce2f5b9f9427d784db56d8195adc2cfb340d4d3578914539a17faa/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:25f2db399eb0a47e345d0471c7af930f5a3be899ba6edb40bd9125719e4b526f", size = 9015 }, + { url = "https://files.pythonhosted.org/packages/4e/c3/b6b779d783dcf3667a2011d8af0d801f6639df9735cdc34c6e6b79822298/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6433452d2c4cdb0eef16cc78a24ba9c61efb5bb04709ee10ca94b69119e889c", size = 9034 }, + { url = "https://files.pythonhosted.org/packages/93/93/bec2235907ff90e9d68d5b7e524e76cee883b2bfa6a2a01b0d590399e49c/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:288bb82674eec04b4eabda8e835aa85cad535feea8845789c1b039a86b662e2b", size = 9053 }, + { url = "https://files.pythonhosted.org/packages/a8/37/9828b36e9b648b2c616906239694ad24caf39f50a5fa9447e820f302257a/pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4b3839404ca21b1cad7139e708efd7a314e7773bbfbededc8621aea0381b2496", size = 9277 }, +] [[package]] name = "pyobjc-framework-automator" @@ -1693,6 +1748,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/1b/1ba4eb296c3915f2e367e45470cb310a9c78b4dd65a37bd522f458f245aa/pyobjc_framework_automator-11.0.tar.gz", hash = "sha256:412d330f8c6f30066cad15e1bdecdc865510bbce469cc7d9477384c4e9f2550f", size = 200905 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/2b/bfe673491042849ad400bebf557b8047317757283b98ad9921fbb6f6cae9/pyobjc_framework_Automator-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:850f9641a54cc8d9a3d02c2d87a4e80aed2413b37aa6c26a7046088b77da5b42", size = 9811 }, + { url = "https://files.pythonhosted.org/packages/13/00/e60db832c536fd354fab7e813ee781327358e6bcbc4cacbd9695dade7006/pyobjc_framework_Automator-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eb1b9b16873ec1d2f8af9a04ca1b2fcaa324ce4a1fada0d02fa239f6fecf773b", size = 9827 }, + { url = "https://files.pythonhosted.org/packages/36/e0/ce39020b80de4ade61022dab7f531ed7f5f1a70124189693d5b6ec3ebd7b/pyobjc_framework_Automator-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ebd8aad30913ff698761b27475764ed8c66314aa1524d636096ee3828a6ae08", size = 9852 }, + { url = "https://files.pythonhosted.org/packages/3c/31/48abdc64d13f2c8802a4e0770304396cb919cef9363ceaee9b2015af9c91/pyobjc_framework_Automator-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:999a1864db68cff47fb1ddd5c3353c5efb2805a9829392dcfc0a11da632e5764", size = 10071 }, +] [[package]] name = "pyobjc-framework-avfoundation" @@ -1706,6 +1767,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/06/018ad0e2a38dbdbc5c126d7ce37488c4d581d4e2a2b9ef678162bb36d5f6/pyobjc_framework_avfoundation-11.0.tar.gz", hash = "sha256:269a592bdaf8a16948d8935f0cf7c8cb9a53e7ea609a963ada0e55f749ddb530", size = 871064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/b5/327654548fa210b4637350de016183fbb1f6f8f9213d2c6c9b492eb8b44c/pyobjc_framework_AVFoundation-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87db350311c1d7e07d68036cdde3d01c09d97b8ba502241c0c1699d7a9c6f2e4", size = 71345 }, + { url = "https://files.pythonhosted.org/packages/f5/36/e09b20f280953fa7be95a9266e5ad75f2e8b184cc39260c0537b3e60b534/pyobjc_framework_AVFoundation-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6bb6f4be53c0fb42bee3f46cf0bb5396a8fd13f92d47a01f6b77037a1134f26b", size = 71314 }, + { url = "https://files.pythonhosted.org/packages/c0/17/8db165bff8c78d424ab7bc2bc3dae856e432673b5425a4ed2084c23345e8/pyobjc_framework_AVFoundation-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d9d2497acf3e7c5ae4a8175832af249754847b415494422727ac43efe14cc776", size = 71340 }, + { url = "https://files.pythonhosted.org/packages/82/cd/d521a60dd8e1edc88cb747c810b1bc018f7205fd0c4a581653e68374500c/pyobjc_framework_AVFoundation-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:da932d77e29e3f4112d0526918a47c978381d00af23133cb06e0a5f76e92a9b6", size = 71694 }, +] [[package]] name = "pyobjc-framework-avkit" @@ -1717,6 +1784,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/de/79/5b2fcb94b051da32a24b54bb0d90b1d01b190e1402b6303747de47fb17ac/pyobjc_framework_avkit-11.0.tar.gz", hash = "sha256:5fa40919320277b820df3e4c6e84cba91ef7221a28f4eb5374e3dbd80d1e521a", size = 46311 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/ae/aed1023150483a288922c447e1997f4f4e9d0460038e1a070a3a53b85c19/pyobjc_framework_AVKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16b5560860c1e13e692c677ad04d8e194d0b9931dd3f15e3df4dbd7217cc8ab1", size = 11960 }, + { url = "https://files.pythonhosted.org/packages/01/f4/08684e5af2a2e8940e6411e96ef1d7ed1e51a121abb19c93c25c34969213/pyobjc_framework_AVKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f4da468b97bb7f356024e31647619cd1cd435b543e467209da0ee0abdfdc7121", size = 11969 }, + { url = "https://files.pythonhosted.org/packages/b0/a0/b611bd5104437bfa504652bbe24594df960d0ee22be100cdad368aa0550e/pyobjc_framework_AVKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ce222b1808d19a7d5c2d00e707388dbdca6becf7be172a820ae0270e4fbfc020", size = 11983 }, + { url = "https://files.pythonhosted.org/packages/fa/82/91557161e27ce4b0827e018068befb6d81a946e51d151b94b5b4322f9840/pyobjc_framework_AVKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f8ccc7314bbbd4df1427706e80493365f5c7884f2c334e1587f6b1cea4066786", size = 12200 }, +] [[package]] name = "pyobjc-framework-avrouting" @@ -1727,6 +1800,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/80/63680dc7788bc3573a20fc5421dfcf606970a0cd3b2457829d9b66603ae0/pyobjc_framework_avrouting-11.0.tar.gz", hash = "sha256:54ec9ea0b5adb5149b554e23c07c6b4f4bdb2892ca2ed7b3e88a5de936313025", size = 20561 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/9c/ea6924de09e13f858210d6dd934f00773b1e3db6af886c72841ed545560f/pyobjc_framework_AVRouting-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:54e58cd0292f734aba035599f37a0c00f03761e9ff5cf53a0857cec7949bb39c", size = 8067 }, + { url = "https://files.pythonhosted.org/packages/3f/92/774e10af5aba5742c4a2dd563fa819550d9caa755d2648b3cc87bbe30129/pyobjc_framework_AVRouting-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:779db3fb0048b22c5dcf5871930025c0fd93068f87946e8053f31a3366fa6fb0", size = 8078 }, + { url = "https://files.pythonhosted.org/packages/fb/67/1eb74b1b978241eee0bb41d8097e10b408499c3461495d977ba5e6c3d178/pyobjc_framework_AVRouting-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4202f79cd1eaece357941f25f026760bf05bf4b269344d5dabd00e2bfa1bb1ed", size = 8100 }, + { url = "https://files.pythonhosted.org/packages/f6/ee/d2563af5d578cba47bf4838ae732833b69453f06052a7b80ffcbec2946b7/pyobjc_framework_AVRouting-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a338c7d59fd4232babb9ff70f2fd809d2934a60b761a906ae78341a54316bc1f", size = 8329 }, +] [[package]] name = "pyobjc-framework-backgroundassets" @@ -1737,6 +1816,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/17/83b873069b0c0763365de88648ad4a2472e9e96fcac39fa534f3633552e8/pyobjc_framework_backgroundassets-11.0.tar.gz", hash = "sha256:9488c3f86bf427898a88b7100e77200c08a487a35c75c1b5735bd69c57ba38cb", size = 23658 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/9d/bea4408649199340ec7ed154bbaa1942a0b0955006b3153088b3f35e6ff6/pyobjc_framework_BackgroundAssets-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:812bcc4eaf71c1cc42e94edc2b5ad0414d16cfe1da5c421edd9382417d625f06", size = 9499 }, + { url = "https://files.pythonhosted.org/packages/bd/79/726c14fd26553c8bbe8b2ed55caa45d89093e2e85b45c1b598dd04ea7589/pyobjc_framework_BackgroundAssets-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:96b3fc40c514867d4a0b3ad4d256bc5134d789e22fa306a6b21e49ecadc51698", size = 9521 }, + { url = "https://files.pythonhosted.org/packages/90/13/c13e73cab02034fdfd6148ebb86a3d811ca2a603ad302135df6b80ac51d8/pyobjc_framework_BackgroundAssets-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7ead62c5201e48df340c978d0cf7805813a3b35dfbb4bb45b9a9e34c972e5a70", size = 9537 }, + { url = "https://files.pythonhosted.org/packages/e7/68/1eb7d8fc15f4cb4268b0cde3fc9b4f7417f45a5c4730240d7769e4341a94/pyobjc_framework_BackgroundAssets-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c954b4aa7ece1670bd129d98d779c4a534a10182350a1809341166a4e2cfa893", size = 9749 }, +] [[package]] name = "pyobjc-framework-browserenginekit" @@ -1750,6 +1835,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/2e/df3d2f7e53132d398c2922d331dd1d2aa352997a1a4a1390e59db51c1d13/pyobjc_framework_browserenginekit-11.0.tar.gz", hash = "sha256:51971527f5103c0e09a4ef438c352ebb037fcad8971f8420a781c72ee421f758", size = 31352 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/6d/6aa929d4993453817523db9c82a4e6e2cce7104fa59e29ee857f9e926b0d/pyobjc_framework_BrowserEngineKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:58494bc3ccc21a63751b7c9f8788d0240c3f1aad84cf221c0e42c9764a069ba4", size = 10913 }, + { url = "https://files.pythonhosted.org/packages/a8/2f/dd18f7ff9438ad4612febfbdb2e4bded37033347b9f0e1355df76f2c5213/pyobjc_framework_BrowserEngineKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0925edfd60a24f53819cfd11f07926fd42bc0fbeb7a4982998a08742e859dbff", size = 10933 }, + { url = "https://files.pythonhosted.org/packages/5e/41/2ba11c3e5947e77da181ebf1350ee493f998c2655574e29f87fa6e6b242d/pyobjc_framework_BrowserEngineKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f65b21e18cdec37cb9531179007f03db654cb320b62f3f51e2f5a28d8355a355", size = 10944 }, + { url = "https://files.pythonhosted.org/packages/48/86/54dfcd5428d291225749673e597b26c2ade9cc94fe2bce574f51cc898221/pyobjc_framework_BrowserEngineKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a3dbea0ce37404030b0fbd9a1387cef0fef90f4f7865b8c628175d74dcaa3e40", size = 11165 }, +] [[package]] name = "pyobjc-framework-businesschat" @@ -1816,6 +1907,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4f/36/7cebdfb621c7d46eeab3173256bc2e1cba1bbbbe6c0ac8aeb9a4fe2a4627/pyobjc_framework_cfnetwork-11.0.tar.gz", hash = "sha256:eb742fc6a42b248886ff09c3cf247d56e65236864bbea4264e70af8377948d96", size = 78532 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/85/11047cfe2d31c242694d780783f0dea81d73cbb09929c7d4b918ce2d29bf/pyobjc_framework_CFNetwork-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e6905c86ccb5608f4153aacb931758ad39af8b708fcebb497431f9741f39e6d", size = 18988 }, + { url = "https://files.pythonhosted.org/packages/3e/6e/7d90c329030e7dd6ebbec217434820ff6158a3af9906e2abbb43e9b685d6/pyobjc_framework_CFNetwork-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5f61010503073e3518e29d440079a7c0b40aef91be6d3c2032e492c21bada80b", size = 19144 }, + { url = "https://files.pythonhosted.org/packages/47/22/2c67d26768225d829ad56967ee985f08f50f694f61fbfc57deeb1c012aee/pyobjc_framework_CFNetwork-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ec543393cc00e3282d1df9348275935e05a52666eabe8118a5aad2d5d98e9896", size = 19157 }, + { url = "https://files.pythonhosted.org/packages/f9/a5/5612fd3026e613b0bf7954c4498dfbef5b8e18e0c9d02081f11558bb6d8e/pyobjc_framework_CFNetwork-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8b12df20b05884eff42f92fea3d736ff6907e4b824523decb5a9fb48a6a6b745", size = 19541 }, +] [[package]] name = "pyobjc-framework-cinematic" @@ -1843,6 +1940,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/81/126075eaf5ccf254ddb4cfd99d92a266c30803c5b4572ea3a920fd85e850/pyobjc_framework_classkit-11.0.tar.gz", hash = "sha256:dc5b3856612cafdc7071fbebc252b8908dbf2433e0e5ddb15a0bcd1ee282d27c", size = 39301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/77/2e31bcf1e9b63f6723c01329c1191ac163e79b0f548b7cd92414115c26ff/pyobjc_framework_ClassKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:723a07591e1e40380c339b58033e8491e58be4080c0f77a26be0728f1c5025c8", size = 8776 }, + { url = "https://files.pythonhosted.org/packages/68/87/f566c4f1ffd1e383c7b38cd22753dfef0863f30bfdb0b3c5102293057fc2/pyobjc_framework_ClassKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7c7ff2eb8a9d87cb69618668e96c41ed9467fd4b4a8fef517c49923c0f6418e6", size = 8794 }, + { url = "https://files.pythonhosted.org/packages/c1/8d/378a90fde703a509a6de54cb4d0b767896a91868a1f5579060a7cca25a8d/pyobjc_framework_ClassKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4e959290652c818bd4dbcd27414ce2da4080bffe1e5ca990494944facb4a272c", size = 8797 }, + { url = "https://files.pythonhosted.org/packages/95/b9/c62bcd5ee97246857463bd37060fc44992460d22f0ed5b9ad7baf6014069/pyobjc_framework_ClassKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4c2e98f878ec7f20a8401df599ae5abaed2213e5a08fd2fc73d07aa89c338ad8", size = 9031 }, +] [[package]] name = "pyobjc-framework-cloudkit" @@ -1913,6 +2016,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/a2/89053853b28c1f2f2e69092d3e81b7c26073bc8396fc87772b3b1bfb9d57/pyobjc_framework_contacts-11.0.tar.gz", hash = "sha256:fc215baa9f66dbf9ffa1cb8170d102a3546cfd708b2b42de4e9d43645aec03d9", size = 84253 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/4f/b7a7b08535015494940a62fd63825eccf4cace7f8ca87050f0837470eca8/pyobjc_framework_Contacts-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b16758fc1edc40f0ec288d67b7e39b59609fb1df2523f4362c958d150619dbe5", size = 11880 }, + { url = "https://files.pythonhosted.org/packages/07/4b/0d2b41a32b6432182548cb84bb6b1c3228a7ff428ea15dfaf812b39c028f/pyobjc_framework_Contacts-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:80972851e2163b94d82fd4b0d9801790ad420dffa91a37c90fa2949031881c02", size = 11957 }, + { url = "https://files.pythonhosted.org/packages/5f/65/f9df980b3bb7620dc8bf0f8b27ab52c044d4afa45d7e68f0ff77101c0e65/pyobjc_framework_Contacts-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:39c616e7cd0188b24b061fe7f9d289dc7c909eccc74684e553f80f66d54e6b34", size = 11971 }, + { url = "https://files.pythonhosted.org/packages/35/82/e5cbab6a58dfdcf53c925073433f66cb82a69a27c45f1bab43dd88eb831d/pyobjc_framework_Contacts-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4d5308498b24e525c8d902a061ad249d3600d60778be5441243fddced21751d5", size = 12181 }, +] [[package]] name = "pyobjc-framework-contactsui" @@ -1924,6 +2033,12 @@ dependencies = [ { name = "pyobjc-framework-contacts" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3f/67/122b16fd7f2da7f0f48c1d7fcaf0f1951253ddd5489d909a1b5fb80f3925/pyobjc_framework_contactsui-11.0.tar.gz", hash = "sha256:d0f2a4afea807fbe4db1518c4f81f0dc9aa1817fe7cb16115308fc00375a70db", size = 19486 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/47/b1dbe48c64e2d061bf8b4ee532413b97e6c5748fdba43598a30421086fcc/pyobjc_framework_ContactsUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd3efaf3f67e92704f41927c5de06ccc4aa9daa09865cba7ac476da9c6e1c3c2", size = 7734 }, + { url = "https://files.pythonhosted.org/packages/5d/c5/465656c744301bfb7640e4077c57170d245843311e0e66702b53295e2534/pyobjc_framework_ContactsUI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:da9c85dccdf518a0ac80c627daca32d56a4636e3f118359579de51a428e85ba7", size = 7739 }, + { url = "https://files.pythonhosted.org/packages/ad/a8/08a745c2b1c9187c517398e72d3d2f447af15526865a80500383f44bf60c/pyobjc_framework_ContactsUI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8b0323c19400d0f7ea53abc3c1cdcdf03e7ffa0ade271caa916242d4352471a9", size = 7758 }, + { url = "https://files.pythonhosted.org/packages/99/9f/343a47ee8adfc17a8e98dceb2d405ec7724e5909e6a46b7297e5364727d6/pyobjc_framework_ContactsUI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b50d25ce8faf0306dd97b7c0b26c01786683d9d0af9fc1ae45642da590a7fbe6", size = 7973 }, +] [[package]] name = "pyobjc-framework-coreaudio" @@ -1934,6 +2049,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/31/e6/3b7a8af3defec012d6cacf277fd8d5c3e254ceace63a05447dc1119f3a7e/pyobjc_framework_coreaudio-11.0.tar.gz", hash = "sha256:38b6b531381119be6998cf704d04c9ea475aaa33f6dd460e0584351475acd0ae", size = 140507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/f8/6f583376d2ef6a6123141d310f7f7e3e93ba9129ffbbc6eb26e25c4289c5/pyobjc_framework_CoreAudio-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:143cd44d5c069aee1abc5a88794e9531250b9fe70a98f6a08e493184dcf64b3e", size = 35750 }, + { url = "https://files.pythonhosted.org/packages/df/14/b33556c06529a3c54853c41c5163e30a3fb9b2ae920e0c65a42ccd82e279/pyobjc_framework_CoreAudio-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d26eac5bc325bf046fc0bfdaa3322ddc828690dab726275f1c4c118bb888cc00", size = 36584 }, + { url = "https://files.pythonhosted.org/packages/37/e4/c716820c64c1f9aeb129c7d03e214d9787ba6a5c18f5425082d32adfecdc/pyobjc_framework_CoreAudio-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:272388af86809f7a81250d931e99f650f62878410d4e1cfcd8adf0bbfb0d4581", size = 36590 }, + { url = "https://files.pythonhosted.org/packages/49/6c/c6105c79b87e1c348459003f4abe5eb0f8e83efba4c532ae1c4bc803a5dc/pyobjc_framework_CoreAudio-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:764873ec0724e42844ed2f0ca95ab4654c5ba59f883799207a3eecd4f5b444df", size = 38499 }, +] [[package]] name = "pyobjc-framework-coreaudiokit" @@ -1945,6 +2066,12 @@ dependencies = [ { name = "pyobjc-framework-coreaudio" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/1a/604cac8d992b6e66adbb98edb1f65820116f5d74d8decd6d43898ae2929d/pyobjc_framework_coreaudiokit-11.0.tar.gz", hash = "sha256:1a4c3de4a02b0dfa7410c012c7f0939edd2e127d439fb934aeafc68450615f1d", size = 21450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/b9/d75a4da2d6a3cb75bafd363c447d45e134fe78a340dee408423a40c04aac/pyobjc_framework_CoreAudioKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6dbf01f2625689b392c2ba02f3ab8186c914d84d6bd896bdef5181a15a9463df", size = 7192 }, + { url = "https://files.pythonhosted.org/packages/46/1f/5c15023665cc0476cdd7cbc054d5b06489fc09990f068768ed2fda8a02a2/pyobjc_framework_CoreAudioKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ccf2d92052a446d1d38bfd7eaa1dcd2451d59c37e73070a9a1fee394a532d9d", size = 7214 }, + { url = "https://files.pythonhosted.org/packages/fd/a5/c3340b72113d2d718c43a7fc534cbd99f5a9f4e092eb838f028cd99f7af6/pyobjc_framework_CoreAudioKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c2f61535c27d8dd84a00ce34ce556b5b31b4aa6399881ddc596e9e281c832eb", size = 7219 }, + { url = "https://files.pythonhosted.org/packages/6c/46/4a41d71ee6f91cf7dd355661472f8244e4b262281c2af627a57b108178f9/pyobjc_framework_CoreAudioKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:64f4928a4e7eae08f27650ec03a932ab7f350ba623089c4ff169968ca8f03cef", size = 7453 }, +] [[package]] name = "pyobjc-framework-corebluetooth" @@ -1955,6 +2082,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/74/66a62a36da9db5924ee15de6fe1eb544930609b307b3bfbc021b5cf43781/pyobjc_framework_corebluetooth-11.0.tar.gz", hash = "sha256:1dcb7c039c2efa7c72dc14cdda80e677240b49fa38999941a77ee02ca142998d", size = 59797 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/a8/df866e8a84fd33d29af1ee383f13715bbd98ad67d5795dfb276a3887560f/pyobjc_framework_CoreBluetooth-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:044069d63447554ba2c65cb1bf58d489d14ea279344810386392e583a2e611ef", size = 13683 }, + { url = "https://files.pythonhosted.org/packages/44/fa/ad2165bc93c9d3fb174a0d8d5a4db3a7dfcf4dcaeca7913d59748ef62fdb/pyobjc_framework_CoreBluetooth-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bae8f909512d014eed85f80deae671185af4bb5a671fba19f85c7b4c973b61bb", size = 13713 }, + { url = "https://files.pythonhosted.org/packages/5e/85/b20d13b06a014150f6d1e57760fb4dce8095bfce8d737326b327e910e8b3/pyobjc_framework_CoreBluetooth-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:decea3e8177f4c1e543e70b73663c31d1f77e19ec32ca57be7a8f48cd64000aa", size = 13727 }, + { url = "https://files.pythonhosted.org/packages/87/65/0635e1a84d4cdb3f091b0b94e8d251505c00572ac773338d4f4147cb438d/pyobjc_framework_CoreBluetooth-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4f8a2def00fac1535a39df633939a895f004649f3ae80f04ed5037256ca17e7e", size = 13929 }, +] [[package]] name = "pyobjc-framework-coredata" @@ -1965,6 +2098,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/84/22/6787205b91cb6d526b6b472ebaa5baff275200774050a55b4b25d2bd957a/pyobjc_framework_coredata-11.0.tar.gz", hash = "sha256:b11acb51ff31cfb69a53f4e127996bf194bcac770e8fa67cb5ba3fb16a496058", size = 260029 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/b0/32c23ee168e5081391daa8737fddde79670b083e948dffb8d74308f1dd43/pyobjc_framework_CoreData-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74ac5e7658df10544708f6017a8823a100fbe41dc3aa9f61bf2fd4f8773c3dd7", size = 16194 }, + { url = "https://files.pythonhosted.org/packages/6a/9e/39ca8124c6d87dc6fa85bcf850a2c23a062a408a26300062041c10363a3f/pyobjc_framework_CoreData-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c23b8c9106b0ec6f43aca80d2b2e0b0cc8fcb4ba78db4ae3c1f39a67464357d7", size = 16208 }, + { url = "https://files.pythonhosted.org/packages/67/d6/c2f4a028c67d0dbebfcd5f11195c6c92c422ed440c64c2ed3e4ca2e2c09b/pyobjc_framework_CoreData-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:51e27c316de5da89159b033fe48c95892f2a85e1d3caea02a6a949ad4d52b14c", size = 16220 }, + { url = "https://files.pythonhosted.org/packages/19/24/7fb96f62c615f93224662b04929451a9f90f1713e10eda995ddb5f1801f1/pyobjc_framework_CoreData-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0453eb20b6f367b5c339ca42bd80031bf694e0c3422c892b28b1b02585f863cd", size = 16428 }, +] [[package]] name = "pyobjc-framework-corehaptics" @@ -1989,6 +2128,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/2d/b21ca49a34db49390420a9d7d05fd9eb89850dbec0a555c9ee408f52609c/pyobjc_framework_corelocation-11.0.tar.gz", hash = "sha256:05055c3b567f7f8f796845da43fb755d84d630909b927a39f25cf706ef52687d", size = 103955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/99/c7844f6e583f4764c6fab4a5b5ad9e949c6fce8c30f95226118bead41e01/pyobjc_framework_CoreLocation-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:046f211a23de55364c8553cfd660dc5adeff28af4d25f5ed9b5a8bfa83266b4d", size = 13075 }, + { url = "https://files.pythonhosted.org/packages/88/6b/bb4fbcd259404fb60fdbfecef3c426dc23da5a0f0bc5bf96a4169b047478/pyobjc_framework_CoreLocation-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9bca9974f143bc9e93bd7ec4ef91655964d8ad0ca5ffccc8404fb6f098fa08dc", size = 13076 }, + { url = "https://files.pythonhosted.org/packages/70/a2/7f0d6fa446775d1cb907be9ae8493587cde90bfd0d7b339a28678061fa69/pyobjc_framework_CoreLocation-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6d204014175ae21250bc289cbfe76eaf1a6c4938cfbb17b2c810ae1c548312cd", size = 13095 }, + { url = "https://files.pythonhosted.org/packages/f7/89/88d858efd81b4eb6aafefe42222320ba306c2c0aed8a817bba3ec4035e22/pyobjc_framework_CoreLocation-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cf3c92b30662e72204a841b2efecc6faf26a58e091c8f46999aa3bbd102ca59d", size = 13305 }, +] [[package]] name = "pyobjc-framework-coremedia" @@ -1999,6 +2144,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/02/60/7c7b9f13c94910882de6cc08f48a52cce9739e75cc3b3b6de5c857e6536a/pyobjc_framework_coremedia-11.0.tar.gz", hash = "sha256:a414db97ba30b43c9dd96213459d6efb169f9e92ce1ad7a75516a679b181ddfb", size = 249161 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/b3/7baca352ddd7256840a4eb8f38fda39bc2e023b222b86d11c1a77cc0a8fa/pyobjc_framework_CoreMedia-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:057e63e533577fe5d764a5a9d307f60e8d9c58803112951ace42183abe9437e3", size = 29422 }, + { url = "https://files.pythonhosted.org/packages/68/73/7ed3eba9c5a4a2071c3a64d6b1388d13474ad8d972529f3d5c950942513d/pyobjc_framework_CoreMedia-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:afd8eb59f5ce0730ff15476ad3989aa84ffb8d8d02c9b8b2c9c1248b0541dbff", size = 29297 }, + { url = "https://files.pythonhosted.org/packages/1c/ac/26b33f7d2386d9a04dfc1697bb2c0b4f6701c8d5fa8ece68162ffbee7049/pyobjc_framework_CoreMedia-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:88b26ca9a1333ddbe2a6dfa9a8c2d2be712cb717c3e9e1174fed66bf8d7af067", size = 29313 }, + { url = "https://files.pythonhosted.org/packages/3b/cf/1c9adaf313312eb0996b1afe7bcf412231d5724aaea0a6b668bcdec5de84/pyobjc_framework_CoreMedia-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ab18a7fbc5003e0929fc8380f371bb580e6ecd6be26333bf88b4a7f51a9c0789", size = 29450 }, +] [[package]] name = "pyobjc-framework-coremediaio" @@ -2009,6 +2160,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a1/59/904af57d302caa4c20d3bfebb9fb9300ccc3c396134460821c9f1e8ab65b/pyobjc_framework_coremediaio-11.0.tar.gz", hash = "sha256:7d652cf1a2a75c78ea6e8dbc7fc8b782bfc0f07eafc84b700598172c82f373d8", size = 107856 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/02/09fda96c4727ff0c632c3cf4b09faa5b82be9f18422860dd80b5bc676ae1/pyobjc_framework_CoreMediaIO-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4182b91c72923d5c4d52eca3c221cc6f149d80a96242c0caab1d5bc9ccbcbbb", size = 17492 }, + { url = "https://files.pythonhosted.org/packages/3f/db/a7b11cbf7d31964a65c5593ac30a02b0db35260845431046d467b08fc059/pyobjc_framework_CoreMediaIO-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ad1e0f74126b6c6d25017e4ba08f66fe5422c902060d64b69e06a0c10214355", size = 17534 }, + { url = "https://files.pythonhosted.org/packages/f9/12/2fb073cde11d209bef38bfc88a1f65a795edc0e40b1f9f55102eeb7ac314/pyobjc_framework_CoreMediaIO-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:80375bcddf98ac1affba62731e8f6036a5881a9fad881ada4dffa30650ba4ac3", size = 17543 }, + { url = "https://files.pythonhosted.org/packages/61/49/a551c1ec660282e3cc8d7da8694faa9167254e455dd659fc4d7a5b4752de/pyobjc_framework_CoreMediaIO-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3afe4318488cc88843ae4f3914317aede9b9e274c5336fdb733a6a22868a0aa4", size = 17885 }, +] [[package]] name = "pyobjc-framework-coremidi" @@ -2019,6 +2176,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/90/d004cdf4c52b8b16842e15135495de882d743b4f0217946bd8ae1a920173/pyobjc_framework_coremidi-11.0.tar.gz", hash = "sha256:acace4448b3e4802ab5dd75bbf875aae5e1f6c8cab2b2f1d58af20fc8b2a5a7f", size = 107342 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b9/c67886891ad3cd21107cf1e65f1431cbdcff33acd74bf55ad3d6e10f3adf/pyobjc_framework_CoreMIDI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:78dec1bcd253a0385ac0b758a455e2a9367fc3cb9e2306d410c61bafa8d4c2eb", size = 24314 }, + { url = "https://files.pythonhosted.org/packages/c0/7a/0639bc1ac35373b68f0f15fbcb9bb4f317cc4452997ea8e611ce79f623e9/pyobjc_framework_CoreMIDI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:97158830d76b999255d87191f31624d4373ee8ff662af4f4376c584cfb805573", size = 24346 }, + { url = "https://files.pythonhosted.org/packages/3f/70/dadb58033fcedb3e328c282caca1be810753aeb1ed0a278911043b903dc2/pyobjc_framework_CoreMIDI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b636bfc7eddd843bdd45dc1445121970d34d4851ef110b8ac138b369eebc3fd5", size = 24367 }, + { url = "https://files.pythonhosted.org/packages/7e/6b/85a15fc3c76d5e41a9f3c68611efb2bcf9458d98001c4770a7f1cad11d1f/pyobjc_framework_CoreMIDI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:140d4b664e2e50c1400e9bc0bdc9fc907d9c3d703c62fe280fad1c4a6b218402", size = 24607 }, +] [[package]] name = "pyobjc-framework-coreml" @@ -2029,6 +2192,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/64/4f0a990ec0955fe9b88f1fa58303c8471c551996670216527b4ac559ed8f/pyobjc_framework_coreml-11.0.tar.gz", hash = "sha256:143a1f73a0ea0a0ea103f3175cb87a61bbcb98f70f85320ed4c61302b9156d58", size = 81452 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/dc/334823bb3faa490259df7611772e804eb883c56436fc69123e8a3a5ba0ea/pyobjc_framework_CoreML-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e290ad9c0ac5f057ce3885d35e33fadc115f59111f2e04f168c45e2890cb86e8", size = 11320 }, + { url = "https://files.pythonhosted.org/packages/90/9f/3d053b95fbeeaf480d33fcc067504e205049591f6bee17e3a700b988d96c/pyobjc_framework_CoreML-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:48320a57589634c206d659799284a5133aaa006cf4562f772697df5b479043e4", size = 11321 }, + { url = "https://files.pythonhosted.org/packages/5c/c3/087296d83d33d19118b9e8605555b01b0fb00c27a9a68c515bf2cee8404d/pyobjc_framework_CoreML-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cc73c6a2a3dd4181b679c12b83066e3a36e9b4213626821633f87ce5be4ad29d", size = 11338 }, + { url = "https://files.pythonhosted.org/packages/82/5b/75b9e0eddf8018be00babb75dfd45cb0023cd7186ac177fe2cf5c00521b3/pyobjc_framework_CoreML-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:45fd15a483f9c4c408da005e3b2816a71112050de2a666cb9a4de20518eb3aca", size = 11804 }, +] [[package]] name = "pyobjc-framework-coremotion" @@ -2039,6 +2208,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/79/5c4ff39a48f0dc0f764d1330b2360e9f31e3a32414e8690e7f20e4574e93/pyobjc_framework_coremotion-11.0.tar.gz", hash = "sha256:d1e7ca418897e35365d07c6fd5b5d625a3c44261b6ce46dcf80787f634ad6fa5", size = 66508 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/35/da29fd7350cd68bfe70f30a9e03e1350d7363c7c4fcdb5b0cd16f4bb47e2/pyobjc_framework_CoreMotion-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8e32de44e30028500e4d17c114eea69e7e74e5ae7aef6c208edc5bac34dfc21e", size = 10229 }, + { url = "https://files.pythonhosted.org/packages/ca/f6/8061b58f0f3e1daf34c19511f0eeefe4ad66d10d1994b84d7fa3733b7852/pyobjc_framework_CoreMotion-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:697a3121615e95e56808f388b0882217a50e5ff6b459eccae93f2809d5ea4389", size = 10250 }, + { url = "https://files.pythonhosted.org/packages/5d/2e/e96a4b3be4bfd86255b49405a16aa95b69f68967413041c85c1bfcbfc0e5/pyobjc_framework_CoreMotion-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0b4b8c62e330c3d9b25fefc08e0f79b28d3966a0d57dde5b7e664c67db5b6f8", size = 10272 }, + { url = "https://files.pythonhosted.org/packages/57/11/669b363d3bb6a11e576c11f1b6596f8ec278bbeaad61d49c746e0dbb783a/pyobjc_framework_CoreMotion-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:07c2dc57b96541dc4f2a4ec87d0fc6fc77fc9a0e861335fc84f24d42ccbbbebb", size = 10479 }, +] [[package]] name = "pyobjc-framework-coreservices" @@ -2050,6 +2225,12 @@ dependencies = [ { name = "pyobjc-framework-fsevents" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ca/b5/19c096b9938d6e2fdb1b436f21ad989b77dbeb4e59b3db4bd344800fa1e8/pyobjc_framework_coreservices-11.0.tar.gz", hash = "sha256:ac96954f1945a1153bdfef685611665749eaa8016b5af6f34bd56a274952b03a", size = 1244406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/cc/3899a59ed62fa36d2c1b95b94ff52e181ac48fde4011b68ca6abcbddd47a/pyobjc_framework_CoreServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7538ca6e22f4da0c3a70ddd9781f9240a3fe2fd7a7aa4dfb31c31f2532f008e", size = 30258 }, + { url = "https://files.pythonhosted.org/packages/82/7b/8e059764951d0414f053bfebb6b1fba803a3b14397755cfd388b0a6363a7/pyobjc_framework_CoreServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3b175b5aa7a78484fd07b93533174b125901a6b791df2c51e05df1ea5d5badab", size = 30250 }, + { url = "https://files.pythonhosted.org/packages/8c/8f/e5176039969b3fe440d381f6110ac9d5675e20b8fedbe25a3c4056db241d/pyobjc_framework_CoreServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:29ce564e55411f78a27d004eeec2abe7a278e3577511dca2bb54351df8d62312", size = 30270 }, + { url = "https://files.pythonhosted.org/packages/99/1e/1291688e4f8ea9767c9ffd2ff43ae3098c08e6d20fa1c19ebd07960887ce/pyobjc_framework_CoreServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:eee78170f1bf89bfde6f9765a21c4a0347d88cfc964d1600f486a0bbf8c6b1ba", size = 30355 }, +] [[package]] name = "pyobjc-framework-corespotlight" @@ -2060,6 +2241,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/6a/6707d7ef339b9ad2dd0994d1df42969ee3b231f2d098f3377d40aed60b4f/pyobjc_framework_corespotlight-11.0.tar.gz", hash = "sha256:a96c9b4ba473bc3ee19afa01a9af989458e6a56e9656c2cdea1850d2b13720e6", size = 86130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/f1/54f9522d7f6ec7a6618c86abe0236869f61dd371b49df02dff7930433656/pyobjc_framework_CoreSpotlight-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:551878bfb9cc815fe2532fdf455f500dda44f8cd203dd836a6f1eb5cc0d49a9a", size = 9579 }, + { url = "https://files.pythonhosted.org/packages/6c/24/dae8d0be7cb90328a8c1100c454e52faef95acc59940796f530b665b9555/pyobjc_framework_CoreSpotlight-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b0c595d0a422a0f81008df93a0a2b38a1fd62434c6f61e31f1dceec927803b80", size = 9597 }, + { url = "https://files.pythonhosted.org/packages/24/7a/fe730e86ddb70d717580010fcbdebc041049760fa963dde3ad425ab3f7d4/pyobjc_framework_CoreSpotlight-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c4538bf053bf3fefa0dd4d572dbcf7b55e4a651b29859a10a51b5e83841621cf", size = 9608 }, + { url = "https://files.pythonhosted.org/packages/a2/49/122013c3233a016b83dea139641377028f3c4a0e38cc65e48a501ab40a4f/pyobjc_framework_CoreSpotlight-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7377286386e6b81ba8d92d9abf96fa5053d6136c8283b80620ecff2738c47ef5", size = 9837 }, +] [[package]] name = "pyobjc-framework-coretext" @@ -2071,6 +2258,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/e8/9b68dc788828e38143a3e834e66346713751cb83d7f0955016323005c1a2/pyobjc_framework_coretext-11.0.tar.gz", hash = "sha256:a68437153e627847e3898754dd3f13ae0cb852246b016a91f9c9cbccb9f91a43", size = 274222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/20/b8a967101b585a2425ffe645135f8618edd51e1430aeb668373475a07d1f/pyobjc_framework_CoreText-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56a4889858308b0d9f147d568b4d91c441cc0ffd332497cb4f709bb1990450c1", size = 30397 }, + { url = "https://files.pythonhosted.org/packages/0d/14/d300b8bf18acd1d98d40820d2a9b5c5b6cf96325bdfc5020bc963218e001/pyobjc_framework_CoreText-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb90e7f370b3fd7cb2fb442e3dc63fedf0b4af6908db1c18df694d10dc94669d", size = 30456 }, + { url = "https://files.pythonhosted.org/packages/94/f0/53b681481e9429e8f9ac2c039da6a820d7417ca92f763f01d629db36c530/pyobjc_framework_CoreText-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7947f755782456bd663e0b00c7905eeffd10f839f0bf2af031f68ded6a1ea360", size = 30453 }, + { url = "https://files.pythonhosted.org/packages/2a/3f/a6d09952e83d70be6d337a5f1d457018459a57a110a91c3e771a2f2a7de0/pyobjc_framework_CoreText-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5356116bae33ec49f1f212c301378a7d08000440a2d6a7281aab351945528ab9", size = 31092 }, +] [[package]] name = "pyobjc-framework-corewlan" @@ -2081,6 +2274,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2e/a9/cda522b270adb75d62bae447b2131da62912b5eda058a07e3a433689116f/pyobjc_framework_corewlan-11.0.tar.gz", hash = "sha256:8803981d64e3eb4fa0ea56657a9b98e4004de5a84d56e32e5444815d8ed6fa6f", size = 65254 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/e7/a869bf3e8673c8fdf496706672dac77fc305493db3c1057e3ca5f8d49c3f/pyobjc_framework_CoreWLAN-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4384ba68d4beb4d610ca0d661593e16efe541faf1790222b898b3f4dd389c98a", size = 9895 }, + { url = "https://files.pythonhosted.org/packages/7c/d7/87626e23f010aa865eef10c796d1d87ddd87b78656f4e4ef0e808c8268f7/pyobjc_framework_CoreWLAN-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5f5c365f6ebdae4a87d534cf8af877a57d2aabe50fe5949a9334e75173291898", size = 9917 }, + { url = "https://files.pythonhosted.org/packages/3f/9e/87e5a0da9bd75e337b6de06fcfebf6e17af68321f251106cfbe917e41767/pyobjc_framework_CoreWLAN-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1724a36219ff649da11aa5dffd93a604cef121df2ce24026a885065973f123d5", size = 9932 }, + { url = "https://files.pythonhosted.org/packages/f0/f5/77972b0bfb1a19643d5a6fce07a1e7e4b7b186256f026e0530660e935b71/pyobjc_framework_CoreWLAN-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:89e3a27291c5cb61d31adff970a46b34b33d7cf6d9ce6c7c55e3b5e8a170081c", size = 10155 }, +] [[package]] name = "pyobjc-framework-cryptotokenkit" @@ -2091,6 +2290,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b8/72/b871fa5476479e4a22a4a0e971fb4724b0eb94c721365539ad55f4dc3135/pyobjc_framework_cryptotokenkit-11.0.tar.gz", hash = "sha256:a1bbfe9170c35cb427d39167af55aefea651c5c8a45c0de60226dae04b61a6b1", size = 58734 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/60/ddf022ce94f829a605992f11b9bfa861d7a1579f794e03d969c209d0de2a/pyobjc_framework_CryptoTokenKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3c42620047cc75a749fbed045d181dc76284bc27edea904b97df1ad82c2fdafc", size = 12949 }, + { url = "https://files.pythonhosted.org/packages/d7/2d/9641cae1800281faace48698646f71c3de23ea1343031c12f6637d31e6f1/pyobjc_framework_CryptoTokenKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:95b05efb06b09987e23fb62dc3af378f38cfd0bd5872940cd95cf0f39dac6a57", size = 12978 }, + { url = "https://files.pythonhosted.org/packages/7e/dc/f5f73fd17d4d59e642d22e4a664b4b9a2409e25d6202758bbffb6b8b3b42/pyobjc_framework_CryptoTokenKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:94dad5e8ec40a8d36edcb0e6a63e0311041c151fd7457a0995ef4512b1fc2a52", size = 12987 }, + { url = "https://files.pythonhosted.org/packages/7d/44/92db6a59c53564d531c12ff821b8e5d816be6258b29a7cfd8db895a0ee2b/pyobjc_framework_CryptoTokenKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1814fe5612e03ce797ca1400f44c6ae0619725c51ad0096e392896e0af4606ec", size = 13201 }, +] [[package]] name = "pyobjc-framework-datadetection" @@ -2157,6 +2362,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/cc/f36612b67ca1fff7659d7933b563dce61f8c84dad0bf79fab08bb34949ad/pyobjc_framework_discrecording-11.0.tar.gz", hash = "sha256:6bdc533f067d049ea5032f65af70b5cdab68673574ac32dacb46509a9411d256", size = 122426 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/0b/fbe460ccddb4c613eb04e2b81cc9c75b0e0c407fd9fb91776381416f99af/pyobjc_framework_DiscRecording-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eab79d83c2d974aa5564f3f6f4415218573dca69010026d2d000d232494a9d81", size = 14491 }, + { url = "https://files.pythonhosted.org/packages/10/6f/c4c220d979771f4d7782deddef5ea9026baa177abe81cbe63d626a215de7/pyobjc_framework_DiscRecording-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e309e7394aed23d6ccce2e035f23c0c015d029c2ad531c6b1dce820b7eea8512", size = 14505 }, + { url = "https://files.pythonhosted.org/packages/f1/66/7bcfc4f9a66f7340b044500df5dba7d7d4dd358e2dca3ad1a44c898c261b/pyobjc_framework_DiscRecording-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:30cb13dfa363de900f53a675b8700d81433602ab42f2850b6122d67445349735", size = 14519 }, + { url = "https://files.pythonhosted.org/packages/08/ac/3d36e4daca56cbfa316ec3cdd2dc1774df89ed417f725849cbaf66b2df10/pyobjc_framework_DiscRecording-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:de401e471aa99cb253b905d81a27054d9bc0a935647dc5451bf0565ab040dd97", size = 14736 }, +] [[package]] name = "pyobjc-framework-discrecordingui" @@ -2252,6 +2463,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/98/803e3cb000dac227eb0d223802a0aeb052d34a741e572d9584e7d83afca7/pyobjc_framework_extensionkit-11.0.tar.gz", hash = "sha256:82d9e79532e5a0ff0eadf1ccac236c5d3dca344e1090a0f3e88519faa24143c7", size = 19200 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/1d/ed580ce024d7e9a1ea88ee592d03b34f0b688414793bf8b7be5a367ecea8/pyobjc_framework_ExtensionKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98957dd51f0a4e02aa3d9d3a184f37ca5f99f4cb9e11282a2fc793d18de02af8", size = 7781 }, + { url = "https://files.pythonhosted.org/packages/fd/9e/a68989bf7bbba7b5fb1ade168d2179e37164439daaad63a27ccb790a6593/pyobjc_framework_ExtensionKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e341979ee4a7fc5978fe44d6d1d461c774411042cac4e119a32704d6c989de6f", size = 7783 }, + { url = "https://files.pythonhosted.org/packages/72/fb/c05dbc1332a542f23bf97bb17b29386f334b6c609642f384838033884012/pyobjc_framework_ExtensionKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:13b2120eb4f9456af9c6eebbe9e5b72aa00e5393b818af6195c312b86dc47e85", size = 7808 }, + { url = "https://files.pythonhosted.org/packages/c4/69/cd650abea2aeded38ee5113cbc32220c36d41723051517644895af669e7f/pyobjc_framework_ExtensionKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e14f1f262d9b639a96ab700d72c16fe6f4eed084e1122db3404052e225a010bc", size = 8024 }, +] [[package]] name = "pyobjc-framework-externalaccessory" @@ -2262,6 +2479,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/67/b0/ac0a02fe26e66c33fee751a65c1ed06bbd2934db8636e08bb491e8334bad/pyobjc_framework_externalaccessory-11.0.tar.gz", hash = "sha256:39e59331ced75cdcccf23bb5ffe0fa9d67e0c190c1da8887a0e4349b7e27584f", size = 22577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/96/bddfe9f72a59a3038ec3208a7d2a62332d5e171d7e3c338ccff6bd6e76b8/pyobjc_framework_ExternalAccessory-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:319f66edb96505f833fe7fe9ba810cb3b0d0c65605b8674bea52f040e8caebd6", size = 8785 }, + { url = "https://files.pythonhosted.org/packages/e7/e2/26e9cbb18723200ef71580e46c46f037b7feecc07cf50051cd6fcb426472/pyobjc_framework_ExternalAccessory-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:aaae920c9241d1b35a58ba76dba761689b248250d782179526f6dea151b1fda0", size = 8808 }, + { url = "https://files.pythonhosted.org/packages/d6/f6/5916df379f2b01393ccf3aaeefa75bfd13f29fc9108525d872c11b31a203/pyobjc_framework_ExternalAccessory-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:38f8865c69b23e2eb69cb61244e79c18e03b70c4c816fed27b47409f1295f38f", size = 8822 }, + { url = "https://files.pythonhosted.org/packages/fb/fe/f844e2020829f6024f3e34684dd497e99349807cbe922058dbb30168ef5d/pyobjc_framework_ExternalAccessory-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:67c6873354be1b3bb00c4ff6a68b42b79f114c5625f2cbb2f0a6bbe59f847f01", size = 9033 }, +] [[package]] name = "pyobjc-framework-fileprovider" @@ -2272,6 +2495,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/44/fc/b8593d8645b9933e60a885f451d0c12d9c0e1b00e62121d8660d95852dff/pyobjc_framework_fileprovider-11.0.tar.gz", hash = "sha256:dcc3ac3c90117c1b8027ea5f26dad6fe5045f688ce3e60d07ece12ec56e17ab3", size = 78701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/57/1f959ec54650d1afc08e89d2995a1534f44229b1371cf66429a45b27c32d/pyobjc_framework_FileProvider-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c7e803a37f7327c191a4de7dbb36e5fbf8bd08dadbcc7f626e491451c7a3849", size = 19179 }, + { url = "https://files.pythonhosted.org/packages/30/79/ff4dfe06eb43c97bd723f066ef2b92b00b1020206b4dcc5abe9b49746cad/pyobjc_framework_FileProvider-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d7acdc5e0f4b5488bcbf47d3eea469b22897a4b783fe3f5d4b2b1f3288e82038", size = 19154 }, + { url = "https://files.pythonhosted.org/packages/d3/55/05c4dec41721ec76ee0331e3877dab5d12c0268a5f2c4085a8388756c16d/pyobjc_framework_FileProvider-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:97b2899160dddc013083344ae0b6b6955269b96105fa3df18cbe16f83592290e", size = 19165 }, + { url = "https://files.pythonhosted.org/packages/fa/5f/865acfd88285dd122d8debdf0cc1c7418e1abfa562ade1140f0448f15e88/pyobjc_framework_FileProvider-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:248f7aaa4985944fac066554041ada3b8561954cd97454707358a8eea44ec238", size = 19445 }, +] [[package]] name = "pyobjc-framework-fileproviderui" @@ -2310,6 +2539,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/82/37/4c09cc7b8678e2bb5b68ebc62e817eb88c409b1c41bdc1510d7d24a0372d/pyobjc_framework_fsevents-11.0.tar.gz", hash = "sha256:e01dab04704a518e4c3e1f7d8722819a4f228d5082978e11618aa7abba3883fe", size = 29078 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/8a/75fd630865c9f9d69b1364208582872fc818b4c1a70fd9ae85a5cf7a2c5a/pyobjc_framework_FSEvents-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0b3c7835251a35453e3079cf929b9e5329d02e2f4eaac2ebabbe19e1abd18ab", size = 13209 }, + { url = "https://files.pythonhosted.org/packages/19/c6/cae1a6a96ad493339e9f0f175bcf18c1526abe422b63309d873acd663dc2/pyobjc_framework_FSEvents-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb8a5a7f7b5a70e15dae80672f10ecc16b5d1c1afe62ad2ccadb17a8098876cd", size = 13274 }, + { url = "https://files.pythonhosted.org/packages/de/d1/1caeef1f358c6b6256565c615a19c7534c2885f0e6e7bc53a16b024b9ee7/pyobjc_framework_FSEvents-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d203f3ca8a86235412d434421f2cec2f98c8379e9091bed9bf28321c6c416693", size = 13280 }, + { url = "https://files.pythonhosted.org/packages/5b/b3/d4e34ce35e7f63763f1d3b26aacc05f74b810d7694cf7bf430b892199343/pyobjc_framework_FSEvents-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1240e1be678b3bed9ca091935cf922e44399a304cbbbb93967759b404b61d826", size = 13753 }, +] [[package]] name = "pyobjc-framework-gamecenter" @@ -2320,6 +2555,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7f/3b/e66caebc948d9fe3b2671659caab220aff6d5e80ac25442d83331b523d23/pyobjc_framework_gamecenter-11.0.tar.gz", hash = "sha256:18a05500dbcf2cca4a0f05839ec010c76ee08ab65b65020c9538a31feb274483", size = 31459 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/7e/8a41ab9880e415143baf771d55566e2a863ec538837480a5ee17e1ddc08b/pyobjc_framework_GameCenter-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8bff2a36cf3cb52cbe321203147766e95997f881062143171cdd8ef2fde9e53", size = 18472 }, + { url = "https://files.pythonhosted.org/packages/c4/78/846aa21be2303cba955aaf781a362504a722183b8f6a030ba02f2b2073ad/pyobjc_framework_GameCenter-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de57380e3b51579a6e8bc397c2bb5be5d0f6dcd4bf5abed587700cf7f57afd4", size = 18437 }, + { url = "https://files.pythonhosted.org/packages/37/65/40fad1b1ea83d4c7b97492a96a155b3f0d359e10703520f1e2b395b3e640/pyobjc_framework_GameCenter-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b392e06132091bd976926f89ebbeb9c433c344426b288e5fe787d15668983926", size = 18451 }, + { url = "https://files.pythonhosted.org/packages/72/45/41a755d07b6908196d036814557c658113cf54864169be728612805e7bb0/pyobjc_framework_GameCenter-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4282b65e0446e5145b7afa4857856d9aec1b0a7893e0ac471c97b680746329cb", size = 18757 }, +] [[package]] name = "pyobjc-framework-gamecontroller" @@ -2330,6 +2571,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fa/30/02ca5a4fb911acf3e8018abcbd29631a842aeac02958ae91fab1acb13ad1/pyobjc_framework_gamecontroller-11.0.tar.gz", hash = "sha256:6d62f4493d634eba03a43a14c4d1e4511e1e3a2ca2e9cbefa6ae9278a272c1d0", size = 115318 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/ec/05f356ab2d747a385c2a68908f2f67ee1b1e7a169b1497b0771b2226a174/pyobjc_framework_GameController-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:30e8f251be49ff67491df758c73149e7c7e87bee89919966ed1b2bf56fdaacf7", size = 20995 }, + { url = "https://files.pythonhosted.org/packages/66/b3/38319c9232e3508297bfedde700b125676845b1e27afe2bb681e8829f34a/pyobjc_framework_GameController-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:46403f23aaaf6a2e1a51e3954c53d6e910b80058117fdcf3a0a8100f25e30f07", size = 20919 }, + { url = "https://files.pythonhosted.org/packages/e1/98/44367d1c0b4301007cfc6c25b8403ce16061ddfdd3e6cc13ece4c9273c83/pyobjc_framework_GameController-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:928f5c907080050f19d78dc8c1f4835f73ede8cdf1f3c9fbbcf49236077c8c7a", size = 20935 }, + { url = "https://files.pythonhosted.org/packages/cd/83/181a90c01dae832de9c69a099ac2cd872784802687f7ede69df22cb154ed/pyobjc_framework_GameController-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0025d04d8121448b3ace0f925f3ed4989ef8ea311304380ffd9346ae53018317", size = 21242 }, +] [[package]] name = "pyobjc-framework-gamekit" @@ -2341,6 +2588,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3f/df/c161460e5736a34f9b59aa0a3f2d6ad1d1cd9a913aa63c89c41a6ba3b6ae/pyobjc_framework_gamekit-11.0.tar.gz", hash = "sha256:29b5464ca78f0de62e6b6d56e80bbeccb96dc13820b6d5b4e835ab1cc127e5b9", size = 164394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/4d/9fe843671c7b94d8e8a925662775d4b2632c138c6a0a9d1bb2c379f225c0/pyobjc_framework_GameKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dabe856c8638940d2b346abc7a1828cca12d00b47d2951d0ac9f4e27ecc8d3ec", size = 21667 }, + { url = "https://files.pythonhosted.org/packages/98/b2/d4d1f123fead83bf68eb4ecfab2125933f3114eaf2ed420d7bb99238ba67/pyobjc_framework_GameKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:40d506505f71ed57779c8be9b4e07ec9337c45aebe323b3f8dd8f8c75e6fce50", size = 21627 }, + { url = "https://files.pythonhosted.org/packages/82/32/d88d22277e1e21885fd6ade972ff0d3a93e9a54ab15bcdc6275901a50af1/pyobjc_framework_GameKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:669bab8e53610d45eb97d2f46833459568231dae6c3811fd5d12a8c6b43b881c", size = 21637 }, + { url = "https://files.pythonhosted.org/packages/5c/86/c2903b10c4d72929a89301bd0bacd2c2330aecae483a5db119b7def8cbfd/pyobjc_framework_GameKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3043a84f8ad19fa92facab0ca3872de996ebb9fd746290ea5206d5726a0f19a0", size = 21944 }, +] [[package]] name = "pyobjc-framework-gameplaykit" @@ -2352,6 +2605,12 @@ dependencies = [ { name = "pyobjc-framework-spritekit" }, ] sdist = { url = "https://files.pythonhosted.org/packages/41/f0/980c4fc3c594d9726b7eb6ae83f73127b22560e1541c7d272d23d17fdf0d/pyobjc_framework_gameplaykit-11.0.tar.gz", hash = "sha256:90eeec464fba992d75a406ccbddb35ed7420a4f5226f19c018982fa3ba7bf431", size = 72837 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/e7/3530071bf1897f2fe2e5f0c54620f0df9fcac586b9ba6bb5726fc9d295c2/pyobjc_framework_GameplayKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:01f59bbf5beb0cfcfea17011987995f1cccf2ec081d91269f95e71283dd83c67", size = 13381 }, + { url = "https://files.pythonhosted.org/packages/b9/07/075369dd9d4e3849646285d4083a9d28214fdd043b499c7929047b942c7f/pyobjc_framework_GameplayKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f2d56af0a84439b3ddc64cdec90e3fab08b1d43da97bed0fb8d60714f47c4372", size = 13382 }, + { url = "https://files.pythonhosted.org/packages/82/59/8a62581d4dfef1f6028dd97f4a990c234a7d743d6444316084ced3eaa0e3/pyobjc_framework_GameplayKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b9c181babc5cb8b2054bd1243863fb2983bf6e1e5ddb0c00081ce0622ac73dc", size = 13398 }, + { url = "https://files.pythonhosted.org/packages/15/70/bad9f256bfe494605571d2a503ee187fbd317b9271dedefddd1da78b64e1/pyobjc_framework_GameplayKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ccba6c8c976dd1887239a15bcfcbf0a31f51e6a83b66eea28482c32de82101ac", size = 13651 }, +] [[package]] name = "pyobjc-framework-healthkit" @@ -2362,6 +2621,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/2f/d79d2ec7c23bfc94bfaa7b7c6f6487a8bffdb73263eea6900aab56135889/pyobjc_framework_healthkit-11.0.tar.gz", hash = "sha256:e78ccb05f747ae3e70b5d73522030b7ba01ef2d390155fba7d50c1c614ae241f", size = 201558 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/66/36a2fa7ef61b54a8e283355518ed003aa28b26e1dfad9ecbb7f543a08acd/pyobjc_framework_HealthKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ee87453c28bd4040b12a3bc834f0ea1989e331400845a14079e8f4a6ede70aa2", size = 20139 }, + { url = "https://files.pythonhosted.org/packages/5f/fd/95d40483d9d185317adbf8433d0c7e83ba36ec6c5a824159b87160f6cebe/pyobjc_framework_HealthKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:680da6d67b0c79d15e897f1c588a8b02d780573aef3692e982294c43727eecf3", size = 20163 }, + { url = "https://files.pythonhosted.org/packages/35/78/2eb507ca32945a47f4411b8bccfaa36a9779192d62a682e7d23b2f37ced3/pyobjc_framework_HealthKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:80fd61a01df1a232ecfd3ff6c5546b6ba6d70edeb133255f85847da3a55a49be", size = 20177 }, + { url = "https://files.pythonhosted.org/packages/8e/02/3060d1cfa3372501e2cc926e9c66de3a6920727b2fc0f566e20d651368d0/pyobjc_framework_HealthKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:22faf604b95d86de27d0fe57972c26904740a2af139963ce7dc72e9ac8178ede", size = 20406 }, +] [[package]] name = "pyobjc-framework-imagecapturecore" @@ -2372,6 +2637,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/fe/db1fc3ffd784a9010070cd87a05d7fd2542c400395589341fab5970a01e1/pyobjc_framework_imagecapturecore-11.0.tar.gz", hash = "sha256:f5d185d8c8b564f8b4a815381bcdb424b10d203ba5bdf0fc887085e007df6f7a", size = 99935 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/fb/29f20521e0df5da0110f1d6a48e4ed3530a2c0b670bf62d89ceeddd42c18/pyobjc_framework_ImageCaptureCore-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3fd78aa4a69e24caed38ae17a69b973e505324d966df86b47441318800a52db9", size = 16611 }, + { url = "https://files.pythonhosted.org/packages/0e/ce/404666e27318435a0513dcf64b85d7cd99195b2e822e03796b03af549c52/pyobjc_framework_ImageCaptureCore-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5cc6c6acbfca05977adc0e339e1225d5cd314af2fa455a70baebb54f9fb2b64", size = 16636 }, + { url = "https://files.pythonhosted.org/packages/3b/2e/0ca4dcfd97273b6d1af9d7af278d9cbc7ebcee0aee6abb6d134e6477a43a/pyobjc_framework_ImageCaptureCore-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0cb3021833c1de8d7fe756e50a194649a5a437287438ecec67e7d9d80f95b739", size = 16646 }, + { url = "https://files.pythonhosted.org/packages/ca/8e/3dfe5150f6505934dd3b05dcb387779e30badc0d74cfb0e728873ad682dc/pyobjc_framework_ImageCaptureCore-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ea4373763b1316a1acc174763091b4cc0f934953a954e5645f8f5ea55b73bc3d", size = 16857 }, +] [[package]] name = "pyobjc-framework-inputmethodkit" @@ -2382,6 +2653,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e7/e9/13d007285582e598903264a7d25cc6771a2a52d6c2a96a68fe91db0844fb/pyobjc_framework_inputmethodkit-11.0.tar.gz", hash = "sha256:86cd648bf98c4e777c884b7f69ebcafba84866740430d297645bf388eee6ce52", size = 26684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/08/18572def66bf1e0ee6d079b45b34f8b4cbf2ab40b3024c351e4bd83cfa4c/pyobjc_framework_InputMethodKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a58273233e236cb9fa2d8d9295017c6bf26d6f47cc3a5dc9ba81f1c1e64a346", size = 9369 }, + { url = "https://files.pythonhosted.org/packages/9d/c9/7793b0d7b363548e62499660899893dff2953ae3a56aa5080e9b199d1291/pyobjc_framework_InputMethodKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7869db2b08586e97181ec2b60b8f5b9d3a683097bae4ce4bb29dc3c5709c3f13", size = 9390 }, + { url = "https://files.pythonhosted.org/packages/1d/5c/35b9bee77374fb8a5586348574d9d13604d0875c76869abad36ee4e4b741/pyobjc_framework_InputMethodKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e136a3d0dbc6e732614cee4836a7eb6eedbb114b99a27e587e36fd1dc4444a4d", size = 9402 }, + { url = "https://files.pythonhosted.org/packages/97/c8/2765a1a4bd1b4c494661ca4377a202f73d947a7a76dff32065a56eefe6f2/pyobjc_framework_InputMethodKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c6aac278bd85babb77e8e567624bd4a32b645693d0987861968c400806f484fc", size = 9619 }, +] [[package]] name = "pyobjc-framework-installerplugins" @@ -2421,6 +2698,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/56/88/07e47b0c5c46fe97c23c883ae7a053c2ca6f6fd6afe851d1c2c784644f0f/pyobjc_framework_intents-11.0.tar.gz", hash = "sha256:6405c816dfed8ffa8b3f8b0fae75f61d64787dbae8db1c475bb4450cf8fdf6b5", size = 447921 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/2e/cd8a4aa10a1d3808dd6f71195a28906c573345673dd92b774fbb8c93dd75/pyobjc_framework_Intents-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9a445a3d4a0622ebf96c65b0ac0be7cec1e72cf7fd9900cd5ace6acf4e84bce", size = 32021 }, + { url = "https://files.pythonhosted.org/packages/4a/0e/05c457dab601e3eb5ed7243a04fede32423f08dd03a08e988611359d55b4/pyobjc_framework_Intents-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1e148accce2c7c9243ff90ab3f1a200f93d93506da9c3a2cd034fd5579cb839a", size = 32008 }, + { url = "https://files.pythonhosted.org/packages/34/bb/6379401e99ab4d588520a8931feaf0bcc12fb3eb38bd41b1af15b05ef952/pyobjc_framework_Intents-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e80b38b923327e2097007ae56a540ad96635267ff5ed0fbcd2ba47912bde721c", size = 32017 }, + { url = "https://files.pythonhosted.org/packages/e6/93/e02d4ec90a578e2d101e813ee6b8601c43070640a7b673f70decedd9a246/pyobjc_framework_Intents-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6413c851d9e8297e19c90adff64805a12b206f3d8e49b447b13b444271fce7c0", size = 32300 }, +] [[package]] name = "pyobjc-framework-intentsui" @@ -2431,6 +2714,12 @@ dependencies = [ { name = "pyobjc-framework-intents" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ee/96/3b3b367f70a4d0a60d2c6251e4a1f4bf470945ae939e0ba20e6d56d10c7a/pyobjc_framework_intentsui-11.0.tar.gz", hash = "sha256:4ce04f926c823fbc1fba7d9c5b33d512b514396719e6bc50ef65b82774e42bc5", size = 20774 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/19/f32a14585e749258bb945805da93fd71e05534b14e09fab243fb5ec507ff/pyobjc_framework_IntentsUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c677225d38fffc5e00df803f93a6a627c466b35a362ed27173f7901e185882e", size = 8772 }, + { url = "https://files.pythonhosted.org/packages/2f/d4/e81e9cfafef63cef481ab251a961ca98e176ca244be91368e0f6b6fe8793/pyobjc_framework_IntentsUI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b93a1d9594f471596f255db354c13d67caed7aa020afb9f4e69cde2674f4db71", size = 8789 }, + { url = "https://files.pythonhosted.org/packages/e8/b1/d90c7fef92e0d30ff6267600a51fc7db504b90830dcc7f46aebd55094923/pyobjc_framework_IntentsUI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:03aed41572c0a3fd1d52d46a76417c2dc41aaf7757c6a21a20e139a99e93a17b", size = 8808 }, + { url = "https://files.pythonhosted.org/packages/31/69/12a0e8237755f86f9fcb0255c4854ba48c78d058e002ae28a133df8e55b5/pyobjc_framework_IntentsUI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6a77264fb77f769cbcc9d2d3f38324641bdd941e874f6a324e4289fc0c5c714c", size = 9022 }, +] [[package]] name = "pyobjc-framework-iobluetooth" @@ -2441,6 +2730,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1e/46/62913f8e5ac307b154b3dd50a7a0b167c9d7ac2a579223e33208c141c387/pyobjc_framework_iobluetooth-11.0.tar.gz", hash = "sha256:869f01f573482da92674abbae4a154143e993b1fe4b2c3523f9e0f9c48b798d4", size = 300463 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/2e/2037b1c3459008ccdc41d65ab236d7919eed9bbadd0f02f65dc0193bb170/pyobjc_framework_IOBluetooth-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7d2005d3eff2afed4b5930613ae3c1b50004ebabffb86c0d5dd28d54436e16e6", size = 41010 }, + { url = "https://files.pythonhosted.org/packages/2a/52/c266636ff3edc98c1aaf2cc154392876a68d4167bed0351dc2933d5ccc3c/pyobjc_framework_IOBluetooth-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f86d2e675ee2a61ba3d2a446322e918e8ef2dc3e242e893ef81abfc480a6f2c2", size = 41012 }, + { url = "https://files.pythonhosted.org/packages/3a/1f/d6f8c89c1c584a0e5ad2642bd05e714bcbe706341a6b35c65d06cb6a82f7/pyobjc_framework_IOBluetooth-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7235081bce37a8f0f9436180f596f47713d1e2f8b9676a7de6ec8c42236db410", size = 41016 }, + { url = "https://files.pythonhosted.org/packages/68/93/c9f56b9c3a14a08ab09100292054ea240d923d55b4e3db680cd505dcb17c/pyobjc_framework_IOBluetooth-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b7b72125fcab798f45cbf0b9667acba0d26810b0f7513f13b88d34b925806b17", size = 41298 }, +] [[package]] name = "pyobjc-framework-iobluetoothui" @@ -2535,6 +2830,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ab/33/4ec96a9edd37948f09e94635852c2db695141430cc1adc7b25968e1f3a95/pyobjc_framework_libdispatch-11.0.tar.gz", hash = "sha256:d22df11b07b1c3c8e7cfc4ba9e876a95c19f44acd36cf13d40c5cccc1ffda04b", size = 53496 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/1f/f3273cc8261d45a6bef1fa48ac39cd94f6a1e77b1ec70f79bae52ad54015/pyobjc_framework_libdispatch-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cebdc33a1a771c9ab03fe5c8a2b0ed9698804e7bccdbfcd3cc0045c4b4aad4f3", size = 20607 }, + { url = "https://files.pythonhosted.org/packages/32/08/40638a5e916b1b94b4b29abacb18628fd47871d80fdf2fc1ef7216726d29/pyobjc_framework_libdispatch-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:999815af50ad2216e28d76893023b7839b7f1e8f22bcf7062d81d9a51ade4613", size = 15949 }, + { url = "https://files.pythonhosted.org/packages/69/53/280aeaf159210dd34a975748894461e8847820e7513621bfe046f8dd41d6/pyobjc_framework_libdispatch-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3c835fa45044ee9137ae86e377dafbd6fdd7e1b0353bddc321cb1202d1a5f09a", size = 15978 }, + { url = "https://files.pythonhosted.org/packages/fa/4d/d7416fc52d9d0917ca22b1529f9979ee8f7231e47273c5c9a0bb3c7c066c/pyobjc_framework_libdispatch-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ca52baf694725fbcec87c5c7f61e4ace5aa089fbae149b05d86b50cae4ee998d", size = 16324 }, +] [[package]] name = "pyobjc-framework-libxpc" @@ -2545,6 +2846,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/7e/9fa73ce6925db9cfd8a6b45d97943af8fe59f92251e7fd201b6e4608c172/pyobjc_framework_libxpc-11.0.tar.gz", hash = "sha256:e0c336913ab6a526b036915aa9038de2a5281e696ac2d3db3347b3040519c11d", size = 48627 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/c2/b77019e344b3f46ca4169c19e0539cff9586c8db0a97715590696993bd00/pyobjc_framework_libxpc-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5f05f9eb3662df5832ff09ab788d6f6099f4674cb015200db317ea8c69f8c5e8", size = 19683 }, + { url = "https://files.pythonhosted.org/packages/3c/b9/bf34709c2d8f62a029f4c8e7f9a58c6eb5f3a68542cbcd2a15070b66485a/pyobjc_framework_libxpc-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e000cad8588a961a3e6e5016736cd76b5d992b080cfe8b95745691db5a0ce8df", size = 19788 }, + { url = "https://files.pythonhosted.org/packages/48/53/abd0e61e7365594d527eeca58a2fa257437b19e66389977121afdc736661/pyobjc_framework_libxpc-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b569a959f53edef8e05e63ea1998ca7b925568a0d9e181a57ffa2ed213105880", size = 19799 }, + { url = "https://files.pythonhosted.org/packages/9c/4c/3d2bb4637ecdccb4770ebb81eb00d1624511d0b8777fe344a2aa24848c05/pyobjc_framework_libxpc-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a7134b64f113382e90369a8627b72cd1a3aef3acc2fc5634640fafdcbada8d6", size = 20453 }, +] [[package]] name = "pyobjc-framework-linkpresentation" @@ -2571,6 +2878,12 @@ dependencies = [ { name = "pyobjc-framework-security" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ec/b1/bea4b5f8adbb69c0b34eddee63e052f35271cc630db43fbef6873352e21f/pyobjc_framework_localauthentication-11.0.tar.gz", hash = "sha256:eb55a3de647894092d6ed3f8f13fdc38e5dbf4850be320ea14dd2ac83176b298", size = 40020 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/dd/eaa44e4fe3b5c312190c0468afcab0a4372da29535fe9f860b6b9e1e6b4a/pyobjc_framework_LocalAuthentication-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6500bb5b195799d70f2a622d89a9c2531cb13d6afe30916cf073a195dd86eb", size = 10515 }, + { url = "https://files.pythonhosted.org/packages/31/86/f4e913e966a6dbefbaa95aed35e7d235ba2f172d079d3c0b4351a584357b/pyobjc_framework_LocalAuthentication-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c0291e743fb1534c1df900e9adacc809af0651744627ce8ae25cfd021e3db73b", size = 10530 }, + { url = "https://files.pythonhosted.org/packages/97/fb/54799f1f66d9c90014a58c8c59f819667f69a4d5bf7aab60749eb9b912bd/pyobjc_framework_LocalAuthentication-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3dca51a68d1c28f304a6bfad5fa2838fcf25f7c97570a503a31642eda042551", size = 10548 }, + { url = "https://files.pythonhosted.org/packages/85/9a/978cea4f058adf731216fe76b7789d0cf562e7f51865e9c8253eebbd2e13/pyobjc_framework_LocalAuthentication-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:bb19e6d5aac03f3dbf668a0daab1dad0f5d638f337f5a4913f143061e9cb969c", size = 10776 }, +] [[package]] name = "pyobjc-framework-localauthenticationembeddedui" @@ -2612,6 +2925,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/96/7e/ef86c6e218a58bb9497ce9754a77f12ffe01c4b3609279727b7d7e44655a/pyobjc_framework_mapkit-11.0.tar.gz", hash = "sha256:cd8a91df4c0b442fcf1b14d735e566a06b21b3f48a2a4afe269fca45bfa49117", size = 165080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/7e/f0457c7ca001a01f47aa944c1f86a24d2d04db0aa1c19f51cbf77a65cc9b/pyobjc_framework_MapKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:83128d79aa7644e5b966b32346f7da749b1dbb110dadba857b93ecf5663e24e6", size = 23045 }, + { url = "https://files.pythonhosted.org/packages/d5/b0/532b4f57f8783cf6394b17e76174c393d0503ee41e026782a9950bd46279/pyobjc_framework_MapKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e6aa1d00cfe2e02b301467e24ca51e469e9a8a2ec2a9f097b73adca1a5a2a054", size = 23040 }, + { url = "https://files.pythonhosted.org/packages/18/13/627207c039d320d72dbfdc58d8fb3832509351d4f2aa613bf052f51734f9/pyobjc_framework_MapKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:202f5c913f419e315b1a75ba9026c85318cca5b335ead4e6fd7e328e1462227d", size = 23065 }, + { url = "https://files.pythonhosted.org/packages/a9/d9/3416d4425c1b57ad8466a34b851e954ce9530057e149a2ccbd38fe050b7a/pyobjc_framework_MapKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2583b6206be60f26908275035ad41b7d183545b4fc9b5e7e780f24942f1d275f", size = 23280 }, +] [[package]] name = "pyobjc-framework-mediaaccessibility" @@ -2638,6 +2957,12 @@ dependencies = [ { name = "pyobjc-framework-coremedia" }, ] sdist = { url = "https://files.pythonhosted.org/packages/18/1f/e31d9431bc71077b09583ea863b3c91b7de9371d0cc17a8be99be8119daa/pyobjc_framework_mediaextension-11.0.tar.gz", hash = "sha256:ecd8a64939e1c16be005690117c21fd406fc04d3036e2adea7600d2a0c53f4ea", size = 57931 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/94/1e4aa67e424a043dfa886c946bb872f9653cc12ad59bd7c2c24e3d19a4f5/pyobjc_framework_MediaExtension-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f25d674f381bae800761efe1628959293009d287f7127616f75318a87e4543d", size = 39781 }, + { url = "https://files.pythonhosted.org/packages/02/3c/2cbd4498950daadd111639a7b8dea2aaa6825526677b31ae49bc940f1036/pyobjc_framework_MediaExtension-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9a167725f7a6921d446084b132505392bb375a5ef91498f7be5d94c0d48d26ae", size = 39777 }, + { url = "https://files.pythonhosted.org/packages/01/fc/0b91ef8b5b56a90aecacb7055ff2ad402c1f0d76cf9d07753ece4c34ac48/pyobjc_framework_MediaExtension-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0423f7a8b4950798a6b49a9d2106679c094f0e107788fef61ee49b4a2a1952eb", size = 39790 }, + { url = "https://files.pythonhosted.org/packages/0e/34/030fdcd89beae33641c53f6e0212950f52826a330218e036a94df52f82be/pyobjc_framework_MediaExtension-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2c82fc1e9e0c8cd9f0b767abcc95f618eaac79b6af72e42987e05fc09cf43398", size = 40010 }, +] [[package]] name = "pyobjc-framework-medialibrary" @@ -2677,6 +3002,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/da/46/cf5f3bde6cad32f10095850ca44f24ba241d18b26379187c412be1260f39/pyobjc_framework_mediatoolbox-11.0.tar.gz", hash = "sha256:de949a44f10b5a15e5a7131ee53b2806b8cb753fd01a955970ec0f475952ba24", size = 23067 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/d5/ee184e33bd743c363d7ab59d8412289c6ac14c78a035545a067b98704ae2/pyobjc_framework_MediaToolbox-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df09e4db52d4efeafe4a324600b9c5062fd87c1d1217ebec2df65c8b6b0ce9ef", size = 12776 }, + { url = "https://files.pythonhosted.org/packages/e9/a5/c02d2c44ebcd5884d7ccf55c597c0960d14e4e8f386b65dcd76f9f50ec3d/pyobjc_framework_MediaToolbox-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e80e3057f5030fb034ac93c3e891cee346716e1669f280ebbd63ccfa52b2b7ff", size = 12937 }, + { url = "https://files.pythonhosted.org/packages/3c/90/26c5de1d6f6a7fe768c0ca5f52c1f8eaa268671822805cd1e4e451efb22e/pyobjc_framework_MediaToolbox-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95d672dab96a4f171a25e77092a18545973cc6c8a2fcb1cbbf290f7fdd8bc23c", size = 12955 }, + { url = "https://files.pythonhosted.org/packages/95/22/bd6a27b2d4b6d18fb4ac89eddd0c8b67295934b7f4d2ea6c798bb478320a/pyobjc_framework_MediaToolbox-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:300af56eb620870af96cebecbac441be4a65e5092d1848fe46e865380171e6c1", size = 13656 }, +] [[package]] name = "pyobjc-framework-metal" @@ -2687,6 +3018,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/77/e0/a6d18a1183410a5d8610ca1ae6c065b8944586441f8669faee7509817246/pyobjc_framework_metal-11.0.tar.gz", hash = "sha256:cad390150aa63502d5cfe242026b55ed39ffaf816342ddf51e44a9aead6c24be", size = 446102 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/fe/083727028e63ffcf7455d10288df05696737ee74a31decdc671e32624f58/pyobjc_framework_Metal-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ac5f317d52cd7523dea2e172fbe8b03e7452b907da42a0a5e5c5ab427c5e9de", size = 57321 }, + { url = "https://files.pythonhosted.org/packages/78/85/396ad46929ec6e2aa554c29a3fae2f7c7ffb2e1a3fbb9c41948d5a573dc8/pyobjc_framework_Metal-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45802d48d1a35cc66fee08539c8ca9fc6a0dc4ab700cf78a81cf5f8982ed6f5b", size = 57099 }, + { url = "https://files.pythonhosted.org/packages/eb/01/fb4c79da7558694cd22ea93a0e346648fa4249b5ab99e46a6cf5339add68/pyobjc_framework_Metal-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0065909c3bc7b464491fc0ad72c2469c6a1267b87bac5e4b821cf07faa249c18", size = 57122 }, + { url = "https://files.pythonhosted.org/packages/46/da/eda15da1154611923ec7ac3df7e3da2b7c6ea686d75d51070bcfad21c81a/pyobjc_framework_Metal-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:124722569e60458e5f64e2b41028a7229679e1358c55fc95ddd297413f0933f6", size = 57527 }, +] [[package]] name = "pyobjc-framework-metalfx" @@ -2697,6 +3034,12 @@ dependencies = [ { name = "pyobjc-framework-metal" }, ] sdist = { url = "https://files.pythonhosted.org/packages/68/cf/ff9367e4737a12ebd12a17e693ec247028cf065761acc073ebefb2b2393a/pyobjc_framework_metalfx-11.0.tar.gz", hash = "sha256:2ae41991bf7a733c44fcd5b6550cedea3accaaf0f529643975d3da113c9f0caa", size = 26436 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/f1/4140b63b3128cb2f12e136c4158a082ce170e4eb979bccb628768c59fd98/pyobjc_framework_MetalFX-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3a3847812d40cb6bb7a5f0e735f9f28cba83a1e1264d4dafc630ce894e98a20", size = 10308 }, + { url = "https://files.pythonhosted.org/packages/c0/85/460abd4f96a7a3efd36404a480ed4d31a51f4b3ed64dc4595502a5f725c3/pyobjc_framework_MetalFX-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a37dc271513b217fcba4a99c6cd92997ee171b49b974e0a9dd1b35feb32b7109", size = 10338 }, + { url = "https://files.pythonhosted.org/packages/37/48/8df0f0e0959ecdcafbe4c43aef15d52a64484d856260dfb5d9848bc80a1b/pyobjc_framework_MetalFX-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:be3772f0f5581ace7b47b10bdf392fe2c1668193a51bfbe0008d620c6ee31d82", size = 10344 }, + { url = "https://files.pythonhosted.org/packages/6a/64/cdb68414bc334bd02bc363313bd0733c020d57d6221c5a1a5734c1dd9f10/pyobjc_framework_MetalFX-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6769916eb595b7bcf5422064217c242a8df72a5a0c679ae35db45684306d81da", size = 10546 }, +] [[package]] name = "pyobjc-framework-metalkit" @@ -2708,6 +3051,12 @@ dependencies = [ { name = "pyobjc-framework-metal" }, ] sdist = { url = "https://files.pythonhosted.org/packages/92/27/fb3c1b10914abf2ae6682837abf76bcd8cb7af2ba613fbc55fb9d055bb95/pyobjc_framework_metalkit-11.0.tar.gz", hash = "sha256:1bbbe35c7c6a481383d32f6eaae59a1cd8084319a65c1aa343d63a257d8b4ddb", size = 44628 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/e7eb6746d9e1ad0ad08ab0a8ac20d264b049960363a8f28a744d1d9c319c/pyobjc_framework_MetalKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f314478a5d772d2f7b4db09957ecb63acd6e3f0cde8c18b1b6b35caa9ea7def2", size = 8598 }, + { url = "https://files.pythonhosted.org/packages/a6/1c/1ae6d629065e495e8e0b7def36e1d632e461a933f616f9776a914d69b2fd/pyobjc_framework_MetalKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f2d93180e7ac5abd906e492165a72f82d308d68101eadd213bba68a4b1dc4a8", size = 8611 }, + { url = "https://files.pythonhosted.org/packages/34/4c/c40821c37bcf24a880d47a7087549eee0cfd48f699b267ed6a57fb2c56bc/pyobjc_framework_MetalKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fcb411f680485cc7a71838c87154d899ba3d27cde406391a13a054f9dddb8e6", size = 8626 }, + { url = "https://files.pythonhosted.org/packages/76/e2/314b0ad3424529727a8d3d2451103944c004588d00ac0c22b135a6299d3b/pyobjc_framework_MetalKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a2169b9dee9c1201d41a950ac5c5e9c89b53aff88df95895f116193c97f74062", size = 8856 }, +] [[package]] name = "pyobjc-framework-metalperformanceshaders" @@ -2718,6 +3067,12 @@ dependencies = [ { name = "pyobjc-framework-metal" }, ] sdist = { url = "https://files.pythonhosted.org/packages/14/c2/c08996a8c6cfef09fb9e726cc99b0bf3ad0ffcef66d5c2543e6b35dd4e2e/pyobjc_framework_metalperformanceshaders-11.0.tar.gz", hash = "sha256:41179e3a11e55325153fffd84f48946d47c1dc1944677febd871a127021e056d", size = 301444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/e9/3741ac0e745e1014961f12cf967eac1d4ec5b110d3ed13fdf9dd4ce27933/pyobjc_framework_MetalPerformanceShaders-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:460a30ff31f04bbe82bf3304949171e148e3171ba0c0773dd9bfc42dad766d2e", size = 33004 }, + { url = "https://files.pythonhosted.org/packages/39/b4/51434a9a897a47f6a0d1f6079725e3de4dbc75a7004275f116a2043cf80b/pyobjc_framework_MetalPerformanceShaders-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:abd4649de32aedfa45f8535d74227ba3e1411b6426f794026e8426feab43ea8e", size = 33222 }, + { url = "https://files.pythonhosted.org/packages/9b/ef/1ad0c0f39a77ea03d349254ba75ee88a8d9cb8e74a941bcc6a5865e2794a/pyobjc_framework_MetalPerformanceShaders-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:80ae6a6421f37817a7045b547928fd0ff14645970dca867565618d6080b143d0", size = 33249 }, + { url = "https://files.pythonhosted.org/packages/a7/bf/de48e14c4ac6ac5092f593ec1f6fc8beec86ddc934fb6df04b3d9d4011d7/pyobjc_framework_MetalPerformanceShaders-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fabae9ba81bfd0e223737ebff97d40766fcad8274eac2597a8aea58bf32e9c86", size = 33489 }, +] [[package]] name = "pyobjc-framework-metalperformanceshadersgraph" @@ -2742,6 +3097,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/82/605ad654f40ff4480ba9366ad3726da80c98e33b73f122fb91259be1ce81/pyobjc_framework_metrickit-11.0.tar.gz", hash = "sha256:ee3da403863beec181a2d6dc7b7eeb4d07e954b88bbabac58a82523b2f83fdc7", size = 40414 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/1f/cc897b07b3ed96a26a3008f43e0deefaa60e280ac13118a2ff4224fca0d8/pyobjc_framework_MetricKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:422b6ca1f082dae864df8cc4aa0bac3829be95675b72ef63cd3ee00d30966b97", size = 7958 }, + { url = "https://files.pythonhosted.org/packages/19/63/f37010479670958d3c976d007d45107c3fc53b5626586527c6310821e15a/pyobjc_framework_MetricKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b94313601bbf0181c8f75712e82646261ff0e020da5c83d25914952db53a7955", size = 7966 }, + { url = "https://files.pythonhosted.org/packages/7b/91/da59a9258ef01c0a9c46e4a5b11f4f9f886386486a549a98f7ed3ce0668b/pyobjc_framework_MetricKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f5e7bc06977d2b84c5f76a32cfbff6d9833f01650efefe9e6848c36b5777040b", size = 7978 }, + { url = "https://files.pythonhosted.org/packages/c3/6e/d24c4341fac9f9ff7bc6d3d544d8f5ab5ebc20c1a46a297fee5e8b78f672/pyobjc_framework_MetricKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8ef7d2c005f0612f2007b597d0963a09d34e082b18e2350f557de859f40d1a1", size = 8208 }, +] [[package]] name = "pyobjc-framework-mlcompute" @@ -2767,6 +3128,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ca/7c/b75b84d41e7854ffe9c9a42846f8105227a5fd0b02b690b4a75018b2caa3/pyobjc_framework_modelio-11.0.tar.gz", hash = "sha256:c875eb6ff7f94d18362a00faaa3016ae0c28140326338d18aa03c0b62f1c6b9d", size = 122652 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/98/a30e8df5624c7929dfcd9748bf859929e8aa2c7d836efe5888dafc05f729/pyobjc_framework_ModelIO-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c126318b878ffb31c39b0c7c91ca20a3b46c14c18f000e3bfb854e4541fe0147", size = 20715 }, + { url = "https://files.pythonhosted.org/packages/a9/f8/bb4bc635eb16331c20731cae2e495645d0d10e25962451631eb9085a3f85/pyobjc_framework_ModelIO-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a7357f07b77f3ab0a8107d827acdbc3e1fd458ce396335c057930b6a3f225a93", size = 20715 }, + { url = "https://files.pythonhosted.org/packages/e5/1b/b663c8238c497ad6079814feb09c5a77f52d65e2d98d634edb9417a7167d/pyobjc_framework_ModelIO-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3e1f3050eaaa34ce5d97d21c08c8df9d58609e5f2ba5d91edd4eb58af727e305", size = 20729 }, + { url = "https://files.pythonhosted.org/packages/8b/54/a64e45375dc6302e1a314541eb15aced849c707dbde3db4ad4763df1c6a6/pyobjc_framework_ModelIO-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cf218295121f5f2bdbb792a5f846fc8d5a3e9cea9341f33909280a1dab2027af", size = 20998 }, +] [[package]] name = "pyobjc-framework-multipeerconnectivity" @@ -2777,6 +3144,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/14/80/4137cb9751aa3846c4954b3e61f948aae17afeb6851e01194aa50683caef/pyobjc_framework_multipeerconnectivity-11.0.tar.gz", hash = "sha256:8278a3483c0b6b88a8888ca76c46fd85808f9df56d45708cbc4e4182a5565cd3", size = 25534 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/d2/a4144f966cbe998f8da46b936783561bcd3e7e84b8f2dc45eb49ee3f6f21/pyobjc_framework_MultipeerConnectivity-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e338b22f5b0fcb398e316552398c252bedfc3375c058340861eb205e3cdf994e", size = 12423 }, + { url = "https://files.pythonhosted.org/packages/7b/50/ac9213aca34d30993a36525c23d19ba5a568d3ea4e31e3bc2a6940ddafde/pyobjc_framework_MultipeerConnectivity-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:66bef15f5e5afd6b966cdadf2162082b0171f4a45af6d2cb2644f38431011911", size = 12447 }, + { url = "https://files.pythonhosted.org/packages/2e/47/6d6d150c71e0d0878f26b4637c33a96976a1ebd769a7ed8cc00b231e7532/pyobjc_framework_MultipeerConnectivity-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:653dc69491483f225efd4c4c58de07541e0a08c777c671abf27007ab569bf03b", size = 12453 }, + { url = "https://files.pythonhosted.org/packages/b3/35/5795e548aabdee75172e7e90337cbef96300d36eb386bd179421c6d85f15/pyobjc_framework_MultipeerConnectivity-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ed2b49bd63734fae15932e8d5619be33bc8a602426d24e321277e27992486510", size = 12656 }, +] [[package]] name = "pyobjc-framework-naturallanguage" @@ -2815,6 +3188,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/8e/18e55aff83549e041484d2ee94dd91b29cec9de40508e7fe9c4afec110a7/pyobjc_framework_network-11.0.tar.gz", hash = "sha256:d4dcc02773d7d642a385c7f0d951aeb7361277446c912a49230cddab60a65ab8", size = 124160 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/b5/16800524e6d8d99467f53dbafa661abb1405d08d50def7edb933504197a3/pyobjc_framework_Network-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6fc797537690a241b555475923bcee28824efacd501e235457daeb4496b4b700", size = 19507 }, + { url = "https://files.pythonhosted.org/packages/36/7c/a5966976564e8e71c0e66bf68e9282c279ad0c3ce81be61fa20ca8e0ca2e/pyobjc_framework_Network-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0b9bb4a0cbd01cc4acb120ce313662763bca0c5ef11c01a0a0cae64c80b120c5", size = 19532 }, + { url = "https://files.pythonhosted.org/packages/27/ff/ef909936cc7e676d03de1dd6fc930f6592d07187a2a50bf6925ad269a4a9/pyobjc_framework_Network-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:63cde7c03c12119da7b7130f6805a751d3c08156cd608d34dce6f6b6f1474309", size = 19554 }, + { url = "https://files.pythonhosted.org/packages/ad/6d/19a9c65844e2b3af1db7db2124d4d8a96f3f3eadfbd4bb028123f6daf825/pyobjc_framework_Network-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8ef9a3c4ea853acfa0bf049088dfa6ffc9bb51cd3e0c6f9011d5f020cd9942d3", size = 19681 }, +] [[package]] name = "pyobjc-framework-networkextension" @@ -2825,6 +3204,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/90/97dcfac5895b07e891adf634c3a074b68992d132ccfab386c186ac1a598c/pyobjc_framework_networkextension-11.0.tar.gz", hash = "sha256:5ba2254e2c13010b6c4f1e2948047d95eff86bfddfc77716747718fa3a8cb1af", size = 188551 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/a4/120aba6e1ccf473d7294c200687f500b096947fec58d94dc772b1a444ecc/pyobjc_framework_NetworkExtension-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bba4f338748c8ad2cb4320c4dd64b64772a863c6b6f991c2636b2a2f4cb839a", size = 13945 }, + { url = "https://files.pythonhosted.org/packages/d1/0f/f7039d2bae0dcd63f66aff008613860499b6014dbd272726026f6c4c768d/pyobjc_framework_NetworkExtension-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:abf63433992ff1830f42cb813d1575473f0034ca6f62827f43bb2b33cc31e095", size = 13960 }, + { url = "https://files.pythonhosted.org/packages/e3/52/0fb68262cfaa66f14cc0dd313b3731d4466b26fc2223e9d30e2481ed0007/pyobjc_framework_NetworkExtension-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fa11259ae396411d1ce592b6f3282de9dd9ed0a48001adb69138262c91c7363", size = 13983 }, + { url = "https://files.pythonhosted.org/packages/c5/32/87aa2517444dfffdcdf83cb1086676ede7ae78be00138091026fe47a43f8/pyobjc_framework_NetworkExtension-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:d55909b121558a81939624839155a0c0dbe41d7512c70d535eed3dd791a510a1", size = 14195 }, +] [[package]] name = "pyobjc-framework-notificationcenter" @@ -2835,6 +3220,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d7/d0/f0a602e01173531a2b639e283a092cf1f307fd873abd2ed590b9c4122337/pyobjc_framework_notificationcenter-11.0.tar.gz", hash = "sha256:f878b318c693d63d6b8bd1c3e2ad4f8097b22872f18f40142e394d84f1ead9f6", size = 22844 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/f2/22f04062b772e2f47ee2d54eac3f80c5aef727ec468ef5ab9a3272dd2a73/pyobjc_framework_NotificationCenter-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:075853f3e36eb4377182589e552226b2207a575035d7e128055cfde9dcad84b7", size = 9684 }, + { url = "https://files.pythonhosted.org/packages/16/22/531c2aab1639ab13aeaf3ac324afa102515b8d5eb860cb1a566018d98058/pyobjc_framework_NotificationCenter-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:093e50badfbc78edf088f9241cddba7516a58188d401f299e361f1ec85e93fce", size = 9707 }, + { url = "https://files.pythonhosted.org/packages/88/4f/38655b39b20d1e9bbeeb2da9ac5cd05e3c1396da6394e8fb43b9864605f5/pyobjc_framework_NotificationCenter-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2c5f7ff6b3fc37beb11c3ff0ad73e0c708bc16f105e78548065c02ab9b23ac75", size = 9722 }, + { url = "https://files.pythonhosted.org/packages/48/be/41f21518ba8e3ccfa49e64dcd5d9aa42dc55bcca8f6cbbde9f10dfe650bf/pyobjc_framework_NotificationCenter-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:94d43c8552f25efdf0d65b10b2a74b5978c77264b392d6b8cc2d55d99b6efd86", size = 9949 }, +] [[package]] name = "pyobjc-framework-opendirectory" @@ -2875,6 +3266,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b0/93/0a72353d0212a815bd5e43aec528ce7b28b71d461d26e5fa3882ff96ffa3/pyobjc_framework_oslog-11.0.tar.gz", hash = "sha256:9d29eb7c89a41d7c702dffb6e2e338a2d5219387c8dae22b67754ddf9e2fcb3f", size = 24151 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/54/6b507a18d0adadf8b707be9616bc9bab157963b81fa3c9928a0148d3bfd8/pyobjc_framework_OSLog-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0131851fca9b741f290ffa727dd30328dd8526b87c8cef623b79239bed99187", size = 7694 }, + { url = "https://files.pythonhosted.org/packages/d1/79/81e64a55023f458aa5d99d10671fd9bcc6c0dcf8339768152fbc28c92cef/pyobjc_framework_OSLog-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:17d8b49113a476372b24ac8e544d88f6d12f878f1081dd611ab203c4484f2039", size = 7720 }, + { url = "https://files.pythonhosted.org/packages/c4/e4/eb278e6cf2f21012ffc2fced634aa92b1908a754ef0b5a2a3d7e5dcfdc45/pyobjc_framework_OSLog-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:76d94209b46e3da1668473155b191af9958f415ee18c1cb3d0f35cf9f42e9640", size = 7733 }, + { url = "https://files.pythonhosted.org/packages/02/f1/04f5c838e605587148837fd193cff50dd615462e9ee69b73dc1227d9c26a/pyobjc_framework_OSLog-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ddaa84ae8234940a07a22a8b48767011e031e009817de8f22f9625c354de01cf", size = 7953 }, +] [[package]] name = "pyobjc-framework-passkit" @@ -2885,6 +3282,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/f8/ebb2bc840f87292a4f60080463ee698ca08516cc958364741dfff2858b33/pyobjc_framework_passkit-11.0.tar.gz", hash = "sha256:2044d9d634dd98b7b624ee09487b27e5f26a7729f6689abba23a4a011febe19c", size = 120495 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/72/d7dae8f5a1c5b12d9cf404a71a82fd5a638bc4de2d1099bf838aee1026f0/pyobjc_framework_PassKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:710372134c3adedb9017bfc2fbc592ef0e94ae916145b58e57234239bf903b90", size = 14354 }, + { url = "https://files.pythonhosted.org/packages/c3/b1/5ee2f5581877241a4fc2db4ab4a33d595a918bde1b4a59796240e2b2244b/pyobjc_framework_PassKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe0144177f7feb96577bea53841d9b9b3f63185735a1bf1b36368ab189fd6282", size = 14391 }, + { url = "https://files.pythonhosted.org/packages/67/fd/4a4449d67210adca601a079efbd823fba0a1df9c46b5b2c49a198f1d2f89/pyobjc_framework_PassKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ec60ab6fd143d26ab6aa8103d8eb3bbf41b1d48d8aa89816005ce0a51a14d88e", size = 14394 }, + { url = "https://files.pythonhosted.org/packages/cd/29/e7192f9f8f0b4bd33eb00bae975f3399ba6eff9b2b6a7c191eea58eaa3d3/pyobjc_framework_PassKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8f7a8af72be7b2f8cef11a7761c255eaad93405c3a752f2f2b91e5d346afb8c2", size = 14607 }, +] [[package]] name = "pyobjc-framework-pencilkit" @@ -2923,6 +3326,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f7/c3/fc755c1f8f411433d7ba2e92f3fe3e7b417e9629675ad6baf94ac8b01e64/pyobjc_framework_photos-11.0.tar.gz", hash = "sha256:cfdfdefb0d560b091425227d5c0e24a40b445b5251ff4d37bd326cd8626b80cd", size = 92122 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/27/62e5833b9629121b4b6ea8f2b2aa295cf6b719dc6316387f77ec0bd41d77/pyobjc_framework_Photos-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:71bf849888713e4a00eb44074c5000ed081c905ba35b3a55ee84c6367ce60ce8", size = 12085 }, + { url = "https://files.pythonhosted.org/packages/b9/6e/54108271ea34b0fc51bf8d0bf677788e4d39a1e29ad481f8c78c100f3159/pyobjc_framework_Photos-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ea630c3abf4620b022f23167ef5f3d6b157b38697d7ffc5df0fc507e95bed655", size = 12107 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/e4697ebe81acc99654c7f5fb26250e86faa0e51de5f1370661aa993c107e/pyobjc_framework_Photos-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e5e10ba50dd25455fcff47126e67e63be48edfd64e1c4f37e1c059a667b0a19d", size = 12121 }, + { url = "https://files.pythonhosted.org/packages/a9/00/16b187f91992438e750c36a0fbf007d4fe1e225c55ff18eaf9560441b369/pyobjc_framework_Photos-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1a1a20b6d73cc6cc9ab2eed33072ba8e3da9628c962ccb95a377e59d869a19dc", size = 12327 }, +] [[package]] name = "pyobjc-framework-photosui" @@ -2933,6 +3342,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/2c/70ac99fb2b7ba14d220c78cf6401c0c7a47992269f85f699220a6a2cff09/pyobjc_framework_photosui-11.0.tar.gz", hash = "sha256:3c65342e31f6109d8229992b2712b29cab1021475969b55f4f215dd97e2a99db", size = 47898 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/ec/9574692e2852d546b28bac853b2b0584c4d4f093a4befac0e105789ee9f6/pyobjc_framework_PhotosUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b3865d2cc4fad4d34255941fe93ce504b9d2c7a7043bd0f4c715da9f4af1cf1", size = 12165 }, + { url = "https://files.pythonhosted.org/packages/90/a9/85d70fe9eee0d15a0615a3f7b2ef92120c32614e350286d347d733fcf1d0/pyobjc_framework_PhotosUI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:66826184121cd15415750d801160721adad80b53cbb315192522229b17252ebb", size = 12176 }, + { url = "https://files.pythonhosted.org/packages/a7/c0/30c58eb2a2963de97c3a9c6ed9c0eb8d76c98dd1af181337cdc568bc2f38/pyobjc_framework_PhotosUI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c438077e03d4c89f3d7f99cc9a2916eea52f2b37690023371fbf2a6d654be9e3", size = 12182 }, + { url = "https://files.pythonhosted.org/packages/2b/3b/06e092d28d55c6e0b8e1c04f769eafd818f27925a79f689ab757bdb5dfec/pyobjc_framework_PhotosUI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cae57888e20be00c40f1784d49dcc572f195f024f0456d0f0c4a599ee9928c83", size = 12406 }, +] [[package]] name = "pyobjc-framework-preferencepanes" @@ -2957,6 +3372,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/17/ab/7fe55ce5b32c434142be026ec27b1801a2d4694b159b502f9ecd568eebf2/pyobjc_framework_pushkit-11.0.tar.gz", hash = "sha256:df9854ed4065c50022863b3c11c2a21c4279b36c2b5c8f08b834174aacb44e81", size = 20816 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/5f/de178da22fa628cd88f599fea2a70b7d1d9ebc65576307df0bf29822a347/pyobjc_framework_PushKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0185cebcc5aad73aae50804c7a2412da6275717b8f872b830d71c484efcdea7a", size = 8010 }, + { url = "https://files.pythonhosted.org/packages/5f/a5/60f93031302aba7cdff28728b8141b58c3bd5c12f4a6cef5796a8cc2e666/pyobjc_framework_PushKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:43bd1ed31664982e4d8397a7e07e58a7deb85bf9c9866ea966fd7ca25796014c", size = 8032 }, + { url = "https://files.pythonhosted.org/packages/11/a8/deb98cbad4cdd18cb1de659c50e4054b878f094fcef4558c843a83eb73a9/pyobjc_framework_PushKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7bdebcdee592c46f2e8c386d4c46a2443c72c2537e973dc4e8a76e32cf1465dc", size = 8045 }, + { url = "https://files.pythonhosted.org/packages/a6/c3/9bb2696746fe9759a94a9941206ea2d945b0c027667b9cdba1cc4ed46039/pyobjc_framework_PushKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2868a62cd57bee9847c6a0fb487bb6d1a3d215de99291748982937f635a5e502", size = 8284 }, +] [[package]] name = "pyobjc-framework-quartz" @@ -2967,6 +3388,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/ad/f00f3f53387c23bbf4e0bb1410e11978cbf87c82fa6baff0ee86f74c5fb6/pyobjc_framework_quartz-11.0.tar.gz", hash = "sha256:3205bf7795fb9ae34747f701486b3db6dfac71924894d1f372977c4d70c3c619", size = 3952463 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/6a/68957c8c5e8f0128d4d419728bac397d48fa7ad7a66e82b70e64d129ffca/pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2", size = 212349 }, + { url = "https://files.pythonhosted.org/packages/60/5d/df827b78dcb5140652ad08af8038c9ddd7e01e6bdf84462bfee644e6e661/pyobjc_framework_Quartz-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb4a9f2d9d580ea15e25e6b270f47681afb5689cafc9e25712445ce715bcd18e", size = 212061 }, + { url = "https://files.pythonhosted.org/packages/a6/9e/54c48fe8faab06ee5eb80796c8c17ec61fc313d84398540ee70abeaf7070/pyobjc_framework_Quartz-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:973b4f9b8ab844574461a038bd5269f425a7368d6e677e3cc81fcc9b27b65498", size = 212478 }, + { url = "https://files.pythonhosted.org/packages/4a/28/456b54a59bfe11a91b7b4e94f8ffdcf174ffd1efa169f4283e5b3bc10194/pyobjc_framework_Quartz-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66ab58d65348863b8707e63b2ec5cdc54569ee8189d1af90d52f29f5fdf6272c", size = 217973 }, +] [[package]] name = "pyobjc-framework-quicklookthumbnailing" @@ -2992,6 +3419,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/43/c751c517dbb8ee599a31e59832c01080473c7964b6996ca29906f46c0967/pyobjc_framework_replaykit-11.0.tar.gz", hash = "sha256:e5693589423eb9ad99d63a7395169f97b484a58108321877b0fc27c748344593", size = 25589 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/56/89a8544426a46bf176c9462511c08d4c94ae7e0403abb2d73632af68ee8e/pyobjc_framework_ReplayKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:262fb834400e8379f4c795e65137763348992f3010284602d876050b8adb9ea4", size = 9904 }, + { url = "https://files.pythonhosted.org/packages/47/af/9abfa41060efc96000cc9ae77f302bb8210f3be0f793ba5d11f98a03e468/pyobjc_framework_ReplayKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:da9db123ee52761a670c6e41e5f9d9a47a2ca5582a9c4a7c8662a8bb56a0f593", size = 9903 }, + { url = "https://files.pythonhosted.org/packages/01/ce/1f9c893cf91bdec4e89e591964c46c588c4bf4a4cd1fda0d457855ad769c/pyobjc_framework_ReplayKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:deb774d2c65f498f9a8311266fb36fddef1d61646a13f7aece1627a18956982d", size = 9922 }, + { url = "https://files.pythonhosted.org/packages/b0/f4/f4705cd2416f64f783aa63751aa47f2a21e59bd530239ebba3813b214e14/pyobjc_framework_ReplayKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:846aaa02e2c81e5bc5f08172592bea84019977bad625ece5934eacaaa53b734c", size = 10139 }, +] [[package]] name = "pyobjc-framework-safariservices" @@ -3002,6 +3435,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/40/ec/c9a97b1aa713145cc8c522c4146af06b293cfe1a959a03ee91007949533b/pyobjc_framework_safariservices-11.0.tar.gz", hash = "sha256:dba416bd0ed5f4481bc400bf56ce57e982c19feaae94bc4eb75d8bda9af15b7e", size = 34367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/39/d69f8e7dbf6f366cb5fdaa8aa7ceef1dadb93a5e4d9fc63217477bba5e32/pyobjc_framework_SafariServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:55c02a533073e0a2aaf6db544f087fd861bace6b62035c3bb2e6b20f0b921b2b", size = 7262 }, + { url = "https://files.pythonhosted.org/packages/36/76/a625330bdf7a5d9962299562b6e19f6cbd1ea1b14887958e42a4372d3344/pyobjc_framework_SafariServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31ba086a39ee06d8622a504e3ea3a1f6dc8fab1d4c4c7930d5af6e989f38ec56", size = 7262 }, + { url = "https://files.pythonhosted.org/packages/ce/09/f1101aacbd3dc563cafe7b519069d54e744c4cc5db4928e205bb6b47242d/pyobjc_framework_SafariServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d037760567baccc452be85ec00fc9350e0403bfea874dc49dc91911440633100", size = 7278 }, + { url = "https://files.pythonhosted.org/packages/cd/c2/a432998d77fff09c286c908458bc21da161a8ef67431875e8d08c3a31ff4/pyobjc_framework_SafariServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8dc7127a325dab5d37775b474f44f354469a569d68599307e974d201421f885", size = 7357 }, +] [[package]] name = "pyobjc-framework-safetykit" @@ -3013,6 +3452,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4e/30/89bfdbdca93e57b19891ddeff1742b20a2019cdeb2e44902027dce2642e1/pyobjc_framework_safetykit-11.0.tar.gz", hash = "sha256:9ec996a6a8eecada4b9fd1138244bcffea96a37722531f0ec16566049dfd4cdb", size = 20745 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/c5/68b79c0f128eb735397aa68a40e5ac48b88c12967f69358f25f753a3fc1c/pyobjc_framework_SafetyKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:83a1f313c9c63ba107a7c543a8300ae225fa5ff17d963b1c499859da45ceaf55", size = 8395 }, + { url = "https://files.pythonhosted.org/packages/99/02/2853a00e75cca8db8b5053ff2648ff2a26f5c02f07af1c70630a36b58d04/pyobjc_framework_SafetyKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c6dd23fcaca9c41d6aadf2ca0a6d07c4032a0c4ea8873ee06da6efd1e868f97e", size = 8418 }, + { url = "https://files.pythonhosted.org/packages/27/18/1af05ced269cd5c9c1f8a983d3b34897bf4705fb39b4dc9252b54d19575c/pyobjc_framework_SafetyKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6937bded126bf76a171b5b91ee777a124c40fcb98497bd3701ae4eb4175d0089", size = 8434 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/16729ab6411e760a20fa9da1bc2a74ed51f81159e2c66e19ffbe50da5803/pyobjc_framework_SafetyKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:54a5b40e94b62e7f1e55d1c25a4b27e8fe4d2b37fa043bf638da31b6b3246eca", size = 8630 }, +] [[package]] name = "pyobjc-framework-scenekit" @@ -3024,6 +3469,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/26/3f/a2761585399e752bce8275c9d56990d4b83e57b13d06dd98335891176a89/pyobjc_framework_scenekit-11.0.tar.gz", hash = "sha256:c0f37019f8de2a583f66e6d14dfd4ae23c8d8703e93f61c1c91728a21f62cd26", size = 213647 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/4c/5ec624ae043fbbe15be2a989e3fc6cb08d992e0a5061450b84b33f96429c/pyobjc_framework_SceneKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86d23456e4c7a7bb7bb49be2b98647678ac7a39955e6bb242e0ac125d8b770e8", size = 33108 }, + { url = "https://files.pythonhosted.org/packages/b8/7f/fef1cf3eaf1366a6f3f93c5a6b164acfdfdc2d15b3243b70763ac217ce03/pyobjc_framework_SceneKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d0a0d557167adddf27a42fb109a1dce29a22ff09aca34558fccd1c22f08ae2b4", size = 33130 }, + { url = "https://files.pythonhosted.org/packages/e5/8a/46cbede998b434bd50494f1105dc92c5a5ebd186d10ecf8af711e7e41bd6/pyobjc_framework_SceneKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:687a9f2fd126d7ebfe80db6096192333e66a01259202a90fe860809fb3697f7d", size = 33148 }, + { url = "https://files.pythonhosted.org/packages/b6/05/d910bd4f3f42a59eea207cfd96d5b78cfead124b6e6ff66c6170ccc136ec/pyobjc_framework_SceneKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b8fe4306eb8ed77e253bb0eec493ea0292260897562a147a7f29378650fa6616", size = 33504 }, +] [[package]] name = "pyobjc-framework-screencapturekit" @@ -3035,6 +3486,12 @@ dependencies = [ { name = "pyobjc-framework-coremedia" }, ] sdist = { url = "https://files.pythonhosted.org/packages/77/90/71f10db2f52ea324f82eaccc959442c43d21778cc5b1294c29e1942e635c/pyobjc_framework_screencapturekit-11.0.tar.gz", hash = "sha256:ca2c960e28216e56f33e4ca9b9b1eda12d9c17b719bae727181e8b96f0314c4b", size = 53046 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/aa/d6d0818564570065411874cbe3de86dee105dc9906161c0584009a1a63bc/pyobjc_framework_ScreenCaptureKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:38468e833ec1498778bd33ce30578afed2e13ac14c73e8e6290ff06a2e0c50d8", size = 11110 }, + { url = "https://files.pythonhosted.org/packages/27/61/557e725aef9ad76a1a7c48b361f8c5636a606cbaf9ba520ff8f69d3cf791/pyobjc_framework_ScreenCaptureKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7d8a83dcc0950699242677cfefda545b9c0a0567111f8f3d3df1cf6ed75ea480", size = 11121 }, + { url = "https://files.pythonhosted.org/packages/70/76/e98d65ee5d6e7b1f0b1b03f1dd93ae01b589cd62fbb4faa4e7e90e69ec7b/pyobjc_framework_ScreenCaptureKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0b4835d96909b5ad5fd2c42c9f15a6cbe5c5f097af8d8f13cbf94599cceaf2d", size = 11136 }, + { url = "https://files.pythonhosted.org/packages/61/0c/14cc9265adf33771a5d7d06ebae8e7170d9bba2e9a0baf78041c05a0eb2d/pyobjc_framework_ScreenCaptureKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:79af2e770b255c68e9f6feffa1e0c9da78496adb2656d15d1d763abde99602f0", size = 11362 }, +] [[package]] name = "pyobjc-framework-screensaver" @@ -3045,6 +3502,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f6/b6/71c20259a1bfffcb5103be62564006b1bbc21f80180658101e2370683bcb/pyobjc_framework_screensaver-11.0.tar.gz", hash = "sha256:2e4c643624cc0cffeafc535c43faf5f8de8be030307fa8a5bea257845e8af474", size = 23774 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ab/f17cd36458e6cf6d64c412128641edcfc220b8147283f6b34ef56c7db111/pyobjc_framework_ScreenSaver-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:436357c822d87220df64912da04b421e82a5e1e6464d48f2dbccc69529d19cd3", size = 8445 }, + { url = "https://files.pythonhosted.org/packages/52/57/300b641e929741a5d38cf80c74496918be1d2fe5e210d3fceb3e768747b2/pyobjc_framework_ScreenSaver-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:03b12e89bc164cb01527ca795f3f590f286d15de6ee0e4ff1d36705740d6d72f", size = 8372 }, + { url = "https://files.pythonhosted.org/packages/dd/39/833ed164556db2115579e98d349dbac2e24df4cbec5b3f15d09d5be4a203/pyobjc_framework_ScreenSaver-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e4561ae6144bef873362b18913c2751cdc5d6c4922f8523a8504f4214b2df9b6", size = 8386 }, + { url = "https://files.pythonhosted.org/packages/52/ed/f43d0f409bced76d216f8aebec295667282b6df5b31ec1470af3e2d46913/pyobjc_framework_ScreenSaver-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:035abb50f05f953ad18ce63218c931df68c0ce5d8f801366fe2073bba1fd6200", size = 8465 }, +] [[package]] name = "pyobjc-framework-screentime" @@ -3069,6 +3532,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4d/f0/592af19047935e44c07ddd1eba4f05aa8eb460ee842f7d5d48501231cd69/pyobjc_framework_scriptingbridge-11.0.tar.gz", hash = "sha256:65e5edd0ea608ae7f01808b963dfa25743315f563705d75c493c2fa7032f88cc", size = 22626 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/2c/2fd33c0318a8fe35f00f0089a44a2c27d4d0fd0b4b5e13628051a4d8c9d3/pyobjc_framework_ScriptingBridge-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c98d080446aa8ba4074e43eb0be1feed96781dbc0718496f172fcd20e84a9158", size = 8209 }, + { url = "https://files.pythonhosted.org/packages/93/3b/b2b721248e951eef6b7e6b25cb3a1d6683702235bc73683d0239f068d2df/pyobjc_framework_ScriptingBridge-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:23a4b2e2e57b7b4d992777ea9efb15273ccd8e8105385143dab9bd5a10962317", size = 8238 }, + { url = "https://files.pythonhosted.org/packages/1f/d3/b478b95e48793165e6195f3b0461f9c022b8610cca945fc4142b5dc5ef0b/pyobjc_framework_ScriptingBridge-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2f9c4b9b47849b196c88bf57ac857f7ab0090c248275a04afd31375539ad0b09", size = 8247 }, + { url = "https://files.pythonhosted.org/packages/31/1a/8c5090b0daecb56a4dd41a1e0402f729812ea6a682a69ebdd4bc17ea8406/pyobjc_framework_ScriptingBridge-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a119111013599932366b4cd1612c93cfb913f69707f81e9f0ed0ddb0de762de2", size = 8460 }, +] [[package]] name = "pyobjc-framework-searchkit" @@ -3093,6 +3562,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c5/75/4b916bff8c650e387077a35916b7a7d331d5ff03bed7275099d96dcc6cd9/pyobjc_framework_security-11.0.tar.gz", hash = "sha256:ac078bb9cc6762d6f0f25f68325dcd7fe77acdd8c364bf4378868493f06a0758", size = 347059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/d8/092940f8c46cf09000a9d026e9854772846d5335e3e8a44d0a81aa1f359e/pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526", size = 41499 }, + { url = "https://files.pythonhosted.org/packages/0b/fc/8710bbe80b825c97ecc312aaead3b0f606a23b62b895f6e0a07df8bfeeae/pyobjc_framework_Security-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:421e03b8560ed296a7f5ee67f42f5f978f8c7959d65c8fec99cd77dc65786355", size = 41523 }, + { url = "https://files.pythonhosted.org/packages/ab/9f/79c1713be83d58199e5379e928c2c94bb3ca44d294de2a0a0edefc6b3ba8/pyobjc_framework_Security-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dda83260c5638dd0470c01ca9d37eccedbce15d0642d9c28b357329e4145528f", size = 41530 }, + { url = "https://files.pythonhosted.org/packages/80/f2/d71306d4431b5492a1c178a44ae922caabc40b884b081aa428bb06f642e6/pyobjc_framework_Security-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:51dd6fb24235f4623d68a02bda4dabd85f48bce00f9b0b306016cf2c891392c4", size = 42057 }, +] [[package]] name = "pyobjc-framework-securityfoundation" @@ -3119,6 +3594,12 @@ dependencies = [ { name = "pyobjc-framework-security" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/88/d7c4942650707fe5b1d3b45b42684f58f2cab7d2772ec74ca96ecef575eb/pyobjc_framework_securityinterface-11.0.tar.gz", hash = "sha256:8843a27cf30a8e4dd6e2cb7702a6d65ad4222429f0ccc6c062537af4683b1c08", size = 37118 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/a96da5f43da5a9d0e5d016bc672a4dca09f88d091c96d9ecff5f753ad1d5/pyobjc_framework_SecurityInterface-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2771dae043c8aa278887f96c7d206957164c7a81a562fa391bf0b9316d6755eb", size = 10706 }, + { url = "https://files.pythonhosted.org/packages/50/86/fc41dcf8f5300ad2c6508568535d9c0a83b412b0a4a961616441c8acf10f/pyobjc_framework_SecurityInterface-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6453732f7608d514e8f7005d80d238422cbebc4ab4d6d6fed1e51175f9f7244f", size = 10781 }, + { url = "https://files.pythonhosted.org/packages/5a/10/c1d584ed7660abd0752d7e957f90995359531f0222f98dd4555809afb7c6/pyobjc_framework_SecurityInterface-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:13e023109899e2c40ce98e914813ccc8e7f1300fbb9640a675453b612d9dace0", size = 10797 }, + { url = "https://files.pythonhosted.org/packages/ba/e6/7c85fe9c0364e350500dc790754b2675e9776a454f757b98768c03057253/pyobjc_framework_SecurityInterface-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9df64d339025846a4d5d1c9311359d1ba41ca3850f744a65543bfb3bb7fb2ea0", size = 11206 }, +] [[package]] name = "pyobjc-framework-sensitivecontentanalysis" @@ -3158,6 +3639,12 @@ dependencies = [ { name = "pyobjc-framework-sharedwithyoucore" }, ] sdist = { url = "https://files.pythonhosted.org/packages/20/84/db667061f815537717a6cac891df01a45b65e6feaa2dfa0c9d2e3803a1ef/pyobjc_framework_sharedwithyou-11.0.tar.gz", hash = "sha256:a3a03daac77ad7364ed22109ca90c6cd2dcb7611a96cbdf37d30543ef1579399", size = 33696 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/ab/391ef0de3021997ec9a12d8044c0b7e884780a9bead7f847254e06d0f075/pyobjc_framework_SharedWithYou-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6dac74375d3dc18d67cae46f3f16a45cef699b1976a4012827c0f15256da55df", size = 8606 }, + { url = "https://files.pythonhosted.org/packages/cf/04/6a3eb12bf9c35f3063be678f36430beb92b7e2683f4b952596396473a74d/pyobjc_framework_SharedWithYou-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6076a0893a3597e054918c136f3391671a225a37fe1b1a070046817e3a232954", size = 8629 }, + { url = "https://files.pythonhosted.org/packages/e6/31/7ac04fd0945941a900d35e6ac32bfde98fab60e37b04d5e76de5aa3bb33d/pyobjc_framework_SharedWithYou-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a84995d1009e9a30e1205d293905a35cb8ecb49d7b2fe00d4daee547ac10685c", size = 8639 }, + { url = "https://files.pythonhosted.org/packages/97/d2/7dd4fa936a5a00357b669719782095092aa110523f4f7ac80883f75e8128/pyobjc_framework_SharedWithYou-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:795d99818eb7f86115872529da7427942aab4a22b4b94986ed0354e7d03bb7b4", size = 8860 }, +] [[package]] name = "pyobjc-framework-sharedwithyoucore" @@ -3168,6 +3655,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/52/2a/86904cd9cc3bf5cdb9101481e17e67358f39f81ffa0f36768097287e34b3/pyobjc_framework_sharedwithyoucore-11.0.tar.gz", hash = "sha256:3932452677df5d67ea27845ab26ccaaa1d1779196bf16b62c5655f13d822c82d", size = 28877 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/40/69ae712e223991cd975c1f8ba2b00a5aa4c129ac0e76838b4d936740e4c7/pyobjc_framework_SharedWithYouCore-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:46cd00a97c5fec747ef057000daa88495699ea5d5d6fe1f302bfb89b2d431645", size = 8366 }, + { url = "https://files.pythonhosted.org/packages/c2/ce/500ad643f2d07e8ef065e8ddc5a08954f5d59cc199c89b700581eaf821ee/pyobjc_framework_SharedWithYouCore-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8b5f180371a63da718fe6c3b58e7613c6b2adf9b483cefbf6d9467eb8ac2f0ca", size = 8380 }, + { url = "https://files.pythonhosted.org/packages/99/2b/6c4a468cfe23180a087ad393d6a8f38ee0f17a7789eb39007e30717bc446/pyobjc_framework_SharedWithYouCore-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77357cf3389d02324d0f4afc19840085f0fe7f21d101d9fee2842687f47f69bb", size = 8394 }, + { url = "https://files.pythonhosted.org/packages/af/17/1b29f58c64d7a00dd717f512ae6ce8c8076731c808a11eeb3a71b9816c46/pyobjc_framework_SharedWithYouCore-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:71bbd5d5a54ff745c35c1bb0c241396cf5b5e0da3001213ec1d4bbb1639777e0", size = 8614 }, +] [[package]] name = "pyobjc-framework-shazamkit" @@ -3178,6 +3671,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/dd/2a/1f4ad92260860e500cb61119e8e7fe604b0788c32f5b00446b5a56705a2b/pyobjc_framework_shazamkit-11.0.tar.gz", hash = "sha256:cea736cefe90b6bb989d0a8abdc21ef4b3b431b27657abb09d6deb0b2c1bd37a", size = 25172 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/81/edfcd4be626aae356dd1b991f521eaeffa1798e91ddae9e7d9ae8ed371d1/pyobjc_framework_ShazamKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ecdc2392d7e8d6e2540c7ad3073a229d08b0818c5dd044a26c93b765ce9868aa", size = 8411 }, + { url = "https://files.pythonhosted.org/packages/e1/f7/f3d2ae7a604e3e3c0de93ed229895be6757edfa0cc76f2a44670f28a81c8/pyobjc_framework_ShazamKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ef79d863cc7d4023aa552f55d4120653eceed862baf1edba8e08b1af10fab036", size = 8419 }, + { url = "https://files.pythonhosted.org/packages/64/6e/095f51d12d4c6a8680cd47d3062315759dbb010348f4d4f804d5a6451b2f/pyobjc_framework_ShazamKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:89cfa01b997042c1e33eb4a670092c501d65c8eed60ce5d489cd08553ec77ba9", size = 8436 }, + { url = "https://files.pythonhosted.org/packages/d3/92/31906c20c663b315918facb444b8958fa68fb02840906d7486eef802510a/pyobjc_framework_ShazamKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cc3dba1f3ed60ef3be9c16285120f8739839e194bdf7a55cb60b03c4179d688b", size = 8659 }, +] [[package]] name = "pyobjc-framework-social" @@ -3216,6 +3715,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5f/39/e9f0a73243c38d85f8da6a1a2afda73503e2fcc31a72f5479770bceae0c1/pyobjc_framework_speech-11.0.tar.gz", hash = "sha256:92a191c3ecfe7032eea2140ab5dda826a59c7bb84b13a2edb0ebc471a76e6d7b", size = 40620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/85/e989076ff0cd40c7cfb3ed7d621703de11bfd8286f1729aca759db1f42a3/pyobjc_framework_Speech-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:353179210683e38bfbd675df6a35eec46b30ce30b7291bcb07a5cadaf11a3bd7", size = 9016 }, + { url = "https://files.pythonhosted.org/packages/00/03/827acde068787c2318981e2bfef2c3cadbe8552434ccc0634b30084ef914/pyobjc_framework_Speech-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:134e08025f4638e428602f7e16bbec94b00477eec090316138d758a86e10fd5f", size = 9037 }, + { url = "https://files.pythonhosted.org/packages/6d/ea/e55e5b1bb0797a1dc56037feb748ef22c76c42846ad848c9b26d3906db26/pyobjc_framework_Speech-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:802a3f77fde47a429c583d670766dfb3822a69a5015039c9865c37f50092ed1f", size = 9054 }, + { url = "https://files.pythonhosted.org/packages/fd/8d/0433036f1a23aed359973dabef80d4fcd736a3bbd5510c2d9bb7a32618c2/pyobjc_framework_Speech-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:56febb163dd342702c5d1de46a3e8504af72d242df4af039e9e564824df2799f", size = 9262 }, +] [[package]] name = "pyobjc-framework-spritekit" @@ -3227,6 +3732,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b7/6e/642e64f5b62a7777c784931c7f018788b5620e307907d416c837fd0c4315/pyobjc_framework_spritekit-11.0.tar.gz", hash = "sha256:aa43927e325d4ac253b7c0ec4df95393b0354bd278ebe9871803419d12d1ef80", size = 129851 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/80/319f156ac6f6cab0dbc85881d81a74d4a7f17913256338683ae8d9ed56c4/pyobjc_framework_SpriteKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d0971a7a85786edc521ab897bdb0c78696278e6417bf389abdfe2151358e854", size = 18077 }, + { url = "https://files.pythonhosted.org/packages/bb/09/303d76844a10745cdbac1ff76c2c8630c1ef46455014562dc79aaa72a6e3/pyobjc_framework_SpriteKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0da5f2b52636a2f04fc38a123fed9d7f8d6fd353df027c51c0bfc91e244a9d2b", size = 18145 }, + { url = "https://files.pythonhosted.org/packages/2e/2e/74cac5f7fbbd3d488c4b9ed70bc0df73d1675a22dc2a06246ea77223b004/pyobjc_framework_SpriteKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:10d2539813763161c9bc76da9aec756a3626c4e3a3400f616fab298ae000bff1", size = 18163 }, + { url = "https://files.pythonhosted.org/packages/67/f1/e90bcd259c16b1245054467a32663dbe7ec70003a352037938f99cf85a0a/pyobjc_framework_SpriteKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3c6593c6d848ebd59d5c70ee9284d268130e01299f863269877d11d395fc1e13", size = 18512 }, +] [[package]] name = "pyobjc-framework-storekit" @@ -3237,6 +3748,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/69/ca/f4e5a1ff8c98bbbf208639b2bef7bf3b88936bccda1d8ed34aa7d052f589/pyobjc_framework_storekit-11.0.tar.gz", hash = "sha256:ef7e75b28f1fa8b0b6413e64b9d5d78b8ca358fc2477483d2783f688ff8d75e0", size = 75855 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/40/af53ad7781515866003c2c71056a053d2f033cf2aa31920a8a1fdb829d7a/pyobjc_framework_StoreKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1d51a05a5e0277c542978b1f5a6aa33331359de7c0a2cf0ad922760b36e5066a", size = 11655 }, + { url = "https://files.pythonhosted.org/packages/f3/11/ba3259d3b22980e08c5e8255a48cc97180bec47d72ffbbd41ab699df39b1/pyobjc_framework_StoreKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:29269183e91043bbfee79851ae712073feba1e10845b8deeb7e6aaa20cfb3cf4", size = 11680 }, + { url = "https://files.pythonhosted.org/packages/23/fc/1ac88e11daa32cdc3cd9bbd0fe45c3d764e60b09d9888ef19ed4caac320e/pyobjc_framework_StoreKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:387b940b3bf4ace5c6fe205bf6adc006d382056d1579a09e15088e57448d826c", size = 11694 }, + { url = "https://files.pythonhosted.org/packages/ae/0e/544c5d83c40761cfdff8d0c4df6d4f493729cf6f7a830873223b12ca7eaf/pyobjc_framework_StoreKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8febba6f938acaaadbf61b267e5c2c8b8c5984b783edcf2c56928025f58e3f5", size = 12533 }, +] [[package]] name = "pyobjc-framework-symbols" @@ -3262,6 +3779,12 @@ dependencies = [ { name = "pyobjc-framework-coredata" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/22/642186906f672461bab1d7773b35ef74e432b9789ca2248186b766e9fd3b/pyobjc_framework_syncservices-11.0.tar.gz", hash = "sha256:7867c23895a8289da8d56e962c144c36ed16bd101dc07d05281c55930b142471", size = 57453 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/9b/484db4eed6b1e29e0d69275bd459ab21a6b3f98e8b2ce61beeb9971303ca/pyobjc_framework_SyncServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89a398df6518cff1c63b7cccf3025e388f3ef299645734112c5aa1ac5f7ca30a", size = 13989 }, + { url = "https://files.pythonhosted.org/packages/8d/d8/dc86d708434b7cb59825c56549e64b118ba4b8584d2eb5a1514d1cd5d1bd/pyobjc_framework_SyncServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e870e82ed34c43607cc50dbae57a81dd419b75abc06670630cbbf41ae6e1402c", size = 14008 }, + { url = "https://files.pythonhosted.org/packages/bc/83/fefd3ca1a9fa5e8b4f59ec7619cd8feeed201b2d50260916e3919983cd8a/pyobjc_framework_SyncServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3af1c26d56e95e84d1d12b620ab53408b889eed3fc00ad0dc02c5c4fbde6774", size = 14012 }, + { url = "https://files.pythonhosted.org/packages/88/84/4a538bd9a358bc28aa5169b4f6a062edfdc34895558a9d473c2634aed414/pyobjc_framework_SyncServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:55c3f4eff005f18891fba13aad848fa9d44169c790fbf104951b98c6b38bd5ae", size = 14228 }, +] [[package]] name = "pyobjc-framework-systemconfiguration" @@ -3272,6 +3795,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/70/70/ebebf311523f436df2407f35d7ce62482c01e530b77aceb3ca6356dcef43/pyobjc_framework_systemconfiguration-11.0.tar.gz", hash = "sha256:06487f0fdd43c6447b5fd3d7f3f59826178d32bcf74f848c5b3ea597191d471d", size = 142949 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/8f/1b5f7e8e848d2c84204da08d5c63e42feff86b26cd508da7a4f95960b842/pyobjc_framework_SystemConfiguration-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89d3c54abedcedbc2ce52c31ff4878251ca54a8535407ed6bd6584ce099c148b", size = 21836 }, + { url = "https://files.pythonhosted.org/packages/6d/49/8660b3d0a46ac2f88e73cec3d10e21885b107f54635680ef0c677ac5cf3e/pyobjc_framework_SystemConfiguration-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8cbcb9662dbb5a034cfc5a44adaf2a0226a2985ae299a4ef4fd75bb49f30f5a0", size = 21727 }, + { url = "https://files.pythonhosted.org/packages/c0/36/c73f197b20e8b195f527904cb1a2e2d3df10249205d93413d808e3fe9d3e/pyobjc_framework_SystemConfiguration-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f52b1b39a33c675816ae24bf078a7f9a68fc981ccb707c378edd2d63c8a701eb", size = 21724 }, + { url = "https://files.pythonhosted.org/packages/e1/77/ad709c5af8695a5eb9f23411527c10e976e3f6dc4a24882d1dc7834c5bef/pyobjc_framework_SystemConfiguration-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5781eb985484f90098b252d4e4f5da759575daa4e23bdc1728b393991c0450d5", size = 22280 }, +] [[package]] name = "pyobjc-framework-systemextensions" @@ -3282,6 +3811,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/4b/904d818debf6216b7be009d492d998c819bf2f2791bfb75870a952e32cf9/pyobjc_framework_systemextensions-11.0.tar.gz", hash = "sha256:da293c99b428fb7f18a7a1d311b17177f73a20c7ffa94de3f72d760df924255e", size = 22531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/3c/8f91b89554ef3127e037d90b3ef83c77a994bb889b7884a995756cd06b63/pyobjc_framework_SystemExtensions-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7a2ec417fa0d383cc066bc292541aa78fd2aec9cca83a98d41b7982f185d1f7", size = 8975 }, + { url = "https://files.pythonhosted.org/packages/21/8c/cf2a018b5f1ecd216f8cb26a3b6fbe590d08de81a6c6b4658e001a203886/pyobjc_framework_SystemExtensions-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:62b99c6bd88bce642960fc2b9d5903fbfca680d16be9a4565a883eb4ba17ca5e", size = 8999 }, + { url = "https://files.pythonhosted.org/packages/b5/23/1a4a5df1f2707a80e51e92721b20afd09b5789f0071dea2dbf596126a47f/pyobjc_framework_SystemExtensions-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:97619be16bfce9fa0634d2b372242191a54dc2e71787b4fc1257be58e67322b4", size = 9014 }, + { url = "https://files.pythonhosted.org/packages/4c/75/117f226d962e67ad039b9f4484bc76e9ea96709047a507b2617143938c35/pyobjc_framework_SystemExtensions-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:90697b8d3fb74c509db3e237779afa7e71971e54543c592adb15fcf48d45a955", size = 9228 }, +] [[package]] name = "pyobjc-framework-threadnetwork" @@ -3320,6 +3855,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/f5/ca3e6a7d940b3aca4323e4f5409b14b5d2eb45432158430c584e3800ce4d/pyobjc_framework_usernotifications-11.0.tar.gz", hash = "sha256:7950a1c6a8297f006c26c3d286705ffc2a07061d6e844f1106290572097b872c", size = 54857 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/bf/5545d5c9d0d10a603ad406a5ce727de6a47daace9c38d4484818611599f3/pyobjc_framework_UserNotifications-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bf78fa37f574f5b43db9b83ca02e82ab45803589f970042afdcd1cb8c01396d", size = 9483 }, + { url = "https://files.pythonhosted.org/packages/7a/1e/41f4d18120b2c006f756edde1845a2df45fdbd6957e540f8ebcfae25747f/pyobjc_framework_UserNotifications-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0b4c06c3862405e103e964327581c28e5390a2d4cd0cef3d8e64afda03c9f431", size = 9506 }, + { url = "https://files.pythonhosted.org/packages/38/af/27e44ec567678ca9e347ef9b0cc49b27d369acfbce98d01b46dc505f5fd2/pyobjc_framework_UserNotifications-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2f8a03ef6f0abbed0ab1ac28cc33ba4e1c8df9887443b008a3c7837f202cf2c9", size = 9517 }, + { url = "https://files.pythonhosted.org/packages/e7/12/008483111e76c7cc543b330dc477ed6ddde4fb6b914a285f5ab974df79ca/pyobjc_framework_UserNotifications-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ea1ef4ce77a3d534d52f2543a592d40553399557ea040e052bfd7ab16f3279a1", size = 9732 }, +] [[package]] name = "pyobjc-framework-usernotificationsui" @@ -3361,6 +3902,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ba/2d/c031a132b142fcd20846cc1ac3ba92abaa58ec04164fd36ca978d9374f1c/pyobjc_framework_videotoolbox-11.0.tar.gz", hash = "sha256:a54ed8f8bcbdd2bdea2a296dc02a8a7d42f81e2b6ccbf4d1f10cec5e7a09bec0", size = 81157 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/ae/ff697840bdcf3530e8fba84e2a606813eda1ee90be074f12e2857460cebf/pyobjc_framework_VideoToolbox-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:12af56190e65c3b60c6ca14fe69045e5ffb5908ea1363580506eb32603b80855", size = 13446 }, + { url = "https://files.pythonhosted.org/packages/1e/ef/9e7230435da47016983a3c9ea7b1d5237b43fce2d8b2b923eb638b7694f5/pyobjc_framework_VideoToolbox-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4ed7f073bd8dfecca0da6359d5cd871b2f39144883930bddd41ca818447de608", size = 13451 }, + { url = "https://files.pythonhosted.org/packages/86/a9/e8d09f795529ea639ad612b2d765f4a3a8d2e0bc31a9a3f69e50dd584bb6/pyobjc_framework_VideoToolbox-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4a9ae5b94376c66b579e7a2a8ada71bfd8c2ad475726fb500d7f498d806dd7bf", size = 13475 }, + { url = "https://files.pythonhosted.org/packages/9c/5a/3630e628bce69675825f6fd90ad8395701a067a75efbcc43a215a63c393f/pyobjc_framework_VideoToolbox-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:de2d2a2c81be9e9c77d1f749a350b2f7edc647f498b0715c0b6c710d8e41af02", size = 13603 }, +] [[package]] name = "pyobjc-framework-virtualization" @@ -3371,6 +3918,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/65/8d/e57e1f2c5ac950dc3da6c977effde4a55b8b70424b1bdb97b5530559f5bc/pyobjc_framework_virtualization-11.0.tar.gz", hash = "sha256:03e1c1fa20950aa7c275e5f11f1257108b6d1c6a7403afb86f4e9d5fae87b73c", size = 78144 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/c9/b2f8322d7ced14822270481be5b44f1846aa7c09b4b3cb52517dc1054f4b/pyobjc_framework_Virtualization-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334712792136ffcf3c63a63cea01ce33d60309a82721c95e25f0cc26b95f72cc", size = 13417 }, + { url = "https://files.pythonhosted.org/packages/1e/96/d64425811a4ef2c8b38914ea1a91bbd2aa6136bb79989e4821acd6d28e67/pyobjc_framework_Virtualization-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b848b1ab365906b11a507c8146e477c27d2bf56159d49d21fda15b93c2811ec", size = 13430 }, + { url = "https://files.pythonhosted.org/packages/7b/8f/21a0a1761e6c34b7c1b544653e9f98eb5a76668eb8644bbdec2db1723271/pyobjc_framework_Virtualization-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9a7bfd870bbe5aa23d29661ea502cefe6cff4e7c32ccf50050f483e650b218d8", size = 13439 }, + { url = "https://files.pythonhosted.org/packages/40/2f/e77bac3d1030fe72bd7ca9de4276b272fef02cd564b5b8655f49a1b0bd40/pyobjc_framework_Virtualization-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b7bbd268f722487ec7279459037f87923ff1abcb87d94f8f6a8b9cafaa559a2e", size = 13661 }, +] [[package]] name = "pyobjc-framework-vision" @@ -3383,6 +3936,12 @@ dependencies = [ { name = "pyobjc-framework-quartz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/53/dc2e0562a177af9306efceb84bc21f5cf7470acaa8f28f64e62bf828b7e1/pyobjc_framework_vision-11.0.tar.gz", hash = "sha256:45342e5253c306dbcd056a68bff04ffbfa00e9ac300a02aabf2e81053b771e39", size = 133175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/84/d23a745d46858409a1dca3e7f5cb3089c148ebb8d42e7a6289e1972ad650/pyobjc_framework_Vision-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ca7cc48332d804a02b5b17f31bed52dd4b7c323f9e4ff4b4e7ecd35d39cc0759", size = 21754 }, + { url = "https://files.pythonhosted.org/packages/3a/80/6db9fc2a3f8b991860156f4700f979ad8aa1e9617b0efa720ee3b52e3602/pyobjc_framework_Vision-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1b07aa867dda47d2a4883cd969e248039988b49190ba097cbe9747156b5d1f30", size = 17099 }, + { url = "https://files.pythonhosted.org/packages/f0/57/0f293f3bae614451292d4206ce9cef92d755b26feb545b35478be3324871/pyobjc_framework_Vision-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b2fd9088d91d950b2127e98785b3d4c6b55516bf733af7cab4b30950571d32be", size = 17111 }, + { url = "https://files.pythonhosted.org/packages/c6/45/02b8cdde64ca896734204bcadd1e03abc2f96ced1f812b262cb0ddf2d783/pyobjc_framework_Vision-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9821d930025d0c084a83ed216751d5b4f022cb4a47d42440b1c6766d8952620d", size = 17302 }, +] [[package]] name = "pyobjc-framework-webkit" @@ -3393,6 +3952,12 @@ dependencies = [ { name = "pyobjc-framework-cocoa" }, ] sdist = { url = "https://files.pythonhosted.org/packages/79/4f/02a6270acf225c2a34339677e796002c77506238475059ae6e855358a40c/pyobjc_framework_webkit-11.0.tar.gz", hash = "sha256:fa6bedf9873786b3376a74ce2ea9dcd311f2a80f61e33dcbd931cc956aa29644", size = 767210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/63/6f04faa75c4c39c54007b256a8e13838c1de213d487f561937d342ec2eac/pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed", size = 44940 }, + { url = "https://files.pythonhosted.org/packages/3e/61/934f03510e7f49454fbf6eeff8ad2eca5d8bfbe71aa4b8a034f8132af2fa/pyobjc_framework_WebKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e4911519e94822011d99fdb9addf4a176f45a79808dab18dc303293f4590f7c", size = 44901 }, + { url = "https://files.pythonhosted.org/packages/dc/8b/e880680429fbac494687626c1338758e70b5dfb75883d9cb78f66635f381/pyobjc_framework_WebKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:22d09bb22c3c48d9243f300f8264a68ecc0bdfe09d25794ee86ab2239eae7da2", size = 44938 }, + { url = "https://files.pythonhosted.org/packages/ec/8f/f0ba035f682038264b1e05bde8fb538e8fa61267dc3ac22e3c2e3d3001bc/pyobjc_framework_WebKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6141a416f1eb33ded2c6685931d1b4d5f17c83814f2d17b7e2febff03c6f6bee", size = 45443 }, +] [[package]] name = "pyperclip" @@ -3409,6 +3974,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216 }, ] +[[package]] +name = "pytest" +version = "8.3.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3808,7 +4388,7 @@ name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ @@ -3877,6 +4457,7 @@ source = { editable = "." } dependencies = [ { name = "browser-use" }, { name = "fastapi" }, + { name = "pytest" }, { name = "typer" }, { name = "uvicorn" }, ] @@ -3891,6 +4472,7 @@ dev = [ requires-dist = [ { name = "browser-use", specifier = ">=0.1.46" }, { name = "fastapi", specifier = ">=0.115.12" }, + { name = "pytest", specifier = ">=8.3.5" }, { name = "typer", specifier = ">=0.15.3" }, { name = "uvicorn", specifier = ">=0.34.2" }, ] From 966c00647c75f0665718d49c527e65b6c4d7713a Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 01:09:16 -0500 Subject: [PATCH 02/13] making tests --- workflows/pyproject.toml | 1 + workflows/tests/shadowdom-closed/app.js | 29 +++++++ workflows/tests/shadowdom-closed/closed.html | 8 ++ .../shadow-closed.workflow.json | 41 ++++++++++ .../shadowdom-closed/test_shadow_closed.py | 79 +++++++++++++++++++ .../shadow-next.workflow.json | 18 +++-- .../shadowdom-detect/shadowdom_detect.py | 5 +- workflows/uv.lock | 14 ++++ workflows/workflow_use/workflow/service.py | 36 ++++++--- 9 files changed, 215 insertions(+), 16 deletions(-) create mode 100644 workflows/tests/shadowdom-closed/app.js create mode 100644 workflows/tests/shadowdom-closed/closed.html create mode 100644 workflows/tests/shadowdom-closed/shadow-closed.workflow.json create mode 100644 workflows/tests/shadowdom-closed/test_shadow_closed.py diff --git a/workflows/pyproject.toml b/workflows/pyproject.toml index 3f0c10ca..5f8262d5 100644 --- a/workflows/pyproject.toml +++ b/workflows/pyproject.toml @@ -15,6 +15,7 @@ dependencies = [ "browser-use>=0.1.46", "fastapi>=0.115.12", "pytest>=8.3.5", + "pytest-asyncio>=0.26.0", "typer>=0.15.3", "uvicorn>=0.34.2", ] diff --git a/workflows/tests/shadowdom-closed/app.js b/workflows/tests/shadowdom-closed/app.js new file mode 100644 index 00000000..e44efb85 --- /dev/null +++ b/workflows/tests/shadowdom-closed/app.js @@ -0,0 +1,29 @@ +/* closed-mode shadow hierarchy */ +class InnerClosed extends HTMLElement { + constructor() { + super(); + const sr = this.attachShadow({ mode: 'closed' }); + sr.innerHTML = ` + + + `; + // put a value in the input so the pytest assertion can verify it + sr.querySelector('#inner-input').value = 'hello-closed'; + } +} +customElements.define('inner-closed', InnerClosed); + +class OuterClosed extends HTMLElement { + constructor() { + super(); + const sr = this.attachShadow({ mode: 'closed' }); + sr.innerHTML = ` + + + `; + } +} +customElements.define('outer-closed', OuterClosed); + +// bootstrap into the DOM +document.getElementById('root').appendChild(new OuterClosed()); diff --git a/workflows/tests/shadowdom-closed/closed.html b/workflows/tests/shadowdom-closed/closed.html new file mode 100644 index 00000000..f616ddd9 --- /dev/null +++ b/workflows/tests/shadowdom-closed/closed.html @@ -0,0 +1,8 @@ + + + Closed Shadow Test + +
+ + + diff --git a/workflows/tests/shadowdom-closed/shadow-closed.workflow.json b/workflows/tests/shadowdom-closed/shadow-closed.workflow.json new file mode 100644 index 00000000..cf2872f8 --- /dev/null +++ b/workflows/tests/shadowdom-closed/shadow-closed.workflow.json @@ -0,0 +1,41 @@ +{ + "workflow_analysis": "Test navigation inside CLOSED shadow roots", + "name": "Shadow DOM (closed) Test", + "description": "Navigate and interact with nested *closed* Shadow DOM elements", + "version": "1.0", + "steps": [ + { + "description": "Navigate to local closed-shadow page", + "type": "navigation", + "url": "http://localhost:8000/closed.html", + "timestamp": 0, + "tabId": 0 + }, + { + "description": "Type in inner input (closed)", + "type": "input", + "cssSelector": "css=outer-closed >> deep=inner-closed >> deep=#inner-input", + "value": "hello-closed", + "timeoutMs": 5000, + "timestamp": 0, + "tabId": 0 + }, + { + "description": "Click inner button (closed)", + "type": "click", + "cssSelector": "css=outer-closed >> deep=inner-closed >> deep=#inner-btn", + "timeoutMs": 5000, + "timestamp": 0, + "tabId": 0 + }, + { + "description": "Click outer button (closed)", + "type": "click", + "cssSelector": "css=outer-closed >> deep=#outer-btn", + "timeoutMs": 5000, + "timestamp": 0, + "tabId": 0 + } + ], + "input_schema": [] +} diff --git a/workflows/tests/shadowdom-closed/test_shadow_closed.py b/workflows/tests/shadowdom-closed/test_shadow_closed.py new file mode 100644 index 00000000..d345a705 --- /dev/null +++ b/workflows/tests/shadowdom-closed/test_shadow_closed.py @@ -0,0 +1,79 @@ +import asyncio, os, shutil, tempfile +from pathlib import Path +from threading import Thread +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer + +import pytest +from playwright.async_api import async_playwright +from workflow_use.workflow.service import Workflow + +TEST_DIR = Path(__file__).parent +EXT_DIR = TEST_DIR.parents[2] / "extension" / "dist" +WORKFLOW_FILE = TEST_DIR / "shadow-closed.workflow.json" + +# ---------- tiny shim ------------------------------------------------------ +class BorrowedCtxWrapper: + """Wrap a Playwright BrowserContext so browser-use actions can use it.""" + def __init__(self, pw_ctx): + self._ctx = pw_ctx # real Playwright context + + # -- async-context-manager no-ops ------------------------------------- + async def __aenter__(self): # allows: async with browser + return self + async def __aexit__(self, exc_type, exc, tb): + return False + + # -- minimal API surface that browser-use expects --------------------- + async def get_current_page(self): + """Return the current page, or open one if none exist.""" + if self._ctx.pages: + return self._ctx.pages[0] + return await self._ctx.new_page() + + # Let *any other* attribute fall through to the underlying context + def __getattr__(self, item): + return getattr(self._ctx, item) +# -------------------------------------------------------------------------- + +def start_server(): + os.chdir(TEST_DIR) + server = ThreadingHTTPServer(("127.0.0.1", 8000), SimpleHTTPRequestHandler) + t = Thread(target=server.serve_forever, daemon=True); t.start() + return server, t + +async def launch_chromium_with_extension(): + tmp_profile = tempfile.mkdtemp(prefix="pw-profile-") + args = [ + f"--disable-extensions-except={EXT_DIR}", + f"--load-extension={EXT_DIR}", + ] + pw = await async_playwright().start() + + ctx = await pw.chromium.launch_persistent_context( + tmp_profile, headless=True, args=args + ) + return pw, ctx, tmp_profile + +# ----------------------------- test ---------------------------------------- +@pytest.mark.asyncio +async def test_shadow_closed_workflow(): + server, thread = start_server() + pw, ctx, profile = await launch_chromium_with_extension() + try: + workflow = Workflow.load_from_file( + str(WORKFLOW_FILE), + existing_pw_context=BorrowedCtxWrapper(ctx), + ) + await workflow.run(close_browser_at_end=False) + + # sanity-check: selector can pierce closed shadows + page = ctx.pages[0] if ctx.pages else await ctx.new_page() + value = await page.input_value( + "css=outer-closed >> deep=inner-closed >> deep=#inner-input" + ) + assert value == "hello-closed" + finally: + await ctx.close() + await pw.stop() + shutil.rmtree(profile, ignore_errors=True) + server.shutdown(); thread.join() diff --git a/workflows/tests/shadowdom-detect/shadow-next.workflow.json b/workflows/tests/shadowdom-detect/shadow-next.workflow.json index 556a86d3..59a13a0e 100644 --- a/workflows/tests/shadowdom-detect/shadow-next.workflow.json +++ b/workflows/tests/shadowdom-detect/shadow-next.workflow.json @@ -7,24 +7,32 @@ { "description": "Navigate to local shadow page", "type": "navigation", - "url": "http://localhost:8000/index.html" + "url": "http://localhost:8000/index.html", + "timestamp": 0, + "tabId": 0 }, { "description": "Type in inner input", "type": "input", "cssSelector": "outer-element >>> inner-element >>> #inner-input", - "value": "hello" + "value": "hello", + "timestamp": 0, + "tabId": 0 }, { "description": "Click inner button", "type": "click", - "cssSelector": "outer-element >>> inner-element >>> #inner-btn" + "cssSelector": "outer-element >>> inner-element >>> #inner-btn", + "timestamp": 0, + "tabId": 0 }, { "description": "Click outer button", "type": "click", - "cssSelector": "outer-element >>> #outer-btn" + "cssSelector": "outer-element >>> #outer-btn", + "timestamp": 0, + "tabId": 0 } ], "input_schema": [] -} \ No newline at end of file +} diff --git a/workflows/tests/shadowdom-detect/shadowdom_detect.py b/workflows/tests/shadowdom-detect/shadowdom_detect.py index 4030fbaa..36137877 100644 --- a/workflows/tests/shadowdom-detect/shadowdom_detect.py +++ b/workflows/tests/shadowdom-detect/shadowdom_detect.py @@ -9,7 +9,8 @@ from workflow_use.workflow.service import Workflow -TEST_DIR = Path(__file__).parent / "nextjs-shadow" +TEST_DIR = Path(__file__).parent + def start_server(): @@ -29,4 +30,4 @@ async def test_shadow_nextjs_workflow(): await workflow.run(close_browser_at_end=True) finally: server.shutdown() - thread.join() \ No newline at end of file + thread.join() diff --git a/workflows/uv.lock b/workflows/uv.lock index 818a75ad..275e2f17 100644 --- a/workflows/uv.lock +++ b/workflows/uv.lock @@ -3989,6 +3989,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, ] +[[package]] +name = "pytest-asyncio" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694 }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -4458,6 +4470,7 @@ dependencies = [ { name = "browser-use" }, { name = "fastapi" }, { name = "pytest" }, + { name = "pytest-asyncio" }, { name = "typer" }, { name = "uvicorn" }, ] @@ -4473,6 +4486,7 @@ requires-dist = [ { name = "browser-use", specifier = ">=0.1.46" }, { name = "fastapi", specifier = ">=0.115.12" }, { name = "pytest", specifier = ">=8.3.5" }, + { name = "pytest-asyncio", specifier = ">=0.26.0" }, { name = "typer", specifier = ">=0.15.3" }, { name = "uvicorn", specifier = ">=0.34.2" }, ] diff --git a/workflows/workflow_use/workflow/service.py b/workflows/workflow_use/workflow/service.py index 8aaa0d80..4698c338 100644 --- a/workflows/workflow_use/workflow/service.py +++ b/workflows/workflow_use/workflow/service.py @@ -33,6 +33,10 @@ ) from workflow_use.workflow.prompts import WORKFLOW_FALLBACK_PROMPT_TEMPLATE +from typing import Any, Dict, List, TYPE_CHECKING +if TYPE_CHECKING: + from playwright.async_api import BrowserContext as PWContext + logger = logging.getLogger(__name__) @@ -47,6 +51,7 @@ def __init__( browser: Browser | None = None, llm: BaseChatModel | None = None, fallback_to_agent: bool = True, + existing_pw_context: "PWContext | None" = None, ) -> None: """Initialize a new Workflow instance from a schema object. @@ -69,10 +74,22 @@ def __init__( self.controller = controller or WorkflowController() self.browser = browser or Browser() + self.llm = llm self.fallback_to_agent = fallback_to_agent - self.browser_context = BrowserContext(browser=self.browser, config=self.browser.config.new_context_config) + if existing_pw_context is not None: + # borrowing an already-launched persistent context (e.g. for tests) + self.browser_context = existing_pw_context + self._owns_context = False + else: + # normal path – create a fresh context on demand + self.browser_context = BrowserContext( + browser=self.browser, + config=self.browser.config.new_context_config, + ) + self._owns_context = True + self.context: dict[str, Any] = {} @@ -88,12 +105,13 @@ def load_from_file( controller: WorkflowController | None = None, browser: Browser | None = None, llm: BaseChatModel | None = None, + existing_pw_context: "PWContext | None" = None, ) -> Workflow: """Load a workflow from a file.""" with open(file_path, 'r') as f: data = _json.load(f) workflow_schema = WorkflowDefinitionSchema(**data) - return Workflow(workflow_schema=workflow_schema, controller=controller, browser=browser, llm=llm) + return Workflow(workflow_schema=workflow_schema, controller=controller, browser=browser, llm=llm, existing_pw_context=existing_pw_context,) # --- Runners --- async def _run_deterministic_step(self, step: DeterministicWorkflowStep) -> ActionResult: @@ -403,7 +421,9 @@ async def run(self, inputs: dict[str, Any] | None = None, close_browser_at_end: results: List[Any] = [] - await self.browser_context.__aenter__() + if self._owns_context: + await self.browser_context.__aenter__() + try: for step_index, step_dict in enumerate(self.steps): # self.steps now holds dictionaries await asyncio.sleep(0.1) @@ -422,15 +442,13 @@ async def run(self, inputs: dict[str, Any] | None = None, close_browser_at_end: self._store_output(step_resolved, result) logger.info(f'--- Finished Step {step_index + 1} ---\n') finally: - if close_browser_at_end: - # Ensure __aexit__ is called with appropriate args for exception handling if needed - # For simplicity, assuming no exception to pass: exc_type, exc_val, exc_tb = None, None, None - # wait 3 seconds before closing the browser - await asyncio.sleep(3) + if close_browser_at_end and self._owns_context: + + await asyncio.sleep(3) # optional pause await self.browser_context.__aexit__(None, None, None) # Clean-up browser after finishing workflow - if close_browser_at_end: + if close_browser_at_end and self._owns_context: await self.browser.close() return results From 3f49824dbf6da82200e352e2d32692e74ba1fd8b Mon Sep 17 00:00:00 2001 From: Guido1Alessandro1Trevisan <46954188+Guido1Alessandro1Trevisan@users.noreply.github.com> Date: Wed, 21 May 2025 02:10:05 -0500 Subject: [PATCH 03/13] Add shadow DOM patch in extension --- extension/src/entrypoints/context.ts | 23 +++++++++++++++++++ .../shadow-closed.workflow.json | 6 ++--- .../shadowdom-closed/test_shadow_closed.py | 5 ++-- 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 extension/src/entrypoints/context.ts diff --git a/extension/src/entrypoints/context.ts b/extension/src/entrypoints/context.ts new file mode 100644 index 00000000..71f5af04 --- /dev/null +++ b/extension/src/entrypoints/context.ts @@ -0,0 +1,23 @@ +export default defineContentScript({ + matches: [''], + // Run as early as possible to intercept shadow root creation + runAt: 'document_start', + main() { + const patch = `( + function() { + const original = Element.prototype.attachShadow; + Element.prototype.attachShadow = function(init) { + if (init && init.mode === 'closed') { + const newInit = Object.assign({}, init, { mode: 'open' }); + return original.call(this, newInit); + } + return original.call(this, init); + }; + } + )();`; + const script = document.createElement('script'); + script.textContent = patch; + (document.documentElement || document.head).appendChild(script); + script.remove(); + }, +}); diff --git a/workflows/tests/shadowdom-closed/shadow-closed.workflow.json b/workflows/tests/shadowdom-closed/shadow-closed.workflow.json index cf2872f8..22c2d2ce 100644 --- a/workflows/tests/shadowdom-closed/shadow-closed.workflow.json +++ b/workflows/tests/shadowdom-closed/shadow-closed.workflow.json @@ -14,7 +14,7 @@ { "description": "Type in inner input (closed)", "type": "input", - "cssSelector": "css=outer-closed >> deep=inner-closed >> deep=#inner-input", + "cssSelector": "css=outer-closed >> inner-closed >> #inner-input", "value": "hello-closed", "timeoutMs": 5000, "timestamp": 0, @@ -23,7 +23,7 @@ { "description": "Click inner button (closed)", "type": "click", - "cssSelector": "css=outer-closed >> deep=inner-closed >> deep=#inner-btn", + "cssSelector": "css=outer-closed >> inner-closed >> #inner-btn", "timeoutMs": 5000, "timestamp": 0, "tabId": 0 @@ -31,7 +31,7 @@ { "description": "Click outer button (closed)", "type": "click", - "cssSelector": "css=outer-closed >> deep=#outer-btn", + "cssSelector": "css=outer-closed >> #outer-btn", "timeoutMs": 5000, "timestamp": 0, "tabId": 0 diff --git a/workflows/tests/shadowdom-closed/test_shadow_closed.py b/workflows/tests/shadowdom-closed/test_shadow_closed.py index d345a705..d76f7b43 100644 --- a/workflows/tests/shadowdom-closed/test_shadow_closed.py +++ b/workflows/tests/shadowdom-closed/test_shadow_closed.py @@ -48,7 +48,6 @@ async def launch_chromium_with_extension(): f"--load-extension={EXT_DIR}", ] pw = await async_playwright().start() - ctx = await pw.chromium.launch_persistent_context( tmp_profile, headless=True, args=args ) @@ -66,10 +65,10 @@ async def test_shadow_closed_workflow(): ) await workflow.run(close_browser_at_end=False) - # sanity-check: selector can pierce closed shadows + # sanity-check: patch opened closed shadow DOM so selectors work page = ctx.pages[0] if ctx.pages else await ctx.new_page() value = await page.input_value( - "css=outer-closed >> deep=inner-closed >> deep=#inner-input" + "css=outer-closed >> inner-closed >> #inner-input" ) assert value == "hello-closed" finally: From 901a6c02e250959b375df72a781647ecb89c03f3 Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 02:22:00 -0500 Subject: [PATCH 04/13] mounted --- extension/.gitignore | 1 - extension/.wxt/tsconfig.json | 28 ++ extension/.wxt/types/globals.d.ts | 15 + extension/.wxt/types/i18n.d.ts | 81 +++ extension/.wxt/types/imports-module.d.ts | 21 + extension/.wxt/types/imports.d.ts | 57 +++ extension/.wxt/types/paths.d.ts | 17 + extension/.wxt/wxt.d.ts | 8 + extension/src/entrypoints/content.ts | 597 ++++++++--------------- 9 files changed, 436 insertions(+), 389 deletions(-) create mode 100644 extension/.wxt/tsconfig.json create mode 100644 extension/.wxt/types/globals.d.ts create mode 100644 extension/.wxt/types/i18n.d.ts create mode 100644 extension/.wxt/types/imports-module.d.ts create mode 100644 extension/.wxt/types/imports.d.ts create mode 100644 extension/.wxt/types/paths.d.ts create mode 100644 extension/.wxt/wxt.d.ts diff --git a/extension/.gitignore b/extension/.gitignore index a2569538..882e5cb0 100644 --- a/extension/.gitignore +++ b/extension/.gitignore @@ -11,7 +11,6 @@ node_modules .output stats.html stats-*.json -.wxt web-ext.config.ts # Editor directories and files diff --git a/extension/.wxt/tsconfig.json b/extension/.wxt/tsconfig.json new file mode 100644 index 00000000..6f2e6804 --- /dev/null +++ b/extension/.wxt/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "strict": true, + "skipLibCheck": true, + "paths": { + "@": ["../src"], + "@/*": ["../src/*"], + "~": ["../src"], + "~/*": ["../src/*"], + "@@": [".."], + "@@/*": ["../*"], + "~~": [".."], + "~~/*": ["../*"] + } + }, + "include": [ + "../**/*", + "./wxt.d.ts" + ], + "exclude": ["../.output"] +} \ No newline at end of file diff --git a/extension/.wxt/types/globals.d.ts b/extension/.wxt/types/globals.d.ts new file mode 100644 index 00000000..b8aa6c72 --- /dev/null +++ b/extension/.wxt/types/globals.d.ts @@ -0,0 +1,15 @@ +// Generated by wxt +interface ImportMetaEnv { + readonly MANIFEST_VERSION: 2 | 3; + readonly BROWSER: string; + readonly CHROME: boolean; + readonly FIREFOX: boolean; + readonly SAFARI: boolean; + readonly EDGE: boolean; + readonly OPERA: boolean; + readonly COMMAND: "build" | "serve"; + readonly ENTRYPOINT: string; +} +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/extension/.wxt/types/i18n.d.ts b/extension/.wxt/types/i18n.d.ts new file mode 100644 index 00000000..0a0577a4 --- /dev/null +++ b/extension/.wxt/types/i18n.d.ts @@ -0,0 +1,81 @@ +// Generated by wxt +import "wxt/browser"; + +declare module "wxt/browser" { + /** + * See https://developer.chrome.com/docs/extensions/reference/i18n/#method-getMessage + */ + interface GetMessageOptions { + /** + * See https://developer.chrome.com/docs/extensions/reference/i18n/#method-getMessage + */ + escapeLt?: boolean + } + + export interface WxtI18n extends I18n.Static { + /** + * The extension or app ID; you might use this string to construct URLs for resources inside the extension. Even unlocalized extensions can use this message. + * Note: You can't use this message in a manifest file. + * + * "" + */ + getMessage( + messageName: "@@extension_id", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * "" + */ + getMessage( + messageName: "@@ui_locale", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * The text direction for the current locale, either "ltr" for left-to-right languages such as English or "rtl" for right-to-left languages such as Japanese. + * + * "" + */ + getMessage( + messageName: "@@bidi_dir", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * If the @@bidi_dir is "ltr", then this is "rtl"; otherwise, it's "ltr". + * + * "" + */ + getMessage( + messageName: "@@bidi_reversed_dir", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * If the @@bidi_dir is "ltr", then this is "left"; otherwise, it's "right". + * + * "" + */ + getMessage( + messageName: "@@bidi_start_edge", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + /** + * If the @@bidi_dir is "ltr", then this is "right"; otherwise, it's "left". + * + * "" + */ + getMessage( + messageName: "@@bidi_end_edge", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + getMessage( + messageName: "@@extension_id" | "@@ui_locale" | "@@bidi_dir" | "@@bidi_reversed_dir" | "@@bidi_start_edge" | "@@bidi_end_edge", + substitutions?: string | string[], + options?: GetMessageOptions, + ): string; + } +} diff --git a/extension/.wxt/types/imports-module.d.ts b/extension/.wxt/types/imports-module.d.ts new file mode 100644 index 00000000..8d30eee9 --- /dev/null +++ b/extension/.wxt/types/imports-module.d.ts @@ -0,0 +1,21 @@ +// Generated by wxt +// Types for the #import virtual module +declare module '#imports' { + export { browser, Browser } from 'wxt/browser'; + export { storage, StorageArea, WxtStorage, WxtStorageItem, StorageItemKey, StorageAreaChanges, MigrationError } from 'wxt/utils/storage'; + export { useAppConfig } from 'wxt/utils/app-config'; + export { ContentScriptContext, WxtWindowEventMap } from 'wxt/utils/content-script-context'; + export { createIframeUi, IframeContentScriptUi, IframeContentScriptUiOptions } from 'wxt/utils/content-script-ui/iframe'; + export { createIntegratedUi, IntegratedContentScriptUi, IntegratedContentScriptUiOptions } from 'wxt/utils/content-script-ui/integrated'; + export { createShadowRootUi, ShadowRootContentScriptUi, ShadowRootContentScriptUiOptions } from 'wxt/utils/content-script-ui/shadow-root'; + export { ContentScriptUi, ContentScriptUiOptions, ContentScriptOverlayAlignment, ContentScriptAppendMode, ContentScriptInlinePositioningOptions, ContentScriptOverlayPositioningOptions, ContentScriptModalPositioningOptions, ContentScriptPositioningOptions, ContentScriptAnchoredOptions, AutoMountOptions, StopAutoMount, AutoMount } from 'wxt/utils/content-script-ui/types'; + export { defineAppConfig, WxtAppConfig } from 'wxt/utils/define-app-config'; + export { defineBackground } from 'wxt/utils/define-background'; + export { defineContentScript } from 'wxt/utils/define-content-script'; + export { defineUnlistedScript } from 'wxt/utils/define-unlisted-script'; + export { defineWxtPlugin } from 'wxt/utils/define-wxt-plugin'; + export { injectScript, ScriptPublicPath, InjectScriptOptions } from 'wxt/utils/inject-script'; + export { InvalidMatchPattern, MatchPattern } from 'wxt/utils/match-patterns'; + export { useState, useCallback, useMemo, useEffect, useRef, useContext, useReducer } from 'react'; + export { fakeBrowser } from 'wxt/testing'; +} diff --git a/extension/.wxt/types/imports.d.ts b/extension/.wxt/types/imports.d.ts new file mode 100644 index 00000000..f8e366e0 --- /dev/null +++ b/extension/.wxt/types/imports.d.ts @@ -0,0 +1,57 @@ +// Generated by wxt +export {} +declare global { + const ContentScriptContext: typeof import('wxt/utils/content-script-context')['ContentScriptContext'] + const InvalidMatchPattern: typeof import('wxt/utils/match-patterns')['InvalidMatchPattern'] + const MatchPattern: typeof import('wxt/utils/match-patterns')['MatchPattern'] + const browser: typeof import('wxt/browser')['browser'] + const createIframeUi: typeof import('wxt/utils/content-script-ui/iframe')['createIframeUi'] + const createIntegratedUi: typeof import('wxt/utils/content-script-ui/integrated')['createIntegratedUi'] + const createShadowRootUi: typeof import('wxt/utils/content-script-ui/shadow-root')['createShadowRootUi'] + const defineAppConfig: typeof import('wxt/utils/define-app-config')['defineAppConfig'] + const defineBackground: typeof import('wxt/utils/define-background')['defineBackground'] + const defineContentScript: typeof import('wxt/utils/define-content-script')['defineContentScript'] + const defineUnlistedScript: typeof import('wxt/utils/define-unlisted-script')['defineUnlistedScript'] + const defineWxtPlugin: typeof import('wxt/utils/define-wxt-plugin')['defineWxtPlugin'] + const fakeBrowser: typeof import('wxt/testing')['fakeBrowser'] + const injectScript: typeof import('wxt/utils/inject-script')['injectScript'] + const storage: typeof import('wxt/utils/storage')['storage'] + const useAppConfig: typeof import('wxt/utils/app-config')['useAppConfig'] + const useCallback: typeof import('react')['useCallback'] + const useContext: typeof import('react')['useContext'] + const useEffect: typeof import('react')['useEffect'] + const useMemo: typeof import('react')['useMemo'] + const useReducer: typeof import('react')['useReducer'] + const useRef: typeof import('react')['useRef'] + const useState: typeof import('react')['useState'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Browser } from 'wxt/browser' + import('wxt/browser') + // @ts-ignore + export type { StorageArea, WxtStorage, WxtStorageItem, StorageItemKey, StorageAreaChanges, MigrationError } from 'wxt/utils/storage' + import('wxt/utils/storage') + // @ts-ignore + export type { WxtWindowEventMap } from 'wxt/utils/content-script-context' + import('wxt/utils/content-script-context') + // @ts-ignore + export type { IframeContentScriptUi, IframeContentScriptUiOptions } from 'wxt/utils/content-script-ui/iframe' + import('wxt/utils/content-script-ui/iframe') + // @ts-ignore + export type { IntegratedContentScriptUi, IntegratedContentScriptUiOptions } from 'wxt/utils/content-script-ui/integrated' + import('wxt/utils/content-script-ui/integrated') + // @ts-ignore + export type { ShadowRootContentScriptUi, ShadowRootContentScriptUiOptions } from 'wxt/utils/content-script-ui/shadow-root' + import('wxt/utils/content-script-ui/shadow-root') + // @ts-ignore + export type { ContentScriptUi, ContentScriptUiOptions, ContentScriptOverlayAlignment, ContentScriptAppendMode, ContentScriptInlinePositioningOptions, ContentScriptOverlayPositioningOptions, ContentScriptModalPositioningOptions, ContentScriptPositioningOptions, ContentScriptAnchoredOptions, AutoMountOptions, StopAutoMount, AutoMount } from 'wxt/utils/content-script-ui/types' + import('wxt/utils/content-script-ui/types') + // @ts-ignore + export type { WxtAppConfig } from 'wxt/utils/define-app-config' + import('wxt/utils/define-app-config') + // @ts-ignore + export type { ScriptPublicPath, InjectScriptOptions } from 'wxt/utils/inject-script' + import('wxt/utils/inject-script') +} diff --git a/extension/.wxt/types/paths.d.ts b/extension/.wxt/types/paths.d.ts new file mode 100644 index 00000000..cfb3cd93 --- /dev/null +++ b/extension/.wxt/types/paths.d.ts @@ -0,0 +1,17 @@ +// Generated by wxt +import "wxt/browser"; + +declare module "wxt/browser" { + export type PublicPath = + | "" + | "/" + | "/background.js" + | "/content-scripts/content.js" + | "/context.js" + | "/sidepanel.html" + type HtmlPublicPath = Extract + export interface WxtRuntime { + getURL(path: PublicPath): string; + getURL(path: `${HtmlPublicPath}${string}`): string; + } +} diff --git a/extension/.wxt/wxt.d.ts b/extension/.wxt/wxt.d.ts new file mode 100644 index 00000000..2342522e --- /dev/null +++ b/extension/.wxt/wxt.d.ts @@ -0,0 +1,8 @@ +// Generated by wxt +/// +/// +/// +/// +/// +/// +/// diff --git a/extension/src/entrypoints/content.ts b/extension/src/entrypoints/content.ts index 09438784..7edd760c 100644 --- a/extension/src/entrypoints/content.ts +++ b/extension/src/entrypoints/content.ts @@ -1,460 +1,281 @@ +/* src/entrypoints/content.ts + * – RRWeb recorder + custom events + * – Open+closed Shadow-DOM instrumentation + * – Safe for WXT’s Node build (no DOM at top level) + */ + +import { defineContentScript } from '#imports'; // <- run `wxt prepare` for TS defs import * as rrweb from 'rrweb'; import { EventType, IncrementalSource } from '@rrweb/types'; -let stopRecording: (() => void) | undefined = undefined; -let isRecordingActive = true; // Content script's local state +/* ──────────────── globals ──────────────── */ +let stopRecording: (() => void) | undefined; +let isRecordingActive = true; + let scrollTimeout: ReturnType | null = null; let lastScrollY: number | null = null; let lastDirection: 'up' | 'down' | null = null; -const DEBOUNCE_MS = 500; // Wait 500ms after scroll stops - -// --- Helper function to generate XPath --- -function getXPath(element: HTMLElement): string { - if (element.id !== '') { - return `id("${element.id}")`; - } - if (element === document.body) { - return element.tagName.toLowerCase(); - } +const DEBOUNCE_MS = 500; +/* ───────────── helper: XPath + CSS selector ───────────── */ +function getXPath(el: HTMLElement): string { + if (el.id) return `id("${el.id}")`; + if (el === document.body) return el.tagName.toLowerCase(); let ix = 0; - const siblings = element.parentNode?.children; - if (siblings) { - for (let i = 0; i < siblings.length; i++) { - const sibling = siblings[i]; - if (sibling === element) { - return `${getXPath( - element.parentElement as HTMLElement - )}/${element.tagName.toLowerCase()}[${ix + 1}]`; - } - if (sibling.nodeType === 1 && sibling.tagName === element.tagName) { - ix++; - } - } + for (const sib of Array.from(el.parentNode?.children ?? [])) { + if (sib === el) + return `${getXPath(el.parentElement as HTMLElement)}/${el.tagName.toLowerCase()}[${ix + 1}]`; + if (sib.nodeType === 1 && (sib as HTMLElement).tagName === el.tagName) ix++; } - // Fallback (should not happen often) - return element.tagName.toLowerCase(); + return el.tagName.toLowerCase(); } -// --- End Helper --- -// --- Helper function to generate CSS Selector --- -// Expanded set of safe attributes (similar to Python) -const SAFE_ATTRIBUTES = new Set([ - 'id', - 'name', - 'type', - 'placeholder', - 'aria-label', - 'aria-labelledby', - 'aria-describedby', - 'role', - 'for', - 'autocomplete', - 'required', - 'readonly', - 'alt', - 'title', - 'src', - 'href', - 'target', - // Add common data attributes if stable - 'data-id', - 'data-qa', - 'data-cy', - 'data-testid', +const SAFE_ATTRS = new Set([ + 'id','name','type','placeholder','aria-label','aria-labelledby','aria-describedby','role','for', + 'autocomplete','required','readonly','alt','title','src','href','target', + 'data-id','data-qa','data-cy','data-testid', ]); -function getEnhancedCSSSelector(element: HTMLElement, xpath: string): string { +function cssSelector(el: HTMLElement, xpath: string): string { try { - // Base selector from simplified XPath or just tagName - let cssSelector = element.tagName.toLowerCase(); - - // Handle class attributes - if (element.classList && element.classList.length > 0) { - const validClassPattern = /^[a-zA-Z_][a-zA-Z0-9_-]*$/; - element.classList.forEach((className) => { - if (className && validClassPattern.test(className)) { - cssSelector += `.${CSS.escape(className)}`; - } - }); + let sel = el.tagName.toLowerCase(); + el.classList.forEach(c => /^[a-zA-Z_][\w-]*$/.test(c) && (sel += `.${CSS.escape(c)}`)); + for (const { name, value } of Array.from(el.attributes)) { + if (name === 'class' || !SAFE_ATTRS.has(name)) continue; + const n = CSS.escape(name); + sel += value + ? /["'<>`\s]/.test(value) + ? `[${n}*="${value.replace(/"/g, '"')}"]` + : `[${n}="${value}"]` + : `[${n}]`; } + return sel; + } catch (e) { + console.error('selector-gen', e); + return `${el.tagName.toLowerCase()}[xpath="${xpath.replace(/"/g, '"')}"]`; + } +} - // Handle other safe attributes - for (const attr of element.attributes) { - const attrName = attr.name; - const attrValue = attr.value; +/* ───────────── Shadow helpers ───────────── */ +const composedTarget = (e: Event) => + (e.composedPath?.().find(n => n instanceof HTMLElement) ?? + (e.target instanceof HTMLElement ? e.target : null)) as HTMLElement | null; + +function chain(el: HTMLElement): string[] { + const chain: string[] = []; + let node: HTMLElement | null = el; + while (node) { + chain.unshift(cssSelector(node, getXPath(node))); + node = node.getRootNode() instanceof ShadowRoot ? (node.getRootNode() as ShadowRoot).host as HTMLElement : node.parentElement; + } + return chain; +} - if (attrName === 'class') continue; - if (!attrName.trim()) continue; - if (!SAFE_ATTRIBUTES.has(attrName)) continue; +function instrumentRoot(root: ShadowRoot) { + root.addEventListener('click', onClick as EventListener, true); + root.addEventListener('input', onInput as EventListener, true); + root.addEventListener('change', onSelect as EventListener, true); + root.addEventListener('keydown', onKey as EventListener, true); + root.querySelectorAll('*').forEach(n => n instanceof HTMLElement && n.shadowRoot && instrumentRoot(n.shadowRoot)); +} - const safeAttribute = CSS.escape(attrName); +function scanOpenRoots() { + document.querySelectorAll('*').forEach(el => { + const sr = (el as HTMLElement).shadowRoot; + if (sr) instrumentRoot(sr); + }); +} - if (attrValue === '') { - cssSelector += `[${safeAttribute}]`; - } else { - const safeValue = attrValue.replace(/"/g, '"'); - if (/["'<>`\s]/.test(attrValue)) { - cssSelector += `[${safeAttribute}*="${safeValue}"]`; - } else { - cssSelector += `[${safeAttribute}="${safeValue}"]`; - } - } - } - return cssSelector; - } catch (error) { - console.error('Error generating enhanced CSS selector:', error); - return `${element.tagName.toLowerCase()}[xpath="${xpath.replace( - /"/g, - '"' - )}"]`; - } +function scanClosedRoots() { + const api = (chrome as any)?.dom?.openOrClosedShadowRoot; // Chrome Canary devtools API + if (!api) return; + document.querySelectorAll('*').forEach(el => { + try { + const sr = api(el); + sr && instrumentRoot(sr); + } catch {} + }); } +/* ───────────── rrweb recorder ───────────── */ function startRecorder() { - if (stopRecording) { - console.log('Recorder already running.'); - return; // Already running - } - console.log('Starting rrweb recorder for:', window.location.href); - isRecordingActive = true; + if (stopRecording) return; stopRecording = rrweb.record({ - emit(event) { + emit(evt) { if (!isRecordingActive) return; - // Handle scroll events with debouncing and direction detection - if ( - event.type === EventType.IncrementalSnapshot && - event.data.source === IncrementalSource.Scroll - ) { - const scrollData = event.data as { id: number; x: number; y: number }; - const currentScrollY = scrollData.y; - - // Round coordinates - const roundedScrollData = { - ...scrollData, - x: Math.round(scrollData.x), - y: Math.round(scrollData.y), - }; - - // Determine scroll direction - let currentDirection: 'up' | 'down' | null = null; - if (lastScrollY !== null) { - currentDirection = currentScrollY > lastScrollY ? 'down' : 'up'; - } - - // Record immediately if direction changes - if ( - lastDirection !== null && - currentDirection !== null && - currentDirection !== lastDirection - ) { - if (scrollTimeout) { - clearTimeout(scrollTimeout); - scrollTimeout = null; - } - chrome.runtime.sendMessage({ - type: 'RRWEB_EVENT', - payload: { - ...event, - data: roundedScrollData, // Use rounded coordinates - }, - }); - lastDirection = currentDirection; - lastScrollY = currentScrollY; - return; - } - - // Update direction and position - lastDirection = currentDirection; - lastScrollY = currentScrollY; - - // Debouncer - if (scrollTimeout) { + if (evt.type === EventType.IncrementalSnapshot && evt.data.source === IncrementalSource.Scroll) { + const d = evt.data as { id: number; x: number; y: number }; + const y = Math.round(d.y), x = Math.round(d.x); + const dir = lastScrollY != null ? (y > lastScrollY ? 'down' : 'up') : null; + if (dir && lastDirection && dir !== lastDirection && scrollTimeout) { clearTimeout(scrollTimeout); + scrollTimeout = null; } + lastDirection = dir; lastScrollY = y; + if (scrollTimeout) clearTimeout(scrollTimeout); scrollTimeout = setTimeout(() => { - chrome.runtime.sendMessage({ - type: 'RRWEB_EVENT', - payload: { - ...event, - data: roundedScrollData, // Use rounded coordinates - }, - }); - scrollTimeout = null; - lastDirection = null; // Reset direction for next scroll + chrome.runtime.sendMessage({ type: 'RRWEB_EVENT', payload: { ...evt, data: { ...d, x, y } } }); + scrollTimeout = null; lastDirection = null; }, DEBOUNCE_MS); } else { - // Pass through non-scroll events unchanged - chrome.runtime.sendMessage({ type: 'RRWEB_EVENT', payload: event }); + chrome.runtime.sendMessage({ type: 'RRWEB_EVENT', payload: evt }); } }, - maskInputOptions: { - password: true, - }, - checkoutEveryNms: 10000, + maskInputOptions: { password: true }, + checkoutEveryNms: 10_000, checkoutEveryNth: 200, }); - - // Add the stop function to window for potenti - // --- End CSS Selector Helper --- al manual cleanup (window as any).rrwebStop = stopRecorder; - - // --- Attach Custom Event Listeners Permanently --- - // These listeners are always active, but the handlers check `isRecordingActive` - document.addEventListener('click', handleCustomClick, true); - document.addEventListener('input', handleInput, true); - document.addEventListener('change', handleSelectChange, true); - document.addEventListener('keydown', handleKeydown, true); - console.log('Permanently attached custom event listeners.'); + document.addEventListener('click', onClick, true); + document.addEventListener('input', onInput, true); + document.addEventListener('change', onSelect, true); + document.addEventListener('keydown', onKey, true); } function stopRecorder() { - if (stopRecording) { - console.log('Stopping rrweb recorder for:', window.location.href); - stopRecording(); - stopRecording = undefined; - isRecordingActive = false; - (window as any).rrwebStop = undefined; // Clean up window property - // Remove custom listeners when recording stops - document.removeEventListener('click', handleCustomClick, true); - document.removeEventListener('input', handleInput, true); - document.removeEventListener('change', handleSelectChange, true); // Remove change listener - document.removeEventListener('keydown', handleKeydown, true); // Remove keydown listener - } else { - console.log('Recorder not running, cannot stop.'); - } + if (!stopRecording) return; + stopRecording(); stopRecording = undefined; isRecordingActive = false; + (window as any).rrwebStop = undefined; + document.removeEventListener('click', onClick, true); + document.removeEventListener('input', onInput, true); + document.removeEventListener('change', onSelect, true); + document.removeEventListener('keydown', onKey, true); } -// --- Custom Click Handler --- -function handleCustomClick(event: MouseEvent) { +/* ───────────── CUSTOM EVENT HANDLERS ───────────── */ +function onClick(e: MouseEvent) { if (!isRecordingActive) return; - const targetElement = event.target as HTMLElement; - if (!targetElement) return; - - try { - const xpath = getXPath(targetElement); - const clickData = { + const el = composedTarget(e); + if (!el) return; + chrome.runtime.sendMessage({ + type: 'CUSTOM_CLICK_EVENT', + payload: { timestamp: Date.now(), - url: document.location.href, // Use document.location for main page URL - frameUrl: window.location.href, // URL of the frame where the event occurred - xpath: xpath, - cssSelector: getEnhancedCSSSelector(targetElement, xpath), - elementTag: targetElement.tagName, - elementText: targetElement.textContent?.trim().slice(0, 200) || '', - }; - console.log('Sending CUSTOM_CLICK_EVENT:', clickData); - chrome.runtime.sendMessage({ - type: 'CUSTOM_CLICK_EVENT', - payload: clickData, - }); - } catch (error) { - console.error('Error capturing click data:', error); - } + url: document.location.href, + frameUrl: window.location.href, + xpath: getXPath(el), + cssSelector: chain(el).join(' >> '), + elementTag: el.tagName, + elementText: el.textContent?.trim().slice(0, 200) ?? '', + }, + }); } -// --- End Custom Click Handler --- -// --- Custom Input Handler --- -function handleInput(event: Event) { +function onInput(e: Event) { if (!isRecordingActive) return; - const targetElement = event.target as HTMLInputElement | HTMLTextAreaElement; - if (!targetElement || !('value' in targetElement)) return; - const isPassword = targetElement.type === 'password'; - - try { - const xpath = getXPath(targetElement); - const inputData = { + const el = composedTarget(e) as HTMLInputElement | HTMLTextAreaElement; + if (!el || !('value' in el)) return; + chrome.runtime.sendMessage({ + type: 'CUSTOM_INPUT_EVENT', + payload: { timestamp: Date.now(), url: document.location.href, frameUrl: window.location.href, - xpath: xpath, - cssSelector: getEnhancedCSSSelector(targetElement, xpath), - elementTag: targetElement.tagName, - value: isPassword ? '********' : targetElement.value, - }; - console.log('Sending CUSTOM_INPUT_EVENT:', inputData); - chrome.runtime.sendMessage({ - type: 'CUSTOM_INPUT_EVENT', - payload: inputData, - }); - } catch (error) { - console.error('Error capturing input data:', error); - } + xpath: getXPath(el), + cssSelector: chain(el).join(' >> '), + elementTag: el.tagName, + value: el.type === 'password' ? '********' : el.value, + }, + }); } -// --- End Custom Input Handler --- -// --- Custom Select Change Handler --- -function handleSelectChange(event: Event) { +function onSelect(e: Event) { if (!isRecordingActive) return; - const targetElement = event.target as HTMLSelectElement; - // Ensure it's a select element - if (!targetElement || targetElement.tagName !== 'SELECT') return; - - try { - const xpath = getXPath(targetElement); - const selectedOption = targetElement.options[targetElement.selectedIndex]; - const selectData = { + const el = composedTarget(e) as HTMLSelectElement; + if (!el || el.tagName !== 'SELECT') return; + const opt = el.options[el.selectedIndex]; + chrome.runtime.sendMessage({ + type: 'CUSTOM_SELECT_EVENT', + payload: { timestamp: Date.now(), url: document.location.href, frameUrl: window.location.href, - xpath: xpath, - cssSelector: getEnhancedCSSSelector(targetElement, xpath), - elementTag: targetElement.tagName, - selectedValue: targetElement.value, - selectedText: selectedOption ? selectedOption.text : '', // Get selected option text - }; - console.log('Sending CUSTOM_SELECT_EVENT:', selectData); - chrome.runtime.sendMessage({ - type: 'CUSTOM_SELECT_EVENT', - payload: selectData, - }); - } catch (error) { - console.error('Error capturing select change data:', error); - } + xpath: getXPath(el), + cssSelector: chain(el).join(' >> '), + elementTag: el.tagName, + selectedValue: el.value, + selectedText: opt ? opt.text : '', + }, + }); } -// --- End Custom Select Change Handler --- -// --- Custom Keydown Handler --- -// Set of keys we want to capture explicitly -const CAPTURED_KEYS = new Set([ - 'Enter', - 'Tab', - 'Escape', - 'ArrowUp', - 'ArrowDown', - 'ArrowLeft', - 'ArrowRight', - 'Home', - 'End', - 'PageUp', - 'PageDown', - 'Backspace', - 'Delete', +const KEYS = new Set([ + 'Enter','Tab','Escape','ArrowUp','ArrowDown','ArrowLeft','ArrowRight', + 'Home','End','PageUp','PageDown','Backspace','Delete', ]); -function handleKeydown(event: KeyboardEvent) { +function onKey(e: KeyboardEvent) { if (!isRecordingActive) return; + let k = ''; + if (KEYS.has(e.key)) k = e.key; + else if ((e.ctrlKey || e.metaKey) && e.key.length === 1) k = `CmdOrCtrl+${e.key.toUpperCase()}`; + if (!k) return; + + const el = composedTarget(e); + chrome.runtime.sendMessage({ + type: 'CUSTOM_KEY_EVENT', + payload: { + timestamp: Date.now(), + url: document.location.href, + frameUrl: window.location.href, + key: k, + xpath: el ? getXPath(el) : '', + cssSelector: el ? chain(el).join(' >> ') : '', + elementTag: el ? el.tagName : 'document', + }, + }); +} - const key = event.key; - let keyToLog = ''; - - // Check if it's a key we explicitly capture - if (CAPTURED_KEYS.has(key)) { - keyToLog = key; - } - // Check for common modifier combinations (Ctrl/Cmd + key) - else if ( - (event.ctrlKey || event.metaKey) && - key.length === 1 && - /[a-zA-Z0-9]/.test(key) - ) { - // Use 'CmdOrCtrl' to be cross-platform friendly in logs - keyToLog = `CmdOrCtrl+${key.toUpperCase()}`; - } - // You could add more specific checks here (Alt+, Shift+, etc.) if needed - - // If we have a key we want to log, send the event - if (keyToLog) { - const targetElement = event.target as HTMLElement; - let xpath = ''; - let cssSelector = ''; - let elementTag = 'document'; // Default if target is not an element - if (targetElement && typeof targetElement.tagName === 'string') { - try { - xpath = getXPath(targetElement); - cssSelector = getEnhancedCSSSelector(targetElement, xpath); - elementTag = targetElement.tagName; - } catch (e) { - console.error('Error getting selector for keydown target:', e); - } +/* ───────────── content-script entry ───────────── */ +export default defineContentScript({ + matches: [''], + runAt: 'document_start', + main() { + // Safe patches – run only in the real browser + if (typeof Element !== 'undefined') { + const original = Element.prototype.attachShadow; + Element.prototype.attachShadow = function (init: ShadowRootInit): ShadowRoot { + if (init && init.mode === 'closed') init = { ...init, mode: 'open' }; + const sr = original.call(this, init); + instrumentRoot(sr); + return sr; + }; } - try { - const keyData = { - timestamp: Date.now(), - url: document.location.href, - frameUrl: window.location.href, - key: keyToLog, // The key or combination pressed - xpath: xpath, // XPath of the element in focus (if any) - cssSelector: cssSelector, // CSS selector of the element in focus (if any) - elementTag: elementTag, // Tag name of the element in focus + if (typeof customElements !== 'undefined') { + const origDefine = customElements.define.bind(customElements); + customElements.define = (name, ctor, opts) => { + const Wrapped = class extends (ctor as any) { + constructor(...a: any[]) { + // @ts-ignore + super(...a); + const sr = (this as any).shadowRoot; + sr && instrumentRoot(sr); + } + }; + // @ts-ignore + return origDefine(name, Wrapped, opts); }; - console.log('Sending CUSTOM_KEY_EVENT:', keyData); - chrome.runtime.sendMessage({ - type: 'CUSTOM_KEY_EVENT', - payload: keyData, - }); - } catch (error) { - console.error('Error capturing keydown data:', error); } - } -} -// --- End Custom Keydown Handler --- -export default defineContentScript({ - matches: [''], - main(ctx) { - // Listener for status updates from the background script - chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { - if (message.type === 'SET_RECORDING_STATUS') { - const shouldBeRecording = message.payload; - console.log(`Received recording status update: ${shouldBeRecording}`); - if (shouldBeRecording && !isRecordingActive) { - startRecorder(); - } else if (!shouldBeRecording && isRecordingActive) { - stopRecorder(); - } - } - // If needed, handle other message types here - }); + new MutationObserver(recs => + recs.forEach(r => + r.addedNodes.forEach(n => n instanceof HTMLElement && n.shadowRoot && instrumentRoot(n.shadowRoot)), + ), + ).observe(document.documentElement, { childList: true, subtree: true }); - // Request initial status when the script loads - console.log( - 'Content script loaded, requesting initial recording status...' - ); - chrome.runtime.sendMessage( - { type: 'REQUEST_RECORDING_STATUS' }, - (response) => { - if (chrome.runtime.lastError) { - console.error( - 'Error requesting initial status:', - chrome.runtime.lastError.message - ); - // Handle error - maybe default to not recording? - return; - } - if (response && response.isRecordingEnabled) { - console.log('Initial status: Recording enabled.'); - startRecorder(); - } else { - console.log('Initial status: Recording disabled.'); - // Ensure recorder is stopped if it somehow started - stopRecorder(); - } - } - ); + scanOpenRoots(); + scanClosedRoots(); - // Optional: Clean up recorder if the page is unloading - window.addEventListener('beforeunload', () => { - // Also remove permanent listeners on unload? - // Might not be strictly necessary as the page context is destroyed, - // but good practice if the script could somehow persist. - document.removeEventListener('click', handleCustomClick, true); - document.removeEventListener('input', handleInput, true); - document.removeEventListener('change', handleSelectChange, true); - document.removeEventListener('keydown', handleKeydown, true); - stopRecorder(); // Ensure rrweb is stopped + chrome.runtime.onMessage.addListener(msg => { + if (msg.type === 'SET_RECORDING_STATUS') msg.payload ? startRecorder() : stopRecorder(); }); - // Optional: Log when the content script is injected - // console.log("rrweb recorder injected into:", window.location.href); + chrome.runtime.sendMessage({ type: 'REQUEST_RECORDING_STATUS' }, res => { + if (!chrome.runtime.lastError && res?.isRecordingEnabled) startRecorder(); + }); - // Listener for potential messages from popup/background if needed later - // chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { - // if (msg.type === 'GET_EVENTS') { - // sendResponse(events); - // } - // return true; // Keep the message channel open for asynchronous response - // }); + window.addEventListener('beforeunload', stopRecorder); }, }); From 409f622867658495bb9949b6f5edf6ac07464f1a Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 02:26:04 -0500 Subject: [PATCH 05/13] fix build --- extension/.gitignore | 2 +- .../chrome-mv3/assets/sidepanel-CFClzryI.css | 1 + extension/.output/chrome-mv3/background.js | 2 + .../chrome-mv3/chunks/sidepanel-Ds4yZcXB.js | 52 +++++++++++++++++++ .../chrome-mv3/content-scripts/content.js | 19 +++++++ extension/.output/chrome-mv3/context.js | 13 +++++ extension/.output/chrome-mv3/manifest.json | 1 + extension/.output/chrome-mv3/sidepanel.html | 18 +++++++ 8 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 extension/.output/chrome-mv3/assets/sidepanel-CFClzryI.css create mode 100644 extension/.output/chrome-mv3/background.js create mode 100644 extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js create mode 100644 extension/.output/chrome-mv3/content-scripts/content.js create mode 100644 extension/.output/chrome-mv3/context.js create mode 100644 extension/.output/chrome-mv3/manifest.json create mode 100644 extension/.output/chrome-mv3/sidepanel.html diff --git a/extension/.gitignore b/extension/.gitignore index 882e5cb0..b5314bbc 100644 --- a/extension/.gitignore +++ b/extension/.gitignore @@ -8,7 +8,7 @@ pnpm-debug.log* lerna-debug.log* node_modules -.output + stats.html stats-*.json web-ext.config.ts diff --git a/extension/.output/chrome-mv3/assets/sidepanel-CFClzryI.css b/extension/.output/chrome-mv3/assets/sidepanel-CFClzryI.css new file mode 100644 index 00000000..519dd410 --- /dev/null +++ b/extension/.output/chrome-mv3/assets/sidepanel-CFClzryI.css @@ -0,0 +1 @@ +/*! tailwindcss v4.1.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring)50%,transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.absolute{position:absolute}.relative{position:relative}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mt-2{margin-top:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.size-9{width:calc(var(--spacing)*9);height:calc(var(--spacing)*9)}.h-3{height:calc(var(--spacing)*3)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-8{width:calc(var(--spacing)*8)}.w-24{width:calc(var(--spacing)*24)}.w-full{width:100%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.scale-\[1\.01\]{scale:1.01}.animate-ping{animation:var(--animate-ping)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--border)}.border-primary{border-color:var(--primary)}.bg-background{background-color:var(--background)}.bg-destructive{background-color:var(--destructive)}.bg-primary{background-color:var(--primary)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.text-center{text-align:center}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-\[10px\]{font-size:10px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-destructive{color:var(--destructive)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:border-muted-foreground\/50:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:border-muted-foreground\/50:hover{border-color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}}:root{--radius:.625rem;--background:oklch(1 0 0);--foreground:oklch(.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(.145 0 0);--primary:oklch(.205 0 0);--primary-foreground:oklch(.985 0 0);--secondary:oklch(.97 0 0);--secondary-foreground:oklch(.205 0 0);--muted:oklch(.97 0 0);--muted-foreground:oklch(.556 0 0);--accent:oklch(.97 0 0);--accent-foreground:oklch(.205 0 0);--destructive:oklch(.577 .245 27.325);--border:oklch(.922 0 0);--input:oklch(.922 0 0);--ring:oklch(.708 0 0);--chart-1:oklch(.646 .222 41.116);--chart-2:oklch(.6 .118 184.704);--chart-3:oklch(.398 .07 227.392);--chart-4:oklch(.828 .189 84.429);--chart-5:oklch(.769 .188 70.08);--sidebar:oklch(.985 0 0);--sidebar-foreground:oklch(.145 0 0);--sidebar-primary:oklch(.205 0 0);--sidebar-primary-foreground:oklch(.985 0 0);--sidebar-accent:oklch(.97 0 0);--sidebar-accent-foreground:oklch(.205 0 0);--sidebar-border:oklch(.922 0 0);--sidebar-ring:oklch(.708 0 0)}.dark{--background:oklch(.145 0 0);--foreground:oklch(.985 0 0);--card:oklch(.205 0 0);--card-foreground:oklch(.985 0 0);--popover:oklch(.205 0 0);--popover-foreground:oklch(.985 0 0);--primary:oklch(.922 0 0);--primary-foreground:oklch(.205 0 0);--secondary:oklch(.269 0 0);--secondary-foreground:oklch(.985 0 0);--muted:oklch(.269 0 0);--muted-foreground:oklch(.708 0 0);--accent:oklch(.269 0 0);--accent-foreground:oklch(.985 0 0);--destructive:oklch(.704 .191 22.216);--border:oklch(1 0 0/10%);--input:oklch(1 0 0/15%);--ring:oklch(.556 0 0);--chart-1:oklch(.488 .243 264.376);--chart-2:oklch(.696 .17 162.48);--chart-3:oklch(.769 .188 70.08);--chart-4:oklch(.627 .265 303.9);--chart-5:oklch(.645 .246 16.439);--sidebar:oklch(.205 0 0);--sidebar-foreground:oklch(.985 0 0);--sidebar-primary:oklch(.488 .243 264.376);--sidebar-primary-foreground:oklch(.985 0 0);--sidebar-accent:oklch(.269 0 0);--sidebar-accent-foreground:oklch(.985 0 0);--sidebar-border:oklch(1 0 0/10%);--sidebar-ring:oklch(.556 0 0)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}} diff --git a/extension/.output/chrome-mv3/background.js b/extension/.output/chrome-mv3/background.js new file mode 100644 index 00000000..d570ec71 --- /dev/null +++ b/extension/.output/chrome-mv3/background.js @@ -0,0 +1,2 @@ +var background=function(){"use strict";var _,C;function U(t){return t==null||typeof t=="function"?{main:t}:t}var u=(t=>(t[t.DomContentLoaded=0]="DomContentLoaded",t[t.Load=1]="Load",t[t.FullSnapshot=2]="FullSnapshot",t[t.IncrementalSnapshot=3]="IncrementalSnapshot",t[t.Meta=4]="Meta",t[t.Custom=5]="Custom",t[t.Plugin=6]="Plugin",t))(u||{}),g=(t=>(t[t.Mutation=0]="Mutation",t[t.MouseMove=1]="MouseMove",t[t.MouseInteraction=2]="MouseInteraction",t[t.Scroll=3]="Scroll",t[t.ViewportResize=4]="ViewportResize",t[t.Input=5]="Input",t[t.TouchMove=6]="TouchMove",t[t.MediaInteraction=7]="MediaInteraction",t[t.StyleSheetRule=8]="StyleSheetRule",t[t.CanvasMutation=9]="CanvasMutation",t[t.Font=10]="Font",t[t.Log=11]="Log",t[t.Drag=12]="Drag",t[t.StyleDeclaration=13]="StyleDeclaration",t[t.Selection=14]="Selection",t[t.AdoptedStyleSheet=15]="AdoptedStyleSheet",t[t.CustomElement=16]="CustomElement",t))(g||{});const v=U(()=>{const t={},c={};let d=!0,E=null;const R="http://127.0.0.1:7331/event";async function k(o){const n=new TextEncoder().encode(o),r=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(r)).map(l=>l.toString(16).padStart(2,"0")).join("")}async function b(o){try{await fetch(R,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}catch(s){console.warn(`Failed to send event to Python server at ${R}:`,s)}}async function y(){const o=Object.keys(t).flatMap(a=>{const l=parseInt(a,10);return N(t[l]||[])}).sort((a,l)=>a.timestamp-l.timestamp),s={name:"Recorded Workflow",description:`Recorded on ${new Date().toLocaleString()}`,version:"1.0.0",input_schema:[],steps:o},n=JSON.stringify(o),r=await k(n);if(E!==null&&r===E)return s;E=r;const e={type:"WORKFLOW_UPDATE",timestamp:Date.now(),payload:s};return b(e),s}function O(){const o=d?"recording":"stopped";chrome.tabs.query({},s=>{s.forEach(n=>{n.id&&chrome.tabs.sendMessage(n.id,{type:"SET_RECORDING_STATUS",payload:d}).catch(r=>{})})}),chrome.runtime.sendMessage({type:"recording_status_updated",payload:{status:o}}).catch(s=>{})}function T(o,s){if(!d)return;console.log(`Sending ${o}:`,s);const n=s.tabId;n?(t[n]||(t[n]=[]),t[n].push({messageType:o,timestamp:Date.now(),tabId:n,...s}),y()):console.warn("Tab event received without tabId in payload:",o,s)}chrome.tabs.onCreated.addListener(o=>{T("CUSTOM_TAB_CREATED",{tabId:o.id,openerTabId:o.openerTabId,url:o.pendingUrl||o.url,windowId:o.windowId,index:o.index})}),chrome.tabs.onUpdated.addListener((o,s,n)=>{(s.url||s.status==="complete")&&T("CUSTOM_TAB_UPDATED",{tabId:o,changeInfo:s,windowId:n.windowId,url:n.url,title:n.title})}),chrome.tabs.onActivated.addListener(o=>{T("CUSTOM_TAB_ACTIVATED",{tabId:o.tabId,windowId:o.windowId})}),chrome.tabs.onRemoved.addListener((o,s)=>{T("CUSTOM_TAB_REMOVED",{tabId:o,windowId:s.windowId,isWindowClosing:s.isWindowClosing})});function N(o){var n;const s=[];for(const r of o)switch(r.messageType){case"CUSTOM_CLICK_EVENT":{const e=r;if(e.url&&e.frameUrl&&e.xpath&&e.elementTag){const a={type:"click",timestamp:e.timestamp,tabId:e.tabId,url:e.url,frameUrl:e.frameUrl,xpath:e.xpath,cssSelector:e.cssSelector,elementTag:e.elementTag,elementText:e.elementText,screenshot:e.screenshot};s.push(a)}else console.warn("Skipping incomplete CUSTOM_CLICK_EVENT:",e);break}case"CUSTOM_INPUT_EVENT":{const e=r;if(e.url&&e.xpath&&e.elementTag){const a=s.length>0?s[s.length-1]:null;if(a&&a.type==="input"&&a.tabId===e.tabId&&a.url===e.url&&a.frameUrl===e.frameUrl&&a.xpath===e.xpath&&a.cssSelector===e.cssSelector&&a.elementTag===e.elementTag)a.value=e.value,a.timestamp=e.timestamp,a.screenshot=e.screenshot;else{const l={type:"input",timestamp:e.timestamp,tabId:e.tabId,url:e.url,frameUrl:e.frameUrl,xpath:e.xpath,cssSelector:e.cssSelector,elementTag:e.elementTag,value:e.value,screenshot:e.screenshot};s.push(l)}}else console.warn("Skipping incomplete CUSTOM_INPUT_EVENT:",e);break}case"CUSTOM_KEY_EVENT":{const e=r;if(e.url&&e.key){const a={type:"key_press",timestamp:e.timestamp,tabId:e.tabId,url:e.url,frameUrl:e.frameUrl,key:e.key,xpath:e.xpath,cssSelector:e.cssSelector,elementTag:e.elementTag,screenshot:e.screenshot};s.push(a)}else console.warn("Skipping incomplete CUSTOM_KEY_EVENT:",e);break}case"RRWEB_EVENT":{const e=r;if(e.type===u.IncrementalSnapshot&&e.data.source===g.Scroll){const a=e.data,l=c[e.tabId],p=s.length>0?s[s.length-1]:null;if(p&&p.type==="scroll"&&p.tabId===e.tabId&&p.targetId===a.id)p.scrollX=a.x,p.scrollY=a.y,p.timestamp=e.timestamp;else{const i={type:"scroll",timestamp:e.timestamp,tabId:e.tabId,targetId:a.id,scrollX:a.x,scrollY:a.y,url:l==null?void 0:l.url};s.push(i)}}else if(e.type===u.Meta&&((n=e.data)!=null&&n.href)){const a=e.data,l={type:"navigation",timestamp:e.timestamp,tabId:e.tabId,url:a.href};s.push(l)}break}}return s}chrome.runtime.onMessage.addListener((o,s,n)=>{var a,l,p;let r=!1;const e=["CUSTOM_CLICK_EVENT","CUSTOM_INPUT_EVENT","CUSTOM_SELECT_EVENT","CUSTOM_KEY_EVENT"];if(o.type==="RRWEB_EVENT"||e.includes(o.type)){if(!d)return!1;if(!((a=s.tab)!=null&&a.id))return console.warn("Received event without tab ID:",o),!1;const i=s.tab.id,f=e.includes(o.type),m=(S,A)=>{var M,D;t[i]||(t[i]=[]),c[i]||(c[i]={}),(M=s.tab)!=null&&M.url&&!c[i].url&&(c[i].url=s.tab.url),(D=s.tab)!=null&&D.title&&!c[i].title&&(c[i].title=s.tab.title);const P={...S,tabId:i,messageType:o.type,screenshot:A};t[i].push(P),y()};f&&((l=s.tab)!=null&&l.windowId)?(r=!0,chrome.tabs.captureVisibleTab(s.tab.windowId,{format:"jpeg",quality:75},S=>{chrome.runtime.lastError?(console.error("Screenshot failed:",chrome.runtime.lastError.message),m(o.payload)):m(o.payload,S)})):o.type==="RRWEB_EVENT"?m(o.payload):f&&(console.warn("Storing custom event without screenshot due to missing windowId or other issue."),m(o.payload))}else{if(o.type==="GET_RECORDING_DATA")return r=!0,(async()=>{const i=await y(),f=d?"recording":i.steps.length>0?"stopped":"idle";n({workflow:i,recordingStatus:f})})(),r;if(o.type==="START_RECORDING"){if(console.log("Received START_RECORDING request."),Object.keys(t).forEach(i=>delete t[parseInt(i)]),Object.keys(c).forEach(i=>delete c[parseInt(i)]),console.log("Cleared previous recording data."),!d){d=!0,console.log("Recording status set to: true"),O();const i={type:"RECORDING_STARTED",timestamp:Date.now(),payload:{message:"Recording has started"}};b(i)}n({status:"started"})}else if(o.type==="STOP_RECORDING"){if(console.log("Received STOP_RECORDING request."),d){d=!1,console.log("Recording status set to: false"),O();const i={type:"RECORDING_STOPPED",timestamp:Date.now(),payload:{message:"Recording has stopped"}};b(i)}n({status:"stopped"})}else o.type==="REQUEST_RECORDING_STATUS"&&((p=s.tab)!=null&&p.id)&&(console.log(`Sending initial status (${d}) to tab ${s.tab.id}`),n({isRecordingEnabled:d}))}return r}),console.log("Background script loaded. Initial recording status:",d,"(EventType:",u,", IncrementalSource:",g,")"),chrome.sidePanel.setPanelBehavior({openPanelOnActionClick:!0}).catch(o=>console.error("Failed to set panel behavior:",o))});function x(){}(C=(_=globalThis.browser)==null?void 0:_.runtime)!=null&&C.id?globalThis.browser:globalThis.chrome;function h(t,...c){}const I={debug:(...t)=>h(console.debug,...t),log:(...t)=>h(console.log,...t),warn:(...t)=>h(console.warn,...t),error:(...t)=>h(console.error,...t)};let w;try{w=v.main(),w instanceof Promise&&console.warn("The background's main() function return a promise, but it must be synchronous")}catch(t){throw I.error("The background crashed on startup!"),t}return w}(); +background; diff --git a/extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js b/extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js new file mode 100644 index 00000000..e50ae412 --- /dev/null +++ b/extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js @@ -0,0 +1,52 @@ +(function(){const S=document.createElement("link").relList;if(S&&S.supports&&S.supports("modulepreload"))return;for(const x of document.querySelectorAll('link[rel="modulepreload"]'))s(x);new MutationObserver(x=>{for(const R of x)if(R.type==="childList")for(const N of R.addedNodes)N.tagName==="LINK"&&N.rel==="modulepreload"&&s(N)}).observe(document,{childList:!0,subtree:!0});function b(x){const R={};return x.integrity&&(R.integrity=x.integrity),x.referrerPolicy&&(R.referrerPolicy=x.referrerPolicy),x.crossOrigin==="use-credentials"?R.credentials="include":x.crossOrigin==="anonymous"?R.credentials="omit":R.credentials="same-origin",R}function s(x){if(x.ep)return;x.ep=!0;const R=b(x);fetch(x.href,R)}})();try{}catch(f){console.error("[wxt] Failed to initialize plugins",f)}function Hd(f){return f&&f.__esModule&&Object.prototype.hasOwnProperty.call(f,"default")?f.default:f}var of={exports:{}},Un={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var gd;function bv(){if(gd)return Un;gd=1;var f=Symbol.for("react.transitional.element"),S=Symbol.for("react.fragment");function b(s,x,R){var N=null;if(R!==void 0&&(N=""+R),x.key!==void 0&&(N=""+x.key),"key"in x){R={};for(var G in x)G!=="key"&&(R[G]=x[G])}else R=x;return x=R.ref,{$$typeof:f,type:s,key:N,ref:x!==void 0?x:null,props:R}}return Un.Fragment=S,Un.jsx=b,Un.jsxs=b,Un}var bd;function pv(){return bd||(bd=1,of.exports=bv()),of.exports}var O=pv(),df={exports:{}},W={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var pd;function Sv(){if(pd)return W;pd=1;var f=Symbol.for("react.transitional.element"),S=Symbol.for("react.portal"),b=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),x=Symbol.for("react.profiler"),R=Symbol.for("react.consumer"),N=Symbol.for("react.context"),G=Symbol.for("react.forward_ref"),A=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),U=Symbol.for("react.lazy"),q=Symbol.iterator;function J(o){return o===null||typeof o!="object"?null:(o=q&&o[q]||o["@@iterator"],typeof o=="function"?o:null)}var Al={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ul=Object.assign,vl={};function pl(o,_,C){this.props=o,this.context=_,this.refs=vl,this.updater=C||Al}pl.prototype.isReactComponent={},pl.prototype.setState=function(o,_){if(typeof o!="object"&&typeof o!="function"&&o!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,o,_,"setState")},pl.prototype.forceUpdate=function(o){this.updater.enqueueForceUpdate(this,o,"forceUpdate")};function rl(){}rl.prototype=pl.prototype;function nl(o,_,C){this.props=o,this.context=_,this.refs=vl,this.updater=C||Al}var dl=nl.prototype=new rl;dl.constructor=nl,ul(dl,pl.prototype),dl.isPureReactComponent=!0;var _l=Array.isArray,$={H:null,A:null,T:null,S:null,V:null},El=Object.prototype.hasOwnProperty;function Nl(o,_,C,j,B,ll){return C=ll.ref,{$$typeof:f,type:o,key:_,ref:C!==void 0?C:null,props:ll}}function V(o,_){return Nl(o.type,_,void 0,void 0,void 0,o.props)}function Cl(o){return typeof o=="object"&&o!==null&&o.$$typeof===f}function Ht(o){var _={"=":"=0",":":"=2"};return"$"+o.replace(/[=:]/g,function(C){return _[C]})}var mt=/\/+/g;function Ul(o,_){return typeof o=="object"&&o!==null&&o.key!=null?Ht(""+o.key):_.toString(36)}function Ot(){}function Tt(o){switch(o.status){case"fulfilled":return o.value;case"rejected":throw o.reason;default:switch(typeof o.status=="string"?o.then(Ot,Ot):(o.status="pending",o.then(function(_){o.status==="pending"&&(o.status="fulfilled",o.value=_)},function(_){o.status==="pending"&&(o.status="rejected",o.reason=_)})),o.status){case"fulfilled":return o.value;case"rejected":throw o.reason}}throw o}function Ml(o,_,C,j,B){var ll=typeof o;(ll==="undefined"||ll==="boolean")&&(o=null);var k=!1;if(o===null)k=!0;else switch(ll){case"bigint":case"string":case"number":k=!0;break;case"object":switch(o.$$typeof){case f:case S:k=!0;break;case U:return k=o._init,Ml(k(o._payload),_,C,j,B)}}if(k)return B=B(o),k=j===""?"."+Ul(o,0):j,_l(B)?(C="",k!=null&&(C=k.replace(mt,"$&/")+"/"),Ml(B,_,C,"",function(at){return at})):B!=null&&(Cl(B)&&(B=V(B,C+(B.key==null||o&&o.key===B.key?"":(""+B.key).replace(mt,"$&/")+"/")+k)),_.push(B)),1;k=0;var il=j===""?".":j+":";if(_l(o))for(var Sl=0;Sl>>1,o=E[ol];if(0>>1;ol<_;){var C=2*(ol+1)-1,j=E[C],B=C+1,ll=E[B];if(0>x(j,D))Bx(ll,j)?(E[ol]=ll,E[B]=D,ol=B):(E[ol]=j,E[C]=D,ol=C);else if(Bx(ll,D))E[ol]=ll,E[B]=D,ol=B;else break l}}return H}function x(E,H){var D=E.sortIndex-H.sortIndex;return D!==0?D:E.id-H.id}if(f.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var R=performance;f.unstable_now=function(){return R.now()}}else{var N=Date,G=N.now();f.unstable_now=function(){return N.now()-G}}var A=[],y=[],U=1,q=null,J=3,Al=!1,ul=!1,vl=!1,pl=!1,rl=typeof setTimeout=="function"?setTimeout:null,nl=typeof clearTimeout=="function"?clearTimeout:null,dl=typeof setImmediate<"u"?setImmediate:null;function _l(E){for(var H=b(y);H!==null;){if(H.callback===null)s(y);else if(H.startTime<=E)s(y),H.sortIndex=H.expirationTime,S(A,H);else break;H=b(y)}}function $(E){if(vl=!1,_l(E),!ul)if(b(A)!==null)ul=!0,El||(El=!0,Ul());else{var H=b(y);H!==null&&Ml($,H.startTime-E)}}var El=!1,Nl=-1,V=5,Cl=-1;function Ht(){return pl?!0:!(f.unstable_now()-ClE&&Ht());){var ol=q.callback;if(typeof ol=="function"){q.callback=null,J=q.priorityLevel;var o=ol(q.expirationTime<=E);if(E=f.unstable_now(),typeof o=="function"){q.callback=o,_l(E),H=!0;break t}q===b(A)&&s(A),_l(E)}else s(A);q=b(A)}if(q!==null)H=!0;else{var _=b(y);_!==null&&Ml($,_.startTime-E),H=!1}}break l}finally{q=null,J=D,Al=!1}H=void 0}}finally{H?Ul():El=!1}}}var Ul;if(typeof dl=="function")Ul=function(){dl(mt)};else if(typeof MessageChannel<"u"){var Ot=new MessageChannel,Tt=Ot.port2;Ot.port1.onmessage=mt,Ul=function(){Tt.postMessage(null)}}else Ul=function(){rl(mt,0)};function Ml(E,H){Nl=rl(function(){E(f.unstable_now())},H)}f.unstable_IdlePriority=5,f.unstable_ImmediatePriority=1,f.unstable_LowPriority=4,f.unstable_NormalPriority=3,f.unstable_Profiling=null,f.unstable_UserBlockingPriority=2,f.unstable_cancelCallback=function(E){E.callback=null},f.unstable_forceFrameRate=function(E){0>E||125ol?(E.sortIndex=D,S(y,E),b(A)===null&&E===b(y)&&(vl?(nl(Nl),Nl=-1):vl=!0,Ml($,D-ol))):(E.sortIndex=o,S(A,E),ul||Al||(ul=!0,El||(El=!0,Ul()))),E},f.unstable_shouldYield=Ht,f.unstable_wrapCallback=function(E){var H=J;return function(){var D=J;J=H;try{return E.apply(this,arguments)}finally{J=D}}}}(vf)),vf}var Ed;function Tv(){return Ed||(Ed=1,hf.exports=Ev()),hf.exports}var yf={exports:{}},$l={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Td;function Av(){if(Td)return $l;Td=1;var f=Ef();function S(A){var y="https://react.dev/errors/"+A;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(S){console.error(S)}}return f(),yf.exports=Av(),yf.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var zd;function Mv(){if(zd)return jn;zd=1;var f=Tv(),S=Ef(),b=zv();function s(l){var t="https://react.dev/errors/"+l;if(1o||(l.current=ol[o],ol[o]=null,o--)}function j(l,t){o++,ol[o]=l.current,l.current=t}var B=_(null),ll=_(null),k=_(null),il=_(null);function Sl(l,t){switch(j(k,t),j(ll,l),j(B,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?Lo(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=Lo(t),l=Ko(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}C(B),j(B,l)}function at(){C(B),C(ll),C(k)}function Ft(l){l.memoizedState!==null&&j(il,l);var t=B.current,e=Ko(t,l.type);t!==e&&(j(ll,l),j(B,e))}function It(l){ll.current===l&&(C(B),C(ll)),il.current===l&&(C(il),On._currentValue=D)}var Pt=Object.prototype.hasOwnProperty,Fu=f.unstable_scheduleCallback,Iu=f.unstable_cancelCallback,$d=f.unstable_shouldYield,Fd=f.unstable_requestPaint,_t=f.unstable_now,Id=f.unstable_getCurrentPriorityLevel,Af=f.unstable_ImmediatePriority,zf=f.unstable_UserBlockingPriority,Cn=f.unstable_NormalPriority,Pd=f.unstable_LowPriority,Mf=f.unstable_IdlePriority,lm=f.log,tm=f.unstable_setDisableYieldValue,Ha=null,nt=null;function le(l){if(typeof lm=="function"&&tm(l),nt&&typeof nt.setStrictMode=="function")try{nt.setStrictMode(Ha,l)}catch{}}var ut=Math.clz32?Math.clz32:nm,em=Math.log,am=Math.LN2;function nm(l){return l>>>=0,l===0?32:31-(em(l)/am|0)|0}var qn=256,Bn=4194304;function ze(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function Gn(l,t,e){var a=l.pendingLanes;if(a===0)return 0;var n=0,u=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=a&134217727;return c!==0?(a=c&~u,a!==0?n=ze(a):(i&=c,i!==0?n=ze(i):e||(e=c&~l,e!==0&&(n=ze(e))))):(c=a&~u,c!==0?n=ze(c):i!==0?n=ze(i):e||(e=a&~l,e!==0&&(n=ze(e)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,e=t&-t,u>=e||u===32&&(e&4194048)!==0)?t:n}function Ca(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function um(l,t){switch(l){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Of(){var l=qn;return qn<<=1,(qn&4194048)===0&&(qn=256),l}function _f(){var l=Bn;return Bn<<=1,(Bn&62914560)===0&&(Bn=4194304),l}function Pu(l){for(var t=[],e=0;31>e;e++)t.push(l);return t}function qa(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function im(l,t,e,a,n,u){var i=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var c=l.entanglements,r=l.expirationTimes,v=l.hiddenUpdates;for(e=i&~e;0)":-1n||r[a]!==v[n]){var T=` +`+r[a].replace(" at new "," at ");return l.displayName&&T.includes("")&&(T=T.replace("",l.displayName)),T}while(1<=a&&0<=n);break}}}finally{ui=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?We(e):""}function dm(l){switch(l.tag){case 26:case 27:case 5:return We(l.type);case 16:return We("Lazy");case 13:return We("Suspense");case 19:return We("SuspenseList");case 0:case 15:return ii(l.type,!1);case 11:return ii(l.type.render,!1);case 1:return ii(l.type,!0);case 31:return We("Activity");default:return""}}function Gf(l){try{var t="";do t+=dm(l),l=l.return;while(l);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}function ht(l){switch(typeof l){case"bigint":case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function Yf(l){var t=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function mm(l){var t=Yf(l)?"checked":"value",e=Object.getOwnPropertyDescriptor(l.constructor.prototype,t),a=""+l[t];if(!l.hasOwnProperty(t)&&typeof e<"u"&&typeof e.get=="function"&&typeof e.set=="function"){var n=e.get,u=e.set;return Object.defineProperty(l,t,{configurable:!0,get:function(){return n.call(this)},set:function(i){a=""+i,u.call(this,i)}}),Object.defineProperty(l,t,{enumerable:e.enumerable}),{getValue:function(){return a},setValue:function(i){a=""+i},stopTracking:function(){l._valueTracker=null,delete l[t]}}}}function Xn(l){l._valueTracker||(l._valueTracker=mm(l))}function wf(l){if(!l)return!1;var t=l._valueTracker;if(!t)return!0;var e=t.getValue(),a="";return l&&(a=Yf(l)?l.checked?"true":"false":l.value),l=a,l!==e?(t.setValue(l),!0):!1}function Qn(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch{return l.body}}var hm=/[\n"\\]/g;function vt(l){return l.replace(hm,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function ci(l,t,e,a,n,u,i,c){l.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?l.type=i:l.removeAttribute("type"),t!=null?i==="number"?(t===0&&l.value===""||l.value!=t)&&(l.value=""+ht(t)):l.value!==""+ht(t)&&(l.value=""+ht(t)):i!=="submit"&&i!=="reset"||l.removeAttribute("value"),t!=null?fi(l,i,ht(t)):e!=null?fi(l,i,ht(e)):a!=null&&l.removeAttribute("value"),n==null&&u!=null&&(l.defaultChecked=!!u),n!=null&&(l.checked=n&&typeof n!="function"&&typeof n!="symbol"),c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?l.name=""+ht(c):l.removeAttribute("name")}function Xf(l,t,e,a,n,u,i,c){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(l.type=u),t!=null||e!=null){if(!(u!=="submit"&&u!=="reset"||t!=null))return;e=e!=null?""+ht(e):"",t=t!=null?""+ht(t):e,c||t===l.value||(l.value=t),l.defaultValue=t}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,l.checked=c?l.checked:!!a,l.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(l.name=i)}function fi(l,t,e){t==="number"&&Qn(l.ownerDocument)===l||l.defaultValue===""+e||(l.defaultValue=""+e)}function $e(l,t,e,a){if(l=l.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),mi=!1;if(qt)try{var wa={};Object.defineProperty(wa,"passive",{get:function(){mi=!0}}),window.addEventListener("test",wa,wa),window.removeEventListener("test",wa,wa)}catch{mi=!1}var ee=null,hi=null,Zn=null;function Jf(){if(Zn)return Zn;var l,t=hi,e=t.length,a,n="value"in ee?ee.value:ee.textContent,u=n.length;for(l=0;l=Va),ls=" ",ts=!1;function es(l,t){switch(l){case"keyup":return Qm.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function as(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var la=!1;function Zm(l,t){switch(l){case"compositionend":return as(t);case"keypress":return t.which!==32?null:(ts=!0,ls);case"textInput":return l=t.data,l===ls&&ts?null:l;default:return null}}function Lm(l,t){if(la)return l==="compositionend"||!pi&&es(l,t)?(l=Jf(),Zn=hi=ee=null,la=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:e,offset:t-l};l=a}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=os(e)}}function ms(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?ms(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function hs(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=Qn(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href=="string"}catch{e=!1}if(e)l=t.contentWindow;else break;t=Qn(l.document)}return t}function Ei(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var Pm=qt&&"documentMode"in document&&11>=document.documentMode,ta=null,Ti=null,ka=null,Ai=!1;function vs(l,t,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;Ai||ta==null||ta!==Qn(a)||(a=ta,"selectionStart"in a&&Ei(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),ka&&Ka(ka,a)||(ka=a,a=Hu(Ti,"onSelect"),0>=i,n-=i,Gt=1<<32-ut(t)+n|e<u?u:8;var i=E.T,c={};E.T=c,sc(l,!1,t,e);try{var r=n(),v=E.S;if(v!==null&&v(c,r),r!==null&&typeof r=="object"&&typeof r.then=="function"){var T=fh(r,a);sn(l,t,T,ot(l))}else sn(l,t,a,ot(l))}catch(M){sn(l,t,{then:function(){},status:"rejected",reason:M},ot())}finally{H.p=u,E.T=i}}function mh(){}function cc(l,t,e,a){if(l.tag!==5)throw Error(s(476));var n=yr(l).queue;vr(l,n,t,D,e===null?mh:function(){return gr(l),e(a)})}function yr(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:D,baseState:D,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qt,lastRenderedState:D},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qt,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function gr(l){var t=yr(l).next.queue;sn(l,t,{},ot())}function fc(){return Wl(On)}function br(){return Bl().memoizedState}function pr(){return Bl().memoizedState}function hh(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=ot();l=ue(e);var a=ie(t,l,e);a!==null&&(dt(a,t,e),en(a,t,e)),t={cache:Gi()},l.payload=t;return}t=t.return}}function vh(l,t,e){var a=ot();e={lane:a,revertLane:0,action:e,hasEagerState:!1,eagerState:null,next:null},hu(l)?xr(t,e):(e=_i(l,t,e,a),e!==null&&(dt(e,l,a),Er(e,t,a)))}function Sr(l,t,e){var a=ot();sn(l,t,e,a)}function sn(l,t,e,a){var n={lane:a,revertLane:0,action:e,hasEagerState:!1,eagerState:null,next:null};if(hu(l))xr(t,n);else{var u=l.alternate;if(l.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,c=u(i,e);if(n.hasEagerState=!0,n.eagerState=c,it(c,i))return Fn(l,t,n,0),Tl===null&&$n(),!1}catch{}finally{}if(e=_i(l,t,n,a),e!==null)return dt(e,l,a),Er(e,t,a),!0}return!1}function sc(l,t,e,a){if(a={lane:2,revertLane:Xc(),action:a,hasEagerState:!1,eagerState:null,next:null},hu(l)){if(t)throw Error(s(479))}else t=_i(l,e,a,2),t!==null&&dt(t,l,2)}function hu(l){var t=l.alternate;return l===F||t!==null&&t===F}function xr(l,t){oa=fu=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function Er(l,t,e){if((e&4194048)!==0){var a=t.lanes;a&=l.pendingLanes,e|=a,t.lanes=e,Df(l,e)}}var vu={readContext:Wl,use:ru,useCallback:jl,useContext:jl,useEffect:jl,useImperativeHandle:jl,useLayoutEffect:jl,useInsertionEffect:jl,useMemo:jl,useReducer:jl,useRef:jl,useState:jl,useDebugValue:jl,useDeferredValue:jl,useTransition:jl,useSyncExternalStore:jl,useId:jl,useHostTransitionStatus:jl,useFormState:jl,useActionState:jl,useOptimistic:jl,useMemoCache:jl,useCacheRefresh:jl},Tr={readContext:Wl,use:ru,useCallback:function(l,t){return lt().memoizedState=[l,t===void 0?null:t],l},useContext:Wl,useEffect:ir,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,mu(4194308,4,rr.bind(null,t,l),e)},useLayoutEffect:function(l,t){return mu(4194308,4,l,t)},useInsertionEffect:function(l,t){mu(4,2,l,t)},useMemo:function(l,t){var e=lt();t=t===void 0?null:t;var a=l();if(Ge){le(!0);try{l()}finally{le(!1)}}return e.memoizedState=[a,t],a},useReducer:function(l,t,e){var a=lt();if(e!==void 0){var n=e(t);if(Ge){le(!0);try{e(t)}finally{le(!1)}}}else n=t;return a.memoizedState=a.baseState=n,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:n},a.queue=l,l=l.dispatch=vh.bind(null,F,l),[a.memoizedState,l]},useRef:function(l){var t=lt();return l={current:l},t.memoizedState=l},useState:function(l){l=ac(l);var t=l.queue,e=Sr.bind(null,F,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:uc,useDeferredValue:function(l,t){var e=lt();return ic(e,l,t)},useTransition:function(){var l=ac(!1);return l=vr.bind(null,F,l.queue,!0,!1),lt().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var a=F,n=lt();if(fl){if(e===void 0)throw Error(s(407));e=e()}else{if(e=t(),Tl===null)throw Error(s(349));(al&124)!==0||Zs(a,t,e)}n.memoizedState=e;var u={value:e,getSnapshot:t};return n.queue=u,ir(Ks.bind(null,a,u,l),[l]),a.flags|=2048,ma(9,du(),Ls.bind(null,a,u,e,t),null),e},useId:function(){var l=lt(),t=Tl.identifierPrefix;if(fl){var e=Yt,a=Gt;e=(a&~(1<<32-ut(a)-1)).toString(32)+e,t="«"+t+"R"+e,e=su++,0L?(Zl=Q,Q=null):Zl=Q.sibling;var cl=g(m,Q,h[L],z);if(cl===null){Q===null&&(Q=Zl);break}l&&Q&&cl.alternate===null&&t(m,Q),d=u(cl,d,L),P===null?Y=cl:P.sibling=cl,P=cl,Q=Zl}if(L===h.length)return e(m,Q),fl&&Ue(m,L),Y;if(Q===null){for(;LL?(Zl=Q,Q=null):Zl=Q.sibling;var Te=g(m,Q,cl.value,z);if(Te===null){Q===null&&(Q=Zl);break}l&&Q&&Te.alternate===null&&t(m,Q),d=u(Te,d,L),P===null?Y=Te:P.sibling=Te,P=Te,Q=Zl}if(cl.done)return e(m,Q),fl&&Ue(m,L),Y;if(Q===null){for(;!cl.done;L++,cl=h.next())cl=M(m,cl.value,z),cl!==null&&(d=u(cl,d,L),P===null?Y=cl:P.sibling=cl,P=cl);return fl&&Ue(m,L),Y}for(Q=a(Q);!cl.done;L++,cl=h.next())cl=p(Q,m,L,cl.value,z),cl!==null&&(l&&cl.alternate!==null&&Q.delete(cl.key===null?L:cl.key),d=u(cl,d,L),P===null?Y=cl:P.sibling=cl,P=cl);return l&&Q.forEach(function(gv){return t(m,gv)}),fl&&Ue(m,L),Y}function bl(m,d,h,z){if(typeof h=="object"&&h!==null&&h.type===ul&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case J:l:{for(var Y=h.key;d!==null;){if(d.key===Y){if(Y=h.type,Y===ul){if(d.tag===7){e(m,d.sibling),z=n(d,h.props.children),z.return=m,m=z;break l}}else if(d.elementType===Y||typeof Y=="object"&&Y!==null&&Y.$$typeof===V&&zr(Y)===d.type){e(m,d.sibling),z=n(d,h.props),on(z,h),z.return=m,m=z;break l}e(m,d);break}else t(m,d);d=d.sibling}h.type===ul?(z=De(h.props.children,m.mode,z,h.key),z.return=m,m=z):(z=Pn(h.type,h.key,h.props,null,m.mode,z),on(z,h),z.return=m,m=z)}return i(m);case Al:l:{for(Y=h.key;d!==null;){if(d.key===Y)if(d.tag===4&&d.stateNode.containerInfo===h.containerInfo&&d.stateNode.implementation===h.implementation){e(m,d.sibling),z=n(d,h.children||[]),z.return=m,m=z;break l}else{e(m,d);break}else t(m,d);d=d.sibling}z=Ni(h,m.mode,z),z.return=m,m=z}return i(m);case V:return Y=h._init,h=Y(h._payload),bl(m,d,h,z)}if(Ml(h))return K(m,d,h,z);if(Ul(h)){if(Y=Ul(h),typeof Y!="function")throw Error(s(150));return h=Y.call(h),Z(m,d,h,z)}if(typeof h.then=="function")return bl(m,d,yu(h),z);if(h.$$typeof===dl)return bl(m,d,au(m,h),z);gu(m,h)}return typeof h=="string"&&h!==""||typeof h=="number"||typeof h=="bigint"?(h=""+h,d!==null&&d.tag===6?(e(m,d.sibling),z=n(d,h),z.return=m,m=z):(e(m,d),z=Di(h,m.mode,z),z.return=m,m=z),i(m)):e(m,d)}return function(m,d,h,z){try{rn=0;var Y=bl(m,d,h,z);return ha=null,Y}catch(Q){if(Q===ln||Q===uu)throw Q;var P=ct(29,Q,null,m.mode);return P.lanes=z,P.return=m,P}finally{}}}var va=Mr(!0),Or=Mr(!1),St=_(null),Dt=null;function fe(l){var t=l.alternate;j(Yl,Yl.current&1),j(St,l),Dt===null&&(t===null||ra.current!==null||t.memoizedState!==null)&&(Dt=l)}function _r(l){if(l.tag===22){if(j(Yl,Yl.current),j(St,l),Dt===null){var t=l.alternate;t!==null&&t.memoizedState!==null&&(Dt=l)}}else se()}function se(){j(Yl,Yl.current),j(St,St.current)}function Vt(l){C(St),Dt===l&&(Dt=null),C(Yl)}var Yl=_(0);function bu(l){for(var t=l;t!==null;){if(t.tag===13){var e=t.memoizedState;if(e!==null&&(e=e.dehydrated,e===null||e.data==="$?"||Pc(e)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===l)break;for(;t.sibling===null;){if(t.return===null||t.return===l)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function rc(l,t,e,a){t=l.memoizedState,e=e(a,t),e=e==null?t:U({},t,e),l.memoizedState=e,l.lanes===0&&(l.updateQueue.baseState=e)}var oc={enqueueSetState:function(l,t,e){l=l._reactInternals;var a=ot(),n=ue(a);n.payload=t,e!=null&&(n.callback=e),t=ie(l,n,a),t!==null&&(dt(t,l,a),en(t,l,a))},enqueueReplaceState:function(l,t,e){l=l._reactInternals;var a=ot(),n=ue(a);n.tag=1,n.payload=t,e!=null&&(n.callback=e),t=ie(l,n,a),t!==null&&(dt(t,l,a),en(t,l,a))},enqueueForceUpdate:function(l,t){l=l._reactInternals;var e=ot(),a=ue(e);a.tag=2,t!=null&&(a.callback=t),t=ie(l,a,e),t!==null&&(dt(t,l,e),en(t,l,e))}};function Rr(l,t,e,a,n,u,i){return l=l.stateNode,typeof l.shouldComponentUpdate=="function"?l.shouldComponentUpdate(a,u,i):t.prototype&&t.prototype.isPureReactComponent?!Ka(e,a)||!Ka(n,u):!0}function Dr(l,t,e,a){l=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(e,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(e,a),t.state!==l&&oc.enqueueReplaceState(t,t.state,null)}function Ye(l,t){var e=t;if("ref"in t){e={};for(var a in t)a!=="ref"&&(e[a]=t[a])}if(l=l.defaultProps){e===t&&(e=U({},e));for(var n in l)e[n]===void 0&&(e[n]=l[n])}return e}var pu=typeof reportError=="function"?reportError:function(l){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof l=="object"&&l!==null&&typeof l.message=="string"?String(l.message):String(l),error:l});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",l);return}console.error(l)};function Nr(l){pu(l)}function Ur(l){console.error(l)}function jr(l){pu(l)}function Su(l,t){try{var e=l.onUncaughtError;e(t.value,{componentStack:t.stack})}catch(a){setTimeout(function(){throw a})}}function Hr(l,t,e){try{var a=l.onCaughtError;a(e.value,{componentStack:e.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(n){setTimeout(function(){throw n})}}function dc(l,t,e){return e=ue(e),e.tag=3,e.payload={element:null},e.callback=function(){Su(l,t)},e}function Cr(l){return l=ue(l),l.tag=3,l}function qr(l,t,e,a){var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var u=a.value;l.payload=function(){return n(u)},l.callback=function(){Hr(t,e,a)}}var i=e.stateNode;i!==null&&typeof i.componentDidCatch=="function"&&(l.callback=function(){Hr(t,e,a),typeof n!="function"&&(ve===null?ve=new Set([this]):ve.add(this));var c=a.stack;this.componentDidCatch(a.value,{componentStack:c!==null?c:""})})}function gh(l,t,e,a,n){if(e.flags|=32768,a!==null&&typeof a=="object"&&typeof a.then=="function"){if(t=e.alternate,t!==null&&Fa(t,e,n,!0),e=St.current,e!==null){switch(e.tag){case 13:return Dt===null?qc():e.alternate===null&&Dl===0&&(Dl=3),e.flags&=-257,e.flags|=65536,e.lanes=n,a===Xi?e.flags|=16384:(t=e.updateQueue,t===null?e.updateQueue=new Set([a]):t.add(a),Gc(l,a,n)),!1;case 22:return e.flags|=65536,a===Xi?e.flags|=16384:(t=e.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([a])},e.updateQueue=t):(e=t.retryQueue,e===null?t.retryQueue=new Set([a]):e.add(a)),Gc(l,a,n)),!1}throw Error(s(435,e.tag))}return Gc(l,a,n),qc(),!1}if(fl)return t=St.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=n,a!==Hi&&(l=Error(s(422),{cause:a}),$a(yt(l,e)))):(a!==Hi&&(t=Error(s(423),{cause:a}),$a(yt(t,e))),l=l.current.alternate,l.flags|=65536,n&=-n,l.lanes|=n,a=yt(a,e),n=dc(l.stateNode,a,n),Zi(l,n),Dl!==4&&(Dl=2)),!1;var u=Error(s(520),{cause:a});if(u=yt(u,e),bn===null?bn=[u]:bn.push(u),Dl!==4&&(Dl=2),t===null)return!0;a=yt(a,e),e=t;do{switch(e.tag){case 3:return e.flags|=65536,l=n&-n,e.lanes|=l,l=dc(e.stateNode,a,l),Zi(e,l),!1;case 1:if(t=e.type,u=e.stateNode,(e.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||u!==null&&typeof u.componentDidCatch=="function"&&(ve===null||!ve.has(u))))return e.flags|=65536,n&=-n,e.lanes|=n,n=Cr(n),qr(n,l,e,a),Zi(e,n),!1}e=e.return}while(e!==null);return!1}var Br=Error(s(461)),Ql=!1;function Ll(l,t,e,a){t.child=l===null?Or(t,null,e,a):va(t,l.child,e,a)}function Gr(l,t,e,a,n){e=e.render;var u=t.ref;if("ref"in a){var i={};for(var c in a)c!=="ref"&&(i[c]=a[c])}else i=a;return qe(t),a=Wi(l,t,e,i,u,n),c=$i(),l!==null&&!Ql?(Fi(l,t,n),Zt(l,t,n)):(fl&&c&&Ui(t),t.flags|=1,Ll(l,t,a,n),t.child)}function Yr(l,t,e,a,n){if(l===null){var u=e.type;return typeof u=="function"&&!Ri(u)&&u.defaultProps===void 0&&e.compare===null?(t.tag=15,t.type=u,wr(l,t,u,a,n)):(l=Pn(e.type,null,a,t,t.mode,n),l.ref=t.ref,l.return=t,t.child=l)}if(u=l.child,!Sc(l,n)){var i=u.memoizedProps;if(e=e.compare,e=e!==null?e:Ka,e(i,a)&&l.ref===t.ref)return Zt(l,t,n)}return t.flags|=1,l=Bt(u,a),l.ref=t.ref,l.return=t,t.child=l}function wr(l,t,e,a,n){if(l!==null){var u=l.memoizedProps;if(Ka(u,a)&&l.ref===t.ref)if(Ql=!1,t.pendingProps=a=u,Sc(l,n))(l.flags&131072)!==0&&(Ql=!0);else return t.lanes=l.lanes,Zt(l,t,n)}return mc(l,t,e,a,n)}function Xr(l,t,e){var a=t.pendingProps,n=a.children,u=l!==null?l.memoizedState:null;if(a.mode==="hidden"){if((t.flags&128)!==0){if(a=u!==null?u.baseLanes|e:e,l!==null){for(n=t.child=l.child,u=0;n!==null;)u=u|n.lanes|n.childLanes,n=n.sibling;t.childLanes=u&~a}else t.childLanes=0,t.child=null;return Qr(l,t,a,e)}if((e&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},l!==null&&nu(t,u!==null?u.cachePool:null),u!==null?ws(t,u):Ki(),_r(t);else return t.lanes=t.childLanes=536870912,Qr(l,t,u!==null?u.baseLanes|e:e,e)}else u!==null?(nu(t,u.cachePool),ws(t,u),se(),t.memoizedState=null):(l!==null&&nu(t,null),Ki(),se());return Ll(l,t,n,e),t.child}function Qr(l,t,e,a){var n=wi();return n=n===null?null:{parent:Gl._currentValue,pool:n},t.memoizedState={baseLanes:e,cachePool:n},l!==null&&nu(t,null),Ki(),_r(t),l!==null&&Fa(l,t,a,!0),null}function xu(l,t){var e=t.ref;if(e===null)l!==null&&l.ref!==null&&(t.flags|=4194816);else{if(typeof e!="function"&&typeof e!="object")throw Error(s(284));(l===null||l.ref!==e)&&(t.flags|=4194816)}}function mc(l,t,e,a,n){return qe(t),e=Wi(l,t,e,a,void 0,n),a=$i(),l!==null&&!Ql?(Fi(l,t,n),Zt(l,t,n)):(fl&&a&&Ui(t),t.flags|=1,Ll(l,t,e,n),t.child)}function Vr(l,t,e,a,n,u){return qe(t),t.updateQueue=null,e=Qs(t,a,e,n),Xs(l),a=$i(),l!==null&&!Ql?(Fi(l,t,u),Zt(l,t,u)):(fl&&a&&Ui(t),t.flags|=1,Ll(l,t,e,u),t.child)}function Zr(l,t,e,a,n){if(qe(t),t.stateNode===null){var u=ua,i=e.contextType;typeof i=="object"&&i!==null&&(u=Wl(i)),u=new e(a,u),t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,u.updater=oc,t.stateNode=u,u._reactInternals=t,u=t.stateNode,u.props=a,u.state=t.memoizedState,u.refs={},Qi(t),i=e.contextType,u.context=typeof i=="object"&&i!==null?Wl(i):ua,u.state=t.memoizedState,i=e.getDerivedStateFromProps,typeof i=="function"&&(rc(t,e,i,a),u.state=t.memoizedState),typeof e.getDerivedStateFromProps=="function"||typeof u.getSnapshotBeforeUpdate=="function"||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(i=u.state,typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount(),i!==u.state&&oc.enqueueReplaceState(u,u.state,null),nn(t,a,u,n),an(),u.state=t.memoizedState),typeof u.componentDidMount=="function"&&(t.flags|=4194308),a=!0}else if(l===null){u=t.stateNode;var c=t.memoizedProps,r=Ye(e,c);u.props=r;var v=u.context,T=e.contextType;i=ua,typeof T=="object"&&T!==null&&(i=Wl(T));var M=e.getDerivedStateFromProps;T=typeof M=="function"||typeof u.getSnapshotBeforeUpdate=="function",c=t.pendingProps!==c,T||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(c||v!==i)&&Dr(t,u,a,i),ne=!1;var g=t.memoizedState;u.state=g,nn(t,a,u,n),an(),v=t.memoizedState,c||g!==v||ne?(typeof M=="function"&&(rc(t,e,M,a),v=t.memoizedState),(r=ne||Rr(t,e,r,a,g,v,i))?(T||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount()),typeof u.componentDidMount=="function"&&(t.flags|=4194308)):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=v),u.props=a,u.state=v,u.context=i,a=r):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{u=t.stateNode,Vi(l,t),i=t.memoizedProps,T=Ye(e,i),u.props=T,M=t.pendingProps,g=u.context,v=e.contextType,r=ua,typeof v=="object"&&v!==null&&(r=Wl(v)),c=e.getDerivedStateFromProps,(v=typeof c=="function"||typeof u.getSnapshotBeforeUpdate=="function")||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(i!==M||g!==r)&&Dr(t,u,a,r),ne=!1,g=t.memoizedState,u.state=g,nn(t,a,u,n),an();var p=t.memoizedState;i!==M||g!==p||ne||l!==null&&l.dependencies!==null&&eu(l.dependencies)?(typeof c=="function"&&(rc(t,e,c,a),p=t.memoizedState),(T=ne||Rr(t,e,T,a,g,p,r)||l!==null&&l.dependencies!==null&&eu(l.dependencies))?(v||typeof u.UNSAFE_componentWillUpdate!="function"&&typeof u.componentWillUpdate!="function"||(typeof u.componentWillUpdate=="function"&&u.componentWillUpdate(a,p,r),typeof u.UNSAFE_componentWillUpdate=="function"&&u.UNSAFE_componentWillUpdate(a,p,r)),typeof u.componentDidUpdate=="function"&&(t.flags|=4),typeof u.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof u.componentDidUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=p),u.props=a,u.state=p,u.context=r,a=T):(typeof u.componentDidUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=1024),a=!1)}return u=a,xu(l,t),a=(t.flags&128)!==0,u||a?(u=t.stateNode,e=a&&typeof e.getDerivedStateFromError!="function"?null:u.render(),t.flags|=1,l!==null&&a?(t.child=va(t,l.child,null,n),t.child=va(t,null,e,n)):Ll(l,t,e,n),t.memoizedState=u.state,l=t.child):l=Zt(l,t,n),l}function Lr(l,t,e,a){return Wa(),t.flags|=256,Ll(l,t,e,a),t.child}var hc={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function vc(l){return{baseLanes:l,cachePool:Us()}}function yc(l,t,e){return l=l!==null?l.childLanes&~e:0,t&&(l|=xt),l}function Kr(l,t,e){var a=t.pendingProps,n=!1,u=(t.flags&128)!==0,i;if((i=u)||(i=l!==null&&l.memoizedState===null?!1:(Yl.current&2)!==0),i&&(n=!0,t.flags&=-129),i=(t.flags&32)!==0,t.flags&=-33,l===null){if(fl){if(n?fe(t):se(),fl){var c=Rl,r;if(r=c){l:{for(r=c,c=Rt;r.nodeType!==8;){if(!c){c=null;break l}if(r=Mt(r.nextSibling),r===null){c=null;break l}}c=r}c!==null?(t.memoizedState={dehydrated:c,treeContext:Ne!==null?{id:Gt,overflow:Yt}:null,retryLane:536870912,hydrationErrors:null},r=ct(18,null,null,0),r.stateNode=c,r.return=t,t.child=r,Fl=t,Rl=null,r=!0):r=!1}r||He(t)}if(c=t.memoizedState,c!==null&&(c=c.dehydrated,c!==null))return Pc(c)?t.lanes=32:t.lanes=536870912,null;Vt(t)}return c=a.children,a=a.fallback,n?(se(),n=t.mode,c=Eu({mode:"hidden",children:c},n),a=De(a,n,e,null),c.return=t,a.return=t,c.sibling=a,t.child=c,n=t.child,n.memoizedState=vc(e),n.childLanes=yc(l,i,e),t.memoizedState=hc,a):(fe(t),gc(t,c))}if(r=l.memoizedState,r!==null&&(c=r.dehydrated,c!==null)){if(u)t.flags&256?(fe(t),t.flags&=-257,t=bc(l,t,e)):t.memoizedState!==null?(se(),t.child=l.child,t.flags|=128,t=null):(se(),n=a.fallback,c=t.mode,a=Eu({mode:"visible",children:a.children},c),n=De(n,c,e,null),n.flags|=2,a.return=t,n.return=t,a.sibling=n,t.child=a,va(t,l.child,null,e),a=t.child,a.memoizedState=vc(e),a.childLanes=yc(l,i,e),t.memoizedState=hc,t=n);else if(fe(t),Pc(c)){if(i=c.nextSibling&&c.nextSibling.dataset,i)var v=i.dgst;i=v,a=Error(s(419)),a.stack="",a.digest=i,$a({value:a,source:null,stack:null}),t=bc(l,t,e)}else if(Ql||Fa(l,t,e,!1),i=(e&l.childLanes)!==0,Ql||i){if(i=Tl,i!==null&&(a=e&-e,a=(a&42)!==0?1:li(a),a=(a&(i.suspendedLanes|e))!==0?0:a,a!==0&&a!==r.retryLane))throw r.retryLane=a,na(l,a),dt(i,l,a),Br;c.data==="$?"||qc(),t=bc(l,t,e)}else c.data==="$?"?(t.flags|=192,t.child=l.child,t=null):(l=r.treeContext,Rl=Mt(c.nextSibling),Fl=t,fl=!0,je=null,Rt=!1,l!==null&&(bt[pt++]=Gt,bt[pt++]=Yt,bt[pt++]=Ne,Gt=l.id,Yt=l.overflow,Ne=t),t=gc(t,a.children),t.flags|=4096);return t}return n?(se(),n=a.fallback,c=t.mode,r=l.child,v=r.sibling,a=Bt(r,{mode:"hidden",children:a.children}),a.subtreeFlags=r.subtreeFlags&65011712,v!==null?n=Bt(v,n):(n=De(n,c,e,null),n.flags|=2),n.return=t,a.return=t,a.sibling=n,t.child=a,a=n,n=t.child,c=l.child.memoizedState,c===null?c=vc(e):(r=c.cachePool,r!==null?(v=Gl._currentValue,r=r.parent!==v?{parent:v,pool:v}:r):r=Us(),c={baseLanes:c.baseLanes|e,cachePool:r}),n.memoizedState=c,n.childLanes=yc(l,i,e),t.memoizedState=hc,a):(fe(t),e=l.child,l=e.sibling,e=Bt(e,{mode:"visible",children:a.children}),e.return=t,e.sibling=null,l!==null&&(i=t.deletions,i===null?(t.deletions=[l],t.flags|=16):i.push(l)),t.child=e,t.memoizedState=null,e)}function gc(l,t){return t=Eu({mode:"visible",children:t},l.mode),t.return=l,l.child=t}function Eu(l,t){return l=ct(22,l,null,t),l.lanes=0,l.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},l}function bc(l,t,e){return va(t,l.child,null,e),l=gc(t,t.pendingProps.children),l.flags|=2,t.memoizedState=null,l}function kr(l,t,e){l.lanes|=t;var a=l.alternate;a!==null&&(a.lanes|=t),qi(l.return,t,e)}function pc(l,t,e,a,n){var u=l.memoizedState;u===null?l.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:e,tailMode:n}:(u.isBackwards=t,u.rendering=null,u.renderingStartTime=0,u.last=a,u.tail=e,u.tailMode=n)}function Jr(l,t,e){var a=t.pendingProps,n=a.revealOrder,u=a.tail;if(Ll(l,t,a.children,e),a=Yl.current,(a&2)!==0)a=a&1|2,t.flags|=128;else{if(l!==null&&(l.flags&128)!==0)l:for(l=t.child;l!==null;){if(l.tag===13)l.memoizedState!==null&&kr(l,e,t);else if(l.tag===19)kr(l,e,t);else if(l.child!==null){l.child.return=l,l=l.child;continue}if(l===t)break l;for(;l.sibling===null;){if(l.return===null||l.return===t)break l;l=l.return}l.sibling.return=l.return,l=l.sibling}a&=1}switch(j(Yl,a),n){case"forwards":for(e=t.child,n=null;e!==null;)l=e.alternate,l!==null&&bu(l)===null&&(n=e),e=e.sibling;e=n,e===null?(n=t.child,t.child=null):(n=e.sibling,e.sibling=null),pc(t,!1,n,e,u);break;case"backwards":for(e=null,n=t.child,t.child=null;n!==null;){if(l=n.alternate,l!==null&&bu(l)===null){t.child=n;break}l=n.sibling,n.sibling=e,e=n,n=l}pc(t,!0,e,null,u);break;case"together":pc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Zt(l,t,e){if(l!==null&&(t.dependencies=l.dependencies),he|=t.lanes,(e&t.childLanes)===0)if(l!==null){if(Fa(l,t,e,!1),(e&t.childLanes)===0)return null}else return null;if(l!==null&&t.child!==l.child)throw Error(s(153));if(t.child!==null){for(l=t.child,e=Bt(l,l.pendingProps),t.child=e,e.return=t;l.sibling!==null;)l=l.sibling,e=e.sibling=Bt(l,l.pendingProps),e.return=t;e.sibling=null}return t.child}function Sc(l,t){return(l.lanes&t)!==0?!0:(l=l.dependencies,!!(l!==null&&eu(l)))}function bh(l,t,e){switch(t.tag){case 3:Sl(t,t.stateNode.containerInfo),ae(t,Gl,l.memoizedState.cache),Wa();break;case 27:case 5:Ft(t);break;case 4:Sl(t,t.stateNode.containerInfo);break;case 10:ae(t,t.type,t.memoizedProps.value);break;case 13:var a=t.memoizedState;if(a!==null)return a.dehydrated!==null?(fe(t),t.flags|=128,null):(e&t.child.childLanes)!==0?Kr(l,t,e):(fe(t),l=Zt(l,t,e),l!==null?l.sibling:null);fe(t);break;case 19:var n=(l.flags&128)!==0;if(a=(e&t.childLanes)!==0,a||(Fa(l,t,e,!1),a=(e&t.childLanes)!==0),n){if(a)return Jr(l,t,e);t.flags|=128}if(n=t.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),j(Yl,Yl.current),a)break;return null;case 22:case 23:return t.lanes=0,Xr(l,t,e);case 24:ae(t,Gl,l.memoizedState.cache)}return Zt(l,t,e)}function Wr(l,t,e){if(l!==null)if(l.memoizedProps!==t.pendingProps)Ql=!0;else{if(!Sc(l,e)&&(t.flags&128)===0)return Ql=!1,bh(l,t,e);Ql=(l.flags&131072)!==0}else Ql=!1,fl&&(t.flags&1048576)!==0&&zs(t,tu,t.index);switch(t.lanes=0,t.tag){case 16:l:{l=t.pendingProps;var a=t.elementType,n=a._init;if(a=n(a._payload),t.type=a,typeof a=="function")Ri(a)?(l=Ye(a,l),t.tag=1,t=Zr(null,t,a,l,e)):(t.tag=0,t=mc(null,t,a,l,e));else{if(a!=null){if(n=a.$$typeof,n===_l){t.tag=11,t=Gr(null,t,a,l,e);break l}else if(n===Nl){t.tag=14,t=Yr(null,t,a,l,e);break l}}throw t=Tt(a)||a,Error(s(306,t,""))}}return t;case 0:return mc(l,t,t.type,t.pendingProps,e);case 1:return a=t.type,n=Ye(a,t.pendingProps),Zr(l,t,a,n,e);case 3:l:{if(Sl(t,t.stateNode.containerInfo),l===null)throw Error(s(387));a=t.pendingProps;var u=t.memoizedState;n=u.element,Vi(l,t),nn(t,a,null,e);var i=t.memoizedState;if(a=i.cache,ae(t,Gl,a),a!==u.cache&&Bi(t,[Gl],e,!0),an(),a=i.element,u.isDehydrated)if(u={element:a,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){t=Lr(l,t,a,e);break l}else if(a!==n){n=yt(Error(s(424)),t),$a(n),t=Lr(l,t,a,e);break l}else{switch(l=t.stateNode.containerInfo,l.nodeType){case 9:l=l.body;break;default:l=l.nodeName==="HTML"?l.ownerDocument.body:l}for(Rl=Mt(l.firstChild),Fl=t,fl=!0,je=null,Rt=!0,e=Or(t,null,a,e),t.child=e;e;)e.flags=e.flags&-3|4096,e=e.sibling}else{if(Wa(),a===n){t=Zt(l,t,e);break l}Ll(l,t,a,e)}t=t.child}return t;case 26:return xu(l,t),l===null?(e=ld(t.type,null,t.pendingProps,null))?t.memoizedState=e:fl||(e=t.type,l=t.pendingProps,a=qu(k.current).createElement(e),a[Jl]=t,a[Il]=l,kl(a,e,l),Xl(a),t.stateNode=a):t.memoizedState=ld(t.type,l.memoizedProps,t.pendingProps,l.memoizedState),null;case 27:return Ft(t),l===null&&fl&&(a=t.stateNode=Fo(t.type,t.pendingProps,k.current),Fl=t,Rt=!0,n=Rl,be(t.type)?(lf=n,Rl=Mt(a.firstChild)):Rl=n),Ll(l,t,t.pendingProps.children,e),xu(l,t),l===null&&(t.flags|=4194304),t.child;case 5:return l===null&&fl&&((n=a=Rl)&&(a=Kh(a,t.type,t.pendingProps,Rt),a!==null?(t.stateNode=a,Fl=t,Rl=Mt(a.firstChild),Rt=!1,n=!0):n=!1),n||He(t)),Ft(t),n=t.type,u=t.pendingProps,i=l!==null?l.memoizedProps:null,a=u.children,$c(n,u)?a=null:i!==null&&$c(n,i)&&(t.flags|=32),t.memoizedState!==null&&(n=Wi(l,t,rh,null,null,e),On._currentValue=n),xu(l,t),Ll(l,t,a,e),t.child;case 6:return l===null&&fl&&((l=e=Rl)&&(e=kh(e,t.pendingProps,Rt),e!==null?(t.stateNode=e,Fl=t,Rl=null,l=!0):l=!1),l||He(t)),null;case 13:return Kr(l,t,e);case 4:return Sl(t,t.stateNode.containerInfo),a=t.pendingProps,l===null?t.child=va(t,null,a,e):Ll(l,t,a,e),t.child;case 11:return Gr(l,t,t.type,t.pendingProps,e);case 7:return Ll(l,t,t.pendingProps,e),t.child;case 8:return Ll(l,t,t.pendingProps.children,e),t.child;case 12:return Ll(l,t,t.pendingProps.children,e),t.child;case 10:return a=t.pendingProps,ae(t,t.type,a.value),Ll(l,t,a.children,e),t.child;case 9:return n=t.type._context,a=t.pendingProps.children,qe(t),n=Wl(n),a=a(n),t.flags|=1,Ll(l,t,a,e),t.child;case 14:return Yr(l,t,t.type,t.pendingProps,e);case 15:return wr(l,t,t.type,t.pendingProps,e);case 19:return Jr(l,t,e);case 31:return a=t.pendingProps,e=t.mode,a={mode:a.mode,children:a.children},l===null?(e=Eu(a,e),e.ref=t.ref,t.child=e,e.return=t,t=e):(e=Bt(l.child,a),e.ref=t.ref,t.child=e,e.return=t,t=e),t;case 22:return Xr(l,t,e);case 24:return qe(t),a=Wl(Gl),l===null?(n=wi(),n===null&&(n=Tl,u=Gi(),n.pooledCache=u,u.refCount++,u!==null&&(n.pooledCacheLanes|=e),n=u),t.memoizedState={parent:a,cache:n},Qi(t),ae(t,Gl,n)):((l.lanes&e)!==0&&(Vi(l,t),nn(t,null,null,e),an()),n=l.memoizedState,u=t.memoizedState,n.parent!==a?(n={parent:a,cache:a},t.memoizedState=n,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=n),ae(t,Gl,a)):(a=u.cache,ae(t,Gl,a),a!==n.cache&&Bi(t,[Gl],e,!0))),Ll(l,t,t.pendingProps.children,e),t.child;case 29:throw t.pendingProps}throw Error(s(156,t.tag))}function Lt(l){l.flags|=4}function $r(l,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)l.flags&=-16777217;else if(l.flags|=16777216,!ud(t)){if(t=St.current,t!==null&&((al&4194048)===al?Dt!==null:(al&62914560)!==al&&(al&536870912)===0||t!==Dt))throw tn=Xi,js;l.flags|=8192}}function Tu(l,t){t!==null&&(l.flags|=4),l.flags&16384&&(t=l.tag!==22?_f():536870912,l.lanes|=t,pa|=t)}function dn(l,t){if(!fl)switch(l.tailMode){case"hidden":t=l.tail;for(var e=null;t!==null;)t.alternate!==null&&(e=t),t=t.sibling;e===null?l.tail=null:e.sibling=null;break;case"collapsed":e=l.tail;for(var a=null;e!==null;)e.alternate!==null&&(a=e),e=e.sibling;a===null?t||l.tail===null?l.tail=null:l.tail.sibling=null:a.sibling=null}}function Ol(l){var t=l.alternate!==null&&l.alternate.child===l.child,e=0,a=0;if(t)for(var n=l.child;n!==null;)e|=n.lanes|n.childLanes,a|=n.subtreeFlags&65011712,a|=n.flags&65011712,n.return=l,n=n.sibling;else for(n=l.child;n!==null;)e|=n.lanes|n.childLanes,a|=n.subtreeFlags,a|=n.flags,n.return=l,n=n.sibling;return l.subtreeFlags|=a,l.childLanes=e,t}function ph(l,t,e){var a=t.pendingProps;switch(ji(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ol(t),null;case 1:return Ol(t),null;case 3:return e=t.stateNode,a=null,l!==null&&(a=l.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Xt(Gl),at(),e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null),(l===null||l.child===null)&&(Ja(t)?Lt(t):l===null||l.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,_s())),Ol(t),null;case 26:return e=t.memoizedState,l===null?(Lt(t),e!==null?(Ol(t),$r(t,e)):(Ol(t),t.flags&=-16777217)):e?e!==l.memoizedState?(Lt(t),Ol(t),$r(t,e)):(Ol(t),t.flags&=-16777217):(l.memoizedProps!==a&&Lt(t),Ol(t),t.flags&=-16777217),null;case 27:It(t),e=k.current;var n=t.type;if(l!==null&&t.stateNode!=null)l.memoizedProps!==a&&Lt(t);else{if(!a){if(t.stateNode===null)throw Error(s(166));return Ol(t),null}l=B.current,Ja(t)?Ms(t):(l=Fo(n,a,e),t.stateNode=l,Lt(t))}return Ol(t),null;case 5:if(It(t),e=t.type,l!==null&&t.stateNode!=null)l.memoizedProps!==a&&Lt(t);else{if(!a){if(t.stateNode===null)throw Error(s(166));return Ol(t),null}if(l=B.current,Ja(t))Ms(t);else{switch(n=qu(k.current),l){case 1:l=n.createElementNS("http://www.w3.org/2000/svg",e);break;case 2:l=n.createElementNS("http://www.w3.org/1998/Math/MathML",e);break;default:switch(e){case"svg":l=n.createElementNS("http://www.w3.org/2000/svg",e);break;case"math":l=n.createElementNS("http://www.w3.org/1998/Math/MathML",e);break;case"script":l=n.createElement("div"),l.innerHTML=" + + + +
+ + From fd883cc490513919d9034989a88db394e8e41114 Mon Sep 17 00:00:00 2001 From: Guido1Alessandro1Trevisan <46954188+Guido1Alessandro1Trevisan@users.noreply.github.com> Date: Wed, 21 May 2025 13:44:24 -0500 Subject: [PATCH 06/13] test: inject shadow patch when extension missing --- .../shadowdom-closed/test_shadow_closed.py | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/workflows/tests/shadowdom-closed/test_shadow_closed.py b/workflows/tests/shadowdom-closed/test_shadow_closed.py index d76f7b43..bd89e2d8 100644 --- a/workflows/tests/shadowdom-closed/test_shadow_closed.py +++ b/workflows/tests/shadowdom-closed/test_shadow_closed.py @@ -8,7 +8,30 @@ from workflow_use.workflow.service import Workflow TEST_DIR = Path(__file__).parent -EXT_DIR = TEST_DIR.parents[2] / "extension" / "dist" +# Extension build output directory. The extension is built using `wxt build` +# which places the compiled files under `.output/chrome-mv3`. +# Tests rely on this path to load the monkey patching extension that forces +# closed shadow roots to open mode. +EXT_DIR = TEST_DIR.parents[2] / "extension" / ".output" / "chrome-mv3" +if not EXT_DIR.exists(): + pytest.skip( + f"Built extension not found at {EXT_DIR}. Run 'npm run build' in the extension directory." + ) + +# Fallback script in case the extension cannot load in headless mode. It mirrors +# the patch applied in the extension's context script (content.ts) and forces +# all newly created shadow roots to be open. +SHADOW_PATCH = """ +(function(){ + const original = Element.prototype.attachShadow; + Element.prototype.attachShadow = function(init){ + if (init && init.mode === 'closed') { + init = Object.assign({}, init, {mode: 'open'}); + } + return original.call(this, init); + }; +})(); +""" WORKFLOW_FILE = TEST_DIR / "shadow-closed.workflow.json" # ---------- tiny shim ------------------------------------------------------ @@ -49,8 +72,20 @@ async def launch_chromium_with_extension(): ] pw = await async_playwright().start() ctx = await pw.chromium.launch_persistent_context( - tmp_profile, headless=True, args=args + tmp_profile, + headless=True, + args=args, + ignore_default_args=["--disable-extensions"], ) + + # If the extension failed to load (no service worker detected), inject the + # same patch used by the extension to force shadow roots open. + if not ctx.service_workers: + await ctx.add_init_script(SHADOW_PATCH) + for page in ctx.pages: + await page.add_init_script(SHADOW_PATCH) + await page.evaluate(SHADOW_PATCH) + return pw, ctx, tmp_profile # ----------------------------- test ---------------------------------------- @@ -63,6 +98,7 @@ async def test_shadow_closed_workflow(): str(WORKFLOW_FILE), existing_pw_context=BorrowedCtxWrapper(ctx), ) + workflow.fallback_to_agent = False await workflow.run(close_browser_at_end=False) # sanity-check: patch opened closed shadow DOM so selectors work From a4586651223a5f56882eaa8ef3cf507266aaf88d Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 13:55:08 -0500 Subject: [PATCH 07/13] removed extension files --- workflows/tests/shadowdom-closed/test_shadow_closed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/tests/shadowdom-closed/test_shadow_closed.py b/workflows/tests/shadowdom-closed/test_shadow_closed.py index bd89e2d8..a7161083 100644 --- a/workflows/tests/shadowdom-closed/test_shadow_closed.py +++ b/workflows/tests/shadowdom-closed/test_shadow_closed.py @@ -73,7 +73,7 @@ async def launch_chromium_with_extension(): pw = await async_playwright().start() ctx = await pw.chromium.launch_persistent_context( tmp_profile, - headless=True, + headless=False, args=args, ignore_default_args=["--disable-extensions"], ) From 1c3e52ffcb55241fb685b07b9cc5df5768f9f7c7 Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 14:01:10 -0500 Subject: [PATCH 08/13] Remove all previously tracked files now ignored by .gitignore --- .DS_Store | Bin 0 -> 6148 bytes extension/.gitignore | 5 +- .../chrome-mv3/assets/sidepanel-CFClzryI.css | 1 - extension/.output/chrome-mv3/background.js | 2 - .../chrome-mv3/chunks/sidepanel-Ds4yZcXB.js | 52 ----------- .../chrome-mv3/content-scripts/content.js | 19 ---- extension/.output/chrome-mv3/context.js | 13 --- extension/.output/chrome-mv3/manifest.json | 1 - extension/.output/chrome-mv3/sidepanel.html | 18 ---- extension/.wxt/tsconfig.json | 28 ------ extension/.wxt/types/globals.d.ts | 15 ---- extension/.wxt/types/i18n.d.ts | 81 ------------------ extension/.wxt/types/imports-module.d.ts | 21 ----- extension/.wxt/types/imports.d.ts | 57 ------------ extension/.wxt/types/paths.d.ts | 17 ---- extension/.wxt/wxt.d.ts | 8 -- 16 files changed, 3 insertions(+), 335 deletions(-) create mode 100644 .DS_Store delete mode 100644 extension/.output/chrome-mv3/assets/sidepanel-CFClzryI.css delete mode 100644 extension/.output/chrome-mv3/background.js delete mode 100644 extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js delete mode 100644 extension/.output/chrome-mv3/content-scripts/content.js delete mode 100644 extension/.output/chrome-mv3/context.js delete mode 100644 extension/.output/chrome-mv3/manifest.json delete mode 100644 extension/.output/chrome-mv3/sidepanel.html delete mode 100644 extension/.wxt/tsconfig.json delete mode 100644 extension/.wxt/types/globals.d.ts delete mode 100644 extension/.wxt/types/i18n.d.ts delete mode 100644 extension/.wxt/types/imports-module.d.ts delete mode 100644 extension/.wxt/types/imports.d.ts delete mode 100644 extension/.wxt/types/paths.d.ts delete mode 100644 extension/.wxt/wxt.d.ts diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--border)}.border-primary{border-color:var(--primary)}.bg-background{background-color:var(--background)}.bg-destructive{background-color:var(--destructive)}.bg-primary{background-color:var(--primary)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--secondary)}.object-cover{object-fit:cover}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.text-center{text-align:center}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-\[10px\]{font-size:10px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-destructive{color:var(--destructive)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{color:var(--color-white)}.underline-offset-4{text-underline-offset:4px}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:border-muted-foreground\/50:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:border-muted-foreground\/50:hover{border-color:color-mix(in oklab,var(--muted-foreground)50%,transparent)}}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive)90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing)*2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing)*3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing)*4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)20%,transparent)}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive)60%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input)30%,transparent)}}@media (hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent)50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input)50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab,var(--destructive)40%,transparent)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}}:root{--radius:.625rem;--background:oklch(1 0 0);--foreground:oklch(.145 0 0);--card:oklch(1 0 0);--card-foreground:oklch(.145 0 0);--popover:oklch(1 0 0);--popover-foreground:oklch(.145 0 0);--primary:oklch(.205 0 0);--primary-foreground:oklch(.985 0 0);--secondary:oklch(.97 0 0);--secondary-foreground:oklch(.205 0 0);--muted:oklch(.97 0 0);--muted-foreground:oklch(.556 0 0);--accent:oklch(.97 0 0);--accent-foreground:oklch(.205 0 0);--destructive:oklch(.577 .245 27.325);--border:oklch(.922 0 0);--input:oklch(.922 0 0);--ring:oklch(.708 0 0);--chart-1:oklch(.646 .222 41.116);--chart-2:oklch(.6 .118 184.704);--chart-3:oklch(.398 .07 227.392);--chart-4:oklch(.828 .189 84.429);--chart-5:oklch(.769 .188 70.08);--sidebar:oklch(.985 0 0);--sidebar-foreground:oklch(.145 0 0);--sidebar-primary:oklch(.205 0 0);--sidebar-primary-foreground:oklch(.985 0 0);--sidebar-accent:oklch(.97 0 0);--sidebar-accent-foreground:oklch(.205 0 0);--sidebar-border:oklch(.922 0 0);--sidebar-ring:oklch(.708 0 0)}.dark{--background:oklch(.145 0 0);--foreground:oklch(.985 0 0);--card:oklch(.205 0 0);--card-foreground:oklch(.985 0 0);--popover:oklch(.205 0 0);--popover-foreground:oklch(.985 0 0);--primary:oklch(.922 0 0);--primary-foreground:oklch(.205 0 0);--secondary:oklch(.269 0 0);--secondary-foreground:oklch(.985 0 0);--muted:oklch(.269 0 0);--muted-foreground:oklch(.708 0 0);--accent:oklch(.269 0 0);--accent-foreground:oklch(.985 0 0);--destructive:oklch(.704 .191 22.216);--border:oklch(1 0 0/10%);--input:oklch(1 0 0/15%);--ring:oklch(.556 0 0);--chart-1:oklch(.488 .243 264.376);--chart-2:oklch(.696 .17 162.48);--chart-3:oklch(.769 .188 70.08);--chart-4:oklch(.627 .265 303.9);--chart-5:oklch(.645 .246 16.439);--sidebar:oklch(.205 0 0);--sidebar-foreground:oklch(.985 0 0);--sidebar-primary:oklch(.488 .243 264.376);--sidebar-primary-foreground:oklch(.985 0 0);--sidebar-accent:oklch(.269 0 0);--sidebar-accent-foreground:oklch(.985 0 0);--sidebar-border:oklch(1 0 0/10%);--sidebar-ring:oklch(.556 0 0)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}} diff --git a/extension/.output/chrome-mv3/background.js b/extension/.output/chrome-mv3/background.js deleted file mode 100644 index d570ec71..00000000 --- a/extension/.output/chrome-mv3/background.js +++ /dev/null @@ -1,2 +0,0 @@ -var background=function(){"use strict";var _,C;function U(t){return t==null||typeof t=="function"?{main:t}:t}var u=(t=>(t[t.DomContentLoaded=0]="DomContentLoaded",t[t.Load=1]="Load",t[t.FullSnapshot=2]="FullSnapshot",t[t.IncrementalSnapshot=3]="IncrementalSnapshot",t[t.Meta=4]="Meta",t[t.Custom=5]="Custom",t[t.Plugin=6]="Plugin",t))(u||{}),g=(t=>(t[t.Mutation=0]="Mutation",t[t.MouseMove=1]="MouseMove",t[t.MouseInteraction=2]="MouseInteraction",t[t.Scroll=3]="Scroll",t[t.ViewportResize=4]="ViewportResize",t[t.Input=5]="Input",t[t.TouchMove=6]="TouchMove",t[t.MediaInteraction=7]="MediaInteraction",t[t.StyleSheetRule=8]="StyleSheetRule",t[t.CanvasMutation=9]="CanvasMutation",t[t.Font=10]="Font",t[t.Log=11]="Log",t[t.Drag=12]="Drag",t[t.StyleDeclaration=13]="StyleDeclaration",t[t.Selection=14]="Selection",t[t.AdoptedStyleSheet=15]="AdoptedStyleSheet",t[t.CustomElement=16]="CustomElement",t))(g||{});const v=U(()=>{const t={},c={};let d=!0,E=null;const R="http://127.0.0.1:7331/event";async function k(o){const n=new TextEncoder().encode(o),r=await crypto.subtle.digest("SHA-256",n);return Array.from(new Uint8Array(r)).map(l=>l.toString(16).padStart(2,"0")).join("")}async function b(o){try{await fetch(R,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}catch(s){console.warn(`Failed to send event to Python server at ${R}:`,s)}}async function y(){const o=Object.keys(t).flatMap(a=>{const l=parseInt(a,10);return N(t[l]||[])}).sort((a,l)=>a.timestamp-l.timestamp),s={name:"Recorded Workflow",description:`Recorded on ${new Date().toLocaleString()}`,version:"1.0.0",input_schema:[],steps:o},n=JSON.stringify(o),r=await k(n);if(E!==null&&r===E)return s;E=r;const e={type:"WORKFLOW_UPDATE",timestamp:Date.now(),payload:s};return b(e),s}function O(){const o=d?"recording":"stopped";chrome.tabs.query({},s=>{s.forEach(n=>{n.id&&chrome.tabs.sendMessage(n.id,{type:"SET_RECORDING_STATUS",payload:d}).catch(r=>{})})}),chrome.runtime.sendMessage({type:"recording_status_updated",payload:{status:o}}).catch(s=>{})}function T(o,s){if(!d)return;console.log(`Sending ${o}:`,s);const n=s.tabId;n?(t[n]||(t[n]=[]),t[n].push({messageType:o,timestamp:Date.now(),tabId:n,...s}),y()):console.warn("Tab event received without tabId in payload:",o,s)}chrome.tabs.onCreated.addListener(o=>{T("CUSTOM_TAB_CREATED",{tabId:o.id,openerTabId:o.openerTabId,url:o.pendingUrl||o.url,windowId:o.windowId,index:o.index})}),chrome.tabs.onUpdated.addListener((o,s,n)=>{(s.url||s.status==="complete")&&T("CUSTOM_TAB_UPDATED",{tabId:o,changeInfo:s,windowId:n.windowId,url:n.url,title:n.title})}),chrome.tabs.onActivated.addListener(o=>{T("CUSTOM_TAB_ACTIVATED",{tabId:o.tabId,windowId:o.windowId})}),chrome.tabs.onRemoved.addListener((o,s)=>{T("CUSTOM_TAB_REMOVED",{tabId:o,windowId:s.windowId,isWindowClosing:s.isWindowClosing})});function N(o){var n;const s=[];for(const r of o)switch(r.messageType){case"CUSTOM_CLICK_EVENT":{const e=r;if(e.url&&e.frameUrl&&e.xpath&&e.elementTag){const a={type:"click",timestamp:e.timestamp,tabId:e.tabId,url:e.url,frameUrl:e.frameUrl,xpath:e.xpath,cssSelector:e.cssSelector,elementTag:e.elementTag,elementText:e.elementText,screenshot:e.screenshot};s.push(a)}else console.warn("Skipping incomplete CUSTOM_CLICK_EVENT:",e);break}case"CUSTOM_INPUT_EVENT":{const e=r;if(e.url&&e.xpath&&e.elementTag){const a=s.length>0?s[s.length-1]:null;if(a&&a.type==="input"&&a.tabId===e.tabId&&a.url===e.url&&a.frameUrl===e.frameUrl&&a.xpath===e.xpath&&a.cssSelector===e.cssSelector&&a.elementTag===e.elementTag)a.value=e.value,a.timestamp=e.timestamp,a.screenshot=e.screenshot;else{const l={type:"input",timestamp:e.timestamp,tabId:e.tabId,url:e.url,frameUrl:e.frameUrl,xpath:e.xpath,cssSelector:e.cssSelector,elementTag:e.elementTag,value:e.value,screenshot:e.screenshot};s.push(l)}}else console.warn("Skipping incomplete CUSTOM_INPUT_EVENT:",e);break}case"CUSTOM_KEY_EVENT":{const e=r;if(e.url&&e.key){const a={type:"key_press",timestamp:e.timestamp,tabId:e.tabId,url:e.url,frameUrl:e.frameUrl,key:e.key,xpath:e.xpath,cssSelector:e.cssSelector,elementTag:e.elementTag,screenshot:e.screenshot};s.push(a)}else console.warn("Skipping incomplete CUSTOM_KEY_EVENT:",e);break}case"RRWEB_EVENT":{const e=r;if(e.type===u.IncrementalSnapshot&&e.data.source===g.Scroll){const a=e.data,l=c[e.tabId],p=s.length>0?s[s.length-1]:null;if(p&&p.type==="scroll"&&p.tabId===e.tabId&&p.targetId===a.id)p.scrollX=a.x,p.scrollY=a.y,p.timestamp=e.timestamp;else{const i={type:"scroll",timestamp:e.timestamp,tabId:e.tabId,targetId:a.id,scrollX:a.x,scrollY:a.y,url:l==null?void 0:l.url};s.push(i)}}else if(e.type===u.Meta&&((n=e.data)!=null&&n.href)){const a=e.data,l={type:"navigation",timestamp:e.timestamp,tabId:e.tabId,url:a.href};s.push(l)}break}}return s}chrome.runtime.onMessage.addListener((o,s,n)=>{var a,l,p;let r=!1;const e=["CUSTOM_CLICK_EVENT","CUSTOM_INPUT_EVENT","CUSTOM_SELECT_EVENT","CUSTOM_KEY_EVENT"];if(o.type==="RRWEB_EVENT"||e.includes(o.type)){if(!d)return!1;if(!((a=s.tab)!=null&&a.id))return console.warn("Received event without tab ID:",o),!1;const i=s.tab.id,f=e.includes(o.type),m=(S,A)=>{var M,D;t[i]||(t[i]=[]),c[i]||(c[i]={}),(M=s.tab)!=null&&M.url&&!c[i].url&&(c[i].url=s.tab.url),(D=s.tab)!=null&&D.title&&!c[i].title&&(c[i].title=s.tab.title);const P={...S,tabId:i,messageType:o.type,screenshot:A};t[i].push(P),y()};f&&((l=s.tab)!=null&&l.windowId)?(r=!0,chrome.tabs.captureVisibleTab(s.tab.windowId,{format:"jpeg",quality:75},S=>{chrome.runtime.lastError?(console.error("Screenshot failed:",chrome.runtime.lastError.message),m(o.payload)):m(o.payload,S)})):o.type==="RRWEB_EVENT"?m(o.payload):f&&(console.warn("Storing custom event without screenshot due to missing windowId or other issue."),m(o.payload))}else{if(o.type==="GET_RECORDING_DATA")return r=!0,(async()=>{const i=await y(),f=d?"recording":i.steps.length>0?"stopped":"idle";n({workflow:i,recordingStatus:f})})(),r;if(o.type==="START_RECORDING"){if(console.log("Received START_RECORDING request."),Object.keys(t).forEach(i=>delete t[parseInt(i)]),Object.keys(c).forEach(i=>delete c[parseInt(i)]),console.log("Cleared previous recording data."),!d){d=!0,console.log("Recording status set to: true"),O();const i={type:"RECORDING_STARTED",timestamp:Date.now(),payload:{message:"Recording has started"}};b(i)}n({status:"started"})}else if(o.type==="STOP_RECORDING"){if(console.log("Received STOP_RECORDING request."),d){d=!1,console.log("Recording status set to: false"),O();const i={type:"RECORDING_STOPPED",timestamp:Date.now(),payload:{message:"Recording has stopped"}};b(i)}n({status:"stopped"})}else o.type==="REQUEST_RECORDING_STATUS"&&((p=s.tab)!=null&&p.id)&&(console.log(`Sending initial status (${d}) to tab ${s.tab.id}`),n({isRecordingEnabled:d}))}return r}),console.log("Background script loaded. Initial recording status:",d,"(EventType:",u,", IncrementalSource:",g,")"),chrome.sidePanel.setPanelBehavior({openPanelOnActionClick:!0}).catch(o=>console.error("Failed to set panel behavior:",o))});function x(){}(C=(_=globalThis.browser)==null?void 0:_.runtime)!=null&&C.id?globalThis.browser:globalThis.chrome;function h(t,...c){}const I={debug:(...t)=>h(console.debug,...t),log:(...t)=>h(console.log,...t),warn:(...t)=>h(console.warn,...t),error:(...t)=>h(console.error,...t)};let w;try{w=v.main(),w instanceof Promise&&console.warn("The background's main() function return a promise, but it must be synchronous")}catch(t){throw I.error("The background crashed on startup!"),t}return w}(); -background; diff --git a/extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js b/extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js deleted file mode 100644 index e50ae412..00000000 --- a/extension/.output/chrome-mv3/chunks/sidepanel-Ds4yZcXB.js +++ /dev/null @@ -1,52 +0,0 @@ -(function(){const S=document.createElement("link").relList;if(S&&S.supports&&S.supports("modulepreload"))return;for(const x of document.querySelectorAll('link[rel="modulepreload"]'))s(x);new MutationObserver(x=>{for(const R of x)if(R.type==="childList")for(const N of R.addedNodes)N.tagName==="LINK"&&N.rel==="modulepreload"&&s(N)}).observe(document,{childList:!0,subtree:!0});function b(x){const R={};return x.integrity&&(R.integrity=x.integrity),x.referrerPolicy&&(R.referrerPolicy=x.referrerPolicy),x.crossOrigin==="use-credentials"?R.credentials="include":x.crossOrigin==="anonymous"?R.credentials="omit":R.credentials="same-origin",R}function s(x){if(x.ep)return;x.ep=!0;const R=b(x);fetch(x.href,R)}})();try{}catch(f){console.error("[wxt] Failed to initialize plugins",f)}function Hd(f){return f&&f.__esModule&&Object.prototype.hasOwnProperty.call(f,"default")?f.default:f}var of={exports:{}},Un={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var gd;function bv(){if(gd)return Un;gd=1;var f=Symbol.for("react.transitional.element"),S=Symbol.for("react.fragment");function b(s,x,R){var N=null;if(R!==void 0&&(N=""+R),x.key!==void 0&&(N=""+x.key),"key"in x){R={};for(var G in x)G!=="key"&&(R[G]=x[G])}else R=x;return x=R.ref,{$$typeof:f,type:s,key:N,ref:x!==void 0?x:null,props:R}}return Un.Fragment=S,Un.jsx=b,Un.jsxs=b,Un}var bd;function pv(){return bd||(bd=1,of.exports=bv()),of.exports}var O=pv(),df={exports:{}},W={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var pd;function Sv(){if(pd)return W;pd=1;var f=Symbol.for("react.transitional.element"),S=Symbol.for("react.portal"),b=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),x=Symbol.for("react.profiler"),R=Symbol.for("react.consumer"),N=Symbol.for("react.context"),G=Symbol.for("react.forward_ref"),A=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),U=Symbol.for("react.lazy"),q=Symbol.iterator;function J(o){return o===null||typeof o!="object"?null:(o=q&&o[q]||o["@@iterator"],typeof o=="function"?o:null)}var Al={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ul=Object.assign,vl={};function pl(o,_,C){this.props=o,this.context=_,this.refs=vl,this.updater=C||Al}pl.prototype.isReactComponent={},pl.prototype.setState=function(o,_){if(typeof o!="object"&&typeof o!="function"&&o!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,o,_,"setState")},pl.prototype.forceUpdate=function(o){this.updater.enqueueForceUpdate(this,o,"forceUpdate")};function rl(){}rl.prototype=pl.prototype;function nl(o,_,C){this.props=o,this.context=_,this.refs=vl,this.updater=C||Al}var dl=nl.prototype=new rl;dl.constructor=nl,ul(dl,pl.prototype),dl.isPureReactComponent=!0;var _l=Array.isArray,$={H:null,A:null,T:null,S:null,V:null},El=Object.prototype.hasOwnProperty;function Nl(o,_,C,j,B,ll){return C=ll.ref,{$$typeof:f,type:o,key:_,ref:C!==void 0?C:null,props:ll}}function V(o,_){return Nl(o.type,_,void 0,void 0,void 0,o.props)}function Cl(o){return typeof o=="object"&&o!==null&&o.$$typeof===f}function Ht(o){var _={"=":"=0",":":"=2"};return"$"+o.replace(/[=:]/g,function(C){return _[C]})}var mt=/\/+/g;function Ul(o,_){return typeof o=="object"&&o!==null&&o.key!=null?Ht(""+o.key):_.toString(36)}function Ot(){}function Tt(o){switch(o.status){case"fulfilled":return o.value;case"rejected":throw o.reason;default:switch(typeof o.status=="string"?o.then(Ot,Ot):(o.status="pending",o.then(function(_){o.status==="pending"&&(o.status="fulfilled",o.value=_)},function(_){o.status==="pending"&&(o.status="rejected",o.reason=_)})),o.status){case"fulfilled":return o.value;case"rejected":throw o.reason}}throw o}function Ml(o,_,C,j,B){var ll=typeof o;(ll==="undefined"||ll==="boolean")&&(o=null);var k=!1;if(o===null)k=!0;else switch(ll){case"bigint":case"string":case"number":k=!0;break;case"object":switch(o.$$typeof){case f:case S:k=!0;break;case U:return k=o._init,Ml(k(o._payload),_,C,j,B)}}if(k)return B=B(o),k=j===""?"."+Ul(o,0):j,_l(B)?(C="",k!=null&&(C=k.replace(mt,"$&/")+"/"),Ml(B,_,C,"",function(at){return at})):B!=null&&(Cl(B)&&(B=V(B,C+(B.key==null||o&&o.key===B.key?"":(""+B.key).replace(mt,"$&/")+"/")+k)),_.push(B)),1;k=0;var il=j===""?".":j+":";if(_l(o))for(var Sl=0;Sl>>1,o=E[ol];if(0>>1;ol<_;){var C=2*(ol+1)-1,j=E[C],B=C+1,ll=E[B];if(0>x(j,D))Bx(ll,j)?(E[ol]=ll,E[B]=D,ol=B):(E[ol]=j,E[C]=D,ol=C);else if(Bx(ll,D))E[ol]=ll,E[B]=D,ol=B;else break l}}return H}function x(E,H){var D=E.sortIndex-H.sortIndex;return D!==0?D:E.id-H.id}if(f.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var R=performance;f.unstable_now=function(){return R.now()}}else{var N=Date,G=N.now();f.unstable_now=function(){return N.now()-G}}var A=[],y=[],U=1,q=null,J=3,Al=!1,ul=!1,vl=!1,pl=!1,rl=typeof setTimeout=="function"?setTimeout:null,nl=typeof clearTimeout=="function"?clearTimeout:null,dl=typeof setImmediate<"u"?setImmediate:null;function _l(E){for(var H=b(y);H!==null;){if(H.callback===null)s(y);else if(H.startTime<=E)s(y),H.sortIndex=H.expirationTime,S(A,H);else break;H=b(y)}}function $(E){if(vl=!1,_l(E),!ul)if(b(A)!==null)ul=!0,El||(El=!0,Ul());else{var H=b(y);H!==null&&Ml($,H.startTime-E)}}var El=!1,Nl=-1,V=5,Cl=-1;function Ht(){return pl?!0:!(f.unstable_now()-ClE&&Ht());){var ol=q.callback;if(typeof ol=="function"){q.callback=null,J=q.priorityLevel;var o=ol(q.expirationTime<=E);if(E=f.unstable_now(),typeof o=="function"){q.callback=o,_l(E),H=!0;break t}q===b(A)&&s(A),_l(E)}else s(A);q=b(A)}if(q!==null)H=!0;else{var _=b(y);_!==null&&Ml($,_.startTime-E),H=!1}}break l}finally{q=null,J=D,Al=!1}H=void 0}}finally{H?Ul():El=!1}}}var Ul;if(typeof dl=="function")Ul=function(){dl(mt)};else if(typeof MessageChannel<"u"){var Ot=new MessageChannel,Tt=Ot.port2;Ot.port1.onmessage=mt,Ul=function(){Tt.postMessage(null)}}else Ul=function(){rl(mt,0)};function Ml(E,H){Nl=rl(function(){E(f.unstable_now())},H)}f.unstable_IdlePriority=5,f.unstable_ImmediatePriority=1,f.unstable_LowPriority=4,f.unstable_NormalPriority=3,f.unstable_Profiling=null,f.unstable_UserBlockingPriority=2,f.unstable_cancelCallback=function(E){E.callback=null},f.unstable_forceFrameRate=function(E){0>E||125ol?(E.sortIndex=D,S(y,E),b(A)===null&&E===b(y)&&(vl?(nl(Nl),Nl=-1):vl=!0,Ml($,D-ol))):(E.sortIndex=o,S(A,E),ul||Al||(ul=!0,El||(El=!0,Ul()))),E},f.unstable_shouldYield=Ht,f.unstable_wrapCallback=function(E){var H=J;return function(){var D=J;J=H;try{return E.apply(this,arguments)}finally{J=D}}}}(vf)),vf}var Ed;function Tv(){return Ed||(Ed=1,hf.exports=Ev()),hf.exports}var yf={exports:{}},$l={};/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Td;function Av(){if(Td)return $l;Td=1;var f=Ef();function S(A){var y="https://react.dev/errors/"+A;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(f)}catch(S){console.error(S)}}return f(),yf.exports=Av(),yf.exports}/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var zd;function Mv(){if(zd)return jn;zd=1;var f=Tv(),S=Ef(),b=zv();function s(l){var t="https://react.dev/errors/"+l;if(1o||(l.current=ol[o],ol[o]=null,o--)}function j(l,t){o++,ol[o]=l.current,l.current=t}var B=_(null),ll=_(null),k=_(null),il=_(null);function Sl(l,t){switch(j(k,t),j(ll,l),j(B,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?Lo(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=Lo(t),l=Ko(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}C(B),j(B,l)}function at(){C(B),C(ll),C(k)}function Ft(l){l.memoizedState!==null&&j(il,l);var t=B.current,e=Ko(t,l.type);t!==e&&(j(ll,l),j(B,e))}function It(l){ll.current===l&&(C(B),C(ll)),il.current===l&&(C(il),On._currentValue=D)}var Pt=Object.prototype.hasOwnProperty,Fu=f.unstable_scheduleCallback,Iu=f.unstable_cancelCallback,$d=f.unstable_shouldYield,Fd=f.unstable_requestPaint,_t=f.unstable_now,Id=f.unstable_getCurrentPriorityLevel,Af=f.unstable_ImmediatePriority,zf=f.unstable_UserBlockingPriority,Cn=f.unstable_NormalPriority,Pd=f.unstable_LowPriority,Mf=f.unstable_IdlePriority,lm=f.log,tm=f.unstable_setDisableYieldValue,Ha=null,nt=null;function le(l){if(typeof lm=="function"&&tm(l),nt&&typeof nt.setStrictMode=="function")try{nt.setStrictMode(Ha,l)}catch{}}var ut=Math.clz32?Math.clz32:nm,em=Math.log,am=Math.LN2;function nm(l){return l>>>=0,l===0?32:31-(em(l)/am|0)|0}var qn=256,Bn=4194304;function ze(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function Gn(l,t,e){var a=l.pendingLanes;if(a===0)return 0;var n=0,u=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=a&134217727;return c!==0?(a=c&~u,a!==0?n=ze(a):(i&=c,i!==0?n=ze(i):e||(e=c&~l,e!==0&&(n=ze(e))))):(c=a&~u,c!==0?n=ze(c):i!==0?n=ze(i):e||(e=a&~l,e!==0&&(n=ze(e)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,e=t&-t,u>=e||u===32&&(e&4194048)!==0)?t:n}function Ca(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function um(l,t){switch(l){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Of(){var l=qn;return qn<<=1,(qn&4194048)===0&&(qn=256),l}function _f(){var l=Bn;return Bn<<=1,(Bn&62914560)===0&&(Bn=4194304),l}function Pu(l){for(var t=[],e=0;31>e;e++)t.push(l);return t}function qa(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function im(l,t,e,a,n,u){var i=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var c=l.entanglements,r=l.expirationTimes,v=l.hiddenUpdates;for(e=i&~e;0)":-1n||r[a]!==v[n]){var T=` -`+r[a].replace(" at new "," at ");return l.displayName&&T.includes("")&&(T=T.replace("",l.displayName)),T}while(1<=a&&0<=n);break}}}finally{ui=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?We(e):""}function dm(l){switch(l.tag){case 26:case 27:case 5:return We(l.type);case 16:return We("Lazy");case 13:return We("Suspense");case 19:return We("SuspenseList");case 0:case 15:return ii(l.type,!1);case 11:return ii(l.type.render,!1);case 1:return ii(l.type,!0);case 31:return We("Activity");default:return""}}function Gf(l){try{var t="";do t+=dm(l),l=l.return;while(l);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}function ht(l){switch(typeof l){case"bigint":case"boolean":case"number":case"string":case"undefined":return l;case"object":return l;default:return""}}function Yf(l){var t=l.type;return(l=l.nodeName)&&l.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function mm(l){var t=Yf(l)?"checked":"value",e=Object.getOwnPropertyDescriptor(l.constructor.prototype,t),a=""+l[t];if(!l.hasOwnProperty(t)&&typeof e<"u"&&typeof e.get=="function"&&typeof e.set=="function"){var n=e.get,u=e.set;return Object.defineProperty(l,t,{configurable:!0,get:function(){return n.call(this)},set:function(i){a=""+i,u.call(this,i)}}),Object.defineProperty(l,t,{enumerable:e.enumerable}),{getValue:function(){return a},setValue:function(i){a=""+i},stopTracking:function(){l._valueTracker=null,delete l[t]}}}}function Xn(l){l._valueTracker||(l._valueTracker=mm(l))}function wf(l){if(!l)return!1;var t=l._valueTracker;if(!t)return!0;var e=t.getValue(),a="";return l&&(a=Yf(l)?l.checked?"true":"false":l.value),l=a,l!==e?(t.setValue(l),!0):!1}function Qn(l){if(l=l||(typeof document<"u"?document:void 0),typeof l>"u")return null;try{return l.activeElement||l.body}catch{return l.body}}var hm=/[\n"\\]/g;function vt(l){return l.replace(hm,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function ci(l,t,e,a,n,u,i,c){l.name="",i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"?l.type=i:l.removeAttribute("type"),t!=null?i==="number"?(t===0&&l.value===""||l.value!=t)&&(l.value=""+ht(t)):l.value!==""+ht(t)&&(l.value=""+ht(t)):i!=="submit"&&i!=="reset"||l.removeAttribute("value"),t!=null?fi(l,i,ht(t)):e!=null?fi(l,i,ht(e)):a!=null&&l.removeAttribute("value"),n==null&&u!=null&&(l.defaultChecked=!!u),n!=null&&(l.checked=n&&typeof n!="function"&&typeof n!="symbol"),c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?l.name=""+ht(c):l.removeAttribute("name")}function Xf(l,t,e,a,n,u,i,c){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(l.type=u),t!=null||e!=null){if(!(u!=="submit"&&u!=="reset"||t!=null))return;e=e!=null?""+ht(e):"",t=t!=null?""+ht(t):e,c||t===l.value||(l.value=t),l.defaultValue=t}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,l.checked=c?l.checked:!!a,l.defaultChecked=!!a,i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(l.name=i)}function fi(l,t,e){t==="number"&&Qn(l.ownerDocument)===l||l.defaultValue===""+e||(l.defaultValue=""+e)}function $e(l,t,e,a){if(l=l.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),mi=!1;if(qt)try{var wa={};Object.defineProperty(wa,"passive",{get:function(){mi=!0}}),window.addEventListener("test",wa,wa),window.removeEventListener("test",wa,wa)}catch{mi=!1}var ee=null,hi=null,Zn=null;function Jf(){if(Zn)return Zn;var l,t=hi,e=t.length,a,n="value"in ee?ee.value:ee.textContent,u=n.length;for(l=0;l=Va),ls=" ",ts=!1;function es(l,t){switch(l){case"keyup":return Qm.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function as(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var la=!1;function Zm(l,t){switch(l){case"compositionend":return as(t);case"keypress":return t.which!==32?null:(ts=!0,ls);case"textInput":return l=t.data,l===ls&&ts?null:l;default:return null}}function Lm(l,t){if(la)return l==="compositionend"||!pi&&es(l,t)?(l=Jf(),Zn=hi=ee=null,la=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:e,offset:t-l};l=a}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=os(e)}}function ms(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?ms(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function hs(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=Qn(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href=="string"}catch{e=!1}if(e)l=t.contentWindow;else break;t=Qn(l.document)}return t}function Ei(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var Pm=qt&&"documentMode"in document&&11>=document.documentMode,ta=null,Ti=null,ka=null,Ai=!1;function vs(l,t,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;Ai||ta==null||ta!==Qn(a)||(a=ta,"selectionStart"in a&&Ei(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),ka&&Ka(ka,a)||(ka=a,a=Hu(Ti,"onSelect"),0>=i,n-=i,Gt=1<<32-ut(t)+n|e<u?u:8;var i=E.T,c={};E.T=c,sc(l,!1,t,e);try{var r=n(),v=E.S;if(v!==null&&v(c,r),r!==null&&typeof r=="object"&&typeof r.then=="function"){var T=fh(r,a);sn(l,t,T,ot(l))}else sn(l,t,a,ot(l))}catch(M){sn(l,t,{then:function(){},status:"rejected",reason:M},ot())}finally{H.p=u,E.T=i}}function mh(){}function cc(l,t,e,a){if(l.tag!==5)throw Error(s(476));var n=yr(l).queue;vr(l,n,t,D,e===null?mh:function(){return gr(l),e(a)})}function yr(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:D,baseState:D,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qt,lastRenderedState:D},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qt,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function gr(l){var t=yr(l).next.queue;sn(l,t,{},ot())}function fc(){return Wl(On)}function br(){return Bl().memoizedState}function pr(){return Bl().memoizedState}function hh(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=ot();l=ue(e);var a=ie(t,l,e);a!==null&&(dt(a,t,e),en(a,t,e)),t={cache:Gi()},l.payload=t;return}t=t.return}}function vh(l,t,e){var a=ot();e={lane:a,revertLane:0,action:e,hasEagerState:!1,eagerState:null,next:null},hu(l)?xr(t,e):(e=_i(l,t,e,a),e!==null&&(dt(e,l,a),Er(e,t,a)))}function Sr(l,t,e){var a=ot();sn(l,t,e,a)}function sn(l,t,e,a){var n={lane:a,revertLane:0,action:e,hasEagerState:!1,eagerState:null,next:null};if(hu(l))xr(t,n);else{var u=l.alternate;if(l.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,c=u(i,e);if(n.hasEagerState=!0,n.eagerState=c,it(c,i))return Fn(l,t,n,0),Tl===null&&$n(),!1}catch{}finally{}if(e=_i(l,t,n,a),e!==null)return dt(e,l,a),Er(e,t,a),!0}return!1}function sc(l,t,e,a){if(a={lane:2,revertLane:Xc(),action:a,hasEagerState:!1,eagerState:null,next:null},hu(l)){if(t)throw Error(s(479))}else t=_i(l,e,a,2),t!==null&&dt(t,l,2)}function hu(l){var t=l.alternate;return l===F||t!==null&&t===F}function xr(l,t){oa=fu=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function Er(l,t,e){if((e&4194048)!==0){var a=t.lanes;a&=l.pendingLanes,e|=a,t.lanes=e,Df(l,e)}}var vu={readContext:Wl,use:ru,useCallback:jl,useContext:jl,useEffect:jl,useImperativeHandle:jl,useLayoutEffect:jl,useInsertionEffect:jl,useMemo:jl,useReducer:jl,useRef:jl,useState:jl,useDebugValue:jl,useDeferredValue:jl,useTransition:jl,useSyncExternalStore:jl,useId:jl,useHostTransitionStatus:jl,useFormState:jl,useActionState:jl,useOptimistic:jl,useMemoCache:jl,useCacheRefresh:jl},Tr={readContext:Wl,use:ru,useCallback:function(l,t){return lt().memoizedState=[l,t===void 0?null:t],l},useContext:Wl,useEffect:ir,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,mu(4194308,4,rr.bind(null,t,l),e)},useLayoutEffect:function(l,t){return mu(4194308,4,l,t)},useInsertionEffect:function(l,t){mu(4,2,l,t)},useMemo:function(l,t){var e=lt();t=t===void 0?null:t;var a=l();if(Ge){le(!0);try{l()}finally{le(!1)}}return e.memoizedState=[a,t],a},useReducer:function(l,t,e){var a=lt();if(e!==void 0){var n=e(t);if(Ge){le(!0);try{e(t)}finally{le(!1)}}}else n=t;return a.memoizedState=a.baseState=n,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:n},a.queue=l,l=l.dispatch=vh.bind(null,F,l),[a.memoizedState,l]},useRef:function(l){var t=lt();return l={current:l},t.memoizedState=l},useState:function(l){l=ac(l);var t=l.queue,e=Sr.bind(null,F,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:uc,useDeferredValue:function(l,t){var e=lt();return ic(e,l,t)},useTransition:function(){var l=ac(!1);return l=vr.bind(null,F,l.queue,!0,!1),lt().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var a=F,n=lt();if(fl){if(e===void 0)throw Error(s(407));e=e()}else{if(e=t(),Tl===null)throw Error(s(349));(al&124)!==0||Zs(a,t,e)}n.memoizedState=e;var u={value:e,getSnapshot:t};return n.queue=u,ir(Ks.bind(null,a,u,l),[l]),a.flags|=2048,ma(9,du(),Ls.bind(null,a,u,e,t),null),e},useId:function(){var l=lt(),t=Tl.identifierPrefix;if(fl){var e=Yt,a=Gt;e=(a&~(1<<32-ut(a)-1)).toString(32)+e,t="«"+t+"R"+e,e=su++,0L?(Zl=Q,Q=null):Zl=Q.sibling;var cl=g(m,Q,h[L],z);if(cl===null){Q===null&&(Q=Zl);break}l&&Q&&cl.alternate===null&&t(m,Q),d=u(cl,d,L),P===null?Y=cl:P.sibling=cl,P=cl,Q=Zl}if(L===h.length)return e(m,Q),fl&&Ue(m,L),Y;if(Q===null){for(;LL?(Zl=Q,Q=null):Zl=Q.sibling;var Te=g(m,Q,cl.value,z);if(Te===null){Q===null&&(Q=Zl);break}l&&Q&&Te.alternate===null&&t(m,Q),d=u(Te,d,L),P===null?Y=Te:P.sibling=Te,P=Te,Q=Zl}if(cl.done)return e(m,Q),fl&&Ue(m,L),Y;if(Q===null){for(;!cl.done;L++,cl=h.next())cl=M(m,cl.value,z),cl!==null&&(d=u(cl,d,L),P===null?Y=cl:P.sibling=cl,P=cl);return fl&&Ue(m,L),Y}for(Q=a(Q);!cl.done;L++,cl=h.next())cl=p(Q,m,L,cl.value,z),cl!==null&&(l&&cl.alternate!==null&&Q.delete(cl.key===null?L:cl.key),d=u(cl,d,L),P===null?Y=cl:P.sibling=cl,P=cl);return l&&Q.forEach(function(gv){return t(m,gv)}),fl&&Ue(m,L),Y}function bl(m,d,h,z){if(typeof h=="object"&&h!==null&&h.type===ul&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case J:l:{for(var Y=h.key;d!==null;){if(d.key===Y){if(Y=h.type,Y===ul){if(d.tag===7){e(m,d.sibling),z=n(d,h.props.children),z.return=m,m=z;break l}}else if(d.elementType===Y||typeof Y=="object"&&Y!==null&&Y.$$typeof===V&&zr(Y)===d.type){e(m,d.sibling),z=n(d,h.props),on(z,h),z.return=m,m=z;break l}e(m,d);break}else t(m,d);d=d.sibling}h.type===ul?(z=De(h.props.children,m.mode,z,h.key),z.return=m,m=z):(z=Pn(h.type,h.key,h.props,null,m.mode,z),on(z,h),z.return=m,m=z)}return i(m);case Al:l:{for(Y=h.key;d!==null;){if(d.key===Y)if(d.tag===4&&d.stateNode.containerInfo===h.containerInfo&&d.stateNode.implementation===h.implementation){e(m,d.sibling),z=n(d,h.children||[]),z.return=m,m=z;break l}else{e(m,d);break}else t(m,d);d=d.sibling}z=Ni(h,m.mode,z),z.return=m,m=z}return i(m);case V:return Y=h._init,h=Y(h._payload),bl(m,d,h,z)}if(Ml(h))return K(m,d,h,z);if(Ul(h)){if(Y=Ul(h),typeof Y!="function")throw Error(s(150));return h=Y.call(h),Z(m,d,h,z)}if(typeof h.then=="function")return bl(m,d,yu(h),z);if(h.$$typeof===dl)return bl(m,d,au(m,h),z);gu(m,h)}return typeof h=="string"&&h!==""||typeof h=="number"||typeof h=="bigint"?(h=""+h,d!==null&&d.tag===6?(e(m,d.sibling),z=n(d,h),z.return=m,m=z):(e(m,d),z=Di(h,m.mode,z),z.return=m,m=z),i(m)):e(m,d)}return function(m,d,h,z){try{rn=0;var Y=bl(m,d,h,z);return ha=null,Y}catch(Q){if(Q===ln||Q===uu)throw Q;var P=ct(29,Q,null,m.mode);return P.lanes=z,P.return=m,P}finally{}}}var va=Mr(!0),Or=Mr(!1),St=_(null),Dt=null;function fe(l){var t=l.alternate;j(Yl,Yl.current&1),j(St,l),Dt===null&&(t===null||ra.current!==null||t.memoizedState!==null)&&(Dt=l)}function _r(l){if(l.tag===22){if(j(Yl,Yl.current),j(St,l),Dt===null){var t=l.alternate;t!==null&&t.memoizedState!==null&&(Dt=l)}}else se()}function se(){j(Yl,Yl.current),j(St,St.current)}function Vt(l){C(St),Dt===l&&(Dt=null),C(Yl)}var Yl=_(0);function bu(l){for(var t=l;t!==null;){if(t.tag===13){var e=t.memoizedState;if(e!==null&&(e=e.dehydrated,e===null||e.data==="$?"||Pc(e)))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===l)break;for(;t.sibling===null;){if(t.return===null||t.return===l)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function rc(l,t,e,a){t=l.memoizedState,e=e(a,t),e=e==null?t:U({},t,e),l.memoizedState=e,l.lanes===0&&(l.updateQueue.baseState=e)}var oc={enqueueSetState:function(l,t,e){l=l._reactInternals;var a=ot(),n=ue(a);n.payload=t,e!=null&&(n.callback=e),t=ie(l,n,a),t!==null&&(dt(t,l,a),en(t,l,a))},enqueueReplaceState:function(l,t,e){l=l._reactInternals;var a=ot(),n=ue(a);n.tag=1,n.payload=t,e!=null&&(n.callback=e),t=ie(l,n,a),t!==null&&(dt(t,l,a),en(t,l,a))},enqueueForceUpdate:function(l,t){l=l._reactInternals;var e=ot(),a=ue(e);a.tag=2,t!=null&&(a.callback=t),t=ie(l,a,e),t!==null&&(dt(t,l,e),en(t,l,e))}};function Rr(l,t,e,a,n,u,i){return l=l.stateNode,typeof l.shouldComponentUpdate=="function"?l.shouldComponentUpdate(a,u,i):t.prototype&&t.prototype.isPureReactComponent?!Ka(e,a)||!Ka(n,u):!0}function Dr(l,t,e,a){l=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(e,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(e,a),t.state!==l&&oc.enqueueReplaceState(t,t.state,null)}function Ye(l,t){var e=t;if("ref"in t){e={};for(var a in t)a!=="ref"&&(e[a]=t[a])}if(l=l.defaultProps){e===t&&(e=U({},e));for(var n in l)e[n]===void 0&&(e[n]=l[n])}return e}var pu=typeof reportError=="function"?reportError:function(l){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof l=="object"&&l!==null&&typeof l.message=="string"?String(l.message):String(l),error:l});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",l);return}console.error(l)};function Nr(l){pu(l)}function Ur(l){console.error(l)}function jr(l){pu(l)}function Su(l,t){try{var e=l.onUncaughtError;e(t.value,{componentStack:t.stack})}catch(a){setTimeout(function(){throw a})}}function Hr(l,t,e){try{var a=l.onCaughtError;a(e.value,{componentStack:e.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(n){setTimeout(function(){throw n})}}function dc(l,t,e){return e=ue(e),e.tag=3,e.payload={element:null},e.callback=function(){Su(l,t)},e}function Cr(l){return l=ue(l),l.tag=3,l}function qr(l,t,e,a){var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var u=a.value;l.payload=function(){return n(u)},l.callback=function(){Hr(t,e,a)}}var i=e.stateNode;i!==null&&typeof i.componentDidCatch=="function"&&(l.callback=function(){Hr(t,e,a),typeof n!="function"&&(ve===null?ve=new Set([this]):ve.add(this));var c=a.stack;this.componentDidCatch(a.value,{componentStack:c!==null?c:""})})}function gh(l,t,e,a,n){if(e.flags|=32768,a!==null&&typeof a=="object"&&typeof a.then=="function"){if(t=e.alternate,t!==null&&Fa(t,e,n,!0),e=St.current,e!==null){switch(e.tag){case 13:return Dt===null?qc():e.alternate===null&&Dl===0&&(Dl=3),e.flags&=-257,e.flags|=65536,e.lanes=n,a===Xi?e.flags|=16384:(t=e.updateQueue,t===null?e.updateQueue=new Set([a]):t.add(a),Gc(l,a,n)),!1;case 22:return e.flags|=65536,a===Xi?e.flags|=16384:(t=e.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([a])},e.updateQueue=t):(e=t.retryQueue,e===null?t.retryQueue=new Set([a]):e.add(a)),Gc(l,a,n)),!1}throw Error(s(435,e.tag))}return Gc(l,a,n),qc(),!1}if(fl)return t=St.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=n,a!==Hi&&(l=Error(s(422),{cause:a}),$a(yt(l,e)))):(a!==Hi&&(t=Error(s(423),{cause:a}),$a(yt(t,e))),l=l.current.alternate,l.flags|=65536,n&=-n,l.lanes|=n,a=yt(a,e),n=dc(l.stateNode,a,n),Zi(l,n),Dl!==4&&(Dl=2)),!1;var u=Error(s(520),{cause:a});if(u=yt(u,e),bn===null?bn=[u]:bn.push(u),Dl!==4&&(Dl=2),t===null)return!0;a=yt(a,e),e=t;do{switch(e.tag){case 3:return e.flags|=65536,l=n&-n,e.lanes|=l,l=dc(e.stateNode,a,l),Zi(e,l),!1;case 1:if(t=e.type,u=e.stateNode,(e.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||u!==null&&typeof u.componentDidCatch=="function"&&(ve===null||!ve.has(u))))return e.flags|=65536,n&=-n,e.lanes|=n,n=Cr(n),qr(n,l,e,a),Zi(e,n),!1}e=e.return}while(e!==null);return!1}var Br=Error(s(461)),Ql=!1;function Ll(l,t,e,a){t.child=l===null?Or(t,null,e,a):va(t,l.child,e,a)}function Gr(l,t,e,a,n){e=e.render;var u=t.ref;if("ref"in a){var i={};for(var c in a)c!=="ref"&&(i[c]=a[c])}else i=a;return qe(t),a=Wi(l,t,e,i,u,n),c=$i(),l!==null&&!Ql?(Fi(l,t,n),Zt(l,t,n)):(fl&&c&&Ui(t),t.flags|=1,Ll(l,t,a,n),t.child)}function Yr(l,t,e,a,n){if(l===null){var u=e.type;return typeof u=="function"&&!Ri(u)&&u.defaultProps===void 0&&e.compare===null?(t.tag=15,t.type=u,wr(l,t,u,a,n)):(l=Pn(e.type,null,a,t,t.mode,n),l.ref=t.ref,l.return=t,t.child=l)}if(u=l.child,!Sc(l,n)){var i=u.memoizedProps;if(e=e.compare,e=e!==null?e:Ka,e(i,a)&&l.ref===t.ref)return Zt(l,t,n)}return t.flags|=1,l=Bt(u,a),l.ref=t.ref,l.return=t,t.child=l}function wr(l,t,e,a,n){if(l!==null){var u=l.memoizedProps;if(Ka(u,a)&&l.ref===t.ref)if(Ql=!1,t.pendingProps=a=u,Sc(l,n))(l.flags&131072)!==0&&(Ql=!0);else return t.lanes=l.lanes,Zt(l,t,n)}return mc(l,t,e,a,n)}function Xr(l,t,e){var a=t.pendingProps,n=a.children,u=l!==null?l.memoizedState:null;if(a.mode==="hidden"){if((t.flags&128)!==0){if(a=u!==null?u.baseLanes|e:e,l!==null){for(n=t.child=l.child,u=0;n!==null;)u=u|n.lanes|n.childLanes,n=n.sibling;t.childLanes=u&~a}else t.childLanes=0,t.child=null;return Qr(l,t,a,e)}if((e&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},l!==null&&nu(t,u!==null?u.cachePool:null),u!==null?ws(t,u):Ki(),_r(t);else return t.lanes=t.childLanes=536870912,Qr(l,t,u!==null?u.baseLanes|e:e,e)}else u!==null?(nu(t,u.cachePool),ws(t,u),se(),t.memoizedState=null):(l!==null&&nu(t,null),Ki(),se());return Ll(l,t,n,e),t.child}function Qr(l,t,e,a){var n=wi();return n=n===null?null:{parent:Gl._currentValue,pool:n},t.memoizedState={baseLanes:e,cachePool:n},l!==null&&nu(t,null),Ki(),_r(t),l!==null&&Fa(l,t,a,!0),null}function xu(l,t){var e=t.ref;if(e===null)l!==null&&l.ref!==null&&(t.flags|=4194816);else{if(typeof e!="function"&&typeof e!="object")throw Error(s(284));(l===null||l.ref!==e)&&(t.flags|=4194816)}}function mc(l,t,e,a,n){return qe(t),e=Wi(l,t,e,a,void 0,n),a=$i(),l!==null&&!Ql?(Fi(l,t,n),Zt(l,t,n)):(fl&&a&&Ui(t),t.flags|=1,Ll(l,t,e,n),t.child)}function Vr(l,t,e,a,n,u){return qe(t),t.updateQueue=null,e=Qs(t,a,e,n),Xs(l),a=$i(),l!==null&&!Ql?(Fi(l,t,u),Zt(l,t,u)):(fl&&a&&Ui(t),t.flags|=1,Ll(l,t,e,u),t.child)}function Zr(l,t,e,a,n){if(qe(t),t.stateNode===null){var u=ua,i=e.contextType;typeof i=="object"&&i!==null&&(u=Wl(i)),u=new e(a,u),t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,u.updater=oc,t.stateNode=u,u._reactInternals=t,u=t.stateNode,u.props=a,u.state=t.memoizedState,u.refs={},Qi(t),i=e.contextType,u.context=typeof i=="object"&&i!==null?Wl(i):ua,u.state=t.memoizedState,i=e.getDerivedStateFromProps,typeof i=="function"&&(rc(t,e,i,a),u.state=t.memoizedState),typeof e.getDerivedStateFromProps=="function"||typeof u.getSnapshotBeforeUpdate=="function"||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(i=u.state,typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount(),i!==u.state&&oc.enqueueReplaceState(u,u.state,null),nn(t,a,u,n),an(),u.state=t.memoizedState),typeof u.componentDidMount=="function"&&(t.flags|=4194308),a=!0}else if(l===null){u=t.stateNode;var c=t.memoizedProps,r=Ye(e,c);u.props=r;var v=u.context,T=e.contextType;i=ua,typeof T=="object"&&T!==null&&(i=Wl(T));var M=e.getDerivedStateFromProps;T=typeof M=="function"||typeof u.getSnapshotBeforeUpdate=="function",c=t.pendingProps!==c,T||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(c||v!==i)&&Dr(t,u,a,i),ne=!1;var g=t.memoizedState;u.state=g,nn(t,a,u,n),an(),v=t.memoizedState,c||g!==v||ne?(typeof M=="function"&&(rc(t,e,M,a),v=t.memoizedState),(r=ne||Rr(t,e,r,a,g,v,i))?(T||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount()),typeof u.componentDidMount=="function"&&(t.flags|=4194308)):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=a,t.memoizedState=v),u.props=a,u.state=v,u.context=i,a=r):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{u=t.stateNode,Vi(l,t),i=t.memoizedProps,T=Ye(e,i),u.props=T,M=t.pendingProps,g=u.context,v=e.contextType,r=ua,typeof v=="object"&&v!==null&&(r=Wl(v)),c=e.getDerivedStateFromProps,(v=typeof c=="function"||typeof u.getSnapshotBeforeUpdate=="function")||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(i!==M||g!==r)&&Dr(t,u,a,r),ne=!1,g=t.memoizedState,u.state=g,nn(t,a,u,n),an();var p=t.memoizedState;i!==M||g!==p||ne||l!==null&&l.dependencies!==null&&eu(l.dependencies)?(typeof c=="function"&&(rc(t,e,c,a),p=t.memoizedState),(T=ne||Rr(t,e,T,a,g,p,r)||l!==null&&l.dependencies!==null&&eu(l.dependencies))?(v||typeof u.UNSAFE_componentWillUpdate!="function"&&typeof u.componentWillUpdate!="function"||(typeof u.componentWillUpdate=="function"&&u.componentWillUpdate(a,p,r),typeof u.UNSAFE_componentWillUpdate=="function"&&u.UNSAFE_componentWillUpdate(a,p,r)),typeof u.componentDidUpdate=="function"&&(t.flags|=4),typeof u.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof u.componentDidUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=p),u.props=a,u.state=p,u.context=r,a=T):(typeof u.componentDidUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||i===l.memoizedProps&&g===l.memoizedState||(t.flags|=1024),a=!1)}return u=a,xu(l,t),a=(t.flags&128)!==0,u||a?(u=t.stateNode,e=a&&typeof e.getDerivedStateFromError!="function"?null:u.render(),t.flags|=1,l!==null&&a?(t.child=va(t,l.child,null,n),t.child=va(t,null,e,n)):Ll(l,t,e,n),t.memoizedState=u.state,l=t.child):l=Zt(l,t,n),l}function Lr(l,t,e,a){return Wa(),t.flags|=256,Ll(l,t,e,a),t.child}var hc={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function vc(l){return{baseLanes:l,cachePool:Us()}}function yc(l,t,e){return l=l!==null?l.childLanes&~e:0,t&&(l|=xt),l}function Kr(l,t,e){var a=t.pendingProps,n=!1,u=(t.flags&128)!==0,i;if((i=u)||(i=l!==null&&l.memoizedState===null?!1:(Yl.current&2)!==0),i&&(n=!0,t.flags&=-129),i=(t.flags&32)!==0,t.flags&=-33,l===null){if(fl){if(n?fe(t):se(),fl){var c=Rl,r;if(r=c){l:{for(r=c,c=Rt;r.nodeType!==8;){if(!c){c=null;break l}if(r=Mt(r.nextSibling),r===null){c=null;break l}}c=r}c!==null?(t.memoizedState={dehydrated:c,treeContext:Ne!==null?{id:Gt,overflow:Yt}:null,retryLane:536870912,hydrationErrors:null},r=ct(18,null,null,0),r.stateNode=c,r.return=t,t.child=r,Fl=t,Rl=null,r=!0):r=!1}r||He(t)}if(c=t.memoizedState,c!==null&&(c=c.dehydrated,c!==null))return Pc(c)?t.lanes=32:t.lanes=536870912,null;Vt(t)}return c=a.children,a=a.fallback,n?(se(),n=t.mode,c=Eu({mode:"hidden",children:c},n),a=De(a,n,e,null),c.return=t,a.return=t,c.sibling=a,t.child=c,n=t.child,n.memoizedState=vc(e),n.childLanes=yc(l,i,e),t.memoizedState=hc,a):(fe(t),gc(t,c))}if(r=l.memoizedState,r!==null&&(c=r.dehydrated,c!==null)){if(u)t.flags&256?(fe(t),t.flags&=-257,t=bc(l,t,e)):t.memoizedState!==null?(se(),t.child=l.child,t.flags|=128,t=null):(se(),n=a.fallback,c=t.mode,a=Eu({mode:"visible",children:a.children},c),n=De(n,c,e,null),n.flags|=2,a.return=t,n.return=t,a.sibling=n,t.child=a,va(t,l.child,null,e),a=t.child,a.memoizedState=vc(e),a.childLanes=yc(l,i,e),t.memoizedState=hc,t=n);else if(fe(t),Pc(c)){if(i=c.nextSibling&&c.nextSibling.dataset,i)var v=i.dgst;i=v,a=Error(s(419)),a.stack="",a.digest=i,$a({value:a,source:null,stack:null}),t=bc(l,t,e)}else if(Ql||Fa(l,t,e,!1),i=(e&l.childLanes)!==0,Ql||i){if(i=Tl,i!==null&&(a=e&-e,a=(a&42)!==0?1:li(a),a=(a&(i.suspendedLanes|e))!==0?0:a,a!==0&&a!==r.retryLane))throw r.retryLane=a,na(l,a),dt(i,l,a),Br;c.data==="$?"||qc(),t=bc(l,t,e)}else c.data==="$?"?(t.flags|=192,t.child=l.child,t=null):(l=r.treeContext,Rl=Mt(c.nextSibling),Fl=t,fl=!0,je=null,Rt=!1,l!==null&&(bt[pt++]=Gt,bt[pt++]=Yt,bt[pt++]=Ne,Gt=l.id,Yt=l.overflow,Ne=t),t=gc(t,a.children),t.flags|=4096);return t}return n?(se(),n=a.fallback,c=t.mode,r=l.child,v=r.sibling,a=Bt(r,{mode:"hidden",children:a.children}),a.subtreeFlags=r.subtreeFlags&65011712,v!==null?n=Bt(v,n):(n=De(n,c,e,null),n.flags|=2),n.return=t,a.return=t,a.sibling=n,t.child=a,a=n,n=t.child,c=l.child.memoizedState,c===null?c=vc(e):(r=c.cachePool,r!==null?(v=Gl._currentValue,r=r.parent!==v?{parent:v,pool:v}:r):r=Us(),c={baseLanes:c.baseLanes|e,cachePool:r}),n.memoizedState=c,n.childLanes=yc(l,i,e),t.memoizedState=hc,a):(fe(t),e=l.child,l=e.sibling,e=Bt(e,{mode:"visible",children:a.children}),e.return=t,e.sibling=null,l!==null&&(i=t.deletions,i===null?(t.deletions=[l],t.flags|=16):i.push(l)),t.child=e,t.memoizedState=null,e)}function gc(l,t){return t=Eu({mode:"visible",children:t},l.mode),t.return=l,l.child=t}function Eu(l,t){return l=ct(22,l,null,t),l.lanes=0,l.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},l}function bc(l,t,e){return va(t,l.child,null,e),l=gc(t,t.pendingProps.children),l.flags|=2,t.memoizedState=null,l}function kr(l,t,e){l.lanes|=t;var a=l.alternate;a!==null&&(a.lanes|=t),qi(l.return,t,e)}function pc(l,t,e,a,n){var u=l.memoizedState;u===null?l.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:e,tailMode:n}:(u.isBackwards=t,u.rendering=null,u.renderingStartTime=0,u.last=a,u.tail=e,u.tailMode=n)}function Jr(l,t,e){var a=t.pendingProps,n=a.revealOrder,u=a.tail;if(Ll(l,t,a.children,e),a=Yl.current,(a&2)!==0)a=a&1|2,t.flags|=128;else{if(l!==null&&(l.flags&128)!==0)l:for(l=t.child;l!==null;){if(l.tag===13)l.memoizedState!==null&&kr(l,e,t);else if(l.tag===19)kr(l,e,t);else if(l.child!==null){l.child.return=l,l=l.child;continue}if(l===t)break l;for(;l.sibling===null;){if(l.return===null||l.return===t)break l;l=l.return}l.sibling.return=l.return,l=l.sibling}a&=1}switch(j(Yl,a),n){case"forwards":for(e=t.child,n=null;e!==null;)l=e.alternate,l!==null&&bu(l)===null&&(n=e),e=e.sibling;e=n,e===null?(n=t.child,t.child=null):(n=e.sibling,e.sibling=null),pc(t,!1,n,e,u);break;case"backwards":for(e=null,n=t.child,t.child=null;n!==null;){if(l=n.alternate,l!==null&&bu(l)===null){t.child=n;break}l=n.sibling,n.sibling=e,e=n,n=l}pc(t,!0,e,null,u);break;case"together":pc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Zt(l,t,e){if(l!==null&&(t.dependencies=l.dependencies),he|=t.lanes,(e&t.childLanes)===0)if(l!==null){if(Fa(l,t,e,!1),(e&t.childLanes)===0)return null}else return null;if(l!==null&&t.child!==l.child)throw Error(s(153));if(t.child!==null){for(l=t.child,e=Bt(l,l.pendingProps),t.child=e,e.return=t;l.sibling!==null;)l=l.sibling,e=e.sibling=Bt(l,l.pendingProps),e.return=t;e.sibling=null}return t.child}function Sc(l,t){return(l.lanes&t)!==0?!0:(l=l.dependencies,!!(l!==null&&eu(l)))}function bh(l,t,e){switch(t.tag){case 3:Sl(t,t.stateNode.containerInfo),ae(t,Gl,l.memoizedState.cache),Wa();break;case 27:case 5:Ft(t);break;case 4:Sl(t,t.stateNode.containerInfo);break;case 10:ae(t,t.type,t.memoizedProps.value);break;case 13:var a=t.memoizedState;if(a!==null)return a.dehydrated!==null?(fe(t),t.flags|=128,null):(e&t.child.childLanes)!==0?Kr(l,t,e):(fe(t),l=Zt(l,t,e),l!==null?l.sibling:null);fe(t);break;case 19:var n=(l.flags&128)!==0;if(a=(e&t.childLanes)!==0,a||(Fa(l,t,e,!1),a=(e&t.childLanes)!==0),n){if(a)return Jr(l,t,e);t.flags|=128}if(n=t.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),j(Yl,Yl.current),a)break;return null;case 22:case 23:return t.lanes=0,Xr(l,t,e);case 24:ae(t,Gl,l.memoizedState.cache)}return Zt(l,t,e)}function Wr(l,t,e){if(l!==null)if(l.memoizedProps!==t.pendingProps)Ql=!0;else{if(!Sc(l,e)&&(t.flags&128)===0)return Ql=!1,bh(l,t,e);Ql=(l.flags&131072)!==0}else Ql=!1,fl&&(t.flags&1048576)!==0&&zs(t,tu,t.index);switch(t.lanes=0,t.tag){case 16:l:{l=t.pendingProps;var a=t.elementType,n=a._init;if(a=n(a._payload),t.type=a,typeof a=="function")Ri(a)?(l=Ye(a,l),t.tag=1,t=Zr(null,t,a,l,e)):(t.tag=0,t=mc(null,t,a,l,e));else{if(a!=null){if(n=a.$$typeof,n===_l){t.tag=11,t=Gr(null,t,a,l,e);break l}else if(n===Nl){t.tag=14,t=Yr(null,t,a,l,e);break l}}throw t=Tt(a)||a,Error(s(306,t,""))}}return t;case 0:return mc(l,t,t.type,t.pendingProps,e);case 1:return a=t.type,n=Ye(a,t.pendingProps),Zr(l,t,a,n,e);case 3:l:{if(Sl(t,t.stateNode.containerInfo),l===null)throw Error(s(387));a=t.pendingProps;var u=t.memoizedState;n=u.element,Vi(l,t),nn(t,a,null,e);var i=t.memoizedState;if(a=i.cache,ae(t,Gl,a),a!==u.cache&&Bi(t,[Gl],e,!0),an(),a=i.element,u.isDehydrated)if(u={element:a,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){t=Lr(l,t,a,e);break l}else if(a!==n){n=yt(Error(s(424)),t),$a(n),t=Lr(l,t,a,e);break l}else{switch(l=t.stateNode.containerInfo,l.nodeType){case 9:l=l.body;break;default:l=l.nodeName==="HTML"?l.ownerDocument.body:l}for(Rl=Mt(l.firstChild),Fl=t,fl=!0,je=null,Rt=!0,e=Or(t,null,a,e),t.child=e;e;)e.flags=e.flags&-3|4096,e=e.sibling}else{if(Wa(),a===n){t=Zt(l,t,e);break l}Ll(l,t,a,e)}t=t.child}return t;case 26:return xu(l,t),l===null?(e=ld(t.type,null,t.pendingProps,null))?t.memoizedState=e:fl||(e=t.type,l=t.pendingProps,a=qu(k.current).createElement(e),a[Jl]=t,a[Il]=l,kl(a,e,l),Xl(a),t.stateNode=a):t.memoizedState=ld(t.type,l.memoizedProps,t.pendingProps,l.memoizedState),null;case 27:return Ft(t),l===null&&fl&&(a=t.stateNode=Fo(t.type,t.pendingProps,k.current),Fl=t,Rt=!0,n=Rl,be(t.type)?(lf=n,Rl=Mt(a.firstChild)):Rl=n),Ll(l,t,t.pendingProps.children,e),xu(l,t),l===null&&(t.flags|=4194304),t.child;case 5:return l===null&&fl&&((n=a=Rl)&&(a=Kh(a,t.type,t.pendingProps,Rt),a!==null?(t.stateNode=a,Fl=t,Rl=Mt(a.firstChild),Rt=!1,n=!0):n=!1),n||He(t)),Ft(t),n=t.type,u=t.pendingProps,i=l!==null?l.memoizedProps:null,a=u.children,$c(n,u)?a=null:i!==null&&$c(n,i)&&(t.flags|=32),t.memoizedState!==null&&(n=Wi(l,t,rh,null,null,e),On._currentValue=n),xu(l,t),Ll(l,t,a,e),t.child;case 6:return l===null&&fl&&((l=e=Rl)&&(e=kh(e,t.pendingProps,Rt),e!==null?(t.stateNode=e,Fl=t,Rl=null,l=!0):l=!1),l||He(t)),null;case 13:return Kr(l,t,e);case 4:return Sl(t,t.stateNode.containerInfo),a=t.pendingProps,l===null?t.child=va(t,null,a,e):Ll(l,t,a,e),t.child;case 11:return Gr(l,t,t.type,t.pendingProps,e);case 7:return Ll(l,t,t.pendingProps,e),t.child;case 8:return Ll(l,t,t.pendingProps.children,e),t.child;case 12:return Ll(l,t,t.pendingProps.children,e),t.child;case 10:return a=t.pendingProps,ae(t,t.type,a.value),Ll(l,t,a.children,e),t.child;case 9:return n=t.type._context,a=t.pendingProps.children,qe(t),n=Wl(n),a=a(n),t.flags|=1,Ll(l,t,a,e),t.child;case 14:return Yr(l,t,t.type,t.pendingProps,e);case 15:return wr(l,t,t.type,t.pendingProps,e);case 19:return Jr(l,t,e);case 31:return a=t.pendingProps,e=t.mode,a={mode:a.mode,children:a.children},l===null?(e=Eu(a,e),e.ref=t.ref,t.child=e,e.return=t,t=e):(e=Bt(l.child,a),e.ref=t.ref,t.child=e,e.return=t,t=e),t;case 22:return Xr(l,t,e);case 24:return qe(t),a=Wl(Gl),l===null?(n=wi(),n===null&&(n=Tl,u=Gi(),n.pooledCache=u,u.refCount++,u!==null&&(n.pooledCacheLanes|=e),n=u),t.memoizedState={parent:a,cache:n},Qi(t),ae(t,Gl,n)):((l.lanes&e)!==0&&(Vi(l,t),nn(t,null,null,e),an()),n=l.memoizedState,u=t.memoizedState,n.parent!==a?(n={parent:a,cache:a},t.memoizedState=n,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=n),ae(t,Gl,a)):(a=u.cache,ae(t,Gl,a),a!==n.cache&&Bi(t,[Gl],e,!0))),Ll(l,t,t.pendingProps.children,e),t.child;case 29:throw t.pendingProps}throw Error(s(156,t.tag))}function Lt(l){l.flags|=4}function $r(l,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)l.flags&=-16777217;else if(l.flags|=16777216,!ud(t)){if(t=St.current,t!==null&&((al&4194048)===al?Dt!==null:(al&62914560)!==al&&(al&536870912)===0||t!==Dt))throw tn=Xi,js;l.flags|=8192}}function Tu(l,t){t!==null&&(l.flags|=4),l.flags&16384&&(t=l.tag!==22?_f():536870912,l.lanes|=t,pa|=t)}function dn(l,t){if(!fl)switch(l.tailMode){case"hidden":t=l.tail;for(var e=null;t!==null;)t.alternate!==null&&(e=t),t=t.sibling;e===null?l.tail=null:e.sibling=null;break;case"collapsed":e=l.tail;for(var a=null;e!==null;)e.alternate!==null&&(a=e),e=e.sibling;a===null?t||l.tail===null?l.tail=null:l.tail.sibling=null:a.sibling=null}}function Ol(l){var t=l.alternate!==null&&l.alternate.child===l.child,e=0,a=0;if(t)for(var n=l.child;n!==null;)e|=n.lanes|n.childLanes,a|=n.subtreeFlags&65011712,a|=n.flags&65011712,n.return=l,n=n.sibling;else for(n=l.child;n!==null;)e|=n.lanes|n.childLanes,a|=n.subtreeFlags,a|=n.flags,n.return=l,n=n.sibling;return l.subtreeFlags|=a,l.childLanes=e,t}function ph(l,t,e){var a=t.pendingProps;switch(ji(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ol(t),null;case 1:return Ol(t),null;case 3:return e=t.stateNode,a=null,l!==null&&(a=l.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Xt(Gl),at(),e.pendingContext&&(e.context=e.pendingContext,e.pendingContext=null),(l===null||l.child===null)&&(Ja(t)?Lt(t):l===null||l.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,_s())),Ol(t),null;case 26:return e=t.memoizedState,l===null?(Lt(t),e!==null?(Ol(t),$r(t,e)):(Ol(t),t.flags&=-16777217)):e?e!==l.memoizedState?(Lt(t),Ol(t),$r(t,e)):(Ol(t),t.flags&=-16777217):(l.memoizedProps!==a&&Lt(t),Ol(t),t.flags&=-16777217),null;case 27:It(t),e=k.current;var n=t.type;if(l!==null&&t.stateNode!=null)l.memoizedProps!==a&&Lt(t);else{if(!a){if(t.stateNode===null)throw Error(s(166));return Ol(t),null}l=B.current,Ja(t)?Ms(t):(l=Fo(n,a,e),t.stateNode=l,Lt(t))}return Ol(t),null;case 5:if(It(t),e=t.type,l!==null&&t.stateNode!=null)l.memoizedProps!==a&&Lt(t);else{if(!a){if(t.stateNode===null)throw Error(s(166));return Ol(t),null}if(l=B.current,Ja(t))Ms(t);else{switch(n=qu(k.current),l){case 1:l=n.createElementNS("http://www.w3.org/2000/svg",e);break;case 2:l=n.createElementNS("http://www.w3.org/1998/Math/MathML",e);break;default:switch(e){case"svg":l=n.createElementNS("http://www.w3.org/2000/svg",e);break;case"math":l=n.createElementNS("http://www.w3.org/1998/Math/MathML",e);break;case"script":l=n.createElement("div"),l.innerHTML=" - - - -
- - diff --git a/extension/.wxt/tsconfig.json b/extension/.wxt/tsconfig.json deleted file mode 100644 index 6f2e6804..00000000 --- a/extension/.wxt/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler", - "noEmit": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "strict": true, - "skipLibCheck": true, - "paths": { - "@": ["../src"], - "@/*": ["../src/*"], - "~": ["../src"], - "~/*": ["../src/*"], - "@@": [".."], - "@@/*": ["../*"], - "~~": [".."], - "~~/*": ["../*"] - } - }, - "include": [ - "../**/*", - "./wxt.d.ts" - ], - "exclude": ["../.output"] -} \ No newline at end of file diff --git a/extension/.wxt/types/globals.d.ts b/extension/.wxt/types/globals.d.ts deleted file mode 100644 index b8aa6c72..00000000 --- a/extension/.wxt/types/globals.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Generated by wxt -interface ImportMetaEnv { - readonly MANIFEST_VERSION: 2 | 3; - readonly BROWSER: string; - readonly CHROME: boolean; - readonly FIREFOX: boolean; - readonly SAFARI: boolean; - readonly EDGE: boolean; - readonly OPERA: boolean; - readonly COMMAND: "build" | "serve"; - readonly ENTRYPOINT: string; -} -interface ImportMeta { - readonly env: ImportMetaEnv -} diff --git a/extension/.wxt/types/i18n.d.ts b/extension/.wxt/types/i18n.d.ts deleted file mode 100644 index 0a0577a4..00000000 --- a/extension/.wxt/types/i18n.d.ts +++ /dev/null @@ -1,81 +0,0 @@ -// Generated by wxt -import "wxt/browser"; - -declare module "wxt/browser" { - /** - * See https://developer.chrome.com/docs/extensions/reference/i18n/#method-getMessage - */ - interface GetMessageOptions { - /** - * See https://developer.chrome.com/docs/extensions/reference/i18n/#method-getMessage - */ - escapeLt?: boolean - } - - export interface WxtI18n extends I18n.Static { - /** - * The extension or app ID; you might use this string to construct URLs for resources inside the extension. Even unlocalized extensions can use this message. - * Note: You can't use this message in a manifest file. - * - * "" - */ - getMessage( - messageName: "@@extension_id", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - /** - * "" - */ - getMessage( - messageName: "@@ui_locale", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - /** - * The text direction for the current locale, either "ltr" for left-to-right languages such as English or "rtl" for right-to-left languages such as Japanese. - * - * "" - */ - getMessage( - messageName: "@@bidi_dir", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - /** - * If the @@bidi_dir is "ltr", then this is "rtl"; otherwise, it's "ltr". - * - * "" - */ - getMessage( - messageName: "@@bidi_reversed_dir", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - /** - * If the @@bidi_dir is "ltr", then this is "left"; otherwise, it's "right". - * - * "" - */ - getMessage( - messageName: "@@bidi_start_edge", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - /** - * If the @@bidi_dir is "ltr", then this is "right"; otherwise, it's "left". - * - * "" - */ - getMessage( - messageName: "@@bidi_end_edge", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - getMessage( - messageName: "@@extension_id" | "@@ui_locale" | "@@bidi_dir" | "@@bidi_reversed_dir" | "@@bidi_start_edge" | "@@bidi_end_edge", - substitutions?: string | string[], - options?: GetMessageOptions, - ): string; - } -} diff --git a/extension/.wxt/types/imports-module.d.ts b/extension/.wxt/types/imports-module.d.ts deleted file mode 100644 index 8d30eee9..00000000 --- a/extension/.wxt/types/imports-module.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Generated by wxt -// Types for the #import virtual module -declare module '#imports' { - export { browser, Browser } from 'wxt/browser'; - export { storage, StorageArea, WxtStorage, WxtStorageItem, StorageItemKey, StorageAreaChanges, MigrationError } from 'wxt/utils/storage'; - export { useAppConfig } from 'wxt/utils/app-config'; - export { ContentScriptContext, WxtWindowEventMap } from 'wxt/utils/content-script-context'; - export { createIframeUi, IframeContentScriptUi, IframeContentScriptUiOptions } from 'wxt/utils/content-script-ui/iframe'; - export { createIntegratedUi, IntegratedContentScriptUi, IntegratedContentScriptUiOptions } from 'wxt/utils/content-script-ui/integrated'; - export { createShadowRootUi, ShadowRootContentScriptUi, ShadowRootContentScriptUiOptions } from 'wxt/utils/content-script-ui/shadow-root'; - export { ContentScriptUi, ContentScriptUiOptions, ContentScriptOverlayAlignment, ContentScriptAppendMode, ContentScriptInlinePositioningOptions, ContentScriptOverlayPositioningOptions, ContentScriptModalPositioningOptions, ContentScriptPositioningOptions, ContentScriptAnchoredOptions, AutoMountOptions, StopAutoMount, AutoMount } from 'wxt/utils/content-script-ui/types'; - export { defineAppConfig, WxtAppConfig } from 'wxt/utils/define-app-config'; - export { defineBackground } from 'wxt/utils/define-background'; - export { defineContentScript } from 'wxt/utils/define-content-script'; - export { defineUnlistedScript } from 'wxt/utils/define-unlisted-script'; - export { defineWxtPlugin } from 'wxt/utils/define-wxt-plugin'; - export { injectScript, ScriptPublicPath, InjectScriptOptions } from 'wxt/utils/inject-script'; - export { InvalidMatchPattern, MatchPattern } from 'wxt/utils/match-patterns'; - export { useState, useCallback, useMemo, useEffect, useRef, useContext, useReducer } from 'react'; - export { fakeBrowser } from 'wxt/testing'; -} diff --git a/extension/.wxt/types/imports.d.ts b/extension/.wxt/types/imports.d.ts deleted file mode 100644 index f8e366e0..00000000 --- a/extension/.wxt/types/imports.d.ts +++ /dev/null @@ -1,57 +0,0 @@ -// Generated by wxt -export {} -declare global { - const ContentScriptContext: typeof import('wxt/utils/content-script-context')['ContentScriptContext'] - const InvalidMatchPattern: typeof import('wxt/utils/match-patterns')['InvalidMatchPattern'] - const MatchPattern: typeof import('wxt/utils/match-patterns')['MatchPattern'] - const browser: typeof import('wxt/browser')['browser'] - const createIframeUi: typeof import('wxt/utils/content-script-ui/iframe')['createIframeUi'] - const createIntegratedUi: typeof import('wxt/utils/content-script-ui/integrated')['createIntegratedUi'] - const createShadowRootUi: typeof import('wxt/utils/content-script-ui/shadow-root')['createShadowRootUi'] - const defineAppConfig: typeof import('wxt/utils/define-app-config')['defineAppConfig'] - const defineBackground: typeof import('wxt/utils/define-background')['defineBackground'] - const defineContentScript: typeof import('wxt/utils/define-content-script')['defineContentScript'] - const defineUnlistedScript: typeof import('wxt/utils/define-unlisted-script')['defineUnlistedScript'] - const defineWxtPlugin: typeof import('wxt/utils/define-wxt-plugin')['defineWxtPlugin'] - const fakeBrowser: typeof import('wxt/testing')['fakeBrowser'] - const injectScript: typeof import('wxt/utils/inject-script')['injectScript'] - const storage: typeof import('wxt/utils/storage')['storage'] - const useAppConfig: typeof import('wxt/utils/app-config')['useAppConfig'] - const useCallback: typeof import('react')['useCallback'] - const useContext: typeof import('react')['useContext'] - const useEffect: typeof import('react')['useEffect'] - const useMemo: typeof import('react')['useMemo'] - const useReducer: typeof import('react')['useReducer'] - const useRef: typeof import('react')['useRef'] - const useState: typeof import('react')['useState'] -} -// for type re-export -declare global { - // @ts-ignore - export type { Browser } from 'wxt/browser' - import('wxt/browser') - // @ts-ignore - export type { StorageArea, WxtStorage, WxtStorageItem, StorageItemKey, StorageAreaChanges, MigrationError } from 'wxt/utils/storage' - import('wxt/utils/storage') - // @ts-ignore - export type { WxtWindowEventMap } from 'wxt/utils/content-script-context' - import('wxt/utils/content-script-context') - // @ts-ignore - export type { IframeContentScriptUi, IframeContentScriptUiOptions } from 'wxt/utils/content-script-ui/iframe' - import('wxt/utils/content-script-ui/iframe') - // @ts-ignore - export type { IntegratedContentScriptUi, IntegratedContentScriptUiOptions } from 'wxt/utils/content-script-ui/integrated' - import('wxt/utils/content-script-ui/integrated') - // @ts-ignore - export type { ShadowRootContentScriptUi, ShadowRootContentScriptUiOptions } from 'wxt/utils/content-script-ui/shadow-root' - import('wxt/utils/content-script-ui/shadow-root') - // @ts-ignore - export type { ContentScriptUi, ContentScriptUiOptions, ContentScriptOverlayAlignment, ContentScriptAppendMode, ContentScriptInlinePositioningOptions, ContentScriptOverlayPositioningOptions, ContentScriptModalPositioningOptions, ContentScriptPositioningOptions, ContentScriptAnchoredOptions, AutoMountOptions, StopAutoMount, AutoMount } from 'wxt/utils/content-script-ui/types' - import('wxt/utils/content-script-ui/types') - // @ts-ignore - export type { WxtAppConfig } from 'wxt/utils/define-app-config' - import('wxt/utils/define-app-config') - // @ts-ignore - export type { ScriptPublicPath, InjectScriptOptions } from 'wxt/utils/inject-script' - import('wxt/utils/inject-script') -} diff --git a/extension/.wxt/types/paths.d.ts b/extension/.wxt/types/paths.d.ts deleted file mode 100644 index cfb3cd93..00000000 --- a/extension/.wxt/types/paths.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -// Generated by wxt -import "wxt/browser"; - -declare module "wxt/browser" { - export type PublicPath = - | "" - | "/" - | "/background.js" - | "/content-scripts/content.js" - | "/context.js" - | "/sidepanel.html" - type HtmlPublicPath = Extract - export interface WxtRuntime { - getURL(path: PublicPath): string; - getURL(path: `${HtmlPublicPath}${string}`): string; - } -} diff --git a/extension/.wxt/wxt.d.ts b/extension/.wxt/wxt.d.ts deleted file mode 100644 index 2342522e..00000000 --- a/extension/.wxt/wxt.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Generated by wxt -/// -/// -/// -/// -/// -/// -/// From 21028ff600ee80bcb72fb8b5805e046bd3822642 Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 14:13:34 -0500 Subject: [PATCH 09/13] removed context.ts redundancy --- extension/src/entrypoints/content.ts | 150 ++++++++++++--------------- extension/src/entrypoints/context.ts | 23 ---- 2 files changed, 69 insertions(+), 104 deletions(-) delete mode 100644 extension/src/entrypoints/context.ts diff --git a/extension/src/entrypoints/content.ts b/extension/src/entrypoints/content.ts index 7edd760c..7232554a 100644 --- a/extension/src/entrypoints/content.ts +++ b/extension/src/entrypoints/content.ts @@ -1,17 +1,14 @@ -/* src/entrypoints/content.ts - * – RRWeb recorder + custom events +/* – RRWeb recorder + custom events * – Open+closed Shadow-DOM instrumentation * – Safe for WXT’s Node build (no DOM at top level) */ - -import { defineContentScript } from '#imports'; // <- run `wxt prepare` for TS defs +import { defineContentScript } from '#imports'; import * as rrweb from 'rrweb'; import { EventType, IncrementalSource } from '@rrweb/types'; -/* ──────────────── globals ──────────────── */ +/* ───────────── globals ───────────── */ let stopRecording: (() => void) | undefined; let isRecordingActive = true; - let scrollTimeout: ReturnType | null = null; let lastScrollY: number | null = null; let lastDirection: 'up' | 'down' | null = null; @@ -50,8 +47,7 @@ function cssSelector(el: HTMLElement, xpath: string): string { : `[${n}]`; } return sel; - } catch (e) { - console.error('selector-gen', e); + } catch { return `${el.tagName.toLowerCase()}[xpath="${xpath.replace(/"/g, '"')}"]`; } } @@ -59,42 +55,27 @@ function cssSelector(el: HTMLElement, xpath: string): string { /* ───────────── Shadow helpers ───────────── */ const composedTarget = (e: Event) => (e.composedPath?.().find(n => n instanceof HTMLElement) ?? - (e.target instanceof HTMLElement ? e.target : null)) as HTMLElement | null; + (e.target instanceof HTMLElement ? e.target : null)) as HTMLElement | null; function chain(el: HTMLElement): string[] { - const chain: string[] = []; + const parts: string[] = []; let node: HTMLElement | null = el; while (node) { - chain.unshift(cssSelector(node, getXPath(node))); - node = node.getRootNode() instanceof ShadowRoot ? (node.getRootNode() as ShadowRoot).host as HTMLElement : node.parentElement; + parts.unshift(cssSelector(node, getXPath(node))); + node = node.getRootNode() instanceof ShadowRoot + ? (node.getRootNode() as ShadowRoot).host as HTMLElement + : node.parentElement; } - return chain; + return parts; } function instrumentRoot(root: ShadowRoot) { - root.addEventListener('click', onClick as EventListener, true); - root.addEventListener('input', onInput as EventListener, true); + root.addEventListener('click', onClick as EventListener, true); + root.addEventListener('input', onInput as EventListener, true); root.addEventListener('change', onSelect as EventListener, true); - root.addEventListener('keydown', onKey as EventListener, true); - root.querySelectorAll('*').forEach(n => n instanceof HTMLElement && n.shadowRoot && instrumentRoot(n.shadowRoot)); -} - -function scanOpenRoots() { - document.querySelectorAll('*').forEach(el => { - const sr = (el as HTMLElement).shadowRoot; - if (sr) instrumentRoot(sr); - }); -} - -function scanClosedRoots() { - const api = (chrome as any)?.dom?.openOrClosedShadowRoot; // Chrome Canary devtools API - if (!api) return; - document.querySelectorAll('*').forEach(el => { - try { - const sr = api(el); - sr && instrumentRoot(sr); - } catch {} - }); + root.addEventListener('keydown',onKey as EventListener, true); + root.querySelectorAll('*') + .forEach(n => n instanceof HTMLElement && n.shadowRoot && instrumentRoot(n.shadowRoot)); } /* ───────────── rrweb recorder ───────────── */ @@ -104,7 +85,8 @@ function startRecorder() { emit(evt) { if (!isRecordingActive) return; - if (evt.type === EventType.IncrementalSnapshot && evt.data.source === IncrementalSource.Scroll) { + if (evt.type === EventType.IncrementalSnapshot && + evt.data.source === IncrementalSource.Scroll) { const d = evt.data as { id: number; x: number; y: number }; const y = Math.round(d.y), x = Math.round(d.x); const dir = lastScrollY != null ? (y > lastScrollY ? 'down' : 'up') : null; @@ -124,23 +106,24 @@ function startRecorder() { }, maskInputOptions: { password: true }, checkoutEveryNms: 10_000, - checkoutEveryNth: 200, + checkoutEveryNth : 200, }); - (window as any).rrwebStop = stopRecorder; - document.addEventListener('click', onClick, true); - document.addEventListener('input', onInput, true); + + /* hook native DOM events */ + document.addEventListener('click', onClick , true); + document.addEventListener('input', onInput , true); document.addEventListener('change', onSelect, true); - document.addEventListener('keydown', onKey, true); + document.addEventListener('keydown',onKey , true); } function stopRecorder() { if (!stopRecording) return; - stopRecording(); stopRecording = undefined; isRecordingActive = false; - (window as any).rrwebStop = undefined; - document.removeEventListener('click', onClick, true); - document.removeEventListener('input', onInput, true); + stopRecording(); stopRecording = undefined; + isRecordingActive = false; + document.removeEventListener('click', onClick , true); + document.removeEventListener('input', onInput , true); document.removeEventListener('change', onSelect, true); - document.removeEventListener('keydown', onKey, true); + document.removeEventListener('keydown',onKey , true); } /* ───────────── CUSTOM EVENT HANDLERS ───────────── */ @@ -151,12 +134,12 @@ function onClick(e: MouseEvent) { chrome.runtime.sendMessage({ type: 'CUSTOM_CLICK_EVENT', payload: { - timestamp: Date.now(), - url: document.location.href, - frameUrl: window.location.href, - xpath: getXPath(el), + timestamp : Date.now(), + url : document.location.href, + frameUrl : window.location.href, + xpath : getXPath(el), cssSelector: chain(el).join(' >> '), - elementTag: el.tagName, + elementTag : el.tagName, elementText: el.textContent?.trim().slice(0, 200) ?? '', }, }); @@ -169,13 +152,13 @@ function onInput(e: Event) { chrome.runtime.sendMessage({ type: 'CUSTOM_INPUT_EVENT', payload: { - timestamp: Date.now(), - url: document.location.href, - frameUrl: window.location.href, - xpath: getXPath(el), + timestamp : Date.now(), + url : document.location.href, + frameUrl : window.location.href, + xpath : getXPath(el), cssSelector: chain(el).join(' >> '), - elementTag: el.tagName, - value: el.type === 'password' ? '********' : el.value, + elementTag : el.tagName, + value : el.type === 'password' ? '********' : el.value, }, }); } @@ -188,14 +171,14 @@ function onSelect(e: Event) { chrome.runtime.sendMessage({ type: 'CUSTOM_SELECT_EVENT', payload: { - timestamp: Date.now(), - url: document.location.href, - frameUrl: window.location.href, - xpath: getXPath(el), + timestamp : Date.now(), + url : document.location.href, + frameUrl : window.location.href, + xpath : getXPath(el), cssSelector: chain(el).join(' >> '), - elementTag: el.tagName, + elementTag : el.tagName, selectedValue: el.value, - selectedText: opt ? opt.text : '', + selectedText : opt ? opt.text : '', }, }); } @@ -209,20 +192,21 @@ function onKey(e: KeyboardEvent) { if (!isRecordingActive) return; let k = ''; if (KEYS.has(e.key)) k = e.key; - else if ((e.ctrlKey || e.metaKey) && e.key.length === 1) k = `CmdOrCtrl+${e.key.toUpperCase()}`; + else if ((e.ctrlKey || e.metaKey) && e.key.length === 1) + k = `CmdOrCtrl+${e.key.toUpperCase()}`; if (!k) return; const el = composedTarget(e); chrome.runtime.sendMessage({ type: 'CUSTOM_KEY_EVENT', payload: { - timestamp: Date.now(), - url: document.location.href, - frameUrl: window.location.href, - key: k, - xpath: el ? getXPath(el) : '', + timestamp : Date.now(), + url : document.location.href, + frameUrl : window.location.href, + key : k, + xpath : el ? getXPath(el) : '', cssSelector: el ? chain(el).join(' >> ') : '', - elementTag: el ? el.tagName : 'document', + elementTag : el ? el.tagName : 'document', }, }); } @@ -230,9 +214,9 @@ function onKey(e: KeyboardEvent) { /* ───────────── content-script entry ───────────── */ export default defineContentScript({ matches: [''], - runAt: 'document_start', + runAt : 'document_start', main() { - // Safe patches – run only in the real browser + /* 1. Monkey-patch attachShadow early, keep closed → open AND auto-instrument */ if (typeof Element !== 'undefined') { const original = Element.prototype.attachShadow; Element.prototype.attachShadow = function (init: ShadowRootInit): ShadowRoot { @@ -243,12 +227,12 @@ export default defineContentScript({ }; } + /* 2. Wrap customElements.define so custom elements created later are covered */ if (typeof customElements !== 'undefined') { const origDefine = customElements.define.bind(customElements); customElements.define = (name, ctor, opts) => { const Wrapped = class extends (ctor as any) { constructor(...a: any[]) { - // @ts-ignore super(...a); const sr = (this as any).shadowRoot; sr && instrumentRoot(sr); @@ -259,18 +243,22 @@ export default defineContentScript({ }; } + /* 3. Observe DOM for shadow hosts added after load */ new MutationObserver(recs => recs.forEach(r => - r.addedNodes.forEach(n => n instanceof HTMLElement && n.shadowRoot && instrumentRoot(n.shadowRoot)), - ), - ).observe(document.documentElement, { childList: true, subtree: true }); + r.addedNodes.forEach(n => + n instanceof HTMLElement && n.shadowRoot && instrumentRoot(n.shadowRoot)))) + .observe(document.documentElement, { childList: true, subtree: true }); - scanOpenRoots(); - scanClosedRoots(); + /* 4. Scan any open / dev-tools-exposed closed roots present at startup */ + document.querySelectorAll('*') + .forEach(el => el instanceof HTMLElement && el.shadowRoot && instrumentRoot(el.shadowRoot)); - chrome.runtime.onMessage.addListener(msg => { - if (msg.type === 'SET_RECORDING_STATUS') msg.payload ? startRecorder() : stopRecorder(); - }); + /* 5. Recording control wiring */ + chrome.runtime.onMessage.addListener(msg => + msg.type === 'SET_RECORDING_STATUS' + ? msg.payload ? startRecorder() : stopRecorder() + : undefined); chrome.runtime.sendMessage({ type: 'REQUEST_RECORDING_STATUS' }, res => { if (!chrome.runtime.lastError && res?.isRecordingEnabled) startRecorder(); diff --git a/extension/src/entrypoints/context.ts b/extension/src/entrypoints/context.ts deleted file mode 100644 index 71f5af04..00000000 --- a/extension/src/entrypoints/context.ts +++ /dev/null @@ -1,23 +0,0 @@ -export default defineContentScript({ - matches: [''], - // Run as early as possible to intercept shadow root creation - runAt: 'document_start', - main() { - const patch = `( - function() { - const original = Element.prototype.attachShadow; - Element.prototype.attachShadow = function(init) { - if (init && init.mode === 'closed') { - const newInit = Object.assign({}, init, { mode: 'open' }); - return original.call(this, newInit); - } - return original.call(this, init); - }; - } - )();`; - const script = document.createElement('script'); - script.textContent = patch; - (document.documentElement || document.head).appendChild(script); - script.remove(); - }, -}); From 61d977d4125cceb187fc7e1e333433572743ab1d Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 14:23:21 -0500 Subject: [PATCH 10/13] moved test files --- .../{ => workflow_use/builder}/tests/shadowdom-closed/app.js | 0 .../{ => workflow_use/builder}/tests/shadowdom-closed/closed.html | 0 .../builder}/tests/shadowdom-closed/shadow-closed.workflow.json | 0 .../builder}/tests/shadowdom-closed/test_shadow_closed.py | 0 .../{ => workflow_use/builder}/tests/shadowdom-detect/app.js | 0 .../{ => workflow_use/builder}/tests/shadowdom-detect/index.html | 0 .../builder}/tests/shadowdom-detect/shadow-next.workflow.json | 0 .../builder}/tests/shadowdom-detect/shadowdom_detect.py | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename workflows/{ => workflow_use/builder}/tests/shadowdom-closed/app.js (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-closed/closed.html (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-closed/shadow-closed.workflow.json (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-closed/test_shadow_closed.py (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-detect/app.js (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-detect/index.html (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-detect/shadow-next.workflow.json (100%) rename workflows/{ => workflow_use/builder}/tests/shadowdom-detect/shadowdom_detect.py (100%) diff --git a/workflows/tests/shadowdom-closed/app.js b/workflows/workflow_use/builder/tests/shadowdom-closed/app.js similarity index 100% rename from workflows/tests/shadowdom-closed/app.js rename to workflows/workflow_use/builder/tests/shadowdom-closed/app.js diff --git a/workflows/tests/shadowdom-closed/closed.html b/workflows/workflow_use/builder/tests/shadowdom-closed/closed.html similarity index 100% rename from workflows/tests/shadowdom-closed/closed.html rename to workflows/workflow_use/builder/tests/shadowdom-closed/closed.html diff --git a/workflows/tests/shadowdom-closed/shadow-closed.workflow.json b/workflows/workflow_use/builder/tests/shadowdom-closed/shadow-closed.workflow.json similarity index 100% rename from workflows/tests/shadowdom-closed/shadow-closed.workflow.json rename to workflows/workflow_use/builder/tests/shadowdom-closed/shadow-closed.workflow.json diff --git a/workflows/tests/shadowdom-closed/test_shadow_closed.py b/workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py similarity index 100% rename from workflows/tests/shadowdom-closed/test_shadow_closed.py rename to workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py diff --git a/workflows/tests/shadowdom-detect/app.js b/workflows/workflow_use/builder/tests/shadowdom-detect/app.js similarity index 100% rename from workflows/tests/shadowdom-detect/app.js rename to workflows/workflow_use/builder/tests/shadowdom-detect/app.js diff --git a/workflows/tests/shadowdom-detect/index.html b/workflows/workflow_use/builder/tests/shadowdom-detect/index.html similarity index 100% rename from workflows/tests/shadowdom-detect/index.html rename to workflows/workflow_use/builder/tests/shadowdom-detect/index.html diff --git a/workflows/tests/shadowdom-detect/shadow-next.workflow.json b/workflows/workflow_use/builder/tests/shadowdom-detect/shadow-next.workflow.json similarity index 100% rename from workflows/tests/shadowdom-detect/shadow-next.workflow.json rename to workflows/workflow_use/builder/tests/shadowdom-detect/shadow-next.workflow.json diff --git a/workflows/tests/shadowdom-detect/shadowdom_detect.py b/workflows/workflow_use/builder/tests/shadowdom-detect/shadowdom_detect.py similarity index 100% rename from workflows/tests/shadowdom-detect/shadowdom_detect.py rename to workflows/workflow_use/builder/tests/shadowdom-detect/shadowdom_detect.py From 12711e23553356010e5aeb1ea0456eb6c180b849 Mon Sep 17 00:00:00 2001 From: Guido1Alessandro1Trevisan <46954188+Guido1Alessandro1Trevisan@users.noreply.github.com> Date: Wed, 21 May 2025 15:06:27 -0500 Subject: [PATCH 11/13] Remove extension usage during workflow run --- .../shadowdom-closed/test_shadow_closed.py | 121 ++++-------------- workflows/workflow_use/workflow/service.py | 83 ++++++------ 2 files changed, 70 insertions(+), 134 deletions(-) diff --git a/workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py b/workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py index a7161083..2483dde8 100644 --- a/workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py +++ b/workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py @@ -1,114 +1,39 @@ -import asyncio, os, shutil, tempfile +import os from pathlib import Path from threading import Thread from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer import pytest -from playwright.async_api import async_playwright from workflow_use.workflow.service import Workflow -TEST_DIR = Path(__file__).parent -# Extension build output directory. The extension is built using `wxt build` -# which places the compiled files under `.output/chrome-mv3`. -# Tests rely on this path to load the monkey patching extension that forces -# closed shadow roots to open mode. -EXT_DIR = TEST_DIR.parents[2] / "extension" / ".output" / "chrome-mv3" -if not EXT_DIR.exists(): - pytest.skip( - f"Built extension not found at {EXT_DIR}. Run 'npm run build' in the extension directory." - ) +TEST_DIR = Path(__file__).parent -# Fallback script in case the extension cannot load in headless mode. It mirrors -# the patch applied in the extension's context script (content.ts) and forces -# all newly created shadow roots to be open. -SHADOW_PATCH = """ -(function(){ - const original = Element.prototype.attachShadow; - Element.prototype.attachShadow = function(init){ - if (init && init.mode === 'closed') { - init = Object.assign({}, init, {mode: 'open'}); - } - return original.call(this, init); - }; -})(); -""" -WORKFLOW_FILE = TEST_DIR / "shadow-closed.workflow.json" +WORKFLOW_FILE = TEST_DIR / 'shadow-closed.workflow.json' -# ---------- tiny shim ------------------------------------------------------ -class BorrowedCtxWrapper: - """Wrap a Playwright BrowserContext so browser-use actions can use it.""" - def __init__(self, pw_ctx): - self._ctx = pw_ctx # real Playwright context - - # -- async-context-manager no-ops ------------------------------------- - async def __aenter__(self): # allows: async with browser - return self - async def __aexit__(self, exc_type, exc, tb): - return False - - # -- minimal API surface that browser-use expects --------------------- - async def get_current_page(self): - """Return the current page, or open one if none exist.""" - if self._ctx.pages: - return self._ctx.pages[0] - return await self._ctx.new_page() - - # Let *any other* attribute fall through to the underlying context - def __getattr__(self, item): - return getattr(self._ctx, item) -# -------------------------------------------------------------------------- def start_server(): - os.chdir(TEST_DIR) - server = ThreadingHTTPServer(("127.0.0.1", 8000), SimpleHTTPRequestHandler) - t = Thread(target=server.serve_forever, daemon=True); t.start() - return server, t + os.chdir(TEST_DIR) + server = ThreadingHTTPServer(('127.0.0.1', 8000), SimpleHTTPRequestHandler) + t = Thread(target=server.serve_forever, daemon=True) + t.start() + return server, t -async def launch_chromium_with_extension(): - tmp_profile = tempfile.mkdtemp(prefix="pw-profile-") - args = [ - f"--disable-extensions-except={EXT_DIR}", - f"--load-extension={EXT_DIR}", - ] - pw = await async_playwright().start() - ctx = await pw.chromium.launch_persistent_context( - tmp_profile, - headless=False, - args=args, - ignore_default_args=["--disable-extensions"], - ) - - # If the extension failed to load (no service worker detected), inject the - # same patch used by the extension to force shadow roots open. - if not ctx.service_workers: - await ctx.add_init_script(SHADOW_PATCH) - for page in ctx.pages: - await page.add_init_script(SHADOW_PATCH) - await page.evaluate(SHADOW_PATCH) - - return pw, ctx, tmp_profile # ----------------------------- test ---------------------------------------- @pytest.mark.asyncio async def test_shadow_closed_workflow(): - server, thread = start_server() - pw, ctx, profile = await launch_chromium_with_extension() - try: - workflow = Workflow.load_from_file( - str(WORKFLOW_FILE), - existing_pw_context=BorrowedCtxWrapper(ctx), - ) - workflow.fallback_to_agent = False - await workflow.run(close_browser_at_end=False) - - # sanity-check: patch opened closed shadow DOM so selectors work - page = ctx.pages[0] if ctx.pages else await ctx.new_page() - value = await page.input_value( - "css=outer-closed >> inner-closed >> #inner-input" - ) - assert value == "hello-closed" - finally: - await ctx.close() - await pw.stop() - shutil.rmtree(profile, ignore_errors=True) - server.shutdown(); thread.join() + server, thread = start_server() + try: + workflow = Workflow.load_from_file(str(WORKFLOW_FILE)) + workflow.fallback_to_agent = False + await workflow.run(close_browser_at_end=False) + + ctx = workflow.browser_context.session.context + page = ctx.pages[0] if ctx.pages else await ctx.new_page() + value = await page.input_value('css=outer-closed >> inner-closed >> #inner-input') + assert value == 'hello-closed' + finally: + await workflow.browser_context.__aexit__(None, None, None) + await workflow.browser.close() + server.shutdown() + thread.join() diff --git a/workflows/workflow_use/workflow/service.py b/workflows/workflow_use/workflow/service.py index 4698c338..7ea08403 100644 --- a/workflows/workflow_use/workflow/service.py +++ b/workflows/workflow_use/workflow/service.py @@ -33,7 +33,21 @@ ) from workflow_use.workflow.prompts import WORKFLOW_FALLBACK_PROMPT_TEMPLATE +# Patch to force closed shadow DOM roots to open mode so selectors work +SHADOW_PATCH = """ +(function(){ + const original = Element.prototype.attachShadow; + Element.prototype.attachShadow = function(init){ + if (init && init.mode === 'closed') { + init = Object.assign({}, init, {mode: 'open'}); + } + return original.call(this, init); + }; +})(); +""" + from typing import Any, Dict, List, TYPE_CHECKING + if TYPE_CHECKING: from playwright.async_api import BrowserContext as PWContext @@ -51,7 +65,6 @@ def __init__( browser: Browser | None = None, llm: BaseChatModel | None = None, fallback_to_agent: bool = True, - existing_pw_context: "PWContext | None" = None, ) -> None: """Initialize a new Workflow instance from a schema object. @@ -74,22 +87,16 @@ def __init__( self.controller = controller or WorkflowController() self.browser = browser or Browser() - + self.llm = llm self.fallback_to_agent = fallback_to_agent - if existing_pw_context is not None: - # borrowing an already-launched persistent context (e.g. for tests) - self.browser_context = existing_pw_context - self._owns_context = False - else: - # normal path – create a fresh context on demand - self.browser_context = BrowserContext( - browser=self.browser, - config=self.browser.config.new_context_config, - ) - self._owns_context = True - + # always create a fresh context on demand + self.browser_context = BrowserContext( + browser=self.browser, + config=self.browser.config.new_context_config, + ) + self._owns_context = True self.context: dict[str, Any] = {} @@ -105,13 +112,12 @@ def load_from_file( controller: WorkflowController | None = None, browser: Browser | None = None, llm: BaseChatModel | None = None, - existing_pw_context: "PWContext | None" = None, ) -> Workflow: """Load a workflow from a file.""" with open(file_path, 'r') as f: data = _json.load(f) workflow_schema = WorkflowDefinitionSchema(**data) - return Workflow(workflow_schema=workflow_schema, controller=controller, browser=browser, llm=llm, existing_pw_context=existing_pw_context,) + return Workflow(workflow_schema=workflow_schema, controller=controller, browser=browser, llm=llm) # --- Runners --- async def _run_deterministic_step(self, step: DeterministicWorkflowStep) -> ActionResult: @@ -159,24 +165,24 @@ async def _fallback_to_agent( # Extract details from the failed step dictionary failed_action_name = step_resolved.type failed_params = step_resolved.model_dump() - step_description = step_resolved.description or "No description provided" - error_msg = str(error) if error else "Unknown error" + step_description = step_resolved.description or 'No description provided' + error_msg = str(error) if error else 'Unknown error' total_steps = len(self.steps) fail_details = ( f"step={step_index + 1}/{total_steps}, action='{failed_action_name}', " f"description='{step_description}', params={str(failed_params)}, error='{error_msg}'" ) - + # Determine the failed_value based on step type and attributes failed_value = None - description_prefix = f"Purpose: {step_description}. " if step_description else "" - + description_prefix = f'Purpose: {step_description}. ' if step_description else '' + if isinstance(step_resolved, NavigationStep): - failed_value = f"{description_prefix}Navigate to URL: {step_resolved.url}" + failed_value = f'{description_prefix}Navigate to URL: {step_resolved.url}' elif isinstance(step_resolved, ClickStep): # element_info = step_resolved.elementText or step_resolved.cssSelector # failed_value = f"{description_prefix}Click element: {element_info}" - failed_value = f"Find and click element with description: {step_resolved.description}" + failed_value = f'Find and click element with description: {step_resolved.description}' elif isinstance(step_resolved, InputStep): failed_value = f"{description_prefix}Input text: '{step_resolved.value}' into element." elif isinstance(step_resolved, SelectChangeStep): @@ -184,20 +190,18 @@ async def _fallback_to_agent( elif isinstance(step_resolved, KeyPressStep): failed_value = f"{description_prefix}Press key: '{step_resolved.key}'" elif isinstance(step_resolved, ScrollStep): - failed_value = f"{description_prefix}Scroll to position: (x={step_resolved.scrollX}, y={step_resolved.scrollY})" + failed_value = f'{description_prefix}Scroll to position: (x={step_resolved.scrollX}, y={step_resolved.scrollY})' else: failed_value = f"{description_prefix}No specific target value available for action '{failed_action_name}'" - + # Build workflow overview using the stored dictionaries workflow_overview_lines: list[str] = [] for idx, step in enumerate(self.steps): - desc = step.description or "" + desc = step.description or '' step_type_info = step.type details = step.model_dump() - workflow_overview_lines.append( - f" {idx + 1}. ({step_type_info}) {desc} - {details}" - ) - workflow_overview = "\n".join(workflow_overview_lines) + workflow_overview_lines.append(f' {idx + 1}. ({step_type_info}) {desc} - {details}') + workflow_overview = '\n'.join(workflow_overview_lines) print(workflow_overview) # Build the fallback task with the failed_value @@ -208,7 +212,7 @@ async def _fallback_to_agent( action_type=failed_action_name, fail_details=fail_details, failed_value=failed_value, - step_description=step_description + step_description=step_description, ) logger.info(f'Agent fallback task: {fallback_task}') @@ -421,9 +425,17 @@ async def run(self, inputs: dict[str, Any] | None = None, close_browser_at_end: results: List[Any] = [] - if self._owns_context: + if self._owns_context: await self.browser_context.__aenter__() - + try: + ctx = self.browser_context.session.context + await ctx.add_init_script(SHADOW_PATCH) + for page in ctx.pages: + await page.add_init_script(SHADOW_PATCH) + await page.evaluate(SHADOW_PATCH) + except Exception as e: + logger.debug(f'Failed to inject shadow patch: {e}') + try: for step_index, step_dict in enumerate(self.steps): # self.steps now holds dictionaries await asyncio.sleep(0.1) @@ -443,12 +455,11 @@ async def run(self, inputs: dict[str, Any] | None = None, close_browser_at_end: logger.info(f'--- Finished Step {step_index + 1} ---\n') finally: if close_browser_at_end and self._owns_context: - - await asyncio.sleep(3) # optional pause + await asyncio.sleep(3) # optional pause await self.browser_context.__aexit__(None, None, None) # Clean-up browser after finishing workflow - if close_browser_at_end and self._owns_context: + if close_browser_at_end and self._owns_context: await self.browser.close() return results From 96884676bf98b03064ef7225497315aa4aeed367 Mon Sep 17 00:00:00 2001 From: Guido1Alessandro1Trevisan <46954188+Guido1Alessandro1Trevisan@users.noreply.github.com> Date: Wed, 21 May 2025 15:06:29 -0500 Subject: [PATCH 12/13] test: add recorder shadow DOM detection --- .../tests/test_recorder_shadow_closed.py | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 workflows/workflow_use/recorder/tests/test_recorder_shadow_closed.py diff --git a/workflows/workflow_use/recorder/tests/test_recorder_shadow_closed.py b/workflows/workflow_use/recorder/tests/test_recorder_shadow_closed.py new file mode 100644 index 00000000..3931774b --- /dev/null +++ b/workflows/workflow_use/recorder/tests/test_recorder_shadow_closed.py @@ -0,0 +1,81 @@ +import asyncio +import os +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from threading import Thread + +import pytest + +from workflow_use.recorder.service import RecordingService + +# Path to the static test site used by existing shadow DOM tests +REPO_ROOT = Path(__file__).resolve().parents[4] +TEST_SITE_DIR = REPO_ROOT / "workflows" / "workflow_use" / "builder" / "tests" / "shadowdom-closed" +EXT_DIR = REPO_ROOT / "extension" / ".output" / "chrome-mv3" + +# Fallback patch in case the extension fails to load in headless mode +SHADOW_PATCH = """ +(function(){ + const original = Element.prototype.attachShadow; + Element.prototype.attachShadow = function(init){ + if (init && init.mode === 'closed') { + init = Object.assign({}, init, {mode: 'open'}); + } + return original.call(this, init); + }; +})(); +""" + + +def start_server(): + os.chdir(TEST_SITE_DIR) + server = ThreadingHTTPServer(("127.0.0.1", 8000), SimpleHTTPRequestHandler) + thread = Thread(target=server.serve_forever, daemon=True) + thread.start() + return server, thread + + +@pytest.mark.asyncio +async def test_recorder_detects_closed_shadow_dom(): + if not EXT_DIR.exists(): + pytest.skip( + f"Built extension not found at {EXT_DIR}. Run 'npm run build' in the extension directory." + ) + + server, thread = start_server() + service = RecordingService() + capture_task = asyncio.create_task(service.capture_workflow()) + try: + # Wait for Playwright context to be ready + for _ in range(100): + if service.playwright_context: + break + await asyncio.sleep(0.1) + assert service.playwright_context is not None, "Playwright context did not start" + + ctx = service.playwright_context + # If the extension failed to load, inject the fallback patch + if not ctx.service_workers: + await ctx.add_init_script(SHADOW_PATCH) + for page in ctx.pages: + await page.add_init_script(SHADOW_PATCH) + await page.evaluate(SHADOW_PATCH) + + page = ctx.pages[0] if ctx.pages else await ctx.new_page() + await page.goto("http://127.0.0.1:8000/closed.html") + await page.fill("css=outer-closed >> inner-closed >> #inner-input", "hello-closed") + await page.click("css=outer-closed >> inner-closed >> #inner-btn") + await page.click("css=outer-closed >> #outer-btn") + + await asyncio.sleep(1) # allow events to be sent to the recorder + await ctx.close() + result = await capture_task + finally: + server.shutdown() + thread.join() + + assert result is not None, "No workflow captured" + selectors = [getattr(step, "cssSelector", None) for step in result.steps] + assert "css=outer-closed >> inner-closed >> #inner-input" in selectors + assert "css=outer-closed >> inner-closed >> #inner-btn" in selectors + assert "css=outer-closed >> #outer-btn" in selectors From 93bb440bb8f9ce500bc9f2d0e734c4295513e348 Mon Sep 17 00:00:00 2001 From: Guido Trevisan Date: Wed, 21 May 2025 15:19:59 -0500 Subject: [PATCH 13/13] moved test files around --- .../{recorder => builder}/tests/test_recorder_shadow_closed.py | 0 .../{builder => workflow}/tests/shadowdom-closed/app.js | 0 .../{builder => workflow}/tests/shadowdom-closed/closed.html | 0 .../tests/shadowdom-closed/shadow-closed.workflow.json | 0 .../tests/shadowdom-closed/test_shadow_closed.py | 0 .../{builder => workflow}/tests/shadowdom-detect/app.js | 0 .../{builder => workflow}/tests/shadowdom-detect/index.html | 0 .../tests/shadowdom-detect/shadow-next.workflow.json | 0 .../tests/shadowdom-detect/shadowdom_detect.py | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename workflows/workflow_use/{recorder => builder}/tests/test_recorder_shadow_closed.py (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-closed/app.js (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-closed/closed.html (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-closed/shadow-closed.workflow.json (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-closed/test_shadow_closed.py (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-detect/app.js (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-detect/index.html (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-detect/shadow-next.workflow.json (100%) rename workflows/workflow_use/{builder => workflow}/tests/shadowdom-detect/shadowdom_detect.py (100%) diff --git a/workflows/workflow_use/recorder/tests/test_recorder_shadow_closed.py b/workflows/workflow_use/builder/tests/test_recorder_shadow_closed.py similarity index 100% rename from workflows/workflow_use/recorder/tests/test_recorder_shadow_closed.py rename to workflows/workflow_use/builder/tests/test_recorder_shadow_closed.py diff --git a/workflows/workflow_use/builder/tests/shadowdom-closed/app.js b/workflows/workflow_use/workflow/tests/shadowdom-closed/app.js similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-closed/app.js rename to workflows/workflow_use/workflow/tests/shadowdom-closed/app.js diff --git a/workflows/workflow_use/builder/tests/shadowdom-closed/closed.html b/workflows/workflow_use/workflow/tests/shadowdom-closed/closed.html similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-closed/closed.html rename to workflows/workflow_use/workflow/tests/shadowdom-closed/closed.html diff --git a/workflows/workflow_use/builder/tests/shadowdom-closed/shadow-closed.workflow.json b/workflows/workflow_use/workflow/tests/shadowdom-closed/shadow-closed.workflow.json similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-closed/shadow-closed.workflow.json rename to workflows/workflow_use/workflow/tests/shadowdom-closed/shadow-closed.workflow.json diff --git a/workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py b/workflows/workflow_use/workflow/tests/shadowdom-closed/test_shadow_closed.py similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-closed/test_shadow_closed.py rename to workflows/workflow_use/workflow/tests/shadowdom-closed/test_shadow_closed.py diff --git a/workflows/workflow_use/builder/tests/shadowdom-detect/app.js b/workflows/workflow_use/workflow/tests/shadowdom-detect/app.js similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-detect/app.js rename to workflows/workflow_use/workflow/tests/shadowdom-detect/app.js diff --git a/workflows/workflow_use/builder/tests/shadowdom-detect/index.html b/workflows/workflow_use/workflow/tests/shadowdom-detect/index.html similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-detect/index.html rename to workflows/workflow_use/workflow/tests/shadowdom-detect/index.html diff --git a/workflows/workflow_use/builder/tests/shadowdom-detect/shadow-next.workflow.json b/workflows/workflow_use/workflow/tests/shadowdom-detect/shadow-next.workflow.json similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-detect/shadow-next.workflow.json rename to workflows/workflow_use/workflow/tests/shadowdom-detect/shadow-next.workflow.json diff --git a/workflows/workflow_use/builder/tests/shadowdom-detect/shadowdom_detect.py b/workflows/workflow_use/workflow/tests/shadowdom-detect/shadowdom_detect.py similarity index 100% rename from workflows/workflow_use/builder/tests/shadowdom-detect/shadowdom_detect.py rename to workflows/workflow_use/workflow/tests/shadowdom-detect/shadowdom_detect.py