stackos-connectors 0.2.1__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/PKG-INFO +6 -3
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/README.md +5 -2
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/pyproject.toml +1 -1
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/catalog/index.json +1 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/__init__.py +1 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/actions.py +110 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/catalog.json +309 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/docs/auth.md +13 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/docs/quickbooks-online.md +24 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/integration.py +75 -0
- stackos_connectors-0.2.2/src/stackos_connectors/connectors/quickbooks_online/response.py +263 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/catalog/test_presentation.py +2 -1
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/packaging/installed_auth_consumer.py +62 -2
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/packaging/test_grouped_layout.py +1 -1
- stackos_connectors-0.2.2/tests/quickbooks_online/conftest.py +57 -0
- stackos_connectors-0.2.2/tests/quickbooks_online/test_auth.py +108 -0
- stackos_connectors-0.2.2/tests/quickbooks_online/test_reads.py +343 -0
- stackos_connectors-0.2.2/tests/web/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/.github/workflows/publish.yml +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/.gitignore +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/LICENSE +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/catalog/schema.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/catalog.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ahrefs/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ahrefs/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ahrefs/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ahrefs/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ahrefs/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aignc/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aignc/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aignc/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aignc/contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aignc/docs/aignc.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aignc/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/alibaba_wan/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/alibaba_wan/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/alibaba_wan/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/alibaba_wan/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/alibaba_wan/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/apollo/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/apollo/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/apollo/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/apollo/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/apollo/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/docs/s3.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/aws_s3/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedance/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedance/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedance/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedream/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedream/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedream/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/byteplus_seedream/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/clay/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/clay/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/clay/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/clay/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/clay/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/cloudflare/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/cloudflare/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/cloudflare/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/cloudflare/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/cloudflare/docs/cloudflare-dns.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/cloudflare/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/dataforseo/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/dataforseo/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/dataforseo/assets/icon.jpeg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/dataforseo/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/dataforseo/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/dataforseo/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/firecrawl/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/firecrawl/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/firecrawl/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/firecrawl/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/firecrawl/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/assets/icon.svg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/docs/ftp.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ftp/remote_tree.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ghost/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ghost/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ghost/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ghost/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ghost/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ghost/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_ads/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_analytics/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_analytics/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_analytics/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_analytics/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_analytics/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_analytics/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_gemini_image/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_gemini_image/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_gemini_image/assets/icon.webp +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_gemini_image/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_gemini_image/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_indexing/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_indexing/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_indexing/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_indexing/docs/google-indexing.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_indexing/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/docs/google-search-console.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_search_console/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_tag_manager/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_tag_manager/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_tag_manager/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_tag_manager/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_tag_manager/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_tag_manager/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_veo/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_veo/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_veo/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_veo/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_veo/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/google_workspace/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/http/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/http/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/http/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/docs/hubspot.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/docs/signatures.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/hubspot/signature.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ideogram/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ideogram/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ideogram/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ideogram/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/ideogram/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/assets/icon.svg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/imap/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/jina/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/jina/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/jina/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/jina/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/jina/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/kling_video/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/kling_video/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/kling_video/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/kling_video/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/kling_video/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/auth/viewer-organization.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/create.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/delete.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/resolve.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/unresolve.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/comments/update.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/create.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/delete.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/update.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/add-label.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/archive.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/create.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/remove-label.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/search.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/unarchive.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/issues/update.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/projects/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/projects/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/teams/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/teams/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/users/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/users/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/viewer/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/get.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/list.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/docs/linear.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.metadata.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/linear/schemas/root-policy-2026-07-23.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/meta_ads/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/meta_ads/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/meta_ads/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/meta_ads/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/meta_ads/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/meta_ads/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/microsoft_365/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openai_images/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openai_images/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openai_images/assets/icon.webp +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openai_images/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openai_images/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openrouter/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openrouter/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openrouter/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openrouter/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/openrouter/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/outreach/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/outreach/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/outreach/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/outreach/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/outreach/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/outreach/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/pipedrive/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reddit/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reddit/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reddit/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reddit/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reddit/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reddit/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reve/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reve/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reve/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reve/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/reve/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesforce/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/assets/icon.jpeg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/salesloft/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/serper/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/serper/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/serper/assets/icon.svg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/serper/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/serper/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/add-customer-tag.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/create-customer.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-lifetime-value.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-orders.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/list-customers.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/remove-customer-tag.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/search-customers.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/update-customer.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/adjust-inventory.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-by-sku.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-item.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-location-inventory.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-item-availability.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-levels.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-product-variant-inventory.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/set-inventory-level.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-note.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-tag.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/create-draft-order.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-by-name.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-fulfillment-status.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-timeline.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-order-variant-quantities.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-orders.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/mark-order-paid.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/search-orders.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-note.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-tags.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-collection.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product-variant.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-collection.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-by-handle.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-variant.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-collections.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-product-variants.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-products.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/search-products.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-status.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-variant.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/graphql/shopifyql.graphql +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/docs/shopify.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/payloads.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/shopify/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/sitemap/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/sitemap/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/sitemap/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/sitemap/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/constants.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/docs/signatures.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/files.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/http.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/payloads.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/results.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/slack_bot/validation.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/assets/icon.svg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/smtp/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/assets/icon.jpeg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/docs/stripe.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/stripe/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/taboola/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/taboola/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/taboola/assets/icon.svg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/taboola/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/taboola/docs/auth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/auth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/docs/auth-protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/docs/protocol.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/payloads.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/schema.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/tdlib/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/tdlib/native.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/tdlib/proxy.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/telegram/tdlib/sessions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/openapi.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/stackos-tools.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/assets.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/docs/agent-api/README.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/docs/trackbooth.md +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/schema.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/trackbooth/transport.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/wordpress/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/wordpress/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/wordpress/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/wordpress/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/wordpress/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/wordpress/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/xai_imagine/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/xai_imagine/actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/xai_imagine/assets/icon.png +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/xai_imagine/catalog.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/connectors/xai_imagine/integration.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/contracts.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/errors.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/py.typed +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/redaction.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/registry.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/base.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/byteplus/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/byteplus/ark.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/byteplus/media.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/google/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/google/batch.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/google/oauth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/google/probe.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/google/service_account.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/icons/integration.svg +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/media.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/oauth.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/provider_utils.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/rate_limit.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/shared/vendor_utils.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/validation.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/auth/test_auth_redaction.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/auth/test_google_service_account.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/auth/test_oauth_contracts.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/auth/test_oauth_protocol.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/auth/test_probes.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/auth/test_search_console_scopes.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/conftest.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/fixtures/wire-contracts.json +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/test_hubspot_signature_protocol.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/test_named_actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/test_pipedrive_probes.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/test_probe_boundary.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/business/test_salesloft_probes.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/catalog/test_catalog.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/catalog/test_nested_resources.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_contract.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_native_result_boundary.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_nested_auth_redaction.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_preflight_redaction.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_public_key_facts.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_runtime.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_timeout_options.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_validation_data.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/core/test_validation_execution_outcome.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/mail_slack/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/mail_slack/test_native.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/mail_slack/test_probes_catalog.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/mail_slack/test_signature_protocol.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/media/test_aignc_native.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/media/test_generation_outcomes.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/media/test_media_files.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/media/test_named_media.py +0 -0
- {stackos_connectors-0.2.1/tests/web → stackos_connectors-0.2.2/tests/quickbooks_online}/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/safe_refs/conftest.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/safe_refs/test_linear_transport.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/safe_refs/test_safe_refs_named_actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/safe_refs/test_stripe_transport_transport.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_authorization.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_closure_outcomes.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_native.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_payloads.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_proxy.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/telegram/test_sessions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/trackbooth/__init__.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/trackbooth/test_native.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/catalog_fixture.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/conftest.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_ahrefs.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_boundary_timeout.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_cloudflare.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_dataforseo.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_firecrawl.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_ftp.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_ftp_actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_google_analytics.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_google_indexing.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_google_indexing_batch.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_google_search_console.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_google_search_console_batch.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_google_tag_manager.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_jina_reader.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_named_clients.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_native_boundary.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_openrouter.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_reddit.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_s3.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_s3_actions.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_serper.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_shopify.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_sitemap.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/tests/web/test_transport_defaults.py +0 -0
- {stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/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.2
|
|
4
4
|
Summary: Named provider connectors with plain data and caller-owned authentication.
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -73,6 +73,9 @@ execution; existing names cannot be replaced.
|
|
|
73
73
|
`CallOptions.timeout=None` preserves each provider's default. A numeric timeout
|
|
74
74
|
overrides that default. A supplied HTTP client remains caller-owned.
|
|
75
75
|
|
|
76
|
+
QuickBooks Online provides bounded company/invoice reads with exact invoice JSON
|
|
77
|
+
fragments and explicit OAuth. See the [provider contract](src/stackos_connectors/connectors/quickbooks_online/docs/quickbooks-online.md).
|
|
78
|
+
|
|
76
79
|
## Explicit authentication
|
|
77
80
|
|
|
78
81
|
`get_auth_contract(connector, method=..., config=...)` reads immutable provider
|
|
@@ -188,10 +191,10 @@ Python 3.12 or newer is required. Source:
|
|
|
188
191
|
Published releases can be installed with:
|
|
189
192
|
|
|
190
193
|
```bash
|
|
191
|
-
python -m pip install stackos-connectors==0.2.
|
|
194
|
+
python -m pip install stackos-connectors==0.2.2
|
|
192
195
|
```
|
|
193
196
|
|
|
194
|
-
Or add `stackos-connectors==0.2.
|
|
197
|
+
Or add `stackos-connectors==0.2.2` to your Python dependency requirements.
|
|
195
198
|
|
|
196
199
|
Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
|
|
197
200
|
build a wheel with `python -m build --wheel` and install that wheel. Runtime use
|
|
@@ -57,6 +57,9 @@ execution; existing names cannot be replaced.
|
|
|
57
57
|
`CallOptions.timeout=None` preserves each provider's default. A numeric timeout
|
|
58
58
|
overrides that default. A supplied HTTP client remains caller-owned.
|
|
59
59
|
|
|
60
|
+
QuickBooks Online provides bounded company/invoice reads with exact invoice JSON
|
|
61
|
+
fragments and explicit OAuth. See the [provider contract](src/stackos_connectors/connectors/quickbooks_online/docs/quickbooks-online.md).
|
|
62
|
+
|
|
60
63
|
## Explicit authentication
|
|
61
64
|
|
|
62
65
|
`get_auth_contract(connector, method=..., config=...)` reads immutable provider
|
|
@@ -172,10 +175,10 @@ Python 3.12 or newer is required. Source:
|
|
|
172
175
|
Published releases can be installed with:
|
|
173
176
|
|
|
174
177
|
```bash
|
|
175
|
-
python -m pip install stackos-connectors==0.2.
|
|
178
|
+
python -m pip install stackos-connectors==0.2.2
|
|
176
179
|
```
|
|
177
180
|
|
|
178
|
-
Or add `stackos-connectors==0.2.
|
|
181
|
+
Or add `stackos-connectors==0.2.2` to your Python dependency requirements.
|
|
179
182
|
|
|
180
183
|
Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
|
|
181
184
|
build a wheel with `python -m build --wheel` and install that wheel. Runtime use
|
{stackos_connectors-0.2.1 → stackos_connectors-0.2.2}/src/stackos_connectors/catalog/index.json
RENAMED
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"connectors/openrouter/catalog.json",
|
|
36
36
|
"connectors/outreach/catalog.json",
|
|
37
37
|
"connectors/pipedrive/catalog.json",
|
|
38
|
+
"connectors/quickbooks_online/catalog.json",
|
|
38
39
|
"connectors/reddit/catalog.json",
|
|
39
40
|
"connectors/reve/catalog.json",
|
|
40
41
|
"connectors/salesforce/catalog.json",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""QuickBooks Online named reads and explicit OAuth declarations."""
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""The two bounded QuickBooks Online read actions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable
|
|
6
|
+
from contextlib import AsyncExitStack
|
|
7
|
+
from functools import partial
|
|
8
|
+
|
|
9
|
+
import httpx
|
|
10
|
+
|
|
11
|
+
from stackos_connectors import ConnectorRequest, ConnectorResult, ValidationIssue
|
|
12
|
+
from stackos_connectors.redaction import auth_secret_values, redact_secret_values
|
|
13
|
+
|
|
14
|
+
from .integration import QuickBooksIntegration
|
|
15
|
+
from .response import (
|
|
16
|
+
CompanyInfo,
|
|
17
|
+
InvoicePage,
|
|
18
|
+
calendar_date,
|
|
19
|
+
invalid_response,
|
|
20
|
+
parse_company_info,
|
|
21
|
+
parse_invoice_page,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class QuickBooksActionConnector:
|
|
26
|
+
key = "quickbooks-online"
|
|
27
|
+
|
|
28
|
+
def validate(self, request: ConnectorRequest) -> list[ValidationIssue]:
|
|
29
|
+
if request.operation != "invoices.list":
|
|
30
|
+
return []
|
|
31
|
+
try:
|
|
32
|
+
first = calendar_date(request.input_json["txn_date_from"])
|
|
33
|
+
last = calendar_date(request.input_json["txn_date_to"])
|
|
34
|
+
if first > last:
|
|
35
|
+
raise ValueError("reversed dates")
|
|
36
|
+
except ValueError:
|
|
37
|
+
return [
|
|
38
|
+
ValidationIssue(path="$.txn_date_from", message="Dates must be valid and ordered")
|
|
39
|
+
]
|
|
40
|
+
return []
|
|
41
|
+
|
|
42
|
+
def estimate_cost_cents(self, request: ConnectorRequest) -> int:
|
|
43
|
+
return 0
|
|
44
|
+
|
|
45
|
+
async def execute(self, request: ConnectorRequest) -> ConnectorResult:
|
|
46
|
+
assert request.auth is not None
|
|
47
|
+
config = request.auth.config
|
|
48
|
+
secrets = auth_secret_values(request.auth)
|
|
49
|
+
realm = config["realm_id"]
|
|
50
|
+
path, params, parser = _read_parameters(request, secrets)
|
|
51
|
+
async with AsyncExitStack() as stack:
|
|
52
|
+
http = request.options.http
|
|
53
|
+
if http is None:
|
|
54
|
+
http = await stack.enter_async_context(
|
|
55
|
+
httpx.AsyncClient(timeout=30.0, follow_redirects=False)
|
|
56
|
+
)
|
|
57
|
+
integration = QuickBooksIntegration(
|
|
58
|
+
payload=b"",
|
|
59
|
+
http=http,
|
|
60
|
+
timeout=request.options.timeout,
|
|
61
|
+
rate_limiter=request.options.rate_limiter,
|
|
62
|
+
)
|
|
63
|
+
result = await integration.read(
|
|
64
|
+
op=request.operation,
|
|
65
|
+
environment=config["environment"],
|
|
66
|
+
realm_id=realm,
|
|
67
|
+
token=request.auth.fields["access_token"],
|
|
68
|
+
path=path,
|
|
69
|
+
params=params,
|
|
70
|
+
parser=parser,
|
|
71
|
+
)
|
|
72
|
+
if redact_secret_values(result.data, secrets) != result.data:
|
|
73
|
+
raise invalid_response()
|
|
74
|
+
return ConnectorResult(
|
|
75
|
+
output_json=result.data,
|
|
76
|
+
metadata_json={"vendor": self.key, "operation": request.operation},
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _read_parameters(
|
|
81
|
+
request: ConnectorRequest, secrets: tuple[str, ...]
|
|
82
|
+
) -> tuple[str, dict[str, str] | None, Callable[[httpx.Response], CompanyInfo | InvoicePage]]:
|
|
83
|
+
assert request.auth is not None
|
|
84
|
+
realm = request.auth.config["realm_id"]
|
|
85
|
+
if request.operation == "company-info.get":
|
|
86
|
+
return (
|
|
87
|
+
f"companyinfo/{realm}",
|
|
88
|
+
None,
|
|
89
|
+
partial(parse_company_info, secrets=secrets, realm_id=realm),
|
|
90
|
+
)
|
|
91
|
+
data = request.input_json
|
|
92
|
+
parser = partial(
|
|
93
|
+
parse_invoice_page,
|
|
94
|
+
secrets=secrets,
|
|
95
|
+
start=data["start_position"],
|
|
96
|
+
limit=data["max_results"],
|
|
97
|
+
date_from=data["txn_date_from"],
|
|
98
|
+
date_to=data["txn_date_to"],
|
|
99
|
+
)
|
|
100
|
+
query = _invoice_query(
|
|
101
|
+
data["txn_date_from"], data["txn_date_to"], data["start_position"], data["max_results"]
|
|
102
|
+
)
|
|
103
|
+
return "query", {"query": query}, parser
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _invoice_query(date_from: str, date_to: str, start: int, limit: int) -> str:
|
|
107
|
+
return (
|
|
108
|
+
f"select * from Invoice where TxnDate >= '{date_from}' and TxnDate <= '{date_to}' "
|
|
109
|
+
f"STARTPOSITION {start} MAXRESULTS {limit}"
|
|
110
|
+
)
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "stackos.connector.v1",
|
|
3
|
+
"connector": "quickbooks-online",
|
|
4
|
+
"name": "QuickBooks Online",
|
|
5
|
+
"description": "Bounded company and invoice reads with explicit caller-owned OAuth.",
|
|
6
|
+
"auth_type": "oauth",
|
|
7
|
+
"auth_methods": [
|
|
8
|
+
{
|
|
9
|
+
"key": "oauth2_authorization_code",
|
|
10
|
+
"description": "Caller-supplied resolved OAuth bearer token; grants are always explicit.",
|
|
11
|
+
"fields_schema": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"properties": {
|
|
14
|
+
"access_token": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"minLength": 1,
|
|
17
|
+
"pattern": "^[^\\s]+$"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"required": [
|
|
21
|
+
"access_token"
|
|
22
|
+
],
|
|
23
|
+
"additionalProperties": false
|
|
24
|
+
},
|
|
25
|
+
"config_schema": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"properties": {
|
|
28
|
+
"environment": {
|
|
29
|
+
"enum": [
|
|
30
|
+
"sandbox",
|
|
31
|
+
"production"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"realm_id": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"pattern": "^[0-9]{1,32}$"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"required": [
|
|
40
|
+
"environment",
|
|
41
|
+
"realm_id"
|
|
42
|
+
],
|
|
43
|
+
"additionalProperties": false
|
|
44
|
+
},
|
|
45
|
+
"setup": {
|
|
46
|
+
"auth_type": "oauth",
|
|
47
|
+
"interactive": true,
|
|
48
|
+
"description": "Register an Intuit app, verify callback state and realmId, and supply its resolved accounting access token.",
|
|
49
|
+
"fields": [
|
|
50
|
+
{
|
|
51
|
+
"key": "client_id",
|
|
52
|
+
"label": "Client Id",
|
|
53
|
+
"type": "secret",
|
|
54
|
+
"secret": true,
|
|
55
|
+
"required": true
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"key": "client_secret",
|
|
59
|
+
"label": "Client Secret",
|
|
60
|
+
"type": "secret",
|
|
61
|
+
"secret": true,
|
|
62
|
+
"required": true
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"evidence_source": "oauth_response",
|
|
67
|
+
"protocol": {
|
|
68
|
+
"grant_types": [
|
|
69
|
+
"authorization_code",
|
|
70
|
+
"refresh_token"
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"key": "oauth2_token",
|
|
76
|
+
"description": "Caller-supplied resolved OAuth bearer token; grants are always explicit.",
|
|
77
|
+
"fields_schema": {
|
|
78
|
+
"type": "object",
|
|
79
|
+
"properties": {
|
|
80
|
+
"access_token": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"minLength": 1,
|
|
83
|
+
"pattern": "^[^\\s]+$"
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"required": [
|
|
87
|
+
"access_token"
|
|
88
|
+
],
|
|
89
|
+
"additionalProperties": false
|
|
90
|
+
},
|
|
91
|
+
"config_schema": {
|
|
92
|
+
"type": "object",
|
|
93
|
+
"properties": {
|
|
94
|
+
"environment": {
|
|
95
|
+
"enum": [
|
|
96
|
+
"sandbox",
|
|
97
|
+
"production"
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"realm_id": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"pattern": "^[0-9]{1,32}$"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"required": [
|
|
106
|
+
"environment",
|
|
107
|
+
"realm_id"
|
|
108
|
+
],
|
|
109
|
+
"additionalProperties": false
|
|
110
|
+
},
|
|
111
|
+
"setup": {
|
|
112
|
+
"auth_type": "oauth",
|
|
113
|
+
"interactive": false,
|
|
114
|
+
"description": "Register an Intuit app, verify callback state and realmId, and supply its resolved accounting access token.",
|
|
115
|
+
"fields": [
|
|
116
|
+
{
|
|
117
|
+
"key": "access_token",
|
|
118
|
+
"label": "Access Token",
|
|
119
|
+
"type": "secret",
|
|
120
|
+
"secret": true,
|
|
121
|
+
"required": true
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"evidence_source": "unavailable",
|
|
126
|
+
"protocol": {
|
|
127
|
+
"grant_types": [
|
|
128
|
+
"refresh_token"
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
],
|
|
133
|
+
"auth_protocol": {
|
|
134
|
+
"flow": "authorization_code",
|
|
135
|
+
"authorization_endpoint": "https://appcenter.intuit.com/connect/oauth2",
|
|
136
|
+
"token_endpoint": "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",
|
|
137
|
+
"client_auth_style": "basic",
|
|
138
|
+
"pkce_mode": "unavailable",
|
|
139
|
+
"scopes": [
|
|
140
|
+
"com.intuit.quickbooks.accounting"
|
|
141
|
+
],
|
|
142
|
+
"response_account_id_field": null
|
|
143
|
+
},
|
|
144
|
+
"actions": [
|
|
145
|
+
{
|
|
146
|
+
"key": "quickbooks-online.company-info.get",
|
|
147
|
+
"operation": "company-info.get",
|
|
148
|
+
"input_schema": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"properties": {},
|
|
151
|
+
"required": [],
|
|
152
|
+
"additionalProperties": false
|
|
153
|
+
},
|
|
154
|
+
"output_schema": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"properties": {
|
|
157
|
+
"realm_id": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"minLength": 1
|
|
160
|
+
},
|
|
161
|
+
"company_id": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"minLength": 1
|
|
164
|
+
},
|
|
165
|
+
"company_name": {
|
|
166
|
+
"type": "string",
|
|
167
|
+
"minLength": 1
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"required": [
|
|
171
|
+
"realm_id",
|
|
172
|
+
"company_id"
|
|
173
|
+
],
|
|
174
|
+
"additionalProperties": false
|
|
175
|
+
},
|
|
176
|
+
"auth_methods": [
|
|
177
|
+
"oauth2_authorization_code",
|
|
178
|
+
"oauth2_token"
|
|
179
|
+
],
|
|
180
|
+
"description": "Read CompanyInfo for the configured realm. Returned realm_id repeats request context, not independent provider attestation.",
|
|
181
|
+
"guidance": "Caller owns pagination, complete-scan limits and current-state semantics. total_count is supplied metadata only; missing currency remains unknown. See provider docs.",
|
|
182
|
+
"metadata": {
|
|
183
|
+
"name": "Read company info",
|
|
184
|
+
"risk_level": "read"
|
|
185
|
+
},
|
|
186
|
+
"config": {}
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"key": "quickbooks-online.invoices.list",
|
|
190
|
+
"operation": "invoices.list",
|
|
191
|
+
"input_schema": {
|
|
192
|
+
"type": "object",
|
|
193
|
+
"properties": {
|
|
194
|
+
"txn_date_from": {
|
|
195
|
+
"type": "string",
|
|
196
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
|
|
197
|
+
},
|
|
198
|
+
"txn_date_to": {
|
|
199
|
+
"type": "string",
|
|
200
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
|
|
201
|
+
},
|
|
202
|
+
"start_position": {
|
|
203
|
+
"type": "integer",
|
|
204
|
+
"minimum": 1,
|
|
205
|
+
"maximum": 2147483647
|
|
206
|
+
},
|
|
207
|
+
"max_results": {
|
|
208
|
+
"type": "integer",
|
|
209
|
+
"minimum": 1,
|
|
210
|
+
"maximum": 100
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
"required": [
|
|
214
|
+
"txn_date_from",
|
|
215
|
+
"txn_date_to",
|
|
216
|
+
"start_position",
|
|
217
|
+
"max_results"
|
|
218
|
+
],
|
|
219
|
+
"additionalProperties": false
|
|
220
|
+
},
|
|
221
|
+
"output_schema": {
|
|
222
|
+
"type": "object",
|
|
223
|
+
"properties": {
|
|
224
|
+
"invoices": {
|
|
225
|
+
"type": "array",
|
|
226
|
+
"items": {
|
|
227
|
+
"type": "object",
|
|
228
|
+
"properties": {
|
|
229
|
+
"native_id": {
|
|
230
|
+
"type": "string",
|
|
231
|
+
"minLength": 1
|
|
232
|
+
},
|
|
233
|
+
"raw_json": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"minLength": 1
|
|
236
|
+
},
|
|
237
|
+
"source_revision": {
|
|
238
|
+
"type": "string",
|
|
239
|
+
"minLength": 1
|
|
240
|
+
},
|
|
241
|
+
"source_updated_at": {
|
|
242
|
+
"type": "string",
|
|
243
|
+
"minLength": 1
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
"required": [
|
|
247
|
+
"native_id",
|
|
248
|
+
"raw_json"
|
|
249
|
+
],
|
|
250
|
+
"additionalProperties": false
|
|
251
|
+
},
|
|
252
|
+
"maxItems": 100
|
|
253
|
+
},
|
|
254
|
+
"start_position": {
|
|
255
|
+
"type": "integer",
|
|
256
|
+
"minimum": 1
|
|
257
|
+
},
|
|
258
|
+
"max_results": {
|
|
259
|
+
"type": "integer",
|
|
260
|
+
"minimum": 0,
|
|
261
|
+
"maximum": 100
|
|
262
|
+
},
|
|
263
|
+
"count": {
|
|
264
|
+
"type": "integer",
|
|
265
|
+
"minimum": 0,
|
|
266
|
+
"maximum": 100
|
|
267
|
+
},
|
|
268
|
+
"total_count": {
|
|
269
|
+
"type": "integer",
|
|
270
|
+
"minimum": 0
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"required": [
|
|
274
|
+
"invoices",
|
|
275
|
+
"start_position",
|
|
276
|
+
"max_results",
|
|
277
|
+
"count"
|
|
278
|
+
],
|
|
279
|
+
"additionalProperties": false
|
|
280
|
+
},
|
|
281
|
+
"auth_methods": [
|
|
282
|
+
"oauth2_authorization_code",
|
|
283
|
+
"oauth2_token"
|
|
284
|
+
],
|
|
285
|
+
"description": "Read one bounded Invoice page by inclusive TxnDate, retaining exact JSON source fragments without floating-point conversion.",
|
|
286
|
+
"guidance": "Caller owns pagination, complete-scan limits and current-state semantics. total_count is supplied metadata only; missing currency remains unknown. See provider docs.",
|
|
287
|
+
"metadata": {
|
|
288
|
+
"name": "Read invoice page",
|
|
289
|
+
"risk_level": "read"
|
|
290
|
+
},
|
|
291
|
+
"config": {}
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
"implementation": "stackos_connectors.connectors.quickbooks_online.actions:QuickBooksActionConnector",
|
|
295
|
+
"icon": {
|
|
296
|
+
"path": "shared/icons/integration.svg",
|
|
297
|
+
"kind": "icon",
|
|
298
|
+
"media_type": "image/svg+xml"
|
|
299
|
+
},
|
|
300
|
+
"setup": {
|
|
301
|
+
"homepage_url": "https://developer.intuit.com/",
|
|
302
|
+
"docs_url": "https://developer.intuit.com/app/developer/qbo/docs/api/accounting/most-commonly-used/invoice",
|
|
303
|
+
"docs": [
|
|
304
|
+
"connectors/quickbooks_online/docs/quickbooks-online.md",
|
|
305
|
+
"connectors/quickbooks_online/docs/auth.md"
|
|
306
|
+
],
|
|
307
|
+
"setup_note": "The caller stores tokens and binds environment plus realm_id after verified OAuth callback state. No implicit authorization or refresh."
|
|
308
|
+
}
|
|
309
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# QuickBooks Online authentication
|
|
2
|
+
|
|
3
|
+
The [catalog](../catalog.json) owns fixed Intuit OAuth declarations. Use the public `build_authorization_request`, `request_token` and `get_auth_contract` functions. Neither read action authorizes or refreshes implicitly.
|
|
4
|
+
|
|
5
|
+
- `oauth2_authorization_code`: explicit code and refresh grants. Consent requests `com.intuit.quickbooks.accounting` with caller-generated state and callback URI.
|
|
6
|
+
- `oauth2_token`: resolved bearer-token reads, plus explicit refresh grants when application fields and a refresh token are supplied to `request_token`.
|
|
7
|
+
- Both grant requests use HTTP Basic application authentication at `https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer`. Consent uses `https://appcenter.intuit.com/connect/oauth2`. The shared grant transport issues one token POST without automatic retries. PKCE is not declared for this provider contract.
|
|
8
|
+
|
|
9
|
+
The caller owns application secrets, state verification, callback handling, binding the returned `realmId` to the intended company, token custody/expiration, refresh concurrency and permissions. Supply only resolved `access_token` in action auth fields, and `{ "environment": "sandbox", "realm_id": "123456789" }` in action auth config. The environment must be `sandbox` or `production`; endpoints cannot be overridden. Code/token grants accept application fields separately from action execution validation.
|
|
10
|
+
|
|
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
|
+
|
|
13
|
+
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.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# QuickBooks Online bounded reads
|
|
2
|
+
|
|
3
|
+
`get_default_client().execute` exposes exactly two actions:
|
|
4
|
+
|
|
5
|
+
| Action | Inputs | Output |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `quickbooks-online.company-info.get` | Empty object | Configured `realm_id`, provider `company_id`, optional `company_name` |
|
|
8
|
+
| `quickbooks-online.invoices.list` | `txn_date_from`, `txn_date_to`, `start_position`, `max_results` | `invoices`, `start_position`, `max_results`, `count`, optional provider `total_count` |
|
|
9
|
+
|
|
10
|
+
Use `ConnectorAuth("oauth2_token", {"access_token": token}, config={"environment": "sandbox", "realm_id": realm_id})` and optional `CallOptions(http=caller_http, timeout=seconds, rate_limiter=caller_bucket)`. The caller owns an injected HTTP client; the connector closes only clients it creates. The numeric timeout overrides each HTTP request; a consumer that needs a whole-operation deadline must enforce it separately. Shared transport retries reads at most three times. Redirects are disabled even when a supplied client enables them. Numeric Retry-After is capped at 30 seconds per retry. OAuth renewal uses its separate explicit, non-retrying token transport.
|
|
11
|
+
|
|
12
|
+
Invoice queries use inclusive valid calendar dates on `TxnDate` and provider-order offset pagination. The query uses `STARTPOSITION` and `MAXRESULTS`, matching the [current official PHP SDK query builder](https://github.com/intuit/QuickBooks-V3-PHP-SDK/blob/master/src/QueryFilter/QueryMessage.php). Explicit ordering is omitted because this increment does not require it and Invoice `Id` sort support was not established by primary evidence. Dates must be ordered, start position is 1-based (maximum 2147483647), and page size is 1–100. There is no arbitrary SQL, URL, write, or minor-version override. Sandbox requests use `sandbox-quickbooks.api.intuit.com`; production requests use `quickbooks.api.intuit.com`.
|
|
13
|
+
|
|
14
|
+
Every invoice carries `native_id`, exact UTF-8 `raw_json`, optional `source_revision` from supplied `SyncToken` and optional `source_updated_at` from supplied offset-aware `MetaData.LastUpdatedTime`. Object text is sliced from the response, retaining whitespace, escaping, numeric precision and scale. Monetary numbers are validated with decimal decoding and are never decoded as binary floats or reserialized. Supplied totals/balances may be zero or negative. Missing currency and other optional fields remain missing; no currency is inferred. Amounts and balances describe the provider's current response, not historical balances or revenue.
|
|
15
|
+
|
|
16
|
+
The provider validates the returned envelope and metadata because the public output schema is descriptive. Duplicate JSON keys anywhere, duplicate invoice IDs in a page, invalid identities/amounts/dates, invoices outside the requested dates, inconsistent positions/counts, malformed metadata, records above 16 KiB and response bodies above 2 MiB fail safely. The response-size check occurs after shared HTTP buffering. Credential echoes in raw text or decoded keys/values fail before registry redaction; evidence is never silently scrubbed and returned as exact.
|
|
17
|
+
|
|
18
|
+
A missing `Invoice` array in an otherwise empty `QueryResponse` means an empty page. Empty pages may omit position/count metadata; returned position then repeats the requested position and count is zero. Nonempty pages require `startPosition` and `maxResults` matching the request and returned count. Supplied `totalCount` is retained only as a nonnegative integer; its semantics are not used for termination.
|
|
19
|
+
|
|
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
|
+
|
|
22
|
+
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
|
+
|
|
24
|
+
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,75 @@
|
|
|
1
|
+
"""Fixed QuickBooks read routes using the shared bounded HTTP transport."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
|
|
10
|
+
from stackos_connectors.errors import ConnectorError, IntegrationDownError, RateLimitedError
|
|
11
|
+
from stackos_connectors.shared.base import BaseIntegration, IntegrationCallResult
|
|
12
|
+
|
|
13
|
+
from .response import CompanyInfo, InvoicePage
|
|
14
|
+
|
|
15
|
+
HOSTS = {
|
|
16
|
+
"sandbox": "https://sandbox-quickbooks.api.intuit.com",
|
|
17
|
+
"production": "https://quickbooks.api.intuit.com",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class QuickBooksIntegration(BaseIntegration):
|
|
22
|
+
kind = vendor = "quickbooks-online"
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def _provider_error(cls, response: httpx.Response) -> dict[str, str]:
|
|
26
|
+
# Never decode/retain arbitrary provider bodies in diagnostics.
|
|
27
|
+
return {"reason_code": _reason(response.status_code)}
|
|
28
|
+
|
|
29
|
+
@staticmethod
|
|
30
|
+
def _parse_retry_after(response: httpx.Response) -> float | None:
|
|
31
|
+
value = BaseIntegration._parse_retry_after(response)
|
|
32
|
+
return (
|
|
33
|
+
min(value, 30.0) if value is not None and math.isfinite(value) and value >= 0 else None
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
async def read(
|
|
37
|
+
self,
|
|
38
|
+
*,
|
|
39
|
+
op: str,
|
|
40
|
+
environment: str,
|
|
41
|
+
realm_id: str,
|
|
42
|
+
token: str,
|
|
43
|
+
path: str,
|
|
44
|
+
parser: Callable[[httpx.Response], CompanyInfo | InvoicePage],
|
|
45
|
+
params: dict[str, str] | None = None,
|
|
46
|
+
) -> IntegrationCallResult:
|
|
47
|
+
try:
|
|
48
|
+
return await self.call(
|
|
49
|
+
op=op,
|
|
50
|
+
method="GET",
|
|
51
|
+
url=f"{HOSTS[environment]}/v3/company/{realm_id}/{path}",
|
|
52
|
+
headers={"Authorization": f"Bearer {token}", "Accept": "application/json"},
|
|
53
|
+
params=params,
|
|
54
|
+
response_parser=parser,
|
|
55
|
+
)
|
|
56
|
+
except (IntegrationDownError, RateLimitedError) as exc:
|
|
57
|
+
status = exc.data.get("status")
|
|
58
|
+
status = status if type(status) is int else None
|
|
59
|
+
raise ConnectorError(
|
|
60
|
+
"QuickBooks read failed",
|
|
61
|
+
provider_status_code=status,
|
|
62
|
+
provider_error={"reason_code": _reason(status)},
|
|
63
|
+
) from None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _reason(status: int | None) -> str:
|
|
67
|
+
if status == 401:
|
|
68
|
+
return "authentication_failed"
|
|
69
|
+
if status == 403:
|
|
70
|
+
return "permission_denied"
|
|
71
|
+
if status == 429:
|
|
72
|
+
return "rate_limited"
|
|
73
|
+
if status is not None and status >= 500:
|
|
74
|
+
return "provider_unavailable"
|
|
75
|
+
return "provider_failure" if status is not None else "network_error"
|