stackos-connectors 0.1.0__tar.gz → 0.2.0__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.
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/PKG-INFO +75 -5
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/README.md +74 -4
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/pyproject.toml +1 -1
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/__init__.py +26 -0
- stackos_connectors-0.2.0/src/stackos_connectors/auth.py +245 -0
- stackos_connectors-0.2.0/src/stackos_connectors/catalog/schema.json +499 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/catalog.py +8 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/aws_s3/probe.py +16 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedream/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/byteplus_seedream/probe.py +5 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/dataforseo/probe.py +9 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/actions.py +7 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/ftp/probe.py +26 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/ghost/probe.py +19 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/catalog.json +47 -1
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_ads/docs/auth.md +15 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_ads/probe.py +5 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/catalog.json +73 -5
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_analytics/docs/auth.md +22 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/catalog.json +73 -5
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_search_console/docs/auth.md +26 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/catalog.json +73 -5
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_tag_manager/docs/auth.md +25 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/catalog.json +51 -1
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_workspace/docs/auth.md +15 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_workspace/probe.py +5 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/catalog.json +172 -17
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/hubspot/docs/auth.md +14 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/hubspot/docs/signatures.md +12 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/hubspot/signature.py +51 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/imap/probe.py +22 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/catalog.json +57 -11
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/linear/docs/auth.md +14 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/meta_ads/auth.py +18 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/catalog.json +26 -6
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/meta_ads/docs/auth.md +12 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/microsoft_365/auth.py +23 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/catalog.json +30 -6
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/microsoft_365/docs/auth.md +14 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/openrouter/probe.py +13 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/catalog.json +21 -4
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/outreach/docs/auth.md +14 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/catalog.json +35 -2
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/pipedrive/docs/auth.md +15 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/pipedrive/probe.py +13 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/catalog.json +24 -2
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/reddit/docs/auth.md +17 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/salesforce/auth.py +33 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/catalog.json +34 -5
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/salesforce/docs/auth.md +14 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/catalog.json +23 -2
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/salesloft/docs/auth.md +15 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/shopify/probe.py +19 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/slack_bot/auth.py +17 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/slack_bot/docs/signatures.md +11 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/slack_bot/probe.py +13 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/smtp/probe.py +17 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/catalog.json +11 -1
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/taboola/docs/auth.md +11 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/telegram/auth.py +185 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/telegram/docs/auth-protocol.md +22 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/trackbooth/probe.py +13 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/catalog.json +1 -0
- stackos_connectors-0.2.0/src/stackos_connectors/connectors/wordpress/probe.py +16 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/catalog.json +1 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/contracts.py +4 -1
- stackos_connectors-0.2.0/src/stackos_connectors/probe.py +183 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/google/oauth.py +1 -1
- stackos_connectors-0.2.0/src/stackos_connectors/shared/google/probe.py +64 -0
- stackos_connectors-0.2.0/src/stackos_connectors/shared/google/service_account.py +125 -0
- stackos_connectors-0.2.0/src/stackos_connectors/shared/oauth.py +337 -0
- stackos_connectors-0.2.0/tests/auth/test_auth_redaction.py +37 -0
- stackos_connectors-0.2.0/tests/auth/test_google_service_account.py +161 -0
- stackos_connectors-0.2.0/tests/auth/test_oauth_contracts.py +353 -0
- stackos_connectors-0.2.0/tests/auth/test_oauth_protocol.py +334 -0
- stackos_connectors-0.2.0/tests/auth/test_probes.py +384 -0
- stackos_connectors-0.2.0/tests/business/test_hubspot_signature_protocol.py +33 -0
- stackos_connectors-0.2.0/tests/mail_slack/test_signature_protocol.py +31 -0
- stackos_connectors-0.2.0/tests/packaging/installed_auth_consumer.py +322 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/packaging/test_grouped_layout.py +45 -0
- stackos_connectors-0.2.0/tests/telegram/test_authorization.py +211 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_ftp_actions.py +86 -0
- stackos_connectors-0.1.0/src/stackos_connectors/catalog/schema.json +0 -80
- stackos_connectors-0.1.0/src/stackos_connectors/probe.py +0 -26
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/.github/workflows/publish.yml +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/.gitignore +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/LICENSE +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/catalog/index.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/docs/aignc.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/docs/s3.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedance/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedance/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedance/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedream/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedream/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/docs/cloudflare-dns.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/assets/icon.jpeg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/assets/icon.svg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/docs/ftp.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/remote_tree.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/assets/icon.webp +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/docs/google-indexing.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/docs/google-search-console.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/http/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/http/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/http/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/docs/hubspot.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/assets/icon.svg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/auth/viewer-organization.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/create.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/delete.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/resolve.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/unresolve.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/update.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/create.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/delete.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/update.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/add-label.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/archive.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/create.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/remove-label.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/search.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/unarchive.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/update.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/projects/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/projects/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/teams/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/teams/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/users/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/users/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/viewer/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/get.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/list.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/docs/linear.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.metadata.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/schemas/root-policy-2026-07-23.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/assets/icon.webp +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/assets/icon.jpeg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/assets/icon.svg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/add-customer-tag.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/create-customer.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-lifetime-value.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-orders.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/list-customers.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/remove-customer-tag.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/search-customers.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/update-customer.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/adjust-inventory.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-by-sku.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-item.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-location-inventory.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-item-availability.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-levels.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-product-variant-inventory.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/set-inventory-level.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-note.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-tag.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/create-draft-order.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-by-name.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-fulfillment-status.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-timeline.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-order-variant-quantities.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-orders.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/mark-order-paid.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/search-orders.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-note.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-tags.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-collection.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product-variant.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-collection.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-by-handle.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-variant.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-collections.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-product-variants.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-products.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/search-products.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-status.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-variant.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/shopifyql.graphql +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/docs/shopify.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/payloads.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/constants.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/files.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/http.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/payloads.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/results.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/validation.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/assets/icon.svg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/assets/icon.jpeg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/docs/stripe.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/assets/icon.svg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/docs/protocol.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/payloads.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/schema.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/native.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/proxy.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/sessions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/catalog.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/openapi.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/stackos-tools.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/docs/agent-api/README.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/docs/trackbooth.md +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/schema.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/transport.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/assets/icon.png +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/integration.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/errors.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/py.typed +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/redaction.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/registry.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/base.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/byteplus/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/byteplus/ark.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/byteplus/media.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/google/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/google/batch.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/icons/integration.svg +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/media.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/provider_utils.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/rate_limit.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/vendor_utils.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/validation.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/conftest.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/fixtures/wire-contracts.json +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_named_actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_pipedrive_probes.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_probe_boundary.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_salesloft_probes.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/catalog/test_catalog.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/catalog/test_nested_resources.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/catalog/test_presentation.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_contract.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_native_result_boundary.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_nested_auth_redaction.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_preflight_redaction.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_public_key_facts.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_runtime.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_timeout_options.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_validation_data.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_validation_execution_outcome.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/mail_slack/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/mail_slack/test_native.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/mail_slack/test_probes_catalog.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_aignc_native.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_generation_outcomes.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_media_files.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_named_media.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/conftest.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/test_linear_transport.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/test_safe_refs_named_actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/test_stripe_transport_transport.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_closure_outcomes.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_native.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_payloads.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_proxy.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_sessions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/trackbooth/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/trackbooth/test_native.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/__init__.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/catalog_fixture.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/conftest.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_ahrefs.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_boundary_timeout.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_cloudflare.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_dataforseo.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_firecrawl.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_ftp.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_analytics.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_indexing.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_indexing_batch.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_search_console.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_search_console_batch.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_tag_manager.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_jina_reader.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_named_clients.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_native_boundary.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_openrouter.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_reddit.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_s3.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_s3_actions.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_serper.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_shopify.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_sitemap.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_transport_defaults.py +0 -0
- {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_wordpress_ghost.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stackos-connectors
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Named provider connectors with plain data and caller-owned authentication.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -20,8 +20,10 @@ A Python library of named provider connectors. A caller supplies a connector,
|
|
|
20
20
|
action, input data and resolved authentication. The library maps that action to
|
|
21
21
|
the provider protocol and returns provider output, metadata and file descriptors.
|
|
22
22
|
|
|
23
|
-
The consumer owns credential storage
|
|
24
|
-
workflow decisions and audit.
|
|
23
|
+
The consumer owns credential storage, when to authorize or refresh, persistent
|
|
24
|
+
state, workflow decisions and audit. Explicit package functions implement provider
|
|
25
|
+
authorization URLs, token grants, probes and signature checks. They never start
|
|
26
|
+
authorization, refresh tokens or persist state implicitly. Provider implementations use plain contracts and
|
|
25
27
|
can accept caller-owned HTTP clients, rate buckets and native protocol sessions.
|
|
26
28
|
|
|
27
29
|
Each integration is grouped under `src/stackos_connectors/connectors/`:
|
|
@@ -71,6 +73,74 @@ execution; existing names cannot be replaced.
|
|
|
71
73
|
`CallOptions.timeout=None` preserves each provider's default. A numeric timeout
|
|
72
74
|
overrides that default. A supplied HTTP client remains caller-owned.
|
|
73
75
|
|
|
76
|
+
## Explicit authentication
|
|
77
|
+
|
|
78
|
+
`get_auth_contract(connector, method=..., config=...)` reads immutable provider
|
|
79
|
+
facts from the bundled catalog. `build_authorization_request` formats a consent
|
|
80
|
+
URL using the caller's redirect URI, state and optional PKCE challenge. The caller
|
|
81
|
+
opens that URL, handles the callback and checks its state. `request_token` performs
|
|
82
|
+
one requested `authorization_code`, `refresh_token`, `client_credentials` or
|
|
83
|
+
`jwt_bearer` grant, where the selected method declares support. Meta's declared
|
|
84
|
+
second token exchange is part of that explicit request.
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from stackos_connectors import ConnectorAuth, request_token
|
|
88
|
+
|
|
89
|
+
token = await request_token(
|
|
90
|
+
"google-search-console",
|
|
91
|
+
auth=ConnectorAuth(
|
|
92
|
+
method="oauth2_authorization_code",
|
|
93
|
+
fields={"client_id": client_id, "client_secret": client_secret},
|
|
94
|
+
),
|
|
95
|
+
grant_type="authorization_code",
|
|
96
|
+
code=validated_callback_code,
|
|
97
|
+
redirect_uri=registered_redirect_uri,
|
|
98
|
+
code_verifier=stored_pkce_verifier,
|
|
99
|
+
http=caller_http,
|
|
100
|
+
)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Grant calls accept resolved application/key fields; action and probe calls accept
|
|
104
|
+
the method's resolved execution fields, usually an access token. The catalog's
|
|
105
|
+
`setup` and `protocol` describe acquisition separately from `fields_schema` and
|
|
106
|
+
`config_schema`. Manual token methods retain their declared refresh compatibility;
|
|
107
|
+
the library does not infer an auth method from token shape.
|
|
108
|
+
|
|
109
|
+
`TokenResult` holds sensitive in-process values. An absent `refresh_token` means
|
|
110
|
+
the response did not rotate it. `scopes_present=False` distinguishes omitted
|
|
111
|
+
scope evidence from an explicitly empty grant. For a successful Google JWT grant,
|
|
112
|
+
the immutable contract supplies the signed request's scopes; the consumer can
|
|
113
|
+
apply the reviewed omission rule without changing the token response's provenance.
|
|
114
|
+
The caller decides how to preserve prior evidence, enforce permissions and store
|
|
115
|
+
results. `OAuthTokenError` exposes bounded categories/status and repair facts,
|
|
116
|
+
without raw provider response bodies. Repr suppression is not a storage policy.
|
|
117
|
+
|
|
118
|
+
`probe_credentials(connector, auth=..., options=..., context=...)` explicitly
|
|
119
|
+
tests a resolved credential through a fixed provider binding. It returns safe
|
|
120
|
+
provider facts and optional `AuthProbeEvidence`; it does not establish application
|
|
121
|
+
readiness or permissions. `project_probe_config` projects portable config and
|
|
122
|
+
retains supported legacy probe aliases. The caller chooses the IMAP native mailbox
|
|
123
|
+
through `CallOptions(provider_context={"mailbox": ...})`. Google Ads/Workspace
|
|
124
|
+
service-account probes only report resolved-token presence and unverified resource
|
|
125
|
+
access; they make no HTTP call or new-grant claim.
|
|
126
|
+
|
|
127
|
+
Google JWT validation/signing is shared across the five declared service-account
|
|
128
|
+
methods. Credentials never come from ambient identity or key-supplied endpoints.
|
|
129
|
+
Provider details live in `connectors/<provider>/docs/auth.md` and the catalog.
|
|
130
|
+
Google Indexing retains its existing resolved-token action/probe contract; this
|
|
131
|
+
release adds no Indexing JWT acquisition method.
|
|
132
|
+
|
|
133
|
+
Provider-local pure helpers cover Telegram authorization request/challenge/state
|
|
134
|
+
translation (`connectors.telegram.auth`), Slack v0 HMAC verification
|
|
135
|
+
(`connectors.slack_bot.auth.verify_signature_v0`) and HubSpot v3 HMAC verification
|
|
136
|
+
(`connectors.hubspot.signature.verify_signature_v3`). Callers own native sessions,
|
|
137
|
+
encrypted custody, challenge expiry, ingress routing, trusted canonical URI,
|
|
138
|
+
timestamp/replay checks and policy. HubSpot v2 verification is not implemented.
|
|
139
|
+
|
|
140
|
+
No library call to discovery, probe or action execution starts an authorization
|
|
141
|
+
flow, refreshes a token, opens a native session, stores credentials or selects
|
|
142
|
+
readiness. Remote token revocation is not part of this API.
|
|
143
|
+
|
|
74
144
|
For file-producing actions, pass `CallOptions(output_dir=Path(...))` and consume
|
|
75
145
|
the plain descriptors in `result.files`. The library does not create application
|
|
76
146
|
artifacts or public download URLs. Telegram actions require an already authorized
|
|
@@ -118,10 +188,10 @@ Python 3.12 or newer is required. Source:
|
|
|
118
188
|
Published releases can be installed with:
|
|
119
189
|
|
|
120
190
|
```bash
|
|
121
|
-
python -m pip install stackos-connectors==0.
|
|
191
|
+
python -m pip install stackos-connectors==0.2.0
|
|
122
192
|
```
|
|
123
193
|
|
|
124
|
-
Or add `stackos-connectors==0.
|
|
194
|
+
Or add `stackos-connectors==0.2.0` to your Python dependency requirements.
|
|
125
195
|
|
|
126
196
|
Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
|
|
127
197
|
build a wheel with `python -m build --wheel` and install that wheel. Runtime use
|
|
@@ -4,8 +4,10 @@ A Python library of named provider connectors. A caller supplies a connector,
|
|
|
4
4
|
action, input data and resolved authentication. The library maps that action to
|
|
5
5
|
the provider protocol and returns provider output, metadata and file descriptors.
|
|
6
6
|
|
|
7
|
-
The consumer owns credential storage
|
|
8
|
-
workflow decisions and audit.
|
|
7
|
+
The consumer owns credential storage, when to authorize or refresh, persistent
|
|
8
|
+
state, workflow decisions and audit. Explicit package functions implement provider
|
|
9
|
+
authorization URLs, token grants, probes and signature checks. They never start
|
|
10
|
+
authorization, refresh tokens or persist state implicitly. Provider implementations use plain contracts and
|
|
9
11
|
can accept caller-owned HTTP clients, rate buckets and native protocol sessions.
|
|
10
12
|
|
|
11
13
|
Each integration is grouped under `src/stackos_connectors/connectors/`:
|
|
@@ -55,6 +57,74 @@ execution; existing names cannot be replaced.
|
|
|
55
57
|
`CallOptions.timeout=None` preserves each provider's default. A numeric timeout
|
|
56
58
|
overrides that default. A supplied HTTP client remains caller-owned.
|
|
57
59
|
|
|
60
|
+
## Explicit authentication
|
|
61
|
+
|
|
62
|
+
`get_auth_contract(connector, method=..., config=...)` reads immutable provider
|
|
63
|
+
facts from the bundled catalog. `build_authorization_request` formats a consent
|
|
64
|
+
URL using the caller's redirect URI, state and optional PKCE challenge. The caller
|
|
65
|
+
opens that URL, handles the callback and checks its state. `request_token` performs
|
|
66
|
+
one requested `authorization_code`, `refresh_token`, `client_credentials` or
|
|
67
|
+
`jwt_bearer` grant, where the selected method declares support. Meta's declared
|
|
68
|
+
second token exchange is part of that explicit request.
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from stackos_connectors import ConnectorAuth, request_token
|
|
72
|
+
|
|
73
|
+
token = await request_token(
|
|
74
|
+
"google-search-console",
|
|
75
|
+
auth=ConnectorAuth(
|
|
76
|
+
method="oauth2_authorization_code",
|
|
77
|
+
fields={"client_id": client_id, "client_secret": client_secret},
|
|
78
|
+
),
|
|
79
|
+
grant_type="authorization_code",
|
|
80
|
+
code=validated_callback_code,
|
|
81
|
+
redirect_uri=registered_redirect_uri,
|
|
82
|
+
code_verifier=stored_pkce_verifier,
|
|
83
|
+
http=caller_http,
|
|
84
|
+
)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Grant calls accept resolved application/key fields; action and probe calls accept
|
|
88
|
+
the method's resolved execution fields, usually an access token. The catalog's
|
|
89
|
+
`setup` and `protocol` describe acquisition separately from `fields_schema` and
|
|
90
|
+
`config_schema`. Manual token methods retain their declared refresh compatibility;
|
|
91
|
+
the library does not infer an auth method from token shape.
|
|
92
|
+
|
|
93
|
+
`TokenResult` holds sensitive in-process values. An absent `refresh_token` means
|
|
94
|
+
the response did not rotate it. `scopes_present=False` distinguishes omitted
|
|
95
|
+
scope evidence from an explicitly empty grant. For a successful Google JWT grant,
|
|
96
|
+
the immutable contract supplies the signed request's scopes; the consumer can
|
|
97
|
+
apply the reviewed omission rule without changing the token response's provenance.
|
|
98
|
+
The caller decides how to preserve prior evidence, enforce permissions and store
|
|
99
|
+
results. `OAuthTokenError` exposes bounded categories/status and repair facts,
|
|
100
|
+
without raw provider response bodies. Repr suppression is not a storage policy.
|
|
101
|
+
|
|
102
|
+
`probe_credentials(connector, auth=..., options=..., context=...)` explicitly
|
|
103
|
+
tests a resolved credential through a fixed provider binding. It returns safe
|
|
104
|
+
provider facts and optional `AuthProbeEvidence`; it does not establish application
|
|
105
|
+
readiness or permissions. `project_probe_config` projects portable config and
|
|
106
|
+
retains supported legacy probe aliases. The caller chooses the IMAP native mailbox
|
|
107
|
+
through `CallOptions(provider_context={"mailbox": ...})`. Google Ads/Workspace
|
|
108
|
+
service-account probes only report resolved-token presence and unverified resource
|
|
109
|
+
access; they make no HTTP call or new-grant claim.
|
|
110
|
+
|
|
111
|
+
Google JWT validation/signing is shared across the five declared service-account
|
|
112
|
+
methods. Credentials never come from ambient identity or key-supplied endpoints.
|
|
113
|
+
Provider details live in `connectors/<provider>/docs/auth.md` and the catalog.
|
|
114
|
+
Google Indexing retains its existing resolved-token action/probe contract; this
|
|
115
|
+
release adds no Indexing JWT acquisition method.
|
|
116
|
+
|
|
117
|
+
Provider-local pure helpers cover Telegram authorization request/challenge/state
|
|
118
|
+
translation (`connectors.telegram.auth`), Slack v0 HMAC verification
|
|
119
|
+
(`connectors.slack_bot.auth.verify_signature_v0`) and HubSpot v3 HMAC verification
|
|
120
|
+
(`connectors.hubspot.signature.verify_signature_v3`). Callers own native sessions,
|
|
121
|
+
encrypted custody, challenge expiry, ingress routing, trusted canonical URI,
|
|
122
|
+
timestamp/replay checks and policy. HubSpot v2 verification is not implemented.
|
|
123
|
+
|
|
124
|
+
No library call to discovery, probe or action execution starts an authorization
|
|
125
|
+
flow, refreshes a token, opens a native session, stores credentials or selects
|
|
126
|
+
readiness. Remote token revocation is not part of this API.
|
|
127
|
+
|
|
58
128
|
For file-producing actions, pass `CallOptions(output_dir=Path(...))` and consume
|
|
59
129
|
the plain descriptors in `result.files`. The library does not create application
|
|
60
130
|
artifacts or public download URLs. Telegram actions require an already authorized
|
|
@@ -102,10 +172,10 @@ Python 3.12 or newer is required. Source:
|
|
|
102
172
|
Published releases can be installed with:
|
|
103
173
|
|
|
104
174
|
```bash
|
|
105
|
-
python -m pip install stackos-connectors==0.
|
|
175
|
+
python -m pip install stackos-connectors==0.2.0
|
|
106
176
|
```
|
|
107
177
|
|
|
108
|
-
Or add `stackos-connectors==0.
|
|
178
|
+
Or add `stackos-connectors==0.2.0` to your Python dependency requirements.
|
|
109
179
|
|
|
110
180
|
Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
|
|
111
181
|
build a wheel with `python -m build --wheel` and install that wheel. Runtime use
|
|
@@ -4,6 +4,15 @@ from collections.abc import Mapping
|
|
|
4
4
|
from functools import lru_cache
|
|
5
5
|
from typing import Any
|
|
6
6
|
|
|
7
|
+
from .auth import (
|
|
8
|
+
AuthorizationRequest,
|
|
9
|
+
OAuthProviderContract,
|
|
10
|
+
OAuthTokenError,
|
|
11
|
+
TokenResult,
|
|
12
|
+
build_authorization_request,
|
|
13
|
+
get_auth_contract,
|
|
14
|
+
request_token,
|
|
15
|
+
)
|
|
7
16
|
from .contracts import (
|
|
8
17
|
ActionDefinition,
|
|
9
18
|
AuthMethodDefinition,
|
|
@@ -18,6 +27,12 @@ from .contracts import (
|
|
|
18
27
|
ValidationIssue,
|
|
19
28
|
)
|
|
20
29
|
from .errors import ConnectorError, IntegrationDownError, RateLimitedError, ValidationError
|
|
30
|
+
from .probe import (
|
|
31
|
+
AuthMethodProbeContext,
|
|
32
|
+
AuthProbeEvidence,
|
|
33
|
+
probe_credentials,
|
|
34
|
+
project_probe_config,
|
|
35
|
+
)
|
|
21
36
|
from .registry import ConnectorClient, ConnectorRegistry
|
|
22
37
|
|
|
23
38
|
|
|
@@ -74,6 +89,9 @@ def describe(connector: str, action: str | None = None) -> dict[str, Any]:
|
|
|
74
89
|
__all__ = [
|
|
75
90
|
"ActionDefinition",
|
|
76
91
|
"AuthMethodDefinition",
|
|
92
|
+
"AuthMethodProbeContext",
|
|
93
|
+
"AuthProbeEvidence",
|
|
94
|
+
"AuthorizationRequest",
|
|
77
95
|
"CallOptions",
|
|
78
96
|
"Connector",
|
|
79
97
|
"ConnectorAuth",
|
|
@@ -85,15 +103,23 @@ __all__ = [
|
|
|
85
103
|
"ConnectorResult",
|
|
86
104
|
"IntegrationDownError",
|
|
87
105
|
"NativeSession",
|
|
106
|
+
"OAuthProviderContract",
|
|
107
|
+
"OAuthTokenError",
|
|
88
108
|
"RateLimitedError",
|
|
89
109
|
"RateLimiter",
|
|
110
|
+
"TokenResult",
|
|
90
111
|
"ValidationError",
|
|
91
112
|
"ValidationIssue",
|
|
113
|
+
"build_authorization_request",
|
|
92
114
|
"describe",
|
|
93
115
|
"estimate_cost",
|
|
94
116
|
"execute",
|
|
117
|
+
"get_auth_contract",
|
|
95
118
|
"get_default_client",
|
|
96
119
|
"list_connectors",
|
|
120
|
+
"probe_credentials",
|
|
121
|
+
"project_probe_config",
|
|
122
|
+
"request_token",
|
|
97
123
|
"validate",
|
|
98
124
|
"validate_data",
|
|
99
125
|
]
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"""Explicit provider authentication protocols; the caller owns every lifecycle decision.
|
|
2
|
+
|
|
3
|
+
These functions never store credentials, launch consent, choose when to renew, or
|
|
4
|
+
enforce application readiness. Token results are sensitive in-process values.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Mapping, Sequence
|
|
10
|
+
from dataclasses import dataclass, field, fields, replace
|
|
11
|
+
from importlib import import_module
|
|
12
|
+
from typing import Any, Literal
|
|
13
|
+
from urllib.parse import urlencode
|
|
14
|
+
|
|
15
|
+
import httpx
|
|
16
|
+
|
|
17
|
+
from .contracts import ConnectorAuth, freeze, thaw
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class OAuthTokenError(ValueError):
|
|
21
|
+
"""Allowlisted protocol diagnostics, never provider bodies or request objects."""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
detail: str,
|
|
26
|
+
*,
|
|
27
|
+
provider_key: str | None = None,
|
|
28
|
+
category: str = "invalid_input",
|
|
29
|
+
retryable: bool = False,
|
|
30
|
+
repair_required: bool = False,
|
|
31
|
+
status_code: int | None = None,
|
|
32
|
+
invalid_fields: Sequence[str] = (),
|
|
33
|
+
) -> None:
|
|
34
|
+
super().__init__(detail)
|
|
35
|
+
self.provider_key = provider_key
|
|
36
|
+
self.category = category
|
|
37
|
+
self.retryable = retryable
|
|
38
|
+
self.repair_required = repair_required
|
|
39
|
+
self.status_code = status_code
|
|
40
|
+
self.invalid_fields = tuple(invalid_fields)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class OAuthProviderContract:
|
|
45
|
+
provider_key: str
|
|
46
|
+
flow: Literal["authorization_code", "client_credentials", "jwt_bearer"]
|
|
47
|
+
token_endpoint: str
|
|
48
|
+
authorization_endpoint: str | None = None
|
|
49
|
+
include_response_type: bool = True
|
|
50
|
+
scopes: tuple[str, ...] = ()
|
|
51
|
+
scope_separator: str = " "
|
|
52
|
+
optional_scope_parameter: str | None = None
|
|
53
|
+
client_auth_style: Literal["body", "basic"] = "body"
|
|
54
|
+
pkce_mode: Literal["required", "supported", "unavailable"] = "unavailable"
|
|
55
|
+
authorization_params: tuple[tuple[str, str], ...] = ()
|
|
56
|
+
token_params: tuple[tuple[str, str], ...] = ()
|
|
57
|
+
response_metadata_fields: tuple[str, ...] = ()
|
|
58
|
+
response_scope_fields: tuple[str, ...] = ("scope",)
|
|
59
|
+
response_account_id_field: str | None = "id"
|
|
60
|
+
authorization_code_response_requirements: tuple[str, ...] = ()
|
|
61
|
+
refresh_token_response_requirements: tuple[str, ...] = ()
|
|
62
|
+
required_token_type: str | None = None
|
|
63
|
+
required_scope_subset: tuple[str, ...] = ()
|
|
64
|
+
hook: str | None = None
|
|
65
|
+
delegated_subject: str | None = field(default=None, repr=False)
|
|
66
|
+
grant_types: tuple[str, ...] = ()
|
|
67
|
+
response_config_fields: tuple[tuple[str, str, str], ...] = ()
|
|
68
|
+
optional_scope_bundles: Mapping[str, Any] = field(default_factory=dict)
|
|
69
|
+
|
|
70
|
+
def __post_init__(self) -> None:
|
|
71
|
+
for descriptor in fields(self):
|
|
72
|
+
value = getattr(self, descriptor.name)
|
|
73
|
+
if isinstance(value, Mapping | list | tuple):
|
|
74
|
+
object.__setattr__(self, descriptor.name, freeze(value))
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass(frozen=True)
|
|
78
|
+
class AuthorizationRequest:
|
|
79
|
+
url: str = field(repr=False)
|
|
80
|
+
required_scopes: tuple[str, ...] = ()
|
|
81
|
+
optional_scopes: tuple[str, ...] = ()
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class TokenResult:
|
|
86
|
+
access_token: str = field(repr=False)
|
|
87
|
+
refresh_token: str | None = field(default=None, repr=False)
|
|
88
|
+
expires_in: int | float | None = None
|
|
89
|
+
token_type: str | None = field(default=None, repr=False)
|
|
90
|
+
scopes: tuple[str, ...] | None = field(default=None, repr=False)
|
|
91
|
+
scopes_present: bool = False
|
|
92
|
+
account_id: str | None = field(default=None, repr=False)
|
|
93
|
+
metadata: Mapping[str, Any] = field(default_factory=dict, repr=False)
|
|
94
|
+
config_updates: Mapping[str, Any] = field(default_factory=dict, repr=False)
|
|
95
|
+
|
|
96
|
+
def __post_init__(self) -> None:
|
|
97
|
+
object.__setattr__(self, "metadata", freeze(self.metadata))
|
|
98
|
+
object.__setattr__(self, "config_updates", freeze(self.config_updates))
|
|
99
|
+
if self.scopes is not None:
|
|
100
|
+
object.__setattr__(self, "scopes", tuple(self.scopes))
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _declaration(connector: str, method: str) -> tuple[Mapping, Mapping]:
|
|
104
|
+
from . import get_default_client
|
|
105
|
+
|
|
106
|
+
metadata = get_default_client().registry.connector_metadata.get(connector)
|
|
107
|
+
if metadata is None:
|
|
108
|
+
raise OAuthTokenError("connector has no supported authentication protocol")
|
|
109
|
+
declaration = next(
|
|
110
|
+
(item for item in metadata.get("auth_methods", ()) if item["key"] == method),
|
|
111
|
+
None,
|
|
112
|
+
)
|
|
113
|
+
if declaration is None or "protocol" not in declaration or "auth_protocol" not in metadata:
|
|
114
|
+
raise OAuthTokenError(
|
|
115
|
+
"auth method has no supported authentication protocol", provider_key=connector
|
|
116
|
+
)
|
|
117
|
+
return metadata, declaration
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def get_auth_contract(
|
|
121
|
+
connector: str,
|
|
122
|
+
*,
|
|
123
|
+
method: str,
|
|
124
|
+
config: Mapping[str, Any] | None = None,
|
|
125
|
+
) -> OAuthProviderContract:
|
|
126
|
+
"""Read trusted provider facts; configuration cannot replace protocol endpoints."""
|
|
127
|
+
metadata, declaration = _declaration(connector, method)
|
|
128
|
+
data = thaw(metadata["auth_protocol"])
|
|
129
|
+
method_data = thaw(declaration["protocol"])
|
|
130
|
+
direct_scopes = method_data.pop("direct_scopes", None)
|
|
131
|
+
data.update(method_data)
|
|
132
|
+
contract = OAuthProviderContract(provider_key=connector, **data)
|
|
133
|
+
if contract.flow == "jwt_bearer":
|
|
134
|
+
from .shared.google.service_account import delegated_subject
|
|
135
|
+
|
|
136
|
+
subject = delegated_subject(connector, (config or {}).get("delegated_subject"))
|
|
137
|
+
contract = replace(contract, delegated_subject=subject)
|
|
138
|
+
if subject is None and direct_scopes is not None:
|
|
139
|
+
contract = replace(contract, scopes=tuple(direct_scopes))
|
|
140
|
+
if binding := metadata.get("auth_implementation"):
|
|
141
|
+
module_name, function_name = binding.split(":", 1)
|
|
142
|
+
contract = getattr(import_module(module_name), function_name)(contract, config or {})
|
|
143
|
+
return contract
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def build_authorization_request(
|
|
147
|
+
connector: str,
|
|
148
|
+
*,
|
|
149
|
+
auth: ConnectorAuth,
|
|
150
|
+
redirect_uri: str,
|
|
151
|
+
state: str,
|
|
152
|
+
code_challenge: str | None = None,
|
|
153
|
+
optional_scopes: Sequence[str] = (),
|
|
154
|
+
) -> AuthorizationRequest:
|
|
155
|
+
"""Format one consent URL using caller-generated state and PKCE challenge."""
|
|
156
|
+
contract = get_auth_contract(connector, method=auth.method, config=auth.config)
|
|
157
|
+
if "authorization_code" not in contract.grant_types or not contract.authorization_endpoint:
|
|
158
|
+
raise OAuthTokenError(
|
|
159
|
+
"auth method does not support authorization-code consent", provider_key=connector
|
|
160
|
+
)
|
|
161
|
+
client_id = auth.fields.get("client_id")
|
|
162
|
+
if not isinstance(client_id, str) or not client_id.strip():
|
|
163
|
+
raise OAuthTokenError("OAuth application id is missing", provider_key=connector)
|
|
164
|
+
if (
|
|
165
|
+
not isinstance(redirect_uri, str)
|
|
166
|
+
or not redirect_uri
|
|
167
|
+
or not isinstance(state, str)
|
|
168
|
+
or not state
|
|
169
|
+
):
|
|
170
|
+
raise OAuthTokenError("callback URI and state are required", provider_key=connector)
|
|
171
|
+
if code_challenge is not None and (not isinstance(code_challenge, str) or not code_challenge):
|
|
172
|
+
raise OAuthTokenError("PKCE challenge is invalid", provider_key=connector)
|
|
173
|
+
if contract.pkce_mode == "required" and not code_challenge:
|
|
174
|
+
raise OAuthTokenError("provider requires PKCE S256", provider_key=connector)
|
|
175
|
+
if contract.pkce_mode == "unavailable" and code_challenge is not None:
|
|
176
|
+
raise OAuthTokenError("provider does not support PKCE", provider_key=connector)
|
|
177
|
+
allowed_optional = {
|
|
178
|
+
scope
|
|
179
|
+
for bundle in contract.optional_scope_bundles.values()
|
|
180
|
+
for scope in bundle.get("optional_scopes", ())
|
|
181
|
+
}
|
|
182
|
+
if isinstance(optional_scopes, str) or any(
|
|
183
|
+
not isinstance(s, str) or s not in allowed_optional for s in optional_scopes
|
|
184
|
+
):
|
|
185
|
+
raise OAuthTokenError("optional scopes must be provider-declared", provider_key=connector)
|
|
186
|
+
optional = tuple(dict.fromkeys(optional_scopes))
|
|
187
|
+
if optional and not contract.optional_scope_parameter:
|
|
188
|
+
raise OAuthTokenError(
|
|
189
|
+
"provider does not support optional consent scopes", provider_key=connector
|
|
190
|
+
)
|
|
191
|
+
query = {"client_id": client_id.strip(), "redirect_uri": redirect_uri, "state": state}
|
|
192
|
+
if contract.include_response_type:
|
|
193
|
+
query["response_type"] = "code"
|
|
194
|
+
if contract.scopes:
|
|
195
|
+
query["scope"] = contract.scope_separator.join(contract.scopes)
|
|
196
|
+
if optional and contract.optional_scope_parameter:
|
|
197
|
+
query[contract.optional_scope_parameter] = contract.scope_separator.join(optional)
|
|
198
|
+
query.update(contract.authorization_params)
|
|
199
|
+
if code_challenge:
|
|
200
|
+
query.update(code_challenge=code_challenge, code_challenge_method="S256")
|
|
201
|
+
return AuthorizationRequest(
|
|
202
|
+
f"{contract.authorization_endpoint}?{urlencode(query)}",
|
|
203
|
+
contract.scopes,
|
|
204
|
+
optional,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
async def request_token(
|
|
209
|
+
connector: str,
|
|
210
|
+
*,
|
|
211
|
+
auth: ConnectorAuth,
|
|
212
|
+
grant_type: Literal["authorization_code", "refresh_token", "client_credentials", "jwt_bearer"],
|
|
213
|
+
code: str | None = None,
|
|
214
|
+
redirect_uri: str | None = None,
|
|
215
|
+
code_verifier: str | None = None,
|
|
216
|
+
refresh_token: str | None = None,
|
|
217
|
+
http: httpx.AsyncClient | None = None,
|
|
218
|
+
timeout: float = 30,
|
|
219
|
+
) -> TokenResult:
|
|
220
|
+
"""Perform exactly one explicit grant (including a declared provider second exchange)."""
|
|
221
|
+
from .shared.oauth import request_token as perform
|
|
222
|
+
|
|
223
|
+
contract = get_auth_contract(connector, method=auth.method, config=auth.config)
|
|
224
|
+
return await perform(
|
|
225
|
+
contract=contract,
|
|
226
|
+
auth=auth,
|
|
227
|
+
grant_type=grant_type,
|
|
228
|
+
code=code,
|
|
229
|
+
redirect_uri=redirect_uri,
|
|
230
|
+
code_verifier=code_verifier,
|
|
231
|
+
refresh_token=refresh_token,
|
|
232
|
+
http=http,
|
|
233
|
+
timeout=timeout,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
__all__ = [
|
|
238
|
+
"AuthorizationRequest",
|
|
239
|
+
"OAuthProviderContract",
|
|
240
|
+
"OAuthTokenError",
|
|
241
|
+
"TokenResult",
|
|
242
|
+
"build_authorization_request",
|
|
243
|
+
"get_auth_contract",
|
|
244
|
+
"request_token",
|
|
245
|
+
]
|