ai-parrot 0.17.2__cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentui/.prettierrc +15 -0
- agentui/QUICKSTART.md +272 -0
- agentui/README.md +59 -0
- agentui/env.example +16 -0
- agentui/jsconfig.json +14 -0
- agentui/package-lock.json +4242 -0
- agentui/package.json +34 -0
- agentui/scripts/postinstall/apply-patches.mjs +260 -0
- agentui/src/app.css +61 -0
- agentui/src/app.d.ts +13 -0
- agentui/src/app.html +12 -0
- agentui/src/components/LoadingSpinner.svelte +64 -0
- agentui/src/components/ThemeSwitcher.svelte +159 -0
- agentui/src/components/index.js +4 -0
- agentui/src/lib/api/bots.ts +60 -0
- agentui/src/lib/api/chat.ts +22 -0
- agentui/src/lib/api/http.ts +25 -0
- agentui/src/lib/components/BotCard.svelte +33 -0
- agentui/src/lib/components/ChatBubble.svelte +63 -0
- agentui/src/lib/components/Toast.svelte +21 -0
- agentui/src/lib/config.ts +20 -0
- agentui/src/lib/stores/auth.svelte.ts +73 -0
- agentui/src/lib/stores/theme.svelte.js +64 -0
- agentui/src/lib/stores/toast.svelte.ts +31 -0
- agentui/src/lib/utils/conversation.ts +39 -0
- agentui/src/routes/+layout.svelte +20 -0
- agentui/src/routes/+page.svelte +232 -0
- agentui/src/routes/login/+page.svelte +200 -0
- agentui/src/routes/talk/[agentId]/+page.svelte +297 -0
- agentui/src/routes/talk/[agentId]/+page.ts +7 -0
- agentui/static/README.md +1 -0
- agentui/svelte.config.js +11 -0
- agentui/tailwind.config.ts +53 -0
- agentui/tsconfig.json +3 -0
- agentui/vite.config.ts +10 -0
- ai_parrot-0.17.2.dist-info/METADATA +472 -0
- ai_parrot-0.17.2.dist-info/RECORD +535 -0
- ai_parrot-0.17.2.dist-info/WHEEL +6 -0
- ai_parrot-0.17.2.dist-info/entry_points.txt +2 -0
- ai_parrot-0.17.2.dist-info/licenses/LICENSE +21 -0
- ai_parrot-0.17.2.dist-info/top_level.txt +6 -0
- crew-builder/.prettierrc +15 -0
- crew-builder/QUICKSTART.md +259 -0
- crew-builder/README.md +113 -0
- crew-builder/env.example +17 -0
- crew-builder/jsconfig.json +14 -0
- crew-builder/package-lock.json +4182 -0
- crew-builder/package.json +37 -0
- crew-builder/scripts/postinstall/apply-patches.mjs +260 -0
- crew-builder/src/app.css +62 -0
- crew-builder/src/app.d.ts +13 -0
- crew-builder/src/app.html +12 -0
- crew-builder/src/components/LoadingSpinner.svelte +64 -0
- crew-builder/src/components/ThemeSwitcher.svelte +149 -0
- crew-builder/src/components/index.js +9 -0
- crew-builder/src/lib/api/bots.ts +60 -0
- crew-builder/src/lib/api/chat.ts +80 -0
- crew-builder/src/lib/api/client.ts +56 -0
- crew-builder/src/lib/api/crew/crew.ts +136 -0
- crew-builder/src/lib/api/index.ts +5 -0
- crew-builder/src/lib/api/o365/auth.ts +65 -0
- crew-builder/src/lib/auth/auth.ts +54 -0
- crew-builder/src/lib/components/AgentNode.svelte +43 -0
- crew-builder/src/lib/components/BotCard.svelte +33 -0
- crew-builder/src/lib/components/ChatBubble.svelte +67 -0
- crew-builder/src/lib/components/ConfigPanel.svelte +278 -0
- crew-builder/src/lib/components/JsonTreeNode.svelte +76 -0
- crew-builder/src/lib/components/JsonViewer.svelte +24 -0
- crew-builder/src/lib/components/MarkdownEditor.svelte +48 -0
- crew-builder/src/lib/components/ThemeToggle.svelte +36 -0
- crew-builder/src/lib/components/Toast.svelte +67 -0
- crew-builder/src/lib/components/Toolbar.svelte +157 -0
- crew-builder/src/lib/components/index.ts +10 -0
- crew-builder/src/lib/config.ts +8 -0
- crew-builder/src/lib/stores/auth.svelte.ts +228 -0
- crew-builder/src/lib/stores/crewStore.ts +369 -0
- crew-builder/src/lib/stores/theme.svelte.js +145 -0
- crew-builder/src/lib/stores/toast.svelte.ts +69 -0
- crew-builder/src/lib/utils/conversation.ts +39 -0
- crew-builder/src/lib/utils/markdown.ts +122 -0
- crew-builder/src/lib/utils/talkHistory.ts +47 -0
- crew-builder/src/routes/+layout.svelte +20 -0
- crew-builder/src/routes/+page.svelte +539 -0
- crew-builder/src/routes/agents/+page.svelte +247 -0
- crew-builder/src/routes/agents/[agentId]/+page.svelte +288 -0
- crew-builder/src/routes/agents/[agentId]/+page.ts +7 -0
- crew-builder/src/routes/builder/+page.svelte +204 -0
- crew-builder/src/routes/crew/ask/+page.svelte +1052 -0
- crew-builder/src/routes/crew/ask/+page.ts +1 -0
- crew-builder/src/routes/integrations/o365/+page.svelte +304 -0
- crew-builder/src/routes/login/+page.svelte +197 -0
- crew-builder/src/routes/talk/[agentId]/+page.svelte +487 -0
- crew-builder/src/routes/talk/[agentId]/+page.ts +7 -0
- crew-builder/static/README.md +1 -0
- crew-builder/svelte.config.js +11 -0
- crew-builder/tailwind.config.ts +53 -0
- crew-builder/tsconfig.json +3 -0
- crew-builder/vite.config.ts +10 -0
- mcp_servers/calculator_server.py +309 -0
- parrot/__init__.py +27 -0
- parrot/__pycache__/__init__.cpython-310.pyc +0 -0
- parrot/__pycache__/version.cpython-310.pyc +0 -0
- parrot/_version.py +34 -0
- parrot/a2a/__init__.py +48 -0
- parrot/a2a/client.py +658 -0
- parrot/a2a/discovery.py +89 -0
- parrot/a2a/mixin.py +257 -0
- parrot/a2a/models.py +376 -0
- parrot/a2a/server.py +770 -0
- parrot/agents/__init__.py +29 -0
- parrot/bots/__init__.py +12 -0
- parrot/bots/a2a_agent.py +19 -0
- parrot/bots/abstract.py +3139 -0
- parrot/bots/agent.py +1129 -0
- parrot/bots/basic.py +9 -0
- parrot/bots/chatbot.py +669 -0
- parrot/bots/data.py +1618 -0
- parrot/bots/database/__init__.py +5 -0
- parrot/bots/database/abstract.py +3071 -0
- parrot/bots/database/cache.py +286 -0
- parrot/bots/database/models.py +468 -0
- parrot/bots/database/prompts.py +154 -0
- parrot/bots/database/retries.py +98 -0
- parrot/bots/database/router.py +269 -0
- parrot/bots/database/sql.py +41 -0
- parrot/bots/db/__init__.py +6 -0
- parrot/bots/db/abstract.py +556 -0
- parrot/bots/db/bigquery.py +602 -0
- parrot/bots/db/cache.py +85 -0
- parrot/bots/db/documentdb.py +668 -0
- parrot/bots/db/elastic.py +1014 -0
- parrot/bots/db/influx.py +898 -0
- parrot/bots/db/mock.py +96 -0
- parrot/bots/db/multi.py +783 -0
- parrot/bots/db/prompts.py +185 -0
- parrot/bots/db/sql.py +1255 -0
- parrot/bots/db/tools.py +212 -0
- parrot/bots/document.py +680 -0
- parrot/bots/hrbot.py +15 -0
- parrot/bots/kb.py +170 -0
- parrot/bots/mcp.py +36 -0
- parrot/bots/orchestration/README.md +463 -0
- parrot/bots/orchestration/__init__.py +1 -0
- parrot/bots/orchestration/agent.py +155 -0
- parrot/bots/orchestration/crew.py +3330 -0
- parrot/bots/orchestration/fsm.py +1179 -0
- parrot/bots/orchestration/hr.py +434 -0
- parrot/bots/orchestration/storage/__init__.py +4 -0
- parrot/bots/orchestration/storage/memory.py +100 -0
- parrot/bots/orchestration/storage/mixin.py +119 -0
- parrot/bots/orchestration/verify.py +202 -0
- parrot/bots/product.py +204 -0
- parrot/bots/prompts/__init__.py +96 -0
- parrot/bots/prompts/agents.py +155 -0
- parrot/bots/prompts/data.py +216 -0
- parrot/bots/prompts/output_generation.py +8 -0
- parrot/bots/scraper/__init__.py +3 -0
- parrot/bots/scraper/models.py +122 -0
- parrot/bots/scraper/scraper.py +1173 -0
- parrot/bots/scraper/templates.py +115 -0
- parrot/bots/stores/__init__.py +5 -0
- parrot/bots/stores/local.py +172 -0
- parrot/bots/webdev.py +81 -0
- parrot/cli.py +17 -0
- parrot/clients/__init__.py +16 -0
- parrot/clients/base.py +1491 -0
- parrot/clients/claude.py +1191 -0
- parrot/clients/factory.py +129 -0
- parrot/clients/google.py +4567 -0
- parrot/clients/gpt.py +1975 -0
- parrot/clients/grok.py +432 -0
- parrot/clients/groq.py +986 -0
- parrot/clients/hf.py +582 -0
- parrot/clients/models.py +18 -0
- parrot/conf.py +395 -0
- parrot/embeddings/__init__.py +9 -0
- parrot/embeddings/base.py +157 -0
- parrot/embeddings/google.py +98 -0
- parrot/embeddings/huggingface.py +74 -0
- parrot/embeddings/openai.py +84 -0
- parrot/embeddings/processor.py +88 -0
- parrot/exceptions.c +13868 -0
- parrot/exceptions.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/exceptions.pxd +22 -0
- parrot/exceptions.pxi +15 -0
- parrot/exceptions.pyx +44 -0
- parrot/generators/__init__.py +29 -0
- parrot/generators/base.py +200 -0
- parrot/generators/html.py +293 -0
- parrot/generators/react.py +205 -0
- parrot/generators/streamlit.py +203 -0
- parrot/generators/template.py +105 -0
- parrot/handlers/__init__.py +4 -0
- parrot/handlers/agent.py +861 -0
- parrot/handlers/agents/__init__.py +1 -0
- parrot/handlers/agents/abstract.py +900 -0
- parrot/handlers/bots.py +338 -0
- parrot/handlers/chat.py +915 -0
- parrot/handlers/creation.sql +192 -0
- parrot/handlers/crew/ARCHITECTURE.md +362 -0
- parrot/handlers/crew/README_BOTMANAGER_PERSISTENCE.md +303 -0
- parrot/handlers/crew/README_REDIS_PERSISTENCE.md +366 -0
- parrot/handlers/crew/__init__.py +0 -0
- parrot/handlers/crew/handler.py +801 -0
- parrot/handlers/crew/models.py +229 -0
- parrot/handlers/crew/redis_persistence.py +523 -0
- parrot/handlers/jobs/__init__.py +10 -0
- parrot/handlers/jobs/job.py +384 -0
- parrot/handlers/jobs/mixin.py +627 -0
- parrot/handlers/jobs/models.py +115 -0
- parrot/handlers/jobs/worker.py +31 -0
- parrot/handlers/models.py +596 -0
- parrot/handlers/o365_auth.py +105 -0
- parrot/handlers/stream.py +337 -0
- parrot/interfaces/__init__.py +6 -0
- parrot/interfaces/aws.py +143 -0
- parrot/interfaces/credentials.py +113 -0
- parrot/interfaces/database.py +27 -0
- parrot/interfaces/google.py +1123 -0
- parrot/interfaces/hierarchy.py +1227 -0
- parrot/interfaces/http.py +651 -0
- parrot/interfaces/images/__init__.py +0 -0
- parrot/interfaces/images/plugins/__init__.py +24 -0
- parrot/interfaces/images/plugins/abstract.py +58 -0
- parrot/interfaces/images/plugins/analisys.py +148 -0
- parrot/interfaces/images/plugins/classify.py +150 -0
- parrot/interfaces/images/plugins/classifybase.py +182 -0
- parrot/interfaces/images/plugins/detect.py +150 -0
- parrot/interfaces/images/plugins/exif.py +1103 -0
- parrot/interfaces/images/plugins/hash.py +52 -0
- parrot/interfaces/images/plugins/vision.py +104 -0
- parrot/interfaces/images/plugins/yolo.py +66 -0
- parrot/interfaces/images/plugins/zerodetect.py +197 -0
- parrot/interfaces/o365.py +978 -0
- parrot/interfaces/onedrive.py +822 -0
- parrot/interfaces/sharepoint.py +1435 -0
- parrot/interfaces/soap.py +257 -0
- parrot/loaders/__init__.py +8 -0
- parrot/loaders/abstract.py +1131 -0
- parrot/loaders/audio.py +199 -0
- parrot/loaders/basepdf.py +53 -0
- parrot/loaders/basevideo.py +1568 -0
- parrot/loaders/csv.py +409 -0
- parrot/loaders/docx.py +116 -0
- parrot/loaders/epubloader.py +316 -0
- parrot/loaders/excel.py +199 -0
- parrot/loaders/factory.py +55 -0
- parrot/loaders/files/__init__.py +0 -0
- parrot/loaders/files/abstract.py +39 -0
- parrot/loaders/files/html.py +26 -0
- parrot/loaders/files/text.py +63 -0
- parrot/loaders/html.py +152 -0
- parrot/loaders/markdown.py +442 -0
- parrot/loaders/pdf.py +373 -0
- parrot/loaders/pdfmark.py +320 -0
- parrot/loaders/pdftables.py +506 -0
- parrot/loaders/ppt.py +476 -0
- parrot/loaders/qa.py +63 -0
- parrot/loaders/splitters/__init__.py +10 -0
- parrot/loaders/splitters/base.py +138 -0
- parrot/loaders/splitters/md.py +228 -0
- parrot/loaders/splitters/token.py +143 -0
- parrot/loaders/txt.py +26 -0
- parrot/loaders/video.py +89 -0
- parrot/loaders/videolocal.py +218 -0
- parrot/loaders/videounderstanding.py +377 -0
- parrot/loaders/vimeo.py +167 -0
- parrot/loaders/web.py +599 -0
- parrot/loaders/youtube.py +504 -0
- parrot/manager/__init__.py +5 -0
- parrot/manager/manager.py +1030 -0
- parrot/mcp/__init__.py +28 -0
- parrot/mcp/adapter.py +105 -0
- parrot/mcp/cli.py +174 -0
- parrot/mcp/client.py +119 -0
- parrot/mcp/config.py +75 -0
- parrot/mcp/integration.py +842 -0
- parrot/mcp/oauth.py +933 -0
- parrot/mcp/server.py +225 -0
- parrot/mcp/transports/__init__.py +3 -0
- parrot/mcp/transports/base.py +279 -0
- parrot/mcp/transports/grpc_session.py +163 -0
- parrot/mcp/transports/http.py +312 -0
- parrot/mcp/transports/mcp.proto +108 -0
- parrot/mcp/transports/quic.py +1082 -0
- parrot/mcp/transports/sse.py +330 -0
- parrot/mcp/transports/stdio.py +309 -0
- parrot/mcp/transports/unix.py +395 -0
- parrot/mcp/transports/websocket.py +547 -0
- parrot/memory/__init__.py +16 -0
- parrot/memory/abstract.py +209 -0
- parrot/memory/agent.py +32 -0
- parrot/memory/cache.py +175 -0
- parrot/memory/core.py +555 -0
- parrot/memory/file.py +153 -0
- parrot/memory/mem.py +131 -0
- parrot/memory/redis.py +613 -0
- parrot/models/__init__.py +46 -0
- parrot/models/basic.py +118 -0
- parrot/models/compliance.py +208 -0
- parrot/models/crew.py +395 -0
- parrot/models/detections.py +654 -0
- parrot/models/generation.py +85 -0
- parrot/models/google.py +223 -0
- parrot/models/groq.py +23 -0
- parrot/models/openai.py +30 -0
- parrot/models/outputs.py +285 -0
- parrot/models/responses.py +938 -0
- parrot/notifications/__init__.py +743 -0
- parrot/openapi/__init__.py +3 -0
- parrot/openapi/components.yaml +641 -0
- parrot/openapi/config.py +322 -0
- parrot/outputs/__init__.py +32 -0
- parrot/outputs/formats/__init__.py +108 -0
- parrot/outputs/formats/altair.py +359 -0
- parrot/outputs/formats/application.py +122 -0
- parrot/outputs/formats/base.py +351 -0
- parrot/outputs/formats/bokeh.py +356 -0
- parrot/outputs/formats/card.py +424 -0
- parrot/outputs/formats/chart.py +436 -0
- parrot/outputs/formats/d3.py +255 -0
- parrot/outputs/formats/echarts.py +310 -0
- parrot/outputs/formats/generators/__init__.py +0 -0
- parrot/outputs/formats/generators/abstract.py +61 -0
- parrot/outputs/formats/generators/panel.py +145 -0
- parrot/outputs/formats/generators/streamlit.py +86 -0
- parrot/outputs/formats/generators/terminal.py +63 -0
- parrot/outputs/formats/holoviews.py +310 -0
- parrot/outputs/formats/html.py +147 -0
- parrot/outputs/formats/jinja2.py +46 -0
- parrot/outputs/formats/json.py +87 -0
- parrot/outputs/formats/map.py +933 -0
- parrot/outputs/formats/markdown.py +172 -0
- parrot/outputs/formats/matplotlib.py +237 -0
- parrot/outputs/formats/mixins/__init__.py +0 -0
- parrot/outputs/formats/mixins/emaps.py +855 -0
- parrot/outputs/formats/plotly.py +341 -0
- parrot/outputs/formats/seaborn.py +310 -0
- parrot/outputs/formats/table.py +397 -0
- parrot/outputs/formats/template_report.py +138 -0
- parrot/outputs/formats/yaml.py +125 -0
- parrot/outputs/formatter.py +152 -0
- parrot/outputs/templates/__init__.py +95 -0
- parrot/pipelines/__init__.py +0 -0
- parrot/pipelines/abstract.py +210 -0
- parrot/pipelines/detector.py +124 -0
- parrot/pipelines/models.py +90 -0
- parrot/pipelines/planogram.py +3002 -0
- parrot/pipelines/table.sql +97 -0
- parrot/plugins/__init__.py +106 -0
- parrot/plugins/importer.py +80 -0
- parrot/py.typed +0 -0
- parrot/registry/__init__.py +18 -0
- parrot/registry/registry.py +594 -0
- parrot/scheduler/__init__.py +1189 -0
- parrot/scheduler/models.py +60 -0
- parrot/security/__init__.py +16 -0
- parrot/security/prompt_injection.py +268 -0
- parrot/security/security_events.sql +25 -0
- parrot/services/__init__.py +1 -0
- parrot/services/mcp/__init__.py +8 -0
- parrot/services/mcp/config.py +13 -0
- parrot/services/mcp/server.py +295 -0
- parrot/services/o365_remote_auth.py +235 -0
- parrot/stores/__init__.py +7 -0
- parrot/stores/abstract.py +352 -0
- parrot/stores/arango.py +1090 -0
- parrot/stores/bigquery.py +1377 -0
- parrot/stores/cache.py +106 -0
- parrot/stores/empty.py +10 -0
- parrot/stores/faiss_store.py +1157 -0
- parrot/stores/kb/__init__.py +9 -0
- parrot/stores/kb/abstract.py +68 -0
- parrot/stores/kb/cache.py +165 -0
- parrot/stores/kb/doc.py +325 -0
- parrot/stores/kb/hierarchy.py +346 -0
- parrot/stores/kb/local.py +457 -0
- parrot/stores/kb/prompt.py +28 -0
- parrot/stores/kb/redis.py +659 -0
- parrot/stores/kb/store.py +115 -0
- parrot/stores/kb/user.py +374 -0
- parrot/stores/models.py +59 -0
- parrot/stores/pgvector.py +3 -0
- parrot/stores/postgres.py +2853 -0
- parrot/stores/utils/__init__.py +0 -0
- parrot/stores/utils/chunking.py +197 -0
- parrot/telemetry/__init__.py +3 -0
- parrot/telemetry/mixin.py +111 -0
- parrot/template/__init__.py +3 -0
- parrot/template/engine.py +259 -0
- parrot/tools/__init__.py +23 -0
- parrot/tools/abstract.py +644 -0
- parrot/tools/agent.py +363 -0
- parrot/tools/arangodbsearch.py +537 -0
- parrot/tools/arxiv_tool.py +188 -0
- parrot/tools/calculator/__init__.py +3 -0
- parrot/tools/calculator/operations/__init__.py +38 -0
- parrot/tools/calculator/operations/calculus.py +80 -0
- parrot/tools/calculator/operations/statistics.py +76 -0
- parrot/tools/calculator/tool.py +150 -0
- parrot/tools/cloudwatch.py +988 -0
- parrot/tools/codeinterpreter/__init__.py +127 -0
- parrot/tools/codeinterpreter/executor.py +371 -0
- parrot/tools/codeinterpreter/internals.py +473 -0
- parrot/tools/codeinterpreter/models.py +643 -0
- parrot/tools/codeinterpreter/prompts.py +224 -0
- parrot/tools/codeinterpreter/tool.py +664 -0
- parrot/tools/company_info/__init__.py +6 -0
- parrot/tools/company_info/tool.py +1138 -0
- parrot/tools/correlationanalysis.py +437 -0
- parrot/tools/database/abstract.py +286 -0
- parrot/tools/database/bq.py +115 -0
- parrot/tools/database/cache.py +284 -0
- parrot/tools/database/models.py +95 -0
- parrot/tools/database/pg.py +343 -0
- parrot/tools/databasequery.py +1159 -0
- parrot/tools/db.py +1800 -0
- parrot/tools/ddgo.py +370 -0
- parrot/tools/decorators.py +271 -0
- parrot/tools/dftohtml.py +282 -0
- parrot/tools/document.py +549 -0
- parrot/tools/ecs.py +819 -0
- parrot/tools/edareport.py +368 -0
- parrot/tools/elasticsearch.py +1049 -0
- parrot/tools/employees.py +462 -0
- parrot/tools/epson/__init__.py +96 -0
- parrot/tools/excel.py +683 -0
- parrot/tools/file/__init__.py +13 -0
- parrot/tools/file/abstract.py +76 -0
- parrot/tools/file/gcs.py +378 -0
- parrot/tools/file/local.py +284 -0
- parrot/tools/file/s3.py +511 -0
- parrot/tools/file/tmp.py +309 -0
- parrot/tools/file/tool.py +501 -0
- parrot/tools/file_reader.py +129 -0
- parrot/tools/flowtask/__init__.py +19 -0
- parrot/tools/flowtask/tool.py +761 -0
- parrot/tools/gittoolkit.py +508 -0
- parrot/tools/google/__init__.py +18 -0
- parrot/tools/google/base.py +169 -0
- parrot/tools/google/tools.py +1251 -0
- parrot/tools/googlelocation.py +5 -0
- parrot/tools/googleroutes.py +5 -0
- parrot/tools/googlesearch.py +5 -0
- parrot/tools/googlesitesearch.py +5 -0
- parrot/tools/googlevoice.py +2 -0
- parrot/tools/gvoice.py +695 -0
- parrot/tools/ibisworld/README.md +225 -0
- parrot/tools/ibisworld/__init__.py +11 -0
- parrot/tools/ibisworld/tool.py +366 -0
- parrot/tools/jiratoolkit.py +1718 -0
- parrot/tools/manager.py +1098 -0
- parrot/tools/math.py +152 -0
- parrot/tools/metadata.py +476 -0
- parrot/tools/msteams.py +1621 -0
- parrot/tools/msword.py +635 -0
- parrot/tools/multidb.py +580 -0
- parrot/tools/multistoresearch.py +369 -0
- parrot/tools/networkninja.py +167 -0
- parrot/tools/nextstop/__init__.py +4 -0
- parrot/tools/nextstop/base.py +286 -0
- parrot/tools/nextstop/employee.py +733 -0
- parrot/tools/nextstop/store.py +462 -0
- parrot/tools/notification.py +435 -0
- parrot/tools/o365/__init__.py +42 -0
- parrot/tools/o365/base.py +295 -0
- parrot/tools/o365/bundle.py +522 -0
- parrot/tools/o365/events.py +554 -0
- parrot/tools/o365/mail.py +992 -0
- parrot/tools/o365/onedrive.py +497 -0
- parrot/tools/o365/sharepoint.py +641 -0
- parrot/tools/openapi_toolkit.py +904 -0
- parrot/tools/openweather.py +527 -0
- parrot/tools/pdfprint.py +1001 -0
- parrot/tools/powerbi.py +518 -0
- parrot/tools/powerpoint.py +1113 -0
- parrot/tools/pricestool.py +146 -0
- parrot/tools/products/__init__.py +246 -0
- parrot/tools/prophet_tool.py +171 -0
- parrot/tools/pythonpandas.py +630 -0
- parrot/tools/pythonrepl.py +910 -0
- parrot/tools/qsource.py +436 -0
- parrot/tools/querytoolkit.py +395 -0
- parrot/tools/quickeda.py +827 -0
- parrot/tools/resttool.py +553 -0
- parrot/tools/retail/__init__.py +0 -0
- parrot/tools/retail/bby.py +528 -0
- parrot/tools/sandboxtool.py +703 -0
- parrot/tools/sassie/__init__.py +352 -0
- parrot/tools/scraping/__init__.py +7 -0
- parrot/tools/scraping/docs/select.md +466 -0
- parrot/tools/scraping/documentation.md +1278 -0
- parrot/tools/scraping/driver.py +436 -0
- parrot/tools/scraping/models.py +576 -0
- parrot/tools/scraping/options.py +85 -0
- parrot/tools/scraping/orchestrator.py +517 -0
- parrot/tools/scraping/readme.md +740 -0
- parrot/tools/scraping/tool.py +3115 -0
- parrot/tools/seasonaldetection.py +642 -0
- parrot/tools/shell_tool/__init__.py +5 -0
- parrot/tools/shell_tool/actions.py +408 -0
- parrot/tools/shell_tool/engine.py +155 -0
- parrot/tools/shell_tool/models.py +322 -0
- parrot/tools/shell_tool/tool.py +442 -0
- parrot/tools/site_search.py +214 -0
- parrot/tools/textfile.py +418 -0
- parrot/tools/think.py +378 -0
- parrot/tools/toolkit.py +298 -0
- parrot/tools/webapp_tool.py +187 -0
- parrot/tools/whatif.py +1279 -0
- parrot/tools/workday/MULTI_WSDL_EXAMPLE.md +249 -0
- parrot/tools/workday/__init__.py +6 -0
- parrot/tools/workday/models.py +1389 -0
- parrot/tools/workday/tool.py +1293 -0
- parrot/tools/yfinance_tool.py +306 -0
- parrot/tools/zipcode.py +217 -0
- parrot/utils/__init__.py +2 -0
- parrot/utils/helpers.py +73 -0
- parrot/utils/parsers/__init__.py +5 -0
- parrot/utils/parsers/toml.c +12078 -0
- parrot/utils/parsers/toml.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/parsers/toml.pyx +21 -0
- parrot/utils/toml.py +11 -0
- parrot/utils/types.cpp +20936 -0
- parrot/utils/types.cpython-310-x86_64-linux-gnu.so +0 -0
- parrot/utils/types.pyx +213 -0
- parrot/utils/uv.py +11 -0
- parrot/version.py +10 -0
- parrot/yaml-rs/Cargo.lock +350 -0
- parrot/yaml-rs/Cargo.toml +19 -0
- parrot/yaml-rs/pyproject.toml +19 -0
- parrot/yaml-rs/python/yaml_rs/__init__.py +81 -0
- parrot/yaml-rs/src/lib.rs +222 -0
- requirements/docker-compose.yml +24 -0
- requirements/requirements-dev.txt +21 -0
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
# Select Action Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `Select` action allows you to select options from HTML `<select>` dropdown elements. It provides multiple selection methods (by value, visible text, or index) and automatically handles change/blur events.
|
|
6
|
+
|
|
7
|
+
## Action Definition
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
class Select(BrowserAction):
|
|
11
|
+
"""Select an option from a dropdown/select element"""
|
|
12
|
+
name: str = 'select'
|
|
13
|
+
action: Literal['select'] = 'select'
|
|
14
|
+
selector: str # CSS selector for the select element
|
|
15
|
+
value: Optional[str] = None # Value attribute of option
|
|
16
|
+
text: Optional[str] = None # Visible text of option
|
|
17
|
+
index: Optional[int] = None # Zero-based index of option
|
|
18
|
+
by: Literal['value', 'text', 'index'] = 'value' # Selection method
|
|
19
|
+
blur_after: bool = True # Trigger blur/change events
|
|
20
|
+
wait_after_select: Optional[str] = None # Wait for element after select
|
|
21
|
+
wait_timeout: int = 2 # Timeout for post-select wait
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Parameters
|
|
27
|
+
|
|
28
|
+
| Parameter | Type | Required | Default | Description |
|
|
29
|
+
|-----------|------|----------|---------|-------------|
|
|
30
|
+
| `action` | `str` | ✅ | - | Must be `"select"` |
|
|
31
|
+
| `selector` | `str` | ✅ | - | CSS selector for the `<select>` element |
|
|
32
|
+
| `value` | `str` | Conditional | `None` | Value attribute of the option (required if `by='value'`) |
|
|
33
|
+
| `text` | `str` | Conditional | `None` | Visible text of the option (required if `by='text'`) |
|
|
34
|
+
| `index` | `int` | Conditional | `None` | Zero-based index of the option (required if `by='index'`) |
|
|
35
|
+
| `by` | `str` | ❌ | `'value'` | Selection method: `'value'`, `'text'`, or `'index'` |
|
|
36
|
+
| `blur_after` | `bool` | ❌ | `True` | Trigger blur and change events after selection |
|
|
37
|
+
| `wait_after_select` | `str` | ❌ | `None` | CSS selector to wait for after selecting |
|
|
38
|
+
| `wait_timeout` | `int` | ❌ | `2` | Timeout in seconds for post-select wait |
|
|
39
|
+
| `timeout` | `int` | ❌ | - | Maximum wait time for the select element |
|
|
40
|
+
| `description` | `str` | ❌ | - | Human-readable description |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Selection Methods
|
|
45
|
+
|
|
46
|
+
### 1. By Value (Default)
|
|
47
|
+
|
|
48
|
+
Select an option by its `value` attribute:
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<select id="country">
|
|
52
|
+
<option value="US">United States</option>
|
|
53
|
+
<option value="CA">Canada</option>
|
|
54
|
+
<option value="UK">United Kingdom</option>
|
|
55
|
+
</select>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
{
|
|
60
|
+
"action": "select",
|
|
61
|
+
"selector": "#country",
|
|
62
|
+
"value": "CA",
|
|
63
|
+
"by": "value", # Optional, this is the default
|
|
64
|
+
"description": "Select Canada"
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 2. By Text
|
|
69
|
+
|
|
70
|
+
Select an option by its visible text:
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<select id="state">
|
|
74
|
+
<option value="ca">California</option>
|
|
75
|
+
<option value="tx">Texas</option>
|
|
76
|
+
<option value="ny">New York</option>
|
|
77
|
+
</select>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
{
|
|
82
|
+
"action": "select",
|
|
83
|
+
"selector": "#state",
|
|
84
|
+
"text": "California",
|
|
85
|
+
"by": "text",
|
|
86
|
+
"description": "Select California by text"
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 3. By Index
|
|
91
|
+
|
|
92
|
+
Select an option by its position (0-based):
|
|
93
|
+
|
|
94
|
+
```html
|
|
95
|
+
<select id="size">
|
|
96
|
+
<option>Small</option>
|
|
97
|
+
<option>Medium</option>
|
|
98
|
+
<option>Large</option>
|
|
99
|
+
</select>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
{
|
|
104
|
+
"action": "select",
|
|
105
|
+
"selector": "#size",
|
|
106
|
+
"index": 2, # Selects "Large" (third option)
|
|
107
|
+
"by": "index",
|
|
108
|
+
"description": "Select large size"
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## blur_after Parameter
|
|
115
|
+
|
|
116
|
+
The `blur_after` parameter controls whether the element loses focus after selection, which triggers important events:
|
|
117
|
+
|
|
118
|
+
### When `blur_after=True` (Default)
|
|
119
|
+
- ✅ Triggers `change` event on the select element
|
|
120
|
+
- ✅ Triggers `blur` event (element loses focus)
|
|
121
|
+
- ✅ Activates dependent dropdowns (e.g., country → states)
|
|
122
|
+
- ✅ Runs JavaScript event listeners
|
|
123
|
+
- ✅ Updates form validation
|
|
124
|
+
- **Use Case**: Standard form behavior, cascading dropdowns
|
|
125
|
+
|
|
126
|
+
### When `blur_after=False`
|
|
127
|
+
- ❌ No events triggered automatically
|
|
128
|
+
- ❌ Element keeps focus
|
|
129
|
+
- **Use Case**: When you need to programmatically control event timing or avoid triggering unwanted behavior
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
# Standard selection (recommended)
|
|
133
|
+
{
|
|
134
|
+
"action": "select",
|
|
135
|
+
"selector": "#country",
|
|
136
|
+
"value": "US",
|
|
137
|
+
"blur_after": True, # Triggers events
|
|
138
|
+
"description": "Select country and trigger dependent fields"
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
# Keep focus (rare)
|
|
142
|
+
{
|
|
143
|
+
"action": "select",
|
|
144
|
+
"selector": "#option",
|
|
145
|
+
"value": "test",
|
|
146
|
+
"blur_after": False, # No events
|
|
147
|
+
"description": "Select without triggering events"
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Waiting for Dynamic Content
|
|
154
|
+
|
|
155
|
+
Use `wait_after_select` for cascading dropdowns or AJAX-loaded content:
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
# Select country and wait for states to load
|
|
159
|
+
{
|
|
160
|
+
"action": "select",
|
|
161
|
+
"selector": "#country",
|
|
162
|
+
"value": "US",
|
|
163
|
+
"wait_after_select": "#state option[value]:not([value=''])",
|
|
164
|
+
"wait_timeout": 5,
|
|
165
|
+
"description": "Select country and wait for states"
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**HTML Example:**
|
|
170
|
+
```html
|
|
171
|
+
<select id="country">
|
|
172
|
+
<option value="US">United States</option>
|
|
173
|
+
<option value="CA">Canada</option>
|
|
174
|
+
</select>
|
|
175
|
+
|
|
176
|
+
<select id="state">
|
|
177
|
+
<!-- Options loaded dynamically via AJAX -->
|
|
178
|
+
</select>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Complete Examples
|
|
184
|
+
|
|
185
|
+
### Example 1: Simple Form
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
steps = [
|
|
189
|
+
{
|
|
190
|
+
"action": "navigate",
|
|
191
|
+
"url": "https://example.com/registration",
|
|
192
|
+
"description": "Go to registration page"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"action": "fill",
|
|
196
|
+
"selector": "#email",
|
|
197
|
+
"value": "user@example.com",
|
|
198
|
+
"description": "Enter email"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"action": "select",
|
|
202
|
+
"selector": "#country",
|
|
203
|
+
"value": "US",
|
|
204
|
+
"description": "Select United States"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"action": "click",
|
|
208
|
+
"selector": "#submit",
|
|
209
|
+
"description": "Submit form"
|
|
210
|
+
}
|
|
211
|
+
]
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Example 2: Cascading Dropdowns
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
steps = [
|
|
218
|
+
{
|
|
219
|
+
"action": "navigate",
|
|
220
|
+
"url": "https://example.com/location",
|
|
221
|
+
"description": "Go to location page"
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"action": "select",
|
|
225
|
+
"selector": "#country",
|
|
226
|
+
"value": "US",
|
|
227
|
+
"wait_after_select": "#state",
|
|
228
|
+
"wait_timeout": 5,
|
|
229
|
+
"description": "Select country and wait for states"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"action": "select",
|
|
233
|
+
"selector": "#state",
|
|
234
|
+
"text": "California",
|
|
235
|
+
"by": "text",
|
|
236
|
+
"wait_after_select": "#city",
|
|
237
|
+
"wait_timeout": 3,
|
|
238
|
+
"description": "Select state and wait for cities"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"action": "select",
|
|
242
|
+
"selector": "#city",
|
|
243
|
+
"text": "Los Angeles",
|
|
244
|
+
"by": "text",
|
|
245
|
+
"description": "Select city"
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Example 3: E-commerce Product Selection
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
steps = [
|
|
254
|
+
{
|
|
255
|
+
"action": "navigate",
|
|
256
|
+
"url": "https://shop.example.com/product/123",
|
|
257
|
+
"description": "Go to product page"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"action": "select",
|
|
261
|
+
"selector": "#size",
|
|
262
|
+
"text": "Large",
|
|
263
|
+
"by": "text",
|
|
264
|
+
"description": "Select size"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"action": "select",
|
|
268
|
+
"selector": "#color",
|
|
269
|
+
"value": "blue",
|
|
270
|
+
"description": "Select color"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"action": "select",
|
|
274
|
+
"selector": "#quantity",
|
|
275
|
+
"index": 2, # Select "3" if options are 1, 2, 3, 4...
|
|
276
|
+
"by": "index",
|
|
277
|
+
"description": "Select quantity"
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"action": "click",
|
|
281
|
+
"selector": "#add-to-cart",
|
|
282
|
+
"wait_after_click": ".cart-notification",
|
|
283
|
+
"description": "Add to cart"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Example 4: Multi-step Form with Validation
|
|
289
|
+
|
|
290
|
+
```python
|
|
291
|
+
steps = [
|
|
292
|
+
{
|
|
293
|
+
"action": "navigate",
|
|
294
|
+
"url": "https://example.com/survey",
|
|
295
|
+
"description": "Go to survey"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"action": "select",
|
|
299
|
+
"selector": "#age-range",
|
|
300
|
+
"value": "25-34",
|
|
301
|
+
"wait_after_select": ".question-2",
|
|
302
|
+
"description": "Select age range, wait for next question"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"action": "select",
|
|
306
|
+
"selector": "#education",
|
|
307
|
+
"text": "Bachelor's Degree",
|
|
308
|
+
"by": "text",
|
|
309
|
+
"description": "Select education level"
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"action": "select",
|
|
313
|
+
"selector": "#employment",
|
|
314
|
+
"index": 1,
|
|
315
|
+
"by": "index",
|
|
316
|
+
"blur_after": True,
|
|
317
|
+
"description": "Select employment status"
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Comparison: Select vs Fill vs Evaluate
|
|
325
|
+
|
|
326
|
+
| Feature | Select | Fill | Evaluate |
|
|
327
|
+
|---------|--------|------|----------|
|
|
328
|
+
| **Use Case** | Dropdown menus | Text inputs | Custom JavaScript |
|
|
329
|
+
| **Target Element** | `<select>` | `<input>`, `<textarea>` | Any element |
|
|
330
|
+
| **Selection Methods** | value/text/index | N/A | Custom |
|
|
331
|
+
| **Auto Events** | change/blur | N/A | Manual |
|
|
332
|
+
| **Complexity** | Simple | Simple | Advanced |
|
|
333
|
+
|
|
334
|
+
**When to use Select:**
|
|
335
|
+
- ✅ Standard HTML `<select>` dropdowns
|
|
336
|
+
- ✅ Multi-option selections with known values
|
|
337
|
+
- ✅ Cascading/dependent dropdowns
|
|
338
|
+
|
|
339
|
+
**When to use Evaluate instead:**
|
|
340
|
+
- Custom dropdown implementations (not `<select>`)
|
|
341
|
+
- Complex selection logic
|
|
342
|
+
- Multiple selections in multi-select dropdowns
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Best Practices
|
|
347
|
+
|
|
348
|
+
### 1. **Prefer `by='value'`** (Default)
|
|
349
|
+
Values are more stable than visible text and faster than index:
|
|
350
|
+
```python
|
|
351
|
+
# ✅ Good - stable
|
|
352
|
+
{"action": "select", "selector": "#country", "value": "US"}
|
|
353
|
+
|
|
354
|
+
# ⚠️ Less stable - text might change with translations
|
|
355
|
+
{"action": "select", "selector": "#country", "text": "United States", "by": "text"}
|
|
356
|
+
|
|
357
|
+
# ❌ Fragile - breaks if options are reordered
|
|
358
|
+
{"action": "select", "selector": "#country", "index": 0, "by": "index"}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### 2. **Use `wait_after_select` for Dynamic Content**
|
|
362
|
+
Always wait for dependent elements to load:
|
|
363
|
+
```python
|
|
364
|
+
{
|
|
365
|
+
"action": "select",
|
|
366
|
+
"selector": "#country",
|
|
367
|
+
"value": "US",
|
|
368
|
+
"wait_after_select": "#state option:not([disabled])", # Wait for enabled options
|
|
369
|
+
"wait_timeout": 5
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### 3. **Keep `blur_after=True` for Standard Behavior**
|
|
374
|
+
Unless you have a specific reason, always trigger events:
|
|
375
|
+
```python
|
|
376
|
+
# ✅ Standard - triggers all events
|
|
377
|
+
{"action": "select", "selector": "#field", "value": "option1", "blur_after": True}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 4. **Combine with Wait Actions for Complex Pages**
|
|
381
|
+
```python
|
|
382
|
+
[
|
|
383
|
+
{"action": "wait", "condition": "#country", "condition_type": "selector"},
|
|
384
|
+
{"action": "select", "selector": "#country", "value": "US"},
|
|
385
|
+
{"action": "wait", "duration": 1}, # Allow AJAX to complete
|
|
386
|
+
{"action": "select", "selector": "#state", "text": "California", "by": "text"}
|
|
387
|
+
]
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### 5. **Handle Errors Gracefully**
|
|
391
|
+
Check that options exist before selecting:
|
|
392
|
+
```python
|
|
393
|
+
{
|
|
394
|
+
"action": "evaluate",
|
|
395
|
+
"script": "return Array.from(document.querySelector('#country').options).map(o => o.value);",
|
|
396
|
+
"description": "Log available options for debugging"
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## Troubleshooting
|
|
403
|
+
|
|
404
|
+
### Issue: Selection doesn't trigger dependent dropdown
|
|
405
|
+
|
|
406
|
+
**Solution**: Ensure `blur_after=True` and use `wait_after_select`:
|
|
407
|
+
```python
|
|
408
|
+
{
|
|
409
|
+
"action": "select",
|
|
410
|
+
"selector": "#country",
|
|
411
|
+
"value": "US",
|
|
412
|
+
"blur_after": True, # Must be True
|
|
413
|
+
"wait_after_select": "#state",
|
|
414
|
+
"wait_timeout": 5
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Issue: "Option not found" error
|
|
419
|
+
|
|
420
|
+
**Solution**: Verify the selection method and value:
|
|
421
|
+
```python
|
|
422
|
+
# Debug: Check available options first
|
|
423
|
+
{
|
|
424
|
+
"action": "evaluate",
|
|
425
|
+
"script": """
|
|
426
|
+
const select = document.querySelector('#country');
|
|
427
|
+
return Array.from(select.options).map(opt => ({
|
|
428
|
+
value: opt.value,
|
|
429
|
+
text: opt.text,
|
|
430
|
+
index: opt.index
|
|
431
|
+
}));
|
|
432
|
+
""",
|
|
433
|
+
"description": "List all options"
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Issue: Element not interactable
|
|
438
|
+
|
|
439
|
+
**Solution**: Wait for the select element to be ready:
|
|
440
|
+
```python
|
|
441
|
+
{
|
|
442
|
+
"action": "wait",
|
|
443
|
+
"condition": "#country",
|
|
444
|
+
"condition_type": "selector",
|
|
445
|
+
"timeout": 5
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
"action": "select",
|
|
449
|
+
"selector": "#country",
|
|
450
|
+
"value": "US"
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
---
|
|
455
|
+
|
|
456
|
+
## Browser Support
|
|
457
|
+
|
|
458
|
+
| Browser | Selenium | Playwright |
|
|
459
|
+
|---------|----------|------------|
|
|
460
|
+
| Chrome | ✅ Full | ✅ Full |
|
|
461
|
+
| Firefox | ✅ Full | ✅ Full |
|
|
462
|
+
| Edge | ✅ Full | ✅ Full |
|
|
463
|
+
| Safari | ✅ Full | ✅ Full |
|
|
464
|
+
| Undetected Chrome | ✅ Full | N/A |
|
|
465
|
+
|
|
466
|
+
Both implementations use native driver methods for maximum reliability.
|