aden-tools 1.0.2__tar.gz
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.
- aden_tools-1.0.2/.env.example +66 -0
- aden_tools-1.0.2/.gitignore +88 -0
- aden_tools-1.0.2/BROWSER_USE_PATTERNS.md +180 -0
- aden_tools-1.0.2/BUILDING_TOOLS.md +358 -0
- aden_tools-1.0.2/Dockerfile +47 -0
- aden_tools-1.0.2/PKG-INFO +307 -0
- aden_tools-1.0.2/README.md +235 -0
- aden_tools-1.0.2/_working_notes +26 -0
- aden_tools-1.0.2/browser-extension/README.md +103 -0
- aden_tools-1.0.2/browser-extension/background.js +1456 -0
- aden_tools-1.0.2/browser-extension/icons/icon-128.png +0 -0
- aden_tools-1.0.2/browser-extension/icons/icon-16.png +0 -0
- aden_tools-1.0.2/browser-extension/icons/icon-32.png +0 -0
- aden_tools-1.0.2/browser-extension/icons/icon-48.png +0 -0
- aden_tools-1.0.2/browser-extension/manifest.json +46 -0
- aden_tools-1.0.2/browser-extension/mockups/hive.svg +3 -0
- aden_tools-1.0.2/browser-extension/mockups/sidepanel-v2.html +968 -0
- aden_tools-1.0.2/browser-extension/offscreen.html +4 -0
- aden_tools-1.0.2/browser-extension/offscreen.js +237 -0
- aden_tools-1.0.2/browser-extension/popup.html +57 -0
- aden_tools-1.0.2/browser-extension/popup.js +12 -0
- aden_tools-1.0.2/browser-extension/sidepanel.html +615 -0
- aden_tools-1.0.2/browser-extension/sidepanel.js +1293 -0
- aden_tools-1.0.2/browser-extension/wordlist.js +51 -0
- aden_tools-1.0.2/chart_tools_server.py +16 -0
- aden_tools-1.0.2/direct_browser_test.py +91 -0
- aden_tools-1.0.2/files_server.py +98 -0
- aden_tools-1.0.2/linkedin_browser_test.py +187 -0
- aden_tools-1.0.2/manual_browser_complex_test.py +324 -0
- aden_tools-1.0.2/manual_browser_test.py +279 -0
- aden_tools-1.0.2/manual_click_debug.py +149 -0
- aden_tools-1.0.2/mcp_server.py +126 -0
- aden_tools-1.0.2/mcp_servers.json +9 -0
- aden_tools-1.0.2/memory_tools_server.py +15 -0
- aden_tools-1.0.2/pyproject.toml +146 -0
- aden_tools-1.0.2/src/aden_tools/__init__.py +52 -0
- aden_tools-1.0.2/src/aden_tools/credentials/__init__.py +330 -0
- aden_tools-1.0.2/src/aden_tools/credentials/airtable.py +40 -0
- aden_tools-1.0.2/src/aden_tools/credentials/apify.py +34 -0
- aden_tools-1.0.2/src/aden_tools/credentials/apollo.py +46 -0
- aden_tools-1.0.2/src/aden_tools/credentials/asana.py +38 -0
- aden_tools-1.0.2/src/aden_tools/credentials/attio.py +55 -0
- aden_tools-1.0.2/src/aden_tools/credentials/aws_s3.py +63 -0
- aden_tools-1.0.2/src/aden_tools/credentials/azure_sql.py +55 -0
- aden_tools-1.0.2/src/aden_tools/credentials/base.py +493 -0
- aden_tools-1.0.2/src/aden_tools/credentials/bigquery.py +51 -0
- aden_tools-1.0.2/src/aden_tools/credentials/brevo.py +39 -0
- aden_tools-1.0.2/src/aden_tools/credentials/browser.py +104 -0
- aden_tools-1.0.2/src/aden_tools/credentials/calcom.py +43 -0
- aden_tools-1.0.2/src/aden_tools/credentials/calendly.py +37 -0
- aden_tools-1.0.2/src/aden_tools/credentials/cloudflare.py +70 -0
- aden_tools-1.0.2/src/aden_tools/credentials/cloudinary.py +83 -0
- aden_tools-1.0.2/src/aden_tools/credentials/confluence.py +83 -0
- aden_tools-1.0.2/src/aden_tools/credentials/databricks.py +39 -0
- aden_tools-1.0.2/src/aden_tools/credentials/discord.py +42 -0
- aden_tools-1.0.2/src/aden_tools/credentials/docker_hub.py +38 -0
- aden_tools-1.0.2/src/aden_tools/credentials/email.py +100 -0
- aden_tools-1.0.2/src/aden_tools/credentials/freshdesk.py +67 -0
- aden_tools-1.0.2/src/aden_tools/credentials/gcp_vision.py +46 -0
- aden_tools-1.0.2/src/aden_tools/credentials/github.py +58 -0
- aden_tools-1.0.2/src/aden_tools/credentials/gitlab.py +40 -0
- aden_tools-1.0.2/src/aden_tools/credentials/google_analytics.py +44 -0
- aden_tools-1.0.2/src/aden_tools/credentials/google_maps.py +49 -0
- aden_tools-1.0.2/src/aden_tools/credentials/google_search_console.py +38 -0
- aden_tools-1.0.2/src/aden_tools/credentials/greenhouse.py +40 -0
- aden_tools-1.0.2/src/aden_tools/credentials/health_check.py +1540 -0
- aden_tools-1.0.2/src/aden_tools/credentials/hubspot.py +56 -0
- aden_tools-1.0.2/src/aden_tools/credentials/huggingface.py +39 -0
- aden_tools-1.0.2/src/aden_tools/credentials/integrations.py +149 -0
- aden_tools-1.0.2/src/aden_tools/credentials/intercom.py +47 -0
- aden_tools-1.0.2/src/aden_tools/credentials/jira.py +86 -0
- aden_tools-1.0.2/src/aden_tools/credentials/kafka.py +59 -0
- aden_tools-1.0.2/src/aden_tools/credentials/langfuse.py +59 -0
- aden_tools-1.0.2/src/aden_tools/credentials/linear.py +51 -0
- aden_tools-1.0.2/src/aden_tools/credentials/lusha.py +37 -0
- aden_tools-1.0.2/src/aden_tools/credentials/mattermost.py +65 -0
- aden_tools-1.0.2/src/aden_tools/credentials/microsoft_graph.py +45 -0
- aden_tools-1.0.2/src/aden_tools/credentials/mongodb.py +78 -0
- aden_tools-1.0.2/src/aden_tools/credentials/n8n.py +56 -0
- aden_tools-1.0.2/src/aden_tools/credentials/news.py +53 -0
- aden_tools-1.0.2/src/aden_tools/credentials/notion.py +52 -0
- aden_tools-1.0.2/src/aden_tools/credentials/obsidian.py +37 -0
- aden_tools-1.0.2/src/aden_tools/credentials/pagerduty.py +55 -0
- aden_tools-1.0.2/src/aden_tools/credentials/pinecone.py +38 -0
- aden_tools-1.0.2/src/aden_tools/credentials/pipedrive.py +43 -0
- aden_tools-1.0.2/src/aden_tools/credentials/plaid.py +58 -0
- aden_tools-1.0.2/src/aden_tools/credentials/postgres.py +40 -0
- aden_tools-1.0.2/src/aden_tools/credentials/powerbi.py +35 -0
- aden_tools-1.0.2/src/aden_tools/credentials/prometheus.py +41 -0
- aden_tools-1.0.2/src/aden_tools/credentials/pushover.py +38 -0
- aden_tools-1.0.2/src/aden_tools/credentials/quickbooks.py +61 -0
- aden_tools-1.0.2/src/aden_tools/credentials/razorpay.py +74 -0
- aden_tools-1.0.2/src/aden_tools/credentials/reddit.py +61 -0
- aden_tools-1.0.2/src/aden_tools/credentials/redis.py +40 -0
- aden_tools-1.0.2/src/aden_tools/credentials/redshift.py +56 -0
- aden_tools-1.0.2/src/aden_tools/credentials/salesforce.py +63 -0
- aden_tools-1.0.2/src/aden_tools/credentials/sap.py +74 -0
- aden_tools-1.0.2/src/aden_tools/credentials/search.py +115 -0
- aden_tools-1.0.2/src/aden_tools/credentials/serpapi.py +36 -0
- aden_tools-1.0.2/src/aden_tools/credentials/shell_config.py +245 -0
- aden_tools-1.0.2/src/aden_tools/credentials/shopify.py +63 -0
- aden_tools-1.0.2/src/aden_tools/credentials/similarweb.py +53 -0
- aden_tools-1.0.2/src/aden_tools/credentials/slack.py +121 -0
- aden_tools-1.0.2/src/aden_tools/credentials/snowflake.py +52 -0
- aden_tools-1.0.2/src/aden_tools/credentials/store_adapter.py +897 -0
- aden_tools-1.0.2/src/aden_tools/credentials/stripe.py +87 -0
- aden_tools-1.0.2/src/aden_tools/credentials/supabase.py +39 -0
- aden_tools-1.0.2/src/aden_tools/credentials/telegram.py +48 -0
- aden_tools-1.0.2/src/aden_tools/credentials/terraform.py +35 -0
- aden_tools-1.0.2/src/aden_tools/credentials/tines.py +54 -0
- aden_tools-1.0.2/src/aden_tools/credentials/trello.py +70 -0
- aden_tools-1.0.2/src/aden_tools/credentials/twilio.py +58 -0
- aden_tools-1.0.2/src/aden_tools/credentials/twitter.py +37 -0
- aden_tools-1.0.2/src/aden_tools/credentials/vercel.py +37 -0
- aden_tools-1.0.2/src/aden_tools/credentials/wandb.py +38 -0
- aden_tools-1.0.2/src/aden_tools/credentials/x.py +106 -0
- aden_tools-1.0.2/src/aden_tools/credentials/youtube.py +40 -0
- aden_tools-1.0.2/src/aden_tools/credentials/zendesk.py +83 -0
- aden_tools-1.0.2/src/aden_tools/credentials/zoho.py +45 -0
- aden_tools-1.0.2/src/aden_tools/credentials/zoho_crm.py +36 -0
- aden_tools-1.0.2/src/aden_tools/credentials/zoom.py +39 -0
- aden_tools-1.0.2/src/aden_tools/file_ops.py +1703 -0
- aden_tools-1.0.2/src/aden_tools/file_state_cache.py +177 -0
- aden_tools-1.0.2/src/aden_tools/hashline.py +223 -0
- aden_tools-1.0.2/src/aden_tools/senders/__init__.py +21 -0
- aden_tools-1.0.2/src/aden_tools/senders/providers.py +346 -0
- aden_tools-1.0.2/src/aden_tools/senders/registry.py +196 -0
- aden_tools-1.0.2/src/aden_tools/senders/rotation.py +173 -0
- aden_tools-1.0.2/src/aden_tools/senders/sendlog.py +203 -0
- aden_tools-1.0.2/src/aden_tools/senders/setup.py +403 -0
- aden_tools-1.0.2/src/aden_tools/senders/threads.py +163 -0
- aden_tools-1.0.2/src/aden_tools/tools/__init__.py +397 -0
- aden_tools-1.0.2/src/aden_tools/tools/account_info_tool/README.md +104 -0
- aden_tools-1.0.2/src/aden_tools/tools/account_info_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/account_info_tool/account_info_tool.py +35 -0
- aden_tools-1.0.2/src/aden_tools/tools/airtable_tool/README.md +99 -0
- aden_tools-1.0.2/src/aden_tools/tools/airtable_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/airtable_tool/airtable_tool.py +466 -0
- aden_tools-1.0.2/src/aden_tools/tools/apify_tool/README.md +155 -0
- aden_tools-1.0.2/src/aden_tools/tools/apify_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/apify_tool/apify_tool.py +346 -0
- aden_tools-1.0.2/src/aden_tools/tools/apollo_tool/README.md +42 -0
- aden_tools-1.0.2/src/aden_tools/tools/apollo_tool/__init__.py +13 -0
- aden_tools-1.0.2/src/aden_tools/tools/apollo_tool/apollo_tool.py +745 -0
- aden_tools-1.0.2/src/aden_tools/tools/arxiv_tool/README.md +171 -0
- aden_tools-1.0.2/src/aden_tools/tools/arxiv_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/arxiv_tool/arxiv_tool.py +224 -0
- aden_tools-1.0.2/src/aden_tools/tools/asana_tool/README.md +78 -0
- aden_tools-1.0.2/src/aden_tools/tools/asana_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/asana_tool/asana_tool.py +476 -0
- aden_tools-1.0.2/src/aden_tools/tools/attach_file_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/attach_file_tool/attach_file_tool.py +317 -0
- aden_tools-1.0.2/src/aden_tools/tools/attio_tool/README.md +65 -0
- aden_tools-1.0.2/src/aden_tools/tools/attio_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/attio_tool/attio_tool.py +739 -0
- aden_tools-1.0.2/src/aden_tools/tools/attio_tool/tests/__init__.py +0 -0
- aden_tools-1.0.2/src/aden_tools/tools/attio_tool/tests/test_attio_tool.py +836 -0
- aden_tools-1.0.2/src/aden_tools/tools/aws_s3_tool/README.md +59 -0
- aden_tools-1.0.2/src/aden_tools/tools/aws_s3_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/aws_s3_tool/aws_s3_tool.py +461 -0
- aden_tools-1.0.2/src/aden_tools/tools/azure_sql_tool/README.md +62 -0
- aden_tools-1.0.2/src/aden_tools/tools/azure_sql_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/azure_sql_tool/azure_sql_tool.py +214 -0
- aden_tools-1.0.2/src/aden_tools/tools/bigquery_tool/README.md +207 -0
- aden_tools-1.0.2/src/aden_tools/tools/bigquery_tool/__init__.py +9 -0
- aden_tools-1.0.2/src/aden_tools/tools/bigquery_tool/bigquery_tool.py +379 -0
- aden_tools-1.0.2/src/aden_tools/tools/brevo_tool/README.md +172 -0
- aden_tools-1.0.2/src/aden_tools/tools/brevo_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/brevo_tool/brevo_tool.py +626 -0
- aden_tools-1.0.2/src/aden_tools/tools/calcom_tool/README.md +94 -0
- aden_tools-1.0.2/src/aden_tools/tools/calcom_tool/__init__.py +9 -0
- aden_tools-1.0.2/src/aden_tools/tools/calcom_tool/calcom_tool.py +597 -0
- aden_tools-1.0.2/src/aden_tools/tools/calendar_tool/README.md +265 -0
- aden_tools-1.0.2/src/aden_tools/tools/calendar_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/calendar_tool/calendar_tool.py +921 -0
- aden_tools-1.0.2/src/aden_tools/tools/calendly_tool/README.md +79 -0
- aden_tools-1.0.2/src/aden_tools/tools/calendly_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/calendly_tool/calendly_tool.py +388 -0
- aden_tools-1.0.2/src/aden_tools/tools/cloudflare_tool/README.md +271 -0
- aden_tools-1.0.2/src/aden_tools/tools/cloudflare_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/cloudflare_tool/cloudflare_tool.py +1842 -0
- aden_tools-1.0.2/src/aden_tools/tools/cloudinary_tool/README.md +59 -0
- aden_tools-1.0.2/src/aden_tools/tools/cloudinary_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/cloudinary_tool/cloudinary_tool.py +416 -0
- aden_tools-1.0.2/src/aden_tools/tools/confluence_tool/README.md +198 -0
- aden_tools-1.0.2/src/aden_tools/tools/confluence_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/confluence_tool/confluence_tool.py +446 -0
- aden_tools-1.0.2/src/aden_tools/tools/csv_tool/README.md +168 -0
- aden_tools-1.0.2/src/aden_tools/tools/csv_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/csv_tool/csv_tool.py +328 -0
- aden_tools-1.0.2/src/aden_tools/tools/databricks_tool/README.md +128 -0
- aden_tools-1.0.2/src/aden_tools/tools/databricks_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/databricks_tool/databricks_tool.py +339 -0
- aden_tools-1.0.2/src/aden_tools/tools/discord_tool/README.md +44 -0
- aden_tools-1.0.2/src/aden_tools/tools/discord_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/discord_tool/discord_tool.py +419 -0
- aden_tools-1.0.2/src/aden_tools/tools/dns_security_scanner/README.md +111 -0
- aden_tools-1.0.2/src/aden_tools/tools/dns_security_scanner/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/dns_security_scanner/dns_security_scanner.py +249 -0
- aden_tools-1.0.2/src/aden_tools/tools/docker_hub_tool/README.md +124 -0
- aden_tools-1.0.2/src/aden_tools/tools/docker_hub_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/docker_hub_tool/docker_hub_tool.py +361 -0
- aden_tools-1.0.2/src/aden_tools/tools/duckduckgo_tool/README.md +64 -0
- aden_tools-1.0.2/src/aden_tools/tools/duckduckgo_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/duckduckgo_tool/duckduckgo_tool.py +176 -0
- aden_tools-1.0.2/src/aden_tools/tools/email_tool/README.md +50 -0
- aden_tools-1.0.2/src/aden_tools/tools/email_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/email_tool/email_tool.py +446 -0
- aden_tools-1.0.2/src/aden_tools/tools/exa_search_tool/README.md +98 -0
- aden_tools-1.0.2/src/aden_tools/tools/exa_search_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/exa_search_tool/exa_search_tool.py +630 -0
- aden_tools-1.0.2/src/aden_tools/tools/excel_tool/README.md +361 -0
- aden_tools-1.0.2/src/aden_tools/tools/excel_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/excel_tool/excel_tool.py +703 -0
- aden_tools-1.0.2/src/aden_tools/tools/file_system_toolkits/README.md +35 -0
- aden_tools-1.0.2/src/aden_tools/tools/file_system_toolkits/__init__.py +0 -0
- aden_tools-1.0.2/src/aden_tools/tools/file_system_toolkits/security.py +62 -0
- aden_tools-1.0.2/src/aden_tools/tools/freshdesk_tool/README.md +109 -0
- aden_tools-1.0.2/src/aden_tools/tools/freshdesk_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/freshdesk_tool/freshdesk_tool.py +889 -0
- aden_tools-1.0.2/src/aden_tools/tools/github_tool/README.md +646 -0
- aden_tools-1.0.2/src/aden_tools/tools/github_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/github_tool/github_tool.py +1231 -0
- aden_tools-1.0.2/src/aden_tools/tools/gitlab_tool/README.md +62 -0
- aden_tools-1.0.2/src/aden_tools/tools/gitlab_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/gitlab_tool/gitlab_tool.py +568 -0
- aden_tools-1.0.2/src/aden_tools/tools/gmail_tool/README.md +107 -0
- aden_tools-1.0.2/src/aden_tools/tools/gmail_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/gmail_tool/gmail_tool.py +807 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_analytics_tool/README.md +124 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_analytics_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_analytics_tool/google_analytics_tool.py +451 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_docs_tool/README.md +146 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_docs_tool/__init__.py +9 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_docs_tool/google_docs_tool.py +797 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_docs_tool/tests/__init__.py +1 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_docs_tool/tests/test_google_docs_tool.py +468 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_maps_tool/README.md +180 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_maps_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_maps_tool/google_maps_tool.py +694 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_search_console_tool/README.md +68 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_search_console_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_search_console_tool/google_search_console_tool.py +439 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_sheets_tool/README.md +181 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_sheets_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_sheets_tool/google_sheets_tool.py +634 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_sheets_tool/tests/__init__.py +0 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_sheets_tool/tests/test_google_sheets_integration.py +253 -0
- aden_tools-1.0.2/src/aden_tools/tools/google_sheets_tool/tests/test_google_sheets_tool.py +717 -0
- aden_tools-1.0.2/src/aden_tools/tools/greenhouse_tool/README.md +60 -0
- aden_tools-1.0.2/src/aden_tools/tools/greenhouse_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/greenhouse_tool/greenhouse_tool.py +511 -0
- aden_tools-1.0.2/src/aden_tools/tools/http_headers_scanner/README.md +111 -0
- aden_tools-1.0.2/src/aden_tools/tools/http_headers_scanner/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/http_headers_scanner/http_headers_scanner.py +164 -0
- aden_tools-1.0.2/src/aden_tools/tools/hubspot_tool/README.md +73 -0
- aden_tools-1.0.2/src/aden_tools/tools/hubspot_tool/__init__.py +9 -0
- aden_tools-1.0.2/src/aden_tools/tools/hubspot_tool/hubspot_tool.py +662 -0
- aden_tools-1.0.2/src/aden_tools/tools/hubspot_tool/tests/__init__.py +0 -0
- aden_tools-1.0.2/src/aden_tools/tools/hubspot_tool/tests/test_hubspot_tool.py +464 -0
- aden_tools-1.0.2/src/aden_tools/tools/huggingface_tool/README.md +101 -0
- aden_tools-1.0.2/src/aden_tools/tools/huggingface_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/huggingface_tool/huggingface_tool.py +524 -0
- aden_tools-1.0.2/src/aden_tools/tools/image_gen_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/image_gen_tool/image_gen_tool.py +429 -0
- aden_tools-1.0.2/src/aden_tools/tools/intercom_tool/README.md +99 -0
- aden_tools-1.0.2/src/aden_tools/tools/intercom_tool/__init__.py +9 -0
- aden_tools-1.0.2/src/aden_tools/tools/intercom_tool/intercom_tool.py +706 -0
- aden_tools-1.0.2/src/aden_tools/tools/intercom_tool/tests/__init__.py +0 -0
- aden_tools-1.0.2/src/aden_tools/tools/intercom_tool/tests/test_intercom_tool.py +734 -0
- aden_tools-1.0.2/src/aden_tools/tools/jira_tool/README.md +127 -0
- aden_tools-1.0.2/src/aden_tools/tools/jira_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/jira_tool/jira_tool.py +516 -0
- aden_tools-1.0.2/src/aden_tools/tools/kafka_tool/README.md +58 -0
- aden_tools-1.0.2/src/aden_tools/tools/kafka_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/kafka_tool/kafka_tool.py +250 -0
- aden_tools-1.0.2/src/aden_tools/tools/langfuse_tool/README.md +102 -0
- aden_tools-1.0.2/src/aden_tools/tools/langfuse_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/langfuse_tool/langfuse_tool.py +490 -0
- aden_tools-1.0.2/src/aden_tools/tools/linear_tool/README.md +151 -0
- aden_tools-1.0.2/src/aden_tools/tools/linear_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/linear_tool/linear_tool.py +1410 -0
- aden_tools-1.0.2/src/aden_tools/tools/linear_tool/tests/__init__.py +1 -0
- aden_tools-1.0.2/src/aden_tools/tools/linear_tool/tests/test_linear_tool.py +792 -0
- aden_tools-1.0.2/src/aden_tools/tools/lusha_tool/README.md +38 -0
- aden_tools-1.0.2/src/aden_tools/tools/lusha_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/lusha_tool/lusha_tool.py +445 -0
- aden_tools-1.0.2/src/aden_tools/tools/mattermost_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/mattermost_tool/mattermost_tool.py +435 -0
- aden_tools-1.0.2/src/aden_tools/tools/microsoft_graph_tool/README.md +83 -0
- aden_tools-1.0.2/src/aden_tools/tools/microsoft_graph_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/microsoft_graph_tool/microsoft_graph_tool.py +588 -0
- aden_tools-1.0.2/src/aden_tools/tools/mongodb_tool/README.md +100 -0
- aden_tools-1.0.2/src/aden_tools/tools/mongodb_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/mongodb_tool/mongodb_tool.py +321 -0
- aden_tools-1.0.2/src/aden_tools/tools/n8n_tool/README.md +56 -0
- aden_tools-1.0.2/src/aden_tools/tools/n8n_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/n8n_tool/n8n_tool.py +410 -0
- aden_tools-1.0.2/src/aden_tools/tools/news_tool/README.md +71 -0
- aden_tools-1.0.2/src/aden_tools/tools/news_tool/__init__.py +7 -0
- aden_tools-1.0.2/src/aden_tools/tools/news_tool/news_tool.py +710 -0
- aden_tools-1.0.2/src/aden_tools/tools/notion_tool/README.md +270 -0
- aden_tools-1.0.2/src/aden_tools/tools/notion_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/notion_tool/notion_tool.py +844 -0
- aden_tools-1.0.2/src/aden_tools/tools/obsidian_tool/README.md +54 -0
- aden_tools-1.0.2/src/aden_tools/tools/obsidian_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/obsidian_tool/obsidian_tool.py +345 -0
- aden_tools-1.0.2/src/aden_tools/tools/openmeteo_tool/README.md +19 -0
- aden_tools-1.0.2/src/aden_tools/tools/openmeteo_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/openmeteo_tool/openmeteo_tool.py +99 -0
- aden_tools-1.0.2/src/aden_tools/tools/pagerduty_tool/README.md +62 -0
- aden_tools-1.0.2/src/aden_tools/tools/pagerduty_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/pagerduty_tool/pagerduty_tool.py +410 -0
- aden_tools-1.0.2/src/aden_tools/tools/pdf_read_tool/README.md +37 -0
- aden_tools-1.0.2/src/aden_tools/tools/pdf_read_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/pdf_read_tool/pdf_read_tool.py +510 -0
- aden_tools-1.0.2/src/aden_tools/tools/pinecone_tool/README.md +127 -0
- aden_tools-1.0.2/src/aden_tools/tools/pinecone_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/pinecone_tool/pinecone_tool.py +459 -0
- aden_tools-1.0.2/src/aden_tools/tools/pipedrive_tool/README.md +72 -0
- aden_tools-1.0.2/src/aden_tools/tools/pipedrive_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/pipedrive_tool/pipedrive_tool.py +743 -0
- aden_tools-1.0.2/src/aden_tools/tools/plaid_tool/README.md +57 -0
- aden_tools-1.0.2/src/aden_tools/tools/plaid_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/plaid_tool/plaid_tool.py +366 -0
- aden_tools-1.0.2/src/aden_tools/tools/port_scanner/README.md +118 -0
- aden_tools-1.0.2/src/aden_tools/tools/port_scanner/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/port_scanner/port_scanner.py +278 -0
- aden_tools-1.0.2/src/aden_tools/tools/postgres_tool/README.md +161 -0
- aden_tools-1.0.2/src/aden_tools/tools/postgres_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/postgres_tool/postgres_tool.py +752 -0
- aden_tools-1.0.2/src/aden_tools/tools/powerbi_tool/README.md +56 -0
- aden_tools-1.0.2/src/aden_tools/tools/powerbi_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/powerbi_tool/powerbi_tool.py +238 -0
- aden_tools-1.0.2/src/aden_tools/tools/prometheus_tool/README.md +158 -0
- aden_tools-1.0.2/src/aden_tools/tools/prometheus_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/prometheus_tool/prometheus_tool.py +260 -0
- aden_tools-1.0.2/src/aden_tools/tools/pushover_tool/README.md +79 -0
- aden_tools-1.0.2/src/aden_tools/tools/pushover_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/pushover_tool/pushover_tool.py +365 -0
- aden_tools-1.0.2/src/aden_tools/tools/pushover_tool/tests/__init__.py +0 -0
- aden_tools-1.0.2/src/aden_tools/tools/pushover_tool/tests/test_pushover_tool.py +88 -0
- aden_tools-1.0.2/src/aden_tools/tools/quickbooks_tool/README.md +61 -0
- aden_tools-1.0.2/src/aden_tools/tools/quickbooks_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/quickbooks_tool/quickbooks_tool.py +409 -0
- aden_tools-1.0.2/src/aden_tools/tools/razorpay_tool/README.md +183 -0
- aden_tools-1.0.2/src/aden_tools/tools/razorpay_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/razorpay_tool/razorpay_tool.py +548 -0
- aden_tools-1.0.2/src/aden_tools/tools/reddit_tool/README.md +338 -0
- aden_tools-1.0.2/src/aden_tools/tools/reddit_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/reddit_tool/reddit_tool.py +440 -0
- aden_tools-1.0.2/src/aden_tools/tools/redis_tool/README.md +96 -0
- aden_tools-1.0.2/src/aden_tools/tools/redis_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/redis_tool/redis_tool.py +341 -0
- aden_tools-1.0.2/src/aden_tools/tools/redshift_tool/README.md +563 -0
- aden_tools-1.0.2/src/aden_tools/tools/redshift_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/redshift_tool/redshift_tool.py +299 -0
- aden_tools-1.0.2/src/aden_tools/tools/risk_scorer/README.md +156 -0
- aden_tools-1.0.2/src/aden_tools/tools/risk_scorer/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/risk_scorer/risk_scorer.py +281 -0
- aden_tools-1.0.2/src/aden_tools/tools/salesforce_tool/README.md +66 -0
- aden_tools-1.0.2/src/aden_tools/tools/salesforce_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/salesforce_tool/salesforce_tool.py +457 -0
- aden_tools-1.0.2/src/aden_tools/tools/sap_tool/README.md +56 -0
- aden_tools-1.0.2/src/aden_tools/tools/sap_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/sap_tool/sap_tool.py +311 -0
- aden_tools-1.0.2/src/aden_tools/tools/senders_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/senders_tool/senders_tool.py +745 -0
- aden_tools-1.0.2/src/aden_tools/tools/serpapi_tool/README.md +77 -0
- aden_tools-1.0.2/src/aden_tools/tools/serpapi_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/serpapi_tool/serpapi_tool.py +728 -0
- aden_tools-1.0.2/src/aden_tools/tools/shopify_tool/README.md +135 -0
- aden_tools-1.0.2/src/aden_tools/tools/shopify_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/shopify_tool/shopify_tool.py +675 -0
- aden_tools-1.0.2/src/aden_tools/tools/similarweb_tool/README.md +152 -0
- aden_tools-1.0.2/src/aden_tools/tools/similarweb_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/similarweb_tool/similarweb_tool.py +559 -0
- aden_tools-1.0.2/src/aden_tools/tools/slack_tool/README.md +127 -0
- aden_tools-1.0.2/src/aden_tools/tools/slack_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/slack_tool/slack_tool.py +3108 -0
- aden_tools-1.0.2/src/aden_tools/tools/snowflake_tool/README.md +111 -0
- aden_tools-1.0.2/src/aden_tools/tools/snowflake_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/snowflake_tool/snowflake_tool.py +155 -0
- aden_tools-1.0.2/src/aden_tools/tools/ssl_tls_scanner/README.md +96 -0
- aden_tools-1.0.2/src/aden_tools/tools/ssl_tls_scanner/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/ssl_tls_scanner/ssl_tls_scanner.py +244 -0
- aden_tools-1.0.2/src/aden_tools/tools/stripe_tool/README.md +233 -0
- aden_tools-1.0.2/src/aden_tools/tools/stripe_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/stripe_tool/stripe_tool.py +2772 -0
- aden_tools-1.0.2/src/aden_tools/tools/subdomain_enumerator/README.md +110 -0
- aden_tools-1.0.2/src/aden_tools/tools/subdomain_enumerator/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/subdomain_enumerator/subdomain_enumerator.py +179 -0
- aden_tools-1.0.2/src/aden_tools/tools/supabase_tool/README.md +131 -0
- aden_tools-1.0.2/src/aden_tools/tools/supabase_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/supabase_tool/supabase_tool.py +404 -0
- aden_tools-1.0.2/src/aden_tools/tools/tech_stack_detector/README.md +122 -0
- aden_tools-1.0.2/src/aden_tools/tools/tech_stack_detector/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/tech_stack_detector/tech_stack_detector.py +422 -0
- aden_tools-1.0.2/src/aden_tools/tools/telegram_tool/README.md +124 -0
- aden_tools-1.0.2/src/aden_tools/tools/telegram_tool/__init__.py +9 -0
- aden_tools-1.0.2/src/aden_tools/tools/telegram_tool/telegram_tool.py +835 -0
- aden_tools-1.0.2/src/aden_tools/tools/terraform_tool/README.md +57 -0
- aden_tools-1.0.2/src/aden_tools/tools/terraform_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/terraform_tool/terraform_tool.py +270 -0
- aden_tools-1.0.2/src/aden_tools/tools/time_tool/README.md +47 -0
- aden_tools-1.0.2/src/aden_tools/tools/time_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/time_tool/time_tool.py +55 -0
- aden_tools-1.0.2/src/aden_tools/tools/tines_tool/README.md +55 -0
- aden_tools-1.0.2/src/aden_tools/tools/tines_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/tines_tool/tines_tool.py +242 -0
- aden_tools-1.0.2/src/aden_tools/tools/trello_tool/README.md +188 -0
- aden_tools-1.0.2/src/aden_tools/tools/trello_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/trello_tool/trello_client.py +229 -0
- aden_tools-1.0.2/src/aden_tools/tools/trello_tool/trello_tool.py +376 -0
- aden_tools-1.0.2/src/aden_tools/tools/twilio_tool/README.md +111 -0
- aden_tools-1.0.2/src/aden_tools/tools/twilio_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/twilio_tool/twilio_tool.py +352 -0
- aden_tools-1.0.2/src/aden_tools/tools/twitter_tool/README.md +108 -0
- aden_tools-1.0.2/src/aden_tools/tools/twitter_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/twitter_tool/twitter_tool.py +357 -0
- aden_tools-1.0.2/src/aden_tools/tools/vercel_tool/README.md +106 -0
- aden_tools-1.0.2/src/aden_tools/tools/vercel_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/vercel_tool/vercel_tool.py +336 -0
- aden_tools-1.0.2/src/aden_tools/tools/vision_tool/README.md +149 -0
- aden_tools-1.0.2/src/aden_tools/tools/vision_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/vision_tool/vision_tool.py +522 -0
- aden_tools-1.0.2/src/aden_tools/tools/wandb_tool/README.md +94 -0
- aden_tools-1.0.2/src/aden_tools/tools/wandb_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/wandb_tool/wandb_tool.py +437 -0
- aden_tools-1.0.2/src/aden_tools/tools/web_scrape_tool/README.md +51 -0
- aden_tools-1.0.2/src/aden_tools/tools/web_scrape_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/web_scrape_tool/web_scrape_tool.py +475 -0
- aden_tools-1.0.2/src/aden_tools/tools/web_search_tool/README.md +64 -0
- aden_tools-1.0.2/src/aden_tools/tools/web_search_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/web_search_tool/web_search_tool.py +235 -0
- aden_tools-1.0.2/src/aden_tools/tools/wikipedia_tool/README.md +54 -0
- aden_tools-1.0.2/src/aden_tools/tools/wikipedia_tool/__init__.py +3 -0
- aden_tools-1.0.2/src/aden_tools/tools/wikipedia_tool/wikipedia_tool.py +88 -0
- aden_tools-1.0.2/src/aden_tools/tools/yahoo_finance_tool/README.md +118 -0
- aden_tools-1.0.2/src/aden_tools/tools/yahoo_finance_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/yahoo_finance_tool/yahoo_finance_tool.py +232 -0
- aden_tools-1.0.2/src/aden_tools/tools/youtube_tool/README.md +130 -0
- aden_tools-1.0.2/src/aden_tools/tools/youtube_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/youtube_tool/youtube_tool.py +563 -0
- aden_tools-1.0.2/src/aden_tools/tools/youtube_transcript_tool/README.md +110 -0
- aden_tools-1.0.2/src/aden_tools/tools/youtube_transcript_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/youtube_transcript_tool/youtube_transcript_tool.py +110 -0
- aden_tools-1.0.2/src/aden_tools/tools/zendesk_tool/README.md +134 -0
- aden_tools-1.0.2/src/aden_tools/tools/zendesk_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/zendesk_tool/zendesk_tool.py +420 -0
- aden_tools-1.0.2/src/aden_tools/tools/zoho_crm_tool/README.md +204 -0
- aden_tools-1.0.2/src/aden_tools/tools/zoho_crm_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/zoho_crm_tool/zoho_crm_tool.py +333 -0
- aden_tools-1.0.2/src/aden_tools/tools/zoom_tool/README.md +130 -0
- aden_tools-1.0.2/src/aden_tools/tools/zoom_tool/__init__.py +5 -0
- aden_tools-1.0.2/src/aden_tools/tools/zoom_tool/zoom_tool.py +630 -0
- aden_tools-1.0.2/src/aden_tools/utils/__init__.py +7 -0
- aden_tools-1.0.2/src/aden_tools/utils/attachments.py +144 -0
- aden_tools-1.0.2/src/aden_tools/utils/env_helpers.py +32 -0
- aden_tools-1.0.2/src/chart_tools/__init__.py +35 -0
- aden_tools-1.0.2/src/chart_tools/renderer.py +386 -0
- aden_tools-1.0.2/src/chart_tools/server.py +148 -0
- aden_tools-1.0.2/src/chart_tools/static/echarts.min.js +45 -0
- aden_tools-1.0.2/src/chart_tools/static/mermaid.min.js +2314 -0
- aden_tools-1.0.2/src/chart_tools/theme.py +183 -0
- aden_tools-1.0.2/src/chart_tools/tools.py +308 -0
- aden_tools-1.0.2/src/gcu/__init__.py +77 -0
- aden_tools-1.0.2/src/gcu/bridge_host.py +481 -0
- aden_tools-1.0.2/src/gcu/browser/__init__.py +80 -0
- aden_tools-1.0.2/src/gcu/browser/bridge.py +6442 -0
- aden_tools-1.0.2/src/gcu/browser/bridge_rpc.py +867 -0
- aden_tools-1.0.2/src/gcu/browser/health.py +490 -0
- aden_tools-1.0.2/src/gcu/browser/hooks/__init__.py +0 -0
- aden_tools-1.0.2/src/gcu/browser/hooks/rate_limit_hook.py +250 -0
- aden_tools-1.0.2/src/gcu/browser/identity.py +64 -0
- aden_tools-1.0.2/src/gcu/browser/refs.py +183 -0
- aden_tools-1.0.2/src/gcu/browser/session.py +76 -0
- aden_tools-1.0.2/src/gcu/browser/telemetry.py +347 -0
- aden_tools-1.0.2/src/gcu/browser/tools/__init__.py +31 -0
- aden_tools-1.0.2/src/gcu/browser/tools/advanced.py +569 -0
- aden_tools-1.0.2/src/gcu/browser/tools/inspection.py +960 -0
- aden_tools-1.0.2/src/gcu/browser/tools/interact.py +1012 -0
- aden_tools-1.0.2/src/gcu/browser/tools/interactions.py +1045 -0
- aden_tools-1.0.2/src/gcu/browser/tools/lifecycle.py +945 -0
- aden_tools-1.0.2/src/gcu/browser/tools/navigation.py +293 -0
- aden_tools-1.0.2/src/gcu/browser/tools/script.py +668 -0
- aden_tools-1.0.2/src/gcu/browser/tools/tabs.py +397 -0
- aden_tools-1.0.2/src/gcu/cli.py +384 -0
- aden_tools-1.0.2/src/gcu/cli_commands/__init__.py +9 -0
- aden_tools-1.0.2/src/gcu/cli_commands/capture.py +52 -0
- aden_tools-1.0.2/src/gcu/cli_commands/dialog.py +52 -0
- aden_tools-1.0.2/src/gcu/cli_commands/evaluate.py +67 -0
- aden_tools-1.0.2/src/gcu/cli_commands/interact.py +300 -0
- aden_tools-1.0.2/src/gcu/cli_commands/lifecycle.py +127 -0
- aden_tools-1.0.2/src/gcu/cli_commands/nav.py +242 -0
- aden_tools-1.0.2/src/gcu/cli_commands/page.py +201 -0
- aden_tools-1.0.2/src/gcu/cli_commands/script.py +69 -0
- aden_tools-1.0.2/src/gcu/cli_commands/tab.py +146 -0
- aden_tools-1.0.2/src/gcu/errors.py +174 -0
- aden_tools-1.0.2/src/gcu/files/__init__.py +22 -0
- aden_tools-1.0.2/src/gcu/files/tools.py +5 -0
- aden_tools-1.0.2/src/gcu/memtrace.py +137 -0
- aden_tools-1.0.2/src/gcu/server.py +353 -0
- aden_tools-1.0.2/src/memory_tools/__init__.py +29 -0
- aden_tools-1.0.2/src/memory_tools/enrich.py +414 -0
- aden_tools-1.0.2/src/memory_tools/index.py +582 -0
- aden_tools-1.0.2/src/memory_tools/locate.py +337 -0
- aden_tools-1.0.2/src/memory_tools/paths.py +183 -0
- aden_tools-1.0.2/src/memory_tools/recall.py +225 -0
- aden_tools-1.0.2/src/memory_tools/server.py +70 -0
- aden_tools-1.0.2/src/memory_tools/timeline.py +147 -0
- aden_tools-1.0.2/src/memory_tools/tool.py +351 -0
- aden_tools-1.0.2/src/pyproject.toml +14 -0
- aden_tools-1.0.2/src/terminal_tools/__init__.py +43 -0
- aden_tools-1.0.2/src/terminal_tools/common/__init__.py +0 -0
- aden_tools-1.0.2/src/terminal_tools/common/command_guard.py +118 -0
- aden_tools-1.0.2/src/terminal_tools/common/destructive_warning.py +72 -0
- aden_tools-1.0.2/src/terminal_tools/common/limits.py +308 -0
- aden_tools-1.0.2/src/terminal_tools/common/output_store.py +121 -0
- aden_tools-1.0.2/src/terminal_tools/common/process_tree.py +82 -0
- aden_tools-1.0.2/src/terminal_tools/common/ring_buffer.py +155 -0
- aden_tools-1.0.2/src/terminal_tools/common/ripgrep.py +120 -0
- aden_tools-1.0.2/src/terminal_tools/common/semantic_exit.py +103 -0
- aden_tools-1.0.2/src/terminal_tools/common/truncation.py +105 -0
- aden_tools-1.0.2/src/terminal_tools/common/windows_job.py +119 -0
- aden_tools-1.0.2/src/terminal_tools/exec.py +354 -0
- aden_tools-1.0.2/src/terminal_tools/jobs/__init__.py +6 -0
- aden_tools-1.0.2/src/terminal_tools/jobs/manager.py +458 -0
- aden_tools-1.0.2/src/terminal_tools/jobs/tools.py +288 -0
- aden_tools-1.0.2/src/terminal_tools/output.py +41 -0
- aden_tools-1.0.2/src/terminal_tools/pty/__init__.py +5 -0
- aden_tools-1.0.2/src/terminal_tools/pty/session.py +367 -0
- aden_tools-1.0.2/src/terminal_tools/pty/tools.py +249 -0
- aden_tools-1.0.2/src/terminal_tools/search/__init__.py +5 -0
- aden_tools-1.0.2/src/terminal_tools/search/glob_match.py +45 -0
- aden_tools-1.0.2/src/terminal_tools/search/tools.py +560 -0
- aden_tools-1.0.2/src/terminal_tools/server.py +175 -0
- aden_tools-1.0.2/system_summary.csv +11 -0
- aden_tools-1.0.2/terminal_tools_server.py +20 -0
- aden_tools-1.0.2/tests/__init__.py +1 -0
- aden_tools-1.0.2/tests/conftest.py +131 -0
- aden_tools-1.0.2/tests/credentials/__init__.py +1 -0
- aden_tools-1.0.2/tests/credentials/test_google_analytics_credentials.py +56 -0
- aden_tools-1.0.2/tests/integrations/__init__.py +8 -0
- aden_tools-1.0.2/tests/integrations/conftest.py +193 -0
- aden_tools-1.0.2/tests/integrations/test_input_validation.py +155 -0
- aden_tools-1.0.2/tests/integrations/test_registration.py +142 -0
- aden_tools-1.0.2/tests/integrations/test_spec_conformance.py +292 -0
- aden_tools-1.0.2/tests/test_bridge_host_lifetime.py +61 -0
- aden_tools-1.0.2/tests/test_bridge_multiconnection.py +264 -0
- aden_tools-1.0.2/tests/test_bridge_rpc_allowlist.py +38 -0
- aden_tools-1.0.2/tests/test_browser_cleanup_phase1.py +439 -0
- aden_tools-1.0.2/tests/test_browser_discovery.py +78 -0
- aden_tools-1.0.2/tests/test_browser_profile_conflict.py +112 -0
- aden_tools-1.0.2/tests/test_browser_tools_comprehensive.py +1174 -0
- aden_tools-1.0.2/tests/test_chart_tools_smoke.py +148 -0
- aden_tools-1.0.2/tests/test_coding_file_tools.py +111 -0
- aden_tools-1.0.2/tests/test_command_guard.py +158 -0
- aden_tools-1.0.2/tests/test_credential_registry.py +104 -0
- aden_tools-1.0.2/tests/test_credentials.py +608 -0
- aden_tools-1.0.2/tests/test_credentials_tool.py +270 -0
- aden_tools-1.0.2/tests/test_env_helpers.py +51 -0
- aden_tools-1.0.2/tests/test_file_state_cache.py +193 -0
- aden_tools-1.0.2/tests/test_health_checks.py +599 -0
- aden_tools-1.0.2/tests/test_live_health_checks.py +185 -0
- aden_tools-1.0.2/tests/test_memory_recall_timeline.py +167 -0
- aden_tools-1.0.2/tests/test_memory_tools.py +532 -0
- aden_tools-1.0.2/tests/test_rate_limit_hook.py +298 -0
- aden_tools-1.0.2/tests/test_refs.py +190 -0
- aden_tools-1.0.2/tests/test_script_hooks.py +153 -0
- aden_tools-1.0.2/tests/test_senders_body_html.py +121 -0
- aden_tools-1.0.2/tests/test_senders_feature_flag.py +68 -0
- aden_tools-1.0.2/tests/test_shell_config.py +90 -0
- aden_tools-1.0.2/tests/test_terminal_tools_exec.py +282 -0
- aden_tools-1.0.2/tests/test_terminal_tools_jobs.py +123 -0
- aden_tools-1.0.2/tests/test_terminal_tools_lifecycle.py +211 -0
- aden_tools-1.0.2/tests/test_terminal_tools_pty.py +112 -0
- aden_tools-1.0.2/tests/test_terminal_tools_ripgrep.py +237 -0
- aden_tools-1.0.2/tests/test_terminal_tools_search.py +293 -0
- aden_tools-1.0.2/tests/test_terminal_tools_security.py +149 -0
- aden_tools-1.0.2/tests/test_terminal_tools_shell.py +156 -0
- aden_tools-1.0.2/tests/test_terminal_tools_smoke.py +31 -0
- aden_tools-1.0.2/tests/test_x_page_load_repro.py +366 -0
- aden_tools-1.0.2/tests/tools/__init__.py +1 -0
- aden_tools-1.0.2/tests/tools/test_airtable_tool.py +211 -0
- aden_tools-1.0.2/tests/tools/test_apify_tool.py +178 -0
- aden_tools-1.0.2/tests/tools/test_apollo_tool.py +672 -0
- aden_tools-1.0.2/tests/tools/test_arxiv_tool.py +230 -0
- aden_tools-1.0.2/tests/tools/test_asana_tool.py +169 -0
- aden_tools-1.0.2/tests/tools/test_attach_file_tool.py +274 -0
- aden_tools-1.0.2/tests/tools/test_attio_tool.py +836 -0
- aden_tools-1.0.2/tests/tools/test_aws_s3_tool.py +156 -0
- aden_tools-1.0.2/tests/tools/test_azure_sql_tool.py +201 -0
- aden_tools-1.0.2/tests/tools/test_bigquery_tool.py +401 -0
- aden_tools-1.0.2/tests/tools/test_brevo_tool.py +645 -0
- aden_tools-1.0.2/tests/tools/test_calcom_tool.py +433 -0
- aden_tools-1.0.2/tests/tools/test_calendar_tool.py +1394 -0
- aden_tools-1.0.2/tests/tools/test_calendly_tool.py +201 -0
- aden_tools-1.0.2/tests/tools/test_cloudflare.py +1104 -0
- aden_tools-1.0.2/tests/tools/test_cloudinary_tool.py +180 -0
- aden_tools-1.0.2/tests/tools/test_confluence_tool.py +161 -0
- aden_tools-1.0.2/tests/tools/test_csv_tool.py +891 -0
- aden_tools-1.0.2/tests/tools/test_databricks_tool.py +179 -0
- aden_tools-1.0.2/tests/tools/test_discord_tool.py +95 -0
- aden_tools-1.0.2/tests/tools/test_dns_security_scanner.py +260 -0
- aden_tools-1.0.2/tests/tools/test_docker_hub_tool.py +151 -0
- aden_tools-1.0.2/tests/tools/test_duckduckgo_tool.py +97 -0
- aden_tools-1.0.2/tests/tools/test_email_tool.py +679 -0
- aden_tools-1.0.2/tests/tools/test_exa_search_tool.py +241 -0
- aden_tools-1.0.2/tests/tools/test_excel_tool.py +1124 -0
- aden_tools-1.0.2/tests/tools/test_file_ops.py +408 -0
- aden_tools-1.0.2/tests/tools/test_freshdesk_tool.py +1771 -0
- aden_tools-1.0.2/tests/tools/test_github_tool.py +620 -0
- aden_tools-1.0.2/tests/tools/test_gitlab_tool.py +213 -0
- aden_tools-1.0.2/tests/tools/test_gmail_tool.py +929 -0
- aden_tools-1.0.2/tests/tools/test_google_analytics_tool.py +764 -0
- aden_tools-1.0.2/tests/tools/test_google_docs_tool.py +593 -0
- aden_tools-1.0.2/tests/tools/test_google_maps_tool.py +949 -0
- aden_tools-1.0.2/tests/tools/test_google_search_console_tool.py +154 -0
- aden_tools-1.0.2/tests/tools/test_google_sheets_tool.py +108 -0
- aden_tools-1.0.2/tests/tools/test_greenhouse_tool.py +217 -0
- aden_tools-1.0.2/tests/tools/test_hashline.py +186 -0
- aden_tools-1.0.2/tests/tools/test_http_headers_scanner.py +315 -0
- aden_tools-1.0.2/tests/tools/test_hubspot_tool.py +580 -0
- aden_tools-1.0.2/tests/tools/test_huggingface_tool.py +374 -0
- aden_tools-1.0.2/tests/tools/test_image_gen_tool.py +229 -0
- aden_tools-1.0.2/tests/tools/test_intercom_tool.py +537 -0
- aden_tools-1.0.2/tests/tools/test_jira_tool.py +200 -0
- aden_tools-1.0.2/tests/tools/test_kafka_tool.py +180 -0
- aden_tools-1.0.2/tests/tools/test_langfuse_tool.py +242 -0
- aden_tools-1.0.2/tests/tools/test_linear_tool.py +792 -0
- aden_tools-1.0.2/tests/tools/test_lusha_tool.py +187 -0
- aden_tools-1.0.2/tests/tools/test_mattermost_tool.py +106 -0
- aden_tools-1.0.2/tests/tools/test_microsoft_graph_tool.py +224 -0
- aden_tools-1.0.2/tests/tools/test_mongodb_tool.py +186 -0
- aden_tools-1.0.2/tests/tools/test_n8n_tool.py +199 -0
- aden_tools-1.0.2/tests/tools/test_news_tool.py +333 -0
- aden_tools-1.0.2/tests/tools/test_notion_tool.py +1156 -0
- aden_tools-1.0.2/tests/tools/test_obsidian_tool.py +191 -0
- aden_tools-1.0.2/tests/tools/test_pagerduty_tool.py +162 -0
- aden_tools-1.0.2/tests/tools/test_pdf_read_tool.py +536 -0
- aden_tools-1.0.2/tests/tools/test_pinecone_tool.py +265 -0
- aden_tools-1.0.2/tests/tools/test_pipedrive_tool.py +307 -0
- aden_tools-1.0.2/tests/tools/test_plaid_tool.py +232 -0
- aden_tools-1.0.2/tests/tools/test_port_scanner.py +282 -0
- aden_tools-1.0.2/tests/tools/test_postgres_tool.py +255 -0
- aden_tools-1.0.2/tests/tools/test_powerbi_tool.py +174 -0
- aden_tools-1.0.2/tests/tools/test_prometheus_tool.py +167 -0
- aden_tools-1.0.2/tests/tools/test_pushover_tool.py +146 -0
- aden_tools-1.0.2/tests/tools/test_quickbooks_tool.py +184 -0
- aden_tools-1.0.2/tests/tools/test_razorpay_tool.py +825 -0
- aden_tools-1.0.2/tests/tools/test_reddit_tool.py +218 -0
- aden_tools-1.0.2/tests/tools/test_redis_tool.py +159 -0
- aden_tools-1.0.2/tests/tools/test_redshift_tool.py +174 -0
- aden_tools-1.0.2/tests/tools/test_risk_scorer.py +316 -0
- aden_tools-1.0.2/tests/tools/test_run_command_pythonpath.py +110 -0
- aden_tools-1.0.2/tests/tools/test_salesforce_tool.py +228 -0
- aden_tools-1.0.2/tests/tools/test_sap_tool.py +258 -0
- aden_tools-1.0.2/tests/tools/test_security.py +205 -0
- aden_tools-1.0.2/tests/tools/test_security_tools.py +291 -0
- aden_tools-1.0.2/tests/tools/test_serpapi_tool.py +409 -0
- aden_tools-1.0.2/tests/tools/test_shopify_tool.py +269 -0
- aden_tools-1.0.2/tests/tools/test_similarweb_tool.py +549 -0
- aden_tools-1.0.2/tests/tools/test_slack_tool.py +1070 -0
- aden_tools-1.0.2/tests/tools/test_snowflake_tool.py +161 -0
- aden_tools-1.0.2/tests/tools/test_ssl_tls_scanner.py +275 -0
- aden_tools-1.0.2/tests/tools/test_stripe_tool.py +1663 -0
- aden_tools-1.0.2/tests/tools/test_subdomain_enumerator.py +294 -0
- aden_tools-1.0.2/tests/tools/test_supabase_tool.py +190 -0
- aden_tools-1.0.2/tests/tools/test_tech_stack_detector.py +269 -0
- aden_tools-1.0.2/tests/tools/test_telegram_tool.py +839 -0
- aden_tools-1.0.2/tests/tools/test_terraform_tool.py +242 -0
- aden_tools-1.0.2/tests/tools/test_time_tool.py +140 -0
- aden_tools-1.0.2/tests/tools/test_tines_tool.py +178 -0
- aden_tools-1.0.2/tests/tools/test_trello_tool.py +99 -0
- aden_tools-1.0.2/tests/tools/test_trello_tool_integration.py +69 -0
- aden_tools-1.0.2/tests/tools/test_twilio_tool.py +152 -0
- aden_tools-1.0.2/tests/tools/test_twitter_tool.py +180 -0
- aden_tools-1.0.2/tests/tools/test_vercel_tool.py +154 -0
- aden_tools-1.0.2/tests/tools/test_vision_tool.py +542 -0
- aden_tools-1.0.2/tests/tools/test_wandb_tool.py +313 -0
- aden_tools-1.0.2/tests/tools/test_web_scrape_tool.py +483 -0
- aden_tools-1.0.2/tests/tools/test_web_search_tool.py +147 -0
- aden_tools-1.0.2/tests/tools/test_wikipedia_tool.py +109 -0
- aden_tools-1.0.2/tests/tools/test_yahoo_finance_tool.py +141 -0
- aden_tools-1.0.2/tests/tools/test_youtube_tool.py +257 -0
- aden_tools-1.0.2/tests/tools/test_youtube_transcript_tool.py +97 -0
- aden_tools-1.0.2/tests/tools/test_zendesk_tool.py +153 -0
- aden_tools-1.0.2/tests/tools/test_zoho_crm_tool.py +160 -0
- aden_tools-1.0.2/tests/tools/test_zoom_tool.py +244 -0
- aden_tools-1.0.2/tests/vision_eval/README.md +67 -0
- aden_tools-1.0.2/tests/vision_eval/runs/20260521T021450Z.jsonl +56 -0
- aden_tools-1.0.2/tests/vision_eval/runs/20260521T025034Z.jsonl +22 -0
- aden_tools-1.0.2/tests/vision_eval/runs/fix.jsonl +3 -0
- aden_tools-1.0.2/tests/vision_eval/server.py +412 -0
- aden_tools-1.0.2/tests/vision_eval/static/instrument.js +113 -0
- aden_tools-1.0.2/tests/vision_eval/static/style.css +61 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/disambiguation_dropdown.html +92 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/disambiguation_duplicates.html +58 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/disambiguation_text_as_image.html +53 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/multistep_drag_drop.html +96 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/multistep_tab_handoff.html +75 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/multistep_tab_handoff_code.html +32 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/precision_low_contrast.html +73 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/precision_occluded.html +71 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/precision_tiny_button.html +61 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/spatial_below_fold.html +60 -0
- aden_tools-1.0.2/tests/vision_eval/tasks/spatial_form_fill.html +67 -0
- aden_tools-1.0.2/uv.lock +3419 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# MSSQL Connection Configuration Template
|
|
2
|
+
#
|
|
3
|
+
# Copy this file to .env and fill in your actual values
|
|
4
|
+
# DO NOT commit the .env file to version control!
|
|
5
|
+
|
|
6
|
+
# ============================================================================
|
|
7
|
+
# SQL Server Connection - Choose ONE format below:
|
|
8
|
+
# ============================================================================
|
|
9
|
+
|
|
10
|
+
# OPTION 1: Local named instance
|
|
11
|
+
MSSQL_SERVER=localhost\SQLEXPRESS
|
|
12
|
+
|
|
13
|
+
# OPTION 2: Local default instance
|
|
14
|
+
# MSSQL_SERVER=localhost
|
|
15
|
+
|
|
16
|
+
# OPTION 3: Remote server with default port (1433)
|
|
17
|
+
# MSSQL_SERVER=192.168.1.100
|
|
18
|
+
|
|
19
|
+
# OPTION 4: Remote server with custom port (comma-separated)
|
|
20
|
+
# MSSQL_SERVER=192.168.1.100,1433
|
|
21
|
+
|
|
22
|
+
# OPTION 5: Remote named instance
|
|
23
|
+
# MSSQL_SERVER=PRODUCTION-SERVER\INSTANCE01
|
|
24
|
+
|
|
25
|
+
# OPTION 6: Domain server name
|
|
26
|
+
# MSSQL_SERVER=sql-prod.company.com
|
|
27
|
+
|
|
28
|
+
# OPTION 7: Domain server with port
|
|
29
|
+
# MSSQL_SERVER=sql-prod.company.com,1433
|
|
30
|
+
|
|
31
|
+
# ============================================================================
|
|
32
|
+
# Database Configuration
|
|
33
|
+
# ============================================================================
|
|
34
|
+
MSSQL_DATABASE=AdenTestDB
|
|
35
|
+
|
|
36
|
+
# ============================================================================
|
|
37
|
+
# Authentication - Choose ONE method:
|
|
38
|
+
# ============================================================================
|
|
39
|
+
|
|
40
|
+
# METHOD 1: SQL Server Authentication (username/password)
|
|
41
|
+
# Use this for: remote servers, Linux servers, specific SQL logins
|
|
42
|
+
MSSQL_USERNAME=sa
|
|
43
|
+
MSSQL_PASSWORD=your_password_here
|
|
44
|
+
|
|
45
|
+
# METHOD 2: Windows Authentication (leave both empty)
|
|
46
|
+
# Use this for: local Windows servers, domain-joined environments
|
|
47
|
+
# MSSQL_USERNAME=
|
|
48
|
+
# MSSQL_PASSWORD=
|
|
49
|
+
|
|
50
|
+
# ============================================================================
|
|
51
|
+
# Important Notes:
|
|
52
|
+
# ============================================================================
|
|
53
|
+
# - Port format: Use comma (,) not colon - Example: server,1433
|
|
54
|
+
# - Named instances: Use backslash (\) - Example: SERVER\INSTANCE
|
|
55
|
+
# - Default port: 1433 (can be omitted if using default)
|
|
56
|
+
# - ODBC Driver: Requires "ODBC Driver 17 for SQL Server" or newer
|
|
57
|
+
# - Security: Never commit this file with real credentials!
|
|
58
|
+
# - Escaping: In some shells, escape backslashes (\\) when setting env vars
|
|
59
|
+
# ============================================================================
|
|
60
|
+
|
|
61
|
+
# Example Production Configurations:
|
|
62
|
+
# -----------------------------------
|
|
63
|
+
# Azure SQL: MSSQL_SERVER=yourserver.database.windows.net
|
|
64
|
+
# AWS RDS: MSSQL_SERVER=yourinstance.region.rds.amazonaws.com,1433
|
|
65
|
+
# Docker: MSSQL_SERVER=localhost,1401
|
|
66
|
+
# Kubernetes: MSSQL_SERVER=mssql-service.namespace.svc.cluster.local,1433
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
.pnpm-store/
|
|
4
|
+
|
|
5
|
+
# Build outputs
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
workdir/
|
|
9
|
+
.next/
|
|
10
|
+
out/
|
|
11
|
+
|
|
12
|
+
# Environment files
|
|
13
|
+
.env
|
|
14
|
+
.env.local
|
|
15
|
+
.env.*.local
|
|
16
|
+
.venv
|
|
17
|
+
/venv
|
|
18
|
+
tools/src/uv.lock
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# User configuration (copied from .example)
|
|
22
|
+
config.yaml
|
|
23
|
+
docker-compose.override.yml
|
|
24
|
+
|
|
25
|
+
# IDE
|
|
26
|
+
.idea/
|
|
27
|
+
.vscode/*
|
|
28
|
+
!.vscode/extensions.json
|
|
29
|
+
!.vscode/settings.json.example
|
|
30
|
+
*.swp
|
|
31
|
+
*.swo
|
|
32
|
+
*~
|
|
33
|
+
|
|
34
|
+
# OS
|
|
35
|
+
.DS_Store
|
|
36
|
+
Thumbs.db
|
|
37
|
+
|
|
38
|
+
# Logs
|
|
39
|
+
logs/
|
|
40
|
+
*.log
|
|
41
|
+
npm-debug.log*
|
|
42
|
+
yarn-debug.log*
|
|
43
|
+
yarn-error.log*
|
|
44
|
+
pnpm-debug.log*
|
|
45
|
+
|
|
46
|
+
# Testing
|
|
47
|
+
coverage/
|
|
48
|
+
.nyc_output/
|
|
49
|
+
.pytest_cache/
|
|
50
|
+
|
|
51
|
+
# TypeScript
|
|
52
|
+
*.tsbuildinfo
|
|
53
|
+
vite.config.d.ts
|
|
54
|
+
|
|
55
|
+
# Python
|
|
56
|
+
__pycache__/
|
|
57
|
+
*.py[cod]
|
|
58
|
+
*$py.class
|
|
59
|
+
*.egg-info/
|
|
60
|
+
.eggs/
|
|
61
|
+
*.egg
|
|
62
|
+
|
|
63
|
+
# Generated runtime data
|
|
64
|
+
core/data/
|
|
65
|
+
|
|
66
|
+
# Misc
|
|
67
|
+
*.local
|
|
68
|
+
.cache/
|
|
69
|
+
tmp/
|
|
70
|
+
temp/
|
|
71
|
+
|
|
72
|
+
exports/*
|
|
73
|
+
exports.old*
|
|
74
|
+
artifacts/*
|
|
75
|
+
|
|
76
|
+
.claude/settings.local.json
|
|
77
|
+
|
|
78
|
+
docs/github-issues/*
|
|
79
|
+
core/tests/*dumps/*
|
|
80
|
+
|
|
81
|
+
screenshots/*
|
|
82
|
+
|
|
83
|
+
.gemini/*
|
|
84
|
+
.coverage
|
|
85
|
+
|
|
86
|
+
temp/
|
|
87
|
+
# Agent runtime scratch output — never commit
|
|
88
|
+
data/
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Browser-Use Patterns Analysis
|
|
2
|
+
|
|
3
|
+
## Key Learnings from the browser-use integration
|
|
4
|
+
|
|
5
|
+
### 1. Element Click Implementation
|
|
6
|
+
|
|
7
|
+
**browser-use approach** (`browser_use/actor/element.py`):
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
# Three fallback methods for element geometry:
|
|
11
|
+
|
|
12
|
+
# Method 1: DOM.getContentQuads (best for inline elements and complex layouts)
|
|
13
|
+
content_quads_result = await self._client.send.DOM.getContentQuads(
|
|
14
|
+
params={'backendNodeId': self._backend_node_id}, session_id=self._session_id
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
# Method 2: DOM.getBoxModel (fallback)
|
|
18
|
+
box_model = await self._client.send.DOM.getBoxModel(
|
|
19
|
+
params={'backendNodeId': self._backend_node_id}, session_id=self._session_id
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Method 3: JavaScript getBoundingClientRect (final fallback)
|
|
23
|
+
bounds_result = await self._client.send.Runtime.callFunctionOn(
|
|
24
|
+
params={
|
|
25
|
+
'functionDeclaration': """
|
|
26
|
+
function() {
|
|
27
|
+
const rect = this.getBoundingClientRect();
|
|
28
|
+
return {
|
|
29
|
+
x: rect.left,
|
|
30
|
+
y: rect.top,
|
|
31
|
+
width: rect.width,
|
|
32
|
+
height: rect.height
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
""",
|
|
36
|
+
'objectId': object_id,
|
|
37
|
+
'returnByValue': True,
|
|
38
|
+
},
|
|
39
|
+
session_id=self._session_id,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Method 4: JavaScript click (if all else fails)
|
|
43
|
+
await self._client.send.Runtime.callFunctionOn(
|
|
44
|
+
params={
|
|
45
|
+
'functionDeclaration': 'function() { this.click(); }',
|
|
46
|
+
'objectId': object_id,
|
|
47
|
+
},
|
|
48
|
+
session_id=self._session_id,
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Key differences from our implementation:**
|
|
53
|
+
- Uses `backendNodeId` instead of `nodeId` (more stable across DOM updates)
|
|
54
|
+
- Tries `DOM.getContentQuads` first (better for complex layouts)
|
|
55
|
+
- Multiple fallback methods with JavaScript click as final resort
|
|
56
|
+
- Finds largest visible quad within viewport
|
|
57
|
+
- Has timeouts for each mouse operation
|
|
58
|
+
- Proper modifier key handling
|
|
59
|
+
|
|
60
|
+
### 2. Input/Type Text Implementation
|
|
61
|
+
|
|
62
|
+
**browser-use approach**:
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
# 1. Scroll element into view
|
|
66
|
+
await cdp_client.send.DOM.scrollIntoViewIfNeeded(
|
|
67
|
+
params={'backendNodeId': backend_node_id},
|
|
68
|
+
session_id=session_id
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# 2. Get object ID
|
|
72
|
+
result = await cdp_client.send.DOM.resolveNode(
|
|
73
|
+
params={'backendNodeId': backend_node_id},
|
|
74
|
+
session_id=session_id,
|
|
75
|
+
)
|
|
76
|
+
object_id = result['object']['objectId']
|
|
77
|
+
|
|
78
|
+
# 3. Focus via JavaScript (more reliable than CDP focus)
|
|
79
|
+
await cdp_client.send.Runtime.callFunctionOn(
|
|
80
|
+
params={
|
|
81
|
+
'functionDeclaration': 'function() { this.focus(); }',
|
|
82
|
+
'objectId': object_id,
|
|
83
|
+
},
|
|
84
|
+
session_id=session_id,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# 4. Type using Input.dispatchKeyEvent
|
|
88
|
+
for char in text:
|
|
89
|
+
await self._client.send.Input.dispatchKeyEvent(
|
|
90
|
+
params={
|
|
91
|
+
'type': 'keyDown',
|
|
92
|
+
'key': char,
|
|
93
|
+
'text': char,
|
|
94
|
+
},
|
|
95
|
+
session_id=self._session_id,
|
|
96
|
+
)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 3. Accessibility Tree (Snapshot)
|
|
100
|
+
|
|
101
|
+
**browser-use approach** (`browser_use/dom/service.py`):
|
|
102
|
+
|
|
103
|
+
- Uses `Accessibility.getFullAXTree` for accessibility data
|
|
104
|
+
- Combines with DOM tree for enhanced snapshot
|
|
105
|
+
- Filters by paint order (elements actually visible)
|
|
106
|
+
- Handles iframes with depth limits
|
|
107
|
+
- Detects hidden interactive elements and reports them
|
|
108
|
+
- Uses `DOM.getFrameOwner` for iframe handling
|
|
109
|
+
|
|
110
|
+
### 4. CDP Domain Handling
|
|
111
|
+
|
|
112
|
+
**browser-use approach** (`browser_use/browser/session.py`):
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
# Session setup enables ONLY these domains:
|
|
116
|
+
await self._client.send.Page.enable(session_id=self._session_id)
|
|
117
|
+
await self._client.send.DOM.enable(session_id=self._session_id)
|
|
118
|
+
await self._client.send.Runtime.enable(session_id=self._session_id)
|
|
119
|
+
await self._client.send.Network.enable(session_id=self._session_id)
|
|
120
|
+
|
|
121
|
+
# Input.enable is NEVER called - it's not required!
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 5. Element Selection
|
|
125
|
+
|
|
126
|
+
**browser-use approach**:
|
|
127
|
+
|
|
128
|
+
- Uses index-based element selection from accessibility tree
|
|
129
|
+
- Maintains a map of index -> EnhancedAXNode
|
|
130
|
+
- Elements have `backendNodeId` which is stable
|
|
131
|
+
- Uses `DOM.pushNodesByBackendIdsToFrontend` to get fresh nodeId
|
|
132
|
+
|
|
133
|
+
### 6. Scroll Handling
|
|
134
|
+
|
|
135
|
+
**browser-use approach**:
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# Uses multiple methods:
|
|
139
|
+
# 1. DOM.scrollIntoViewIfNeeded (CDP)
|
|
140
|
+
# 2. JavaScript scrollIntoView as fallback
|
|
141
|
+
# 3. Mouse wheel events for smooth scrolling
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 7. Wait Strategies
|
|
145
|
+
|
|
146
|
+
**browser-use approach**:
|
|
147
|
+
|
|
148
|
+
- `wait_for_element` uses CDP DOM queries with polling
|
|
149
|
+
- Has configurable timeouts
|
|
150
|
+
- Uses `DOM.getContentQuads` to verify element is visible
|
|
151
|
+
- Detects page load state via `Page.loadEventFired`
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Improvements to Make to hive/tools
|
|
156
|
+
|
|
157
|
+
### 1. Bridge Updates
|
|
158
|
+
|
|
159
|
+
- [x] Use `backendNodeId` instead of `nodeId` where possible
|
|
160
|
+
- [x] Add `DOM.getContentQuads` as primary method for element geometry
|
|
161
|
+
- [x] Add JavaScript click as final fallback
|
|
162
|
+
- [x] Add proper timeouts to mouse operations
|
|
163
|
+
- [x] Handle modifier keys for click
|
|
164
|
+
|
|
165
|
+
### 2. Type Text Updates
|
|
166
|
+
|
|
167
|
+
- [x] Focus element via JavaScript before typing
|
|
168
|
+
- [x] Use `Input.dispatchKeyEvent` for typing (more reliable than insertText)
|
|
169
|
+
|
|
170
|
+
### 3. Snapshot Updates
|
|
171
|
+
|
|
172
|
+
- [x] Use accessibility tree (CDP Accessibility domain)
|
|
173
|
+
- [x] Add computed styles to detect visibility
|
|
174
|
+
- [x] Report hidden interactive elements
|
|
175
|
+
|
|
176
|
+
### 4. Error Handling
|
|
177
|
+
|
|
178
|
+
- [x] Better error messages with element context
|
|
179
|
+
- [x] Graceful fallbacks instead of hard failures
|
|
180
|
+
- [x] Timeout handling for all CDP operations
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
# Building Tools for Aden
|
|
2
|
+
|
|
3
|
+
This guide explains how to create new tools for the Hive framework using FastMCP.
|
|
4
|
+
|
|
5
|
+
## Quick Start Checklist
|
|
6
|
+
|
|
7
|
+
1. Create folder under `src/aden_tools/tools/<tool_name>/`
|
|
8
|
+
2. Implement a `register_tools(mcp: FastMCP)` function using the `@mcp.tool()` decorator
|
|
9
|
+
3. Add a `README.md` documenting your tool
|
|
10
|
+
4. Register in `src/aden_tools/tools/__init__.py`
|
|
11
|
+
5. Add tests in `tests/tools/`
|
|
12
|
+
|
|
13
|
+
## Tool Structure
|
|
14
|
+
|
|
15
|
+
Each tool lives in its own folder:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/aden_tools/tools/my_tool/
|
|
19
|
+
├── __init__.py # Export register_tools function
|
|
20
|
+
├── my_tool.py # Tool implementation
|
|
21
|
+
└── README.md # Documentation
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Implementation Pattern
|
|
25
|
+
|
|
26
|
+
Tools use FastMCP's native decorator pattern:
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from fastmcp import FastMCP
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def register_tools(mcp: FastMCP) -> None:
|
|
33
|
+
"""Register my tools with the MCP server."""
|
|
34
|
+
|
|
35
|
+
@mcp.tool()
|
|
36
|
+
def my_tool(
|
|
37
|
+
query: str,
|
|
38
|
+
limit: int = 10,
|
|
39
|
+
) -> dict:
|
|
40
|
+
"""
|
|
41
|
+
Search for items matching a query.
|
|
42
|
+
|
|
43
|
+
Use this when you need to find specific information.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
query: The search query (1-500 chars)
|
|
47
|
+
limit: Maximum number of results (1-100)
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
Dict with search results or error dict
|
|
51
|
+
"""
|
|
52
|
+
# Validate inputs
|
|
53
|
+
if not query or len(query) > 500:
|
|
54
|
+
return {"error": "Query must be 1-500 characters"}
|
|
55
|
+
if limit < 1 or limit > 100:
|
|
56
|
+
limit = max(1, min(100, limit))
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
# Your implementation here
|
|
60
|
+
results = do_search(query, limit)
|
|
61
|
+
return {
|
|
62
|
+
"query": query,
|
|
63
|
+
"results": results,
|
|
64
|
+
"total": len(results),
|
|
65
|
+
}
|
|
66
|
+
except Exception as e:
|
|
67
|
+
return {"error": f"Search failed: {str(e)}"}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Exporting the Tool
|
|
71
|
+
|
|
72
|
+
In `src/aden_tools/tools/my_tool/__init__.py`:
|
|
73
|
+
```python
|
|
74
|
+
from .my_tool import register_tools
|
|
75
|
+
|
|
76
|
+
__all__ = ["register_tools"]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
In `src/aden_tools/tools/__init__.py`, add to `_TOOL_MODULES`:
|
|
80
|
+
```python
|
|
81
|
+
_TOOL_MODULES = [
|
|
82
|
+
# ... existing tools
|
|
83
|
+
"my_tool",
|
|
84
|
+
]
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Credential Management
|
|
88
|
+
|
|
89
|
+
Tools fall into two categories based on whether they need external API credentials:
|
|
90
|
+
|
|
91
|
+
| Signature | Meaning | CI Enforcement |
|
|
92
|
+
|-----------|---------|----------------|
|
|
93
|
+
| `register_tools(mcp)` | No credentials needed | ✅ Just works |
|
|
94
|
+
| `register_tools(mcp, credentials=None)` | Requires credentials | ⚠️ Must have `CredentialSpec` |
|
|
95
|
+
|
|
96
|
+
**This is enforced by CI** — if your `register_tools` accepts a `credentials` parameter, every tool it registers must appear in a `CredentialSpec.tools` list. Otherwise, CI will fail with a clear error message.
|
|
97
|
+
|
|
98
|
+
### Tools WITHOUT Credentials (Simple Case)
|
|
99
|
+
|
|
100
|
+
If your tool doesn't need external API keys (file operations, local processing, etc.), just use the simple signature:
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
def register_tools(mcp: FastMCP) -> None:
|
|
104
|
+
"""Register tools that don't need credentials."""
|
|
105
|
+
|
|
106
|
+
@mcp.tool()
|
|
107
|
+
def my_local_tool(path: str) -> dict:
|
|
108
|
+
"""Process a local file."""
|
|
109
|
+
# No credentials needed - just do the work
|
|
110
|
+
return {"result": process_file(path)}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
That's it! No additional configuration needed.
|
|
114
|
+
|
|
115
|
+
### Tools WITH Credentials (Integration Case)
|
|
116
|
+
|
|
117
|
+
For tools requiring API keys, follow these steps:
|
|
118
|
+
|
|
119
|
+
#### Step 1: Add the `credentials` parameter
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
from typing import TYPE_CHECKING
|
|
123
|
+
|
|
124
|
+
if TYPE_CHECKING:
|
|
125
|
+
from aden_tools.credentials import CredentialStoreAdapter
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def register_tools(
|
|
129
|
+
mcp: FastMCP,
|
|
130
|
+
credentials: CredentialStoreAdapter | None = None,
|
|
131
|
+
) -> None:
|
|
132
|
+
@mcp.tool()
|
|
133
|
+
def my_api_tool(query: str) -> dict:
|
|
134
|
+
"""Tool that requires an API key."""
|
|
135
|
+
# Use credentials adapter if provided, fallback to direct env access
|
|
136
|
+
if credentials is not None:
|
|
137
|
+
api_key = credentials.get("my_api")
|
|
138
|
+
else:
|
|
139
|
+
api_key = os.getenv("MY_API_KEY")
|
|
140
|
+
|
|
141
|
+
if not api_key:
|
|
142
|
+
return {
|
|
143
|
+
"error": "MY_API_KEY environment variable not set",
|
|
144
|
+
"help": "Get an API key at https://example.com/api-keys",
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# Use the API key...
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### Step 2: Create a CredentialSpec
|
|
151
|
+
|
|
152
|
+
Find the appropriate category file in `src/aden_tools/credentials/` or create a new one:
|
|
153
|
+
|
|
154
|
+
| Category | File | Examples |
|
|
155
|
+
|----------|------|----------|
|
|
156
|
+
| LLM providers | `llm.py` | anthropic, openai |
|
|
157
|
+
| Search tools | `search.py` | brave_search, google_search |
|
|
158
|
+
| Email providers | `email.py` | resend, google/gmail |
|
|
159
|
+
| GitHub | `github.py` | github |
|
|
160
|
+
| CRM | `hubspot.py` | hubspot |
|
|
161
|
+
| Messaging | `slack.py` | slack |
|
|
162
|
+
|
|
163
|
+
Add your credential spec:
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
# In credentials/<category>.py
|
|
167
|
+
from .base import CredentialSpec
|
|
168
|
+
|
|
169
|
+
MY_CREDENTIALS = {
|
|
170
|
+
"my_api": CredentialSpec(
|
|
171
|
+
env_var="MY_API_KEY",
|
|
172
|
+
tools=["my_api_tool"], # IMPORTANT: List ALL tool names this credential covers
|
|
173
|
+
required=True,
|
|
174
|
+
help_url="https://example.com/api-keys",
|
|
175
|
+
description="API key for My Service",
|
|
176
|
+
# Credential store mapping
|
|
177
|
+
credential_id="my_api",
|
|
178
|
+
credential_key="api_key",
|
|
179
|
+
),
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Important:** The `tools` list must include every tool name that your `register_tools` function creates. CI will fail if any tool is missing.
|
|
184
|
+
|
|
185
|
+
#### Step 3: Merge into CREDENTIAL_SPECS
|
|
186
|
+
|
|
187
|
+
If you created a new category file, import and merge it in `credentials/__init__.py`:
|
|
188
|
+
|
|
189
|
+
```python
|
|
190
|
+
from .my_category import MY_CREDENTIALS
|
|
191
|
+
|
|
192
|
+
CREDENTIAL_SPECS = {
|
|
193
|
+
**LLM_CREDENTIALS,
|
|
194
|
+
**SEARCH_CREDENTIALS,
|
|
195
|
+
**MY_CREDENTIALS, # Add new category
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
__all__ = [
|
|
199
|
+
# ... existing exports
|
|
200
|
+
"MY_CREDENTIALS",
|
|
201
|
+
]
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
#### Step 4: Update register_all_tools
|
|
205
|
+
|
|
206
|
+
In `tools/__init__.py`, add your tool registration with credentials:
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
from .my_tool import register_tools as register_my_tool
|
|
210
|
+
|
|
211
|
+
def register_all_tools(mcp: FastMCP, credentials=None) -> list[str]:
|
|
212
|
+
# ... existing registrations
|
|
213
|
+
|
|
214
|
+
# Tools that need credentials
|
|
215
|
+
register_my_tool(mcp, credentials=credentials)
|
|
216
|
+
|
|
217
|
+
return [
|
|
218
|
+
# ... existing tool names
|
|
219
|
+
"my_api_tool",
|
|
220
|
+
]
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### CI Enforcement Rules
|
|
224
|
+
|
|
225
|
+
The following conformance tests run in CI (`tests/integrations/test_spec_conformance.py`):
|
|
226
|
+
|
|
227
|
+
| Test | What It Checks |
|
|
228
|
+
|------|----------------|
|
|
229
|
+
| `TestModuleStructure` | Every tool module exports `register_tools` |
|
|
230
|
+
| `TestRegisterToolsSignature` | Correct function signature (`mcp` param, optional `credentials`) |
|
|
231
|
+
| `TestCredentialSpecFields` | All CredentialSpec fields are complete (`env_var`, `help_url`, `description`, `credential_id`, `credential_key`) |
|
|
232
|
+
| `TestSpecToolsMatchRegistered` | Tool names in `spec.tools` actually exist |
|
|
233
|
+
| `TestCredentialCoverage` | **Every tool from a module with `credentials` param has a spec** |
|
|
234
|
+
|
|
235
|
+
If `TestCredentialCoverage` fails, you'll see:
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
Tool 'my_new_tool' from module 'my_tool' accepts credentials but has no CredentialSpec.
|
|
239
|
+
|
|
240
|
+
Fix by either:
|
|
241
|
+
1. Adding a CredentialSpec in credentials/<category>.py with tools=['my_new_tool'], or
|
|
242
|
+
2. Removing 'credentials' param from register_tools() if this tool doesn't need credentials
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Testing with Mock Credentials
|
|
246
|
+
|
|
247
|
+
```python
|
|
248
|
+
from aden_tools.credentials import CredentialStoreAdapter
|
|
249
|
+
|
|
250
|
+
def test_my_tool_with_valid_key(mcp):
|
|
251
|
+
creds = CredentialStoreAdapter.for_testing({"my_api": "test-key"})
|
|
252
|
+
register_tools(mcp, credentials=creds)
|
|
253
|
+
tool_fn = mcp._tool_manager._tools["my_api_tool"].fn
|
|
254
|
+
|
|
255
|
+
result = tool_fn(query="test")
|
|
256
|
+
# Assertions...
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### When Validation Happens
|
|
260
|
+
|
|
261
|
+
Credentials are validated when an agent is loaded (via `AgentRunner.validate()`), not at MCP server startup. This means:
|
|
262
|
+
|
|
263
|
+
1. The MCP server always starts (even if credentials are missing)
|
|
264
|
+
2. When you load an agent, validation checks which tools it needs
|
|
265
|
+
3. If credentials are missing, you get a clear error:
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
Cannot run agent: Missing credentials
|
|
269
|
+
|
|
270
|
+
The following tools require credentials that are not set:
|
|
271
|
+
|
|
272
|
+
web_search requires BRAVE_SEARCH_API_KEY
|
|
273
|
+
API key for Brave Search
|
|
274
|
+
Get an API key at: https://brave.com/search/api/
|
|
275
|
+
Set via: export BRAVE_SEARCH_API_KEY=your_key
|
|
276
|
+
|
|
277
|
+
Set these environment variables and re-run the agent.
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Best Practices
|
|
281
|
+
|
|
282
|
+
### Error Handling
|
|
283
|
+
|
|
284
|
+
Return error dicts instead of raising exceptions:
|
|
285
|
+
|
|
286
|
+
```python
|
|
287
|
+
@mcp.tool()
|
|
288
|
+
def my_tool(**kwargs) -> dict:
|
|
289
|
+
try:
|
|
290
|
+
result = do_work()
|
|
291
|
+
return {"success": True, "data": result}
|
|
292
|
+
except SpecificError as e:
|
|
293
|
+
return {"error": f"Failed to process: {str(e)}"}
|
|
294
|
+
except Exception as e:
|
|
295
|
+
return {"error": f"Unexpected error: {str(e)}"}
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Return Values
|
|
299
|
+
|
|
300
|
+
- Return dicts for structured data
|
|
301
|
+
- Include relevant metadata (query, total count, etc.)
|
|
302
|
+
- Use `{"error": "message"}` for errors
|
|
303
|
+
|
|
304
|
+
### Documentation
|
|
305
|
+
|
|
306
|
+
The docstring becomes the tool description in MCP. Include:
|
|
307
|
+
- What the tool does
|
|
308
|
+
- When to use it
|
|
309
|
+
- Args with types and constraints
|
|
310
|
+
- What it returns
|
|
311
|
+
|
|
312
|
+
Every tool folder needs a `README.md` with:
|
|
313
|
+
- Description and use cases
|
|
314
|
+
- Usage examples
|
|
315
|
+
- Argument table
|
|
316
|
+
- Environment variables (if any)
|
|
317
|
+
- Error handling notes
|
|
318
|
+
|
|
319
|
+
## Testing
|
|
320
|
+
|
|
321
|
+
Place tests in `tests/tools/test_{{tool_name}}.py`:
|
|
322
|
+
|
|
323
|
+
```python
|
|
324
|
+
import pytest
|
|
325
|
+
from fastmcp import FastMCP
|
|
326
|
+
|
|
327
|
+
from aden_tools.tools.{{tool_name}} import register_tools
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
@pytest.fixture
|
|
331
|
+
def mcp():
|
|
332
|
+
"""Create a FastMCP instance with tools registered."""
|
|
333
|
+
server = FastMCP("test")
|
|
334
|
+
register_tools(server)
|
|
335
|
+
return server
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def test_my_tool_basic(mcp):
|
|
339
|
+
"""Test basic tool functionality."""
|
|
340
|
+
tool_fn = mcp._tool_manager._tools["my_tool"].fn
|
|
341
|
+
result = tool_fn(query="test")
|
|
342
|
+
assert "results" in result
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def test_my_tool_validation(mcp):
|
|
346
|
+
"""Test input validation."""
|
|
347
|
+
tool_fn = mcp._tool_manager._tools["my_tool"].fn
|
|
348
|
+
result = tool_fn(query="")
|
|
349
|
+
assert "error" in result
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Mock external APIs to keep tests fast and deterministic.
|
|
353
|
+
|
|
354
|
+
## Naming Conventions
|
|
355
|
+
|
|
356
|
+
- **Folder name**: `snake_case` with `_tool` suffix (e.g., `file_read_tool`)
|
|
357
|
+
- **Function name**: `snake_case` (e.g., `file_read`)
|
|
358
|
+
- **Tool description**: Clear, actionable docstring
|