stackos-connectors 0.2.3__tar.gz → 0.2.4__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.2.3 → stackos_connectors-0.2.4}/PKG-INFO +12 -3
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/README.md +11 -2
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/pyproject.toml +1 -1
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/catalog.json +45 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/docs/auth.md +12 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/docs/quickbooks-online.md +5 -0
- stackos_connectors-0.2.4/src/stackos_connectors/connectors/quickbooks_online/probe.py +62 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/auth/test_probes.py +1 -1
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/packaging/installed_auth_consumer.py +22 -2
- stackos_connectors-0.2.4/tests/quickbooks_online/test_probe.py +207 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/.github/workflows/publish.yml +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/.gitignore +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/LICENSE +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/catalog/index.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/catalog/schema.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/catalog.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ahrefs/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ahrefs/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ahrefs/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ahrefs/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ahrefs/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aignc/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aignc/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aignc/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aignc/contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aignc/docs/aignc.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aignc/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/alibaba_wan/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/alibaba_wan/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/alibaba_wan/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/alibaba_wan/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/alibaba_wan/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/apollo/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/apollo/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/apollo/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/apollo/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/apollo/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/docs/s3.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/aws_s3/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedance/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedance/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedance/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedream/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedream/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedream/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/byteplus_seedream/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/clay/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/clay/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/clay/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/clay/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/clay/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/cloudflare/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/cloudflare/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/cloudflare/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/cloudflare/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/cloudflare/docs/cloudflare-dns.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/cloudflare/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/dataforseo/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/dataforseo/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/dataforseo/assets/icon.jpeg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/dataforseo/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/dataforseo/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/dataforseo/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/firecrawl/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/firecrawl/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/firecrawl/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/firecrawl/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/firecrawl/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/assets/icon.svg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/docs/ftp.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ftp/remote_tree.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ghost/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ghost/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ghost/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ghost/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ghost/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ghost/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_ads/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_analytics/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_analytics/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_analytics/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_analytics/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_analytics/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_analytics/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_gemini_image/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_gemini_image/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_gemini_image/assets/icon.webp +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_gemini_image/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_gemini_image/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_indexing/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_indexing/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_indexing/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_indexing/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_indexing/docs/google-indexing.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_indexing/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/docs/google-search-console.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_search_console/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_tag_manager/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_tag_manager/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_tag_manager/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_tag_manager/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_tag_manager/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_tag_manager/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_veo/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_veo/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_veo/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_veo/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_veo/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/google_workspace/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/http/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/http/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/http/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/docs/hubspot.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/docs/signatures.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/hubspot/signature.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ideogram/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ideogram/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ideogram/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ideogram/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/ideogram/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/assets/icon.svg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/imap/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/jina/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/jina/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/jina/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/jina/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/jina/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/kling_video/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/kling_video/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/kling_video/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/kling_video/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/kling_video/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/auth/viewer-organization.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/create.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/delete.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/resolve.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/unresolve.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/comments/update.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/create.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/delete.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/update.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/add-label.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/archive.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/create.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/remove-label.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/search.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/unarchive.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/issues/update.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/projects/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/projects/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/teams/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/teams/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/users/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/users/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/viewer/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/get.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/list.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/docs/linear.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.metadata.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/linear/schemas/root-policy-2026-07-23.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/meta_ads/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/meta_ads/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/meta_ads/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/meta_ads/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/meta_ads/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/meta_ads/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/microsoft_365/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openai_images/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openai_images/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openai_images/assets/icon.webp +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openai_images/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openai_images/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openrouter/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openrouter/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openrouter/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openrouter/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/openrouter/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/outreach/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/outreach/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/outreach/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/outreach/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/outreach/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/outreach/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/pipedrive/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/quickbooks_online/response.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reddit/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reddit/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reddit/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reddit/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reddit/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reddit/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reve/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reve/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reve/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reve/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/reve/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesforce/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/assets/icon.jpeg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/salesloft/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/serper/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/serper/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/serper/assets/icon.svg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/serper/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/serper/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/add-customer-tag.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/create-customer.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-lifetime-value.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-orders.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/list-customers.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/remove-customer-tag.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/search-customers.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/update-customer.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/adjust-inventory.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-by-sku.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-item.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-location-inventory.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-item-availability.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-levels.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-product-variant-inventory.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/set-inventory-level.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-note.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-tag.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/create-draft-order.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-by-name.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-fulfillment-status.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-timeline.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-order-variant-quantities.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-orders.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/mark-order-paid.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/search-orders.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-note.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-tags.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-collection.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product-variant.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-collection.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-by-handle.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-variant.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-collections.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-product-variants.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-products.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/search-products.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-status.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-variant.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/graphql/shopifyql.graphql +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/docs/shopify.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/payloads.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/shopify/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/sitemap/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/sitemap/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/sitemap/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/sitemap/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/constants.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/docs/signatures.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/files.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/http.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/payloads.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/results.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/slack_bot/validation.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/assets/icon.svg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/smtp/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/assets/icon.jpeg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/docs/stripe.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/stripe/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/taboola/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/taboola/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/taboola/assets/icon.svg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/taboola/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/taboola/docs/auth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/docs/auth-protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/docs/protocol.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/payloads.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/schema.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/tdlib/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/tdlib/native.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/tdlib/proxy.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/telegram/tdlib/sessions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/openapi.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/stackos-tools.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/assets.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/docs/agent-api/README.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/docs/trackbooth.md +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/schema.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/trackbooth/transport.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/wordpress/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/wordpress/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/wordpress/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/wordpress/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/wordpress/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/wordpress/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/xai_imagine/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/xai_imagine/actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/xai_imagine/assets/icon.png +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/xai_imagine/catalog.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/xai_imagine/integration.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/contracts.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/errors.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/py.typed +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/redaction.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/registry.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/base.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/byteplus/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/byteplus/ark.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/byteplus/media.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/google/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/google/batch.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/google/oauth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/google/probe.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/google/service_account.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/icons/integration.svg +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/media.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/oauth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/provider_utils.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/rate_limit.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/shared/vendor_utils.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/validation.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/auth/test_auth_redaction.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/auth/test_google_service_account.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/auth/test_oauth_contracts.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/auth/test_oauth_protocol.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/auth/test_search_console_scopes.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/conftest.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/fixtures/wire-contracts.json +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/test_hubspot_signature_protocol.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/test_named_actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/test_pipedrive_probes.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/test_probe_boundary.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/business/test_salesloft_probes.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/catalog/test_catalog.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/catalog/test_nested_resources.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/catalog/test_presentation.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_contract.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_native_result_boundary.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_nested_auth_redaction.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_preflight_redaction.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_public_key_facts.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_runtime.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_timeout_options.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_validation_data.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/core/test_validation_execution_outcome.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/mail_slack/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/mail_slack/test_native.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/mail_slack/test_probes_catalog.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/mail_slack/test_signature_protocol.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/media/test_aignc_native.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/media/test_generation_outcomes.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/media/test_media_files.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/media/test_named_media.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/packaging/test_grouped_layout.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/quickbooks_online/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/quickbooks_online/conftest.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/quickbooks_online/test_auth.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/quickbooks_online/test_reads.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/safe_refs/conftest.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/safe_refs/test_linear_transport.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/safe_refs/test_safe_refs_named_actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/safe_refs/test_stripe_transport_transport.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_authorization.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_closure_outcomes.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_native.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_payloads.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_proxy.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/telegram/test_sessions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/trackbooth/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/trackbooth/test_native.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/__init__.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/catalog_fixture.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/conftest.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_ahrefs.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_boundary_timeout.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_cloudflare.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_dataforseo.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_firecrawl.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_ftp.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_ftp_actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_google_analytics.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_google_indexing.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_google_indexing_batch.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_google_search_console.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_google_search_console_batch.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_google_tag_manager.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_jina_reader.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_named_clients.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_native_boundary.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_openrouter.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_reddit.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_s3.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_s3_actions.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_serper.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_shopify.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_sitemap.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/web/test_transport_defaults.py +0 -0
- {stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/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.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Named provider connectors with plain data and caller-owned authentication.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -191,15 +191,24 @@ Python 3.12 or newer is required. Source:
|
|
|
191
191
|
Published releases can be installed with:
|
|
192
192
|
|
|
193
193
|
```bash
|
|
194
|
-
python -m pip install stackos-connectors==0.2.
|
|
194
|
+
python -m pip install stackos-connectors==0.2.4
|
|
195
195
|
```
|
|
196
196
|
|
|
197
|
-
Or add `stackos-connectors==0.2.
|
|
197
|
+
Or add `stackos-connectors==0.2.4` to your Python dependency requirements.
|
|
198
198
|
|
|
199
199
|
Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
|
|
200
200
|
build a wheel with `python -m build --wheel` and install that wheel. Runtime use
|
|
201
201
|
needs only the installed package and its declared dependencies.
|
|
202
202
|
|
|
203
|
+
### 0.2.4 release notes
|
|
204
|
+
|
|
205
|
+
- Complete QuickBooks setup metadata with method labels and explicit required
|
|
206
|
+
environment and company realm fields.
|
|
207
|
+
- Add a credential probe through the existing validated CompanyInfo read. It
|
|
208
|
+
returns bounded company identity and leaves OAuth grant evidence unknown.
|
|
209
|
+
- Preserve the two QuickBooks read actions and Google Indexing authentication
|
|
210
|
+
support from 0.2.3.
|
|
211
|
+
|
|
203
212
|
### 0.2.3 release notes
|
|
204
213
|
|
|
205
214
|
- Restore Google Indexing service-account token acquisition through the canonical
|
|
@@ -175,15 +175,24 @@ Python 3.12 or newer is required. Source:
|
|
|
175
175
|
Published releases can be installed with:
|
|
176
176
|
|
|
177
177
|
```bash
|
|
178
|
-
python -m pip install stackos-connectors==0.2.
|
|
178
|
+
python -m pip install stackos-connectors==0.2.4
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
Or add `stackos-connectors==0.2.
|
|
181
|
+
Or add `stackos-connectors==0.2.4` to your Python dependency requirements.
|
|
182
182
|
|
|
183
183
|
Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
|
|
184
184
|
build a wheel with `python -m build --wheel` and install that wheel. Runtime use
|
|
185
185
|
needs only the installed package and its declared dependencies.
|
|
186
186
|
|
|
187
|
+
### 0.2.4 release notes
|
|
188
|
+
|
|
189
|
+
- Complete QuickBooks setup metadata with method labels and explicit required
|
|
190
|
+
environment and company realm fields.
|
|
191
|
+
- Add a credential probe through the existing validated CompanyInfo read. It
|
|
192
|
+
returns bounded company identity and leaves OAuth grant evidence unknown.
|
|
193
|
+
- Preserve the two QuickBooks read actions and Google Indexing authentication
|
|
194
|
+
support from 0.2.3.
|
|
195
|
+
|
|
187
196
|
### 0.2.3 release notes
|
|
188
197
|
|
|
189
198
|
- Restore Google Indexing service-account token acquisition through the canonical
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"name": "QuickBooks Online",
|
|
5
5
|
"description": "Bounded company and invoice reads with explicit caller-owned OAuth.",
|
|
6
6
|
"auth_type": "oauth",
|
|
7
|
+
"probe_implementation": "stackos_connectors.connectors.quickbooks_online.probe:probe",
|
|
7
8
|
"auth_methods": [
|
|
8
9
|
{
|
|
9
10
|
"key": "oauth2_authorization_code",
|
|
@@ -26,6 +27,7 @@
|
|
|
26
27
|
"type": "object",
|
|
27
28
|
"properties": {
|
|
28
29
|
"environment": {
|
|
30
|
+
"type": "string",
|
|
29
31
|
"enum": [
|
|
30
32
|
"sandbox",
|
|
31
33
|
"production"
|
|
@@ -43,6 +45,7 @@
|
|
|
43
45
|
"additionalProperties": false
|
|
44
46
|
},
|
|
45
47
|
"setup": {
|
|
48
|
+
"label": "Connect with QuickBooks",
|
|
46
49
|
"auth_type": "oauth",
|
|
47
50
|
"interactive": true,
|
|
48
51
|
"description": "Register an Intuit app, verify callback state and realmId, and supply its resolved accounting access token.",
|
|
@@ -60,6 +63,26 @@
|
|
|
60
63
|
"type": "secret",
|
|
61
64
|
"secret": true,
|
|
62
65
|
"required": true
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"key": "environment",
|
|
69
|
+
"label": "Environment",
|
|
70
|
+
"type": "select",
|
|
71
|
+
"secret": false,
|
|
72
|
+
"required": true,
|
|
73
|
+
"options": [
|
|
74
|
+
{"value": "sandbox", "label": "Sandbox"},
|
|
75
|
+
{"value": "production", "label": "Production"}
|
|
76
|
+
],
|
|
77
|
+
"description": "Choose the intended QuickBooks environment explicitly; there is no default."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"key": "realm_id",
|
|
81
|
+
"label": "Company realm ID",
|
|
82
|
+
"type": "text",
|
|
83
|
+
"secret": false,
|
|
84
|
+
"required": true,
|
|
85
|
+
"description": "Numeric company realm ID, 1–32 digits. Bind it to the intended company and verify callback realmId before token exchange."
|
|
63
86
|
}
|
|
64
87
|
]
|
|
65
88
|
},
|
|
@@ -92,6 +115,7 @@
|
|
|
92
115
|
"type": "object",
|
|
93
116
|
"properties": {
|
|
94
117
|
"environment": {
|
|
118
|
+
"type": "string",
|
|
95
119
|
"enum": [
|
|
96
120
|
"sandbox",
|
|
97
121
|
"production"
|
|
@@ -109,6 +133,7 @@
|
|
|
109
133
|
"additionalProperties": false
|
|
110
134
|
},
|
|
111
135
|
"setup": {
|
|
136
|
+
"label": "OAuth2 access token",
|
|
112
137
|
"auth_type": "oauth",
|
|
113
138
|
"interactive": false,
|
|
114
139
|
"description": "Register an Intuit app, verify callback state and realmId, and supply its resolved accounting access token.",
|
|
@@ -119,6 +144,26 @@
|
|
|
119
144
|
"type": "secret",
|
|
120
145
|
"secret": true,
|
|
121
146
|
"required": true
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"key": "environment",
|
|
150
|
+
"label": "Environment",
|
|
151
|
+
"type": "select",
|
|
152
|
+
"secret": false,
|
|
153
|
+
"required": true,
|
|
154
|
+
"options": [
|
|
155
|
+
{"value": "sandbox", "label": "Sandbox"},
|
|
156
|
+
{"value": "production", "label": "Production"}
|
|
157
|
+
],
|
|
158
|
+
"description": "Choose the intended QuickBooks environment explicitly; there is no default."
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"key": "realm_id",
|
|
162
|
+
"label": "Company realm ID",
|
|
163
|
+
"type": "text",
|
|
164
|
+
"secret": false,
|
|
165
|
+
"required": true,
|
|
166
|
+
"description": "Numeric company realm ID, 1–32 digits. Supply the company realm bound to this access token."
|
|
122
167
|
}
|
|
123
168
|
]
|
|
124
169
|
},
|
|
@@ -10,4 +10,16 @@ The caller owns application secrets, state verification, callback handling, bind
|
|
|
10
10
|
|
|
11
11
|
An omitted token response scope remains unknown; the requested accounting scope is not evidence of an actual grant. An omitted refresh token remains absent in `TokenResult`; the caller decides whether to retain a prior value. Unknown refresh outcomes require caller reconciliation, not automatic replay. `CompanyInfo.Id` is a separate entity identifier and need not equal callback `realmId`.
|
|
12
12
|
|
|
13
|
+
Both method setup forms require an explicit environment and numeric company realm
|
|
14
|
+
ID of 1–32 digits. Neither field has a default. The caller validates the intended
|
|
15
|
+
realm against the OAuth callback before exchanging a code.
|
|
16
|
+
|
|
17
|
+
`probe_credentials` reuses `quickbooks-online.company-info.get` with the resolved
|
|
18
|
+
token and configured realm. It returns optional company display name and metadata
|
|
19
|
+
containing provider-returned `company_id`, caller-configured `configured_realm_id`
|
|
20
|
+
and `environment`. `provider_account_id` remains null because the returned entity
|
|
21
|
+
ID is not realm attestation. No grants or scopes are inferred from a successful
|
|
22
|
+
CompanyInfo read. Malformed responses and credential echoes fail through the same
|
|
23
|
+
validator as the action; provider failures expose only safe status/reason facts.
|
|
24
|
+
|
|
13
25
|
Primary protocol sources: [sandbox discovery](https://developer.intuit.com/.well-known/openid_sandbox_configuration/), [production discovery](https://developer.intuit.com/.well-known/openid_configuration/), [official Python OAuth client](https://github.com/intuit/oauth-pythonclient/blob/master/intuitlib/client.py), and [accounting scope](https://github.com/intuit/oauth-pythonclient/blob/master/intuitlib/enums.py). Local fixture verification does not establish live app consent or sandbox compatibility.
|
|
@@ -19,6 +19,11 @@ A missing `Invoice` array in an otherwise empty `QueryResponse` means an empty p
|
|
|
19
19
|
|
|
20
20
|
The consumer owns page traversal, cross-page duplicate detection, aggregate size/count bounds, empty-scan handling, overflow detection, persistence and publication. A short page can terminate a declared traversal, but offset pagination is not a transactionally isolated snapshot. The returned `realm_id` repeats request context, not independent provider attestation. Provider faults return fixed safe error codes and status, never raw response bodies, tokens or transport exception text.
|
|
21
21
|
|
|
22
|
+
The explicit credential probe calls the existing CompanyInfo action and shares
|
|
23
|
+
its validation, transport, retry bounds and redaction. It reports only safe company
|
|
24
|
+
identity, keeps configured realm context distinct from `CompanyInfo.Id`, and does
|
|
25
|
+
not establish OAuth scope grants. See [authentication](auth.md) for its result.
|
|
26
|
+
|
|
22
27
|
Run local checks with `.venv/bin/python -B -m pytest tests/quickbooks_online tests/auth tests/catalog tests/packaging -p no:cacheprovider` and `.venv/bin/ruff check src/stackos_connectors/connectors/quickbooks_online tests/quickbooks_online`. The standalone installed-wheel driver in `tests/packaging/installed_auth_consumer.py` uses injected transports with live networking prohibited. Live Intuit consent/provider verification is a separate gate.
|
|
23
28
|
|
|
24
29
|
References: [Invoice API](https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/invoice), [limits and throttling](https://static.developer.intuit.com/output_html/qbo/docs/learn/limits-and-throttles.html), [authentication](auth.md).
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Company identity probe using the existing validated QuickBooks read action."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from stackos_connectors import CallOptions, ConnectorAuth, get_default_client
|
|
6
|
+
from stackos_connectors.errors import ConnectorError, IntegrationDownError, RateLimitedError
|
|
7
|
+
from stackos_connectors.probe import AuthMethodProbeContext
|
|
8
|
+
|
|
9
|
+
_SAFE_ERROR_REASONS = frozenset(
|
|
10
|
+
{
|
|
11
|
+
"invalid_response",
|
|
12
|
+
"authentication_failed",
|
|
13
|
+
"permission_denied",
|
|
14
|
+
"rate_limited",
|
|
15
|
+
"provider_unavailable",
|
|
16
|
+
"provider_failure",
|
|
17
|
+
"network_error",
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
async def probe(
|
|
23
|
+
*, auth: ConnectorAuth, options: CallOptions, context: AuthMethodProbeContext
|
|
24
|
+
) -> dict[str, Any]:
|
|
25
|
+
try:
|
|
26
|
+
result = await get_default_client().execute(
|
|
27
|
+
"quickbooks-online", "quickbooks-online.company-info.get", {}, auth, options
|
|
28
|
+
)
|
|
29
|
+
except ConnectorError as exc:
|
|
30
|
+
data: dict[str, Any] = {"stage": "test", "reason_code": "probe_error"}
|
|
31
|
+
reason = (
|
|
32
|
+
exc.provider_error.get("reason_code") if isinstance(exc.provider_error, dict) else None
|
|
33
|
+
)
|
|
34
|
+
if isinstance(reason, str) and reason in _SAFE_ERROR_REASONS:
|
|
35
|
+
data["reason_code"] = reason
|
|
36
|
+
status = exc.provider_status_code
|
|
37
|
+
if type(status) is int and 100 <= status <= 599:
|
|
38
|
+
data["status"] = status
|
|
39
|
+
error_type = RateLimitedError if status == 429 else IntegrationDownError
|
|
40
|
+
raise error_type("QuickBooks CompanyInfo probe failed.", data=data) from None
|
|
41
|
+
|
|
42
|
+
company = result.output_json
|
|
43
|
+
return {
|
|
44
|
+
"ok": True,
|
|
45
|
+
"vendor": "quickbooks-online",
|
|
46
|
+
"status": "ok",
|
|
47
|
+
"summary": "QuickBooks CompanyInfo read succeeded for the configured realm.",
|
|
48
|
+
"metadata": {
|
|
49
|
+
"evidence": {
|
|
50
|
+
"account": {
|
|
51
|
+
# CompanyInfo.Id is an entity id, not the account's realm id.
|
|
52
|
+
"provider_account_id": None,
|
|
53
|
+
"display_name": company.get("company_name"),
|
|
54
|
+
"metadata": {
|
|
55
|
+
"company_id": company["company_id"],
|
|
56
|
+
"configured_realm_id": company["realm_id"],
|
|
57
|
+
"environment": auth.config["environment"],
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
}
|
|
@@ -385,5 +385,5 @@ def test_probe_bindings_are_fixed_and_metadata_discovery_does_not_probe(monkeypa
|
|
|
385
385
|
for key, metadata in get_default_client().registry.connector_metadata.items()
|
|
386
386
|
if metadata.get("probe_implementation")
|
|
387
387
|
}
|
|
388
|
-
assert len(bound) ==
|
|
388
|
+
assert len(bound) == 38
|
|
389
389
|
assert all(project_probe_config(key, {}) == {} for key in bound)
|
{stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/tests/packaging/installed_auth_consumer.py
RENAMED
|
@@ -58,6 +58,12 @@ ACCESS = "driver-access-canary"
|
|
|
58
58
|
|
|
59
59
|
async def quickbooks_reads(client):
|
|
60
60
|
"""Exercise the installed QBO action factory through the public API."""
|
|
61
|
+
description = client.describe("quickbooks-online")
|
|
62
|
+
assert len(description["actions"]) == 2
|
|
63
|
+
for method in description["auth_methods"]:
|
|
64
|
+
assert method["setup"]["label"]
|
|
65
|
+
setup_fields = {field["key"]: field for field in method["setup"]["fields"]}
|
|
66
|
+
assert setup_fields["environment"]["required"] and setup_fields["realm_id"]["required"]
|
|
61
67
|
raw = '{ "Id":"7", "TxnDate":"2026-01-31", "TotalAmt":9007199254740993.0100, "Balance":-0.001 }'
|
|
62
68
|
calls = []
|
|
63
69
|
|
|
@@ -110,8 +116,21 @@ async def quickbooks_reads(client):
|
|
|
110
116
|
)
|
|
111
117
|
assert page.output_json["invoices"] == [{"native_id": "7", "raw_json": raw}]
|
|
112
118
|
assert page.output_json["count"] == 1
|
|
119
|
+
probe = await probe_credentials("quickbooks-online", auth=auth, options=options)
|
|
120
|
+
assert probe["ok"]
|
|
121
|
+
assert probe["metadata"]["evidence"] == {
|
|
122
|
+
"account": {
|
|
123
|
+
"provider_account_id": None,
|
|
124
|
+
"display_name": "Synthetic",
|
|
125
|
+
"metadata": {
|
|
126
|
+
"company_id": "1",
|
|
127
|
+
"configured_realm_id": "123456789",
|
|
128
|
+
"environment": "sandbox",
|
|
129
|
+
},
|
|
130
|
+
}
|
|
131
|
+
}
|
|
113
132
|
assert not http.is_closed
|
|
114
|
-
assert len(calls) ==
|
|
133
|
+
assert len(calls) == 3
|
|
115
134
|
|
|
116
135
|
|
|
117
136
|
async def main():
|
|
@@ -202,7 +221,6 @@ async def main():
|
|
|
202
221
|
assert result.access_token == ACCESS and result.scopes_present
|
|
203
222
|
assert ACCESS not in repr(result) and SECRET not in repr(auth)
|
|
204
223
|
assert len(grant_calls) == 17 # Meta explicitly performs its second exchange.
|
|
205
|
-
await quickbooks_reads(client)
|
|
206
224
|
|
|
207
225
|
async with httpx.AsyncClient(
|
|
208
226
|
transport=httpx.MockTransport(
|
|
@@ -302,6 +320,7 @@ async def main():
|
|
|
302
320
|
|
|
303
321
|
auth_api.request_token = implicit_grant
|
|
304
322
|
oauth_protocol.request_token = implicit_grant
|
|
323
|
+
await quickbooks_reads(client)
|
|
305
324
|
client.describe("google-workspace")
|
|
306
325
|
config = project_probe_config(
|
|
307
326
|
"wordpress", {"site_url": "https://fixture.test", "account_ref": "private"}
|
|
@@ -396,6 +415,7 @@ async def main():
|
|
|
396
415
|
"slack_v0",
|
|
397
416
|
"hubspot_v3",
|
|
398
417
|
"quickbooks_exact_reads",
|
|
418
|
+
"quickbooks_company_probe",
|
|
399
419
|
],
|
|
400
420
|
"network": "blocked; injected edges only",
|
|
401
421
|
"origins": origins,
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import socket
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from stackos_connectors import CallOptions, ConnectorAuth, get_default_client, probe_credentials
|
|
8
|
+
from stackos_connectors.errors import ConnectorError, IntegrationDownError, ValidationError
|
|
9
|
+
from stackos_connectors.probe import AuthProbeEvidence, project_probe_config
|
|
10
|
+
|
|
11
|
+
PROVIDER = "quickbooks-online"
|
|
12
|
+
TOKEN = "qbo-probe-access-canary"
|
|
13
|
+
CONFIG = {"environment": "sandbox", "realm_id": "123456789"}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@pytest.fixture(autouse=True)
|
|
17
|
+
def no_implicit_grant_or_network(monkeypatch):
|
|
18
|
+
def forbidden(*args, **kwargs):
|
|
19
|
+
raise AssertionError("probe must use the supplied token and injected HTTP transport")
|
|
20
|
+
|
|
21
|
+
monkeypatch.setattr(socket.socket, "connect", forbidden)
|
|
22
|
+
monkeypatch.setattr(socket, "getaddrinfo", forbidden)
|
|
23
|
+
monkeypatch.setattr("stackos_connectors.auth.request_token", forbidden)
|
|
24
|
+
monkeypatch.setattr("stackos_connectors.shared.oauth.request_token", forbidden)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@pytest.mark.parametrize("method", ["oauth2_authorization_code", "oauth2_token"])
|
|
28
|
+
def test_setup_declares_required_explicit_company_context(method):
|
|
29
|
+
description = get_default_client().describe(PROVIDER)
|
|
30
|
+
declaration = next(item for item in description["auth_methods"] if item["key"] == method)
|
|
31
|
+
setup = declaration["setup"]
|
|
32
|
+
assert setup["label"]
|
|
33
|
+
fields = {field["key"]: field for field in setup["fields"]}
|
|
34
|
+
environment, realm = fields["environment"], fields["realm_id"]
|
|
35
|
+
assert environment["type"] == "select" and environment["required"]
|
|
36
|
+
assert not environment["secret"]
|
|
37
|
+
assert {option["value"] for option in environment["options"]} == {"sandbox", "production"}
|
|
38
|
+
assert realm["type"] == "text" and realm["required"] and not realm["secret"]
|
|
39
|
+
assert "numeric" in realm["description"].lower()
|
|
40
|
+
schema = declaration["config_schema"]
|
|
41
|
+
assert schema["required"] == ["environment", "realm_id"]
|
|
42
|
+
assert schema["properties"]["realm_id"]["pattern"] == "^[0-9]{1,32}$"
|
|
43
|
+
assert "default" not in schema["properties"]["environment"]
|
|
44
|
+
assert "default" not in environment and not setup.get("config")
|
|
45
|
+
assert project_probe_config(PROVIDER, {**CONFIG, "account_ref": "private-host-ref"}) == CONFIG
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@pytest.mark.parametrize("method", ["oauth2_authorization_code", "oauth2_token"])
|
|
49
|
+
@pytest.mark.parametrize(
|
|
50
|
+
"environment,host",
|
|
51
|
+
[("sandbox", "sandbox-quickbooks.api.intuit.com"), ("production", "quickbooks.api.intuit.com")],
|
|
52
|
+
)
|
|
53
|
+
async def test_probe_uses_company_read_and_preserves_distinct_identity(method, environment, host):
|
|
54
|
+
calls = []
|
|
55
|
+
|
|
56
|
+
class Limiter:
|
|
57
|
+
count = 0
|
|
58
|
+
|
|
59
|
+
async def acquire(self, n=1):
|
|
60
|
+
self.count += 1
|
|
61
|
+
|
|
62
|
+
limiter = Limiter()
|
|
63
|
+
|
|
64
|
+
def handle(request):
|
|
65
|
+
calls.append(request)
|
|
66
|
+
assert request.method == "GET"
|
|
67
|
+
assert str(request.url) == f"https://{host}/v3/company/123456789/companyinfo/123456789"
|
|
68
|
+
assert request.headers["authorization"] == f"Bearer {TOKEN}"
|
|
69
|
+
assert request.extensions["timeout"]["read"] == 0.5
|
|
70
|
+
return httpx.Response(
|
|
71
|
+
200,
|
|
72
|
+
json={"CompanyInfo": {"Id": "1", "CompanyName": "Example", "Email": "private"}},
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
async with httpx.AsyncClient(transport=httpx.MockTransport(handle)) as http:
|
|
76
|
+
result = await probe_credentials(
|
|
77
|
+
PROVIDER,
|
|
78
|
+
auth=ConnectorAuth(
|
|
79
|
+
method, {"access_token": TOKEN}, {**CONFIG, "environment": environment}
|
|
80
|
+
),
|
|
81
|
+
options=CallOptions(http=http, timeout=0.5, rate_limiter=limiter),
|
|
82
|
+
)
|
|
83
|
+
assert not http.is_closed
|
|
84
|
+
assert result["ok"] and result["vendor"] == PROVIDER and result["status"] == "ok"
|
|
85
|
+
evidence = result["metadata"]["evidence"]
|
|
86
|
+
assert evidence == {
|
|
87
|
+
"account": {
|
|
88
|
+
"provider_account_id": None,
|
|
89
|
+
"display_name": "Example",
|
|
90
|
+
"metadata": {
|
|
91
|
+
"company_id": "1",
|
|
92
|
+
"configured_realm_id": "123456789",
|
|
93
|
+
"environment": environment,
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
assert AuthProbeEvidence.model_validate(evidence).grants is None
|
|
98
|
+
assert TOKEN not in json.dumps(result) and "private" not in json.dumps(result)
|
|
99
|
+
assert len(calls) == 1 and limiter.count == 1
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
async def test_probe_optional_company_name_does_not_gain_scope_evidence():
|
|
103
|
+
async with httpx.AsyncClient(
|
|
104
|
+
transport=httpx.MockTransport(
|
|
105
|
+
lambda r: httpx.Response(200, json={"CompanyInfo": {"Id": "1"}})
|
|
106
|
+
)
|
|
107
|
+
) as http:
|
|
108
|
+
result = await probe_credentials(
|
|
109
|
+
PROVIDER,
|
|
110
|
+
auth=ConnectorAuth("oauth2_token", {"access_token": TOKEN}, CONFIG),
|
|
111
|
+
options=CallOptions(http=http),
|
|
112
|
+
)
|
|
113
|
+
evidence = result["metadata"]["evidence"]
|
|
114
|
+
assert evidence["account"]["display_name"] is None
|
|
115
|
+
assert "grants" not in evidence and "scope" not in json.dumps(result)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@pytest.mark.parametrize(
|
|
119
|
+
"config",
|
|
120
|
+
[
|
|
121
|
+
{},
|
|
122
|
+
{"realm_id": "123"},
|
|
123
|
+
{"environment": "sandbox"},
|
|
124
|
+
{**CONFIG, "environment": "unknown"},
|
|
125
|
+
{**CONFIG, "realm_id": "../123"},
|
|
126
|
+
{**CONFIG, "realm_id": 123},
|
|
127
|
+
],
|
|
128
|
+
)
|
|
129
|
+
async def test_probe_rejects_missing_or_invalid_context_before_io(config):
|
|
130
|
+
with pytest.raises(ValidationError, match="inputs are invalid"):
|
|
131
|
+
await probe_credentials(
|
|
132
|
+
PROVIDER, auth=ConnectorAuth("oauth2_token", {"access_token": TOKEN}, config)
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@pytest.mark.parametrize(
|
|
137
|
+
"body",
|
|
138
|
+
[
|
|
139
|
+
b"not json",
|
|
140
|
+
b"{}",
|
|
141
|
+
b'{"CompanyInfo":{"Id":1}}',
|
|
142
|
+
b'{"CompanyInfo":{"Id":"1","Id":"2"}}',
|
|
143
|
+
b'{"CompanyInfo":{"Id":"1","CompanyName":""}}',
|
|
144
|
+
json.dumps({"CompanyInfo": {"Id": "1", "CompanyName": TOKEN}}).encode(),
|
|
145
|
+
json.dumps({"CompanyInfo": {"Id": "1", "private": TOKEN}}).encode(),
|
|
146
|
+
],
|
|
147
|
+
)
|
|
148
|
+
async def test_probe_reuses_malformed_and_credential_echo_rejection(body):
|
|
149
|
+
async with httpx.AsyncClient(
|
|
150
|
+
transport=httpx.MockTransport(lambda r: httpx.Response(200, content=body))
|
|
151
|
+
) as http:
|
|
152
|
+
with pytest.raises(IntegrationDownError) as caught:
|
|
153
|
+
await probe_credentials(
|
|
154
|
+
PROVIDER,
|
|
155
|
+
auth=ConnectorAuth("oauth2_token", {"access_token": TOKEN}, CONFIG),
|
|
156
|
+
options=CallOptions(http=http),
|
|
157
|
+
)
|
|
158
|
+
assert caught.value.data == {"stage": "test", "reason_code": "invalid_response"}
|
|
159
|
+
assert TOKEN not in str(caught.value.__dict__)
|
|
160
|
+
assert caught.value.__cause__ is None
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@pytest.mark.parametrize(
|
|
164
|
+
"status,reason",
|
|
165
|
+
[
|
|
166
|
+
(401, "authentication_failed"),
|
|
167
|
+
(403, "permission_denied"),
|
|
168
|
+
(429, "rate_limited"),
|
|
169
|
+
(503, "provider_unavailable"),
|
|
170
|
+
],
|
|
171
|
+
)
|
|
172
|
+
async def test_probe_preserves_safe_provider_error_without_body(status, reason):
|
|
173
|
+
async with httpx.AsyncClient(
|
|
174
|
+
transport=httpx.MockTransport(
|
|
175
|
+
lambda r: httpx.Response(
|
|
176
|
+
status,
|
|
177
|
+
json={"Fault": {"Error": [{"Message": f"private-body {TOKEN}"}]}},
|
|
178
|
+
headers={"Retry-After": "0.001"},
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
) as http:
|
|
182
|
+
with pytest.raises(IntegrationDownError) as caught:
|
|
183
|
+
await probe_credentials(
|
|
184
|
+
PROVIDER,
|
|
185
|
+
auth=ConnectorAuth("oauth2_token", {"access_token": TOKEN}, CONFIG),
|
|
186
|
+
options=CallOptions(http=http),
|
|
187
|
+
)
|
|
188
|
+
assert caught.value.data == {"stage": "test", "status": status, "reason_code": reason}
|
|
189
|
+
assert TOKEN not in str(caught.value.__dict__) and "private-body" not in str(
|
|
190
|
+
caught.value.__dict__
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
async def test_probe_never_returns_unreviewed_exception_details(monkeypatch):
|
|
195
|
+
async def fail(*args, **kwargs):
|
|
196
|
+
raise ConnectorError(
|
|
197
|
+
f"unsafe-detail {TOKEN}",
|
|
198
|
+
provider_error={"reason_code": "unsafe-reason", "body": f"unsafe-body {TOKEN}"},
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
monkeypatch.setattr(get_default_client(), "execute", fail)
|
|
202
|
+
with pytest.raises(IntegrationDownError) as caught:
|
|
203
|
+
await probe_credentials(
|
|
204
|
+
PROVIDER, auth=ConnectorAuth("oauth2_token", {"access_token": TOKEN}, CONFIG)
|
|
205
|
+
)
|
|
206
|
+
assert caught.value.data == {"stage": "test", "reason_code": "probe_error"}
|
|
207
|
+
assert "unsafe" not in str(caught.value.__dict__) and TOKEN not in str(caught.value.__dict__)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/catalog/index.json
RENAMED
|
File without changes
|
{stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/catalog/schema.json
RENAMED
|
File without changes
|
|
File without changes
|
{stackos_connectors-0.2.3 → stackos_connectors-0.2.4}/src/stackos_connectors/connectors/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|