stackos-connectors 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/PKG-INFO +75 -5
  2. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/README.md +74 -4
  3. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/pyproject.toml +1 -1
  4. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/__init__.py +26 -0
  5. stackos_connectors-0.2.0/src/stackos_connectors/auth.py +245 -0
  6. stackos_connectors-0.2.0/src/stackos_connectors/catalog/schema.json +499 -0
  7. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/catalog.py +8 -0
  8. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/catalog.json +1 -0
  9. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/catalog.json +1 -0
  10. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/catalog.json +1 -0
  11. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/catalog.json +1 -0
  12. stackos_connectors-0.2.0/src/stackos_connectors/connectors/aws_s3/probe.py +16 -0
  13. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedream/catalog.json +1 -0
  14. stackos_connectors-0.2.0/src/stackos_connectors/connectors/byteplus_seedream/probe.py +5 -0
  15. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/catalog.json +1 -0
  16. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/catalog.json +1 -0
  17. stackos_connectors-0.2.0/src/stackos_connectors/connectors/dataforseo/probe.py +9 -0
  18. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/catalog.json +1 -0
  19. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/actions.py +7 -0
  20. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/catalog.json +1 -0
  21. stackos_connectors-0.2.0/src/stackos_connectors/connectors/ftp/probe.py +26 -0
  22. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/catalog.json +1 -0
  23. stackos_connectors-0.2.0/src/stackos_connectors/connectors/ghost/probe.py +19 -0
  24. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/catalog.json +47 -1
  25. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_ads/docs/auth.md +15 -0
  26. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_ads/probe.py +5 -0
  27. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/catalog.json +73 -5
  28. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_analytics/docs/auth.md +22 -0
  29. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/catalog.json +1 -0
  30. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/catalog.json +1 -0
  31. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/catalog.json +73 -5
  32. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_search_console/docs/auth.md +26 -0
  33. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/catalog.json +73 -5
  34. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_tag_manager/docs/auth.md +25 -0
  35. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/catalog.json +1 -0
  36. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/catalog.json +51 -1
  37. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_workspace/docs/auth.md +15 -0
  38. stackos_connectors-0.2.0/src/stackos_connectors/connectors/google_workspace/probe.py +5 -0
  39. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/catalog.json +172 -17
  40. stackos_connectors-0.2.0/src/stackos_connectors/connectors/hubspot/docs/auth.md +14 -0
  41. stackos_connectors-0.2.0/src/stackos_connectors/connectors/hubspot/docs/signatures.md +12 -0
  42. stackos_connectors-0.2.0/src/stackos_connectors/connectors/hubspot/signature.py +51 -0
  43. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/catalog.json +1 -0
  44. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/catalog.json +1 -0
  45. stackos_connectors-0.2.0/src/stackos_connectors/connectors/imap/probe.py +22 -0
  46. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/catalog.json +1 -0
  47. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/catalog.json +57 -11
  48. stackos_connectors-0.2.0/src/stackos_connectors/connectors/linear/docs/auth.md +14 -0
  49. stackos_connectors-0.2.0/src/stackos_connectors/connectors/meta_ads/auth.py +18 -0
  50. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/catalog.json +26 -6
  51. stackos_connectors-0.2.0/src/stackos_connectors/connectors/meta_ads/docs/auth.md +12 -0
  52. stackos_connectors-0.2.0/src/stackos_connectors/connectors/microsoft_365/auth.py +23 -0
  53. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/catalog.json +30 -6
  54. stackos_connectors-0.2.0/src/stackos_connectors/connectors/microsoft_365/docs/auth.md +14 -0
  55. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/catalog.json +1 -0
  56. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/catalog.json +1 -0
  57. stackos_connectors-0.2.0/src/stackos_connectors/connectors/openrouter/probe.py +13 -0
  58. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/catalog.json +21 -4
  59. stackos_connectors-0.2.0/src/stackos_connectors/connectors/outreach/docs/auth.md +14 -0
  60. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/catalog.json +35 -2
  61. stackos_connectors-0.2.0/src/stackos_connectors/connectors/pipedrive/docs/auth.md +15 -0
  62. stackos_connectors-0.2.0/src/stackos_connectors/connectors/pipedrive/probe.py +13 -0
  63. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/catalog.json +24 -2
  64. stackos_connectors-0.2.0/src/stackos_connectors/connectors/reddit/docs/auth.md +17 -0
  65. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/catalog.json +1 -0
  66. stackos_connectors-0.2.0/src/stackos_connectors/connectors/salesforce/auth.py +33 -0
  67. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/catalog.json +34 -5
  68. stackos_connectors-0.2.0/src/stackos_connectors/connectors/salesforce/docs/auth.md +14 -0
  69. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/catalog.json +23 -2
  70. stackos_connectors-0.2.0/src/stackos_connectors/connectors/salesloft/docs/auth.md +15 -0
  71. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/catalog.json +1 -0
  72. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/catalog.json +1 -0
  73. stackos_connectors-0.2.0/src/stackos_connectors/connectors/shopify/probe.py +19 -0
  74. stackos_connectors-0.2.0/src/stackos_connectors/connectors/slack_bot/auth.py +17 -0
  75. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/catalog.json +1 -0
  76. stackos_connectors-0.2.0/src/stackos_connectors/connectors/slack_bot/docs/signatures.md +11 -0
  77. stackos_connectors-0.2.0/src/stackos_connectors/connectors/slack_bot/probe.py +13 -0
  78. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/catalog.json +1 -0
  79. stackos_connectors-0.2.0/src/stackos_connectors/connectors/smtp/probe.py +17 -0
  80. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/catalog.json +1 -0
  81. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/catalog.json +11 -1
  82. stackos_connectors-0.2.0/src/stackos_connectors/connectors/taboola/docs/auth.md +11 -0
  83. stackos_connectors-0.2.0/src/stackos_connectors/connectors/telegram/auth.py +185 -0
  84. stackos_connectors-0.2.0/src/stackos_connectors/connectors/telegram/docs/auth-protocol.md +22 -0
  85. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/catalog.json +1 -0
  86. stackos_connectors-0.2.0/src/stackos_connectors/connectors/trackbooth/probe.py +13 -0
  87. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/catalog.json +1 -0
  88. stackos_connectors-0.2.0/src/stackos_connectors/connectors/wordpress/probe.py +16 -0
  89. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/catalog.json +1 -0
  90. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/contracts.py +4 -1
  91. stackos_connectors-0.2.0/src/stackos_connectors/probe.py +183 -0
  92. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/google/oauth.py +1 -1
  93. stackos_connectors-0.2.0/src/stackos_connectors/shared/google/probe.py +64 -0
  94. stackos_connectors-0.2.0/src/stackos_connectors/shared/google/service_account.py +125 -0
  95. stackos_connectors-0.2.0/src/stackos_connectors/shared/oauth.py +337 -0
  96. stackos_connectors-0.2.0/tests/auth/test_auth_redaction.py +37 -0
  97. stackos_connectors-0.2.0/tests/auth/test_google_service_account.py +161 -0
  98. stackos_connectors-0.2.0/tests/auth/test_oauth_contracts.py +353 -0
  99. stackos_connectors-0.2.0/tests/auth/test_oauth_protocol.py +334 -0
  100. stackos_connectors-0.2.0/tests/auth/test_probes.py +384 -0
  101. stackos_connectors-0.2.0/tests/business/test_hubspot_signature_protocol.py +33 -0
  102. stackos_connectors-0.2.0/tests/mail_slack/test_signature_protocol.py +31 -0
  103. stackos_connectors-0.2.0/tests/packaging/installed_auth_consumer.py +322 -0
  104. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/packaging/test_grouped_layout.py +45 -0
  105. stackos_connectors-0.2.0/tests/telegram/test_authorization.py +211 -0
  106. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_ftp_actions.py +86 -0
  107. stackos_connectors-0.1.0/src/stackos_connectors/catalog/schema.json +0 -80
  108. stackos_connectors-0.1.0/src/stackos_connectors/probe.py +0 -26
  109. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/.github/workflows/publish.yml +0 -0
  110. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/.gitignore +0 -0
  111. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/LICENSE +0 -0
  112. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/catalog/index.json +0 -0
  113. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/__init__.py +0 -0
  114. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/__init__.py +0 -0
  115. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/actions.py +0 -0
  116. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/assets/icon.png +0 -0
  117. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ahrefs/integration.py +0 -0
  118. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/__init__.py +0 -0
  119. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/actions.py +0 -0
  120. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/contract.py +0 -0
  121. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/docs/aignc.md +0 -0
  122. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aignc/integration.py +0 -0
  123. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/__init__.py +0 -0
  124. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/actions.py +0 -0
  125. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/assets/icon.png +0 -0
  126. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/alibaba_wan/integration.py +0 -0
  127. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/__init__.py +0 -0
  128. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/actions.py +0 -0
  129. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/assets/icon.png +0 -0
  130. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/catalog.json +0 -0
  131. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/apollo/docs/protocol.md +0 -0
  132. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/__init__.py +0 -0
  133. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/actions.py +0 -0
  134. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/assets/icon.png +0 -0
  135. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/contract.py +0 -0
  136. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/docs/s3.md +0 -0
  137. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/aws_s3/integration.py +0 -0
  138. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedance/__init__.py +0 -0
  139. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedance/actions.py +0 -0
  140. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedance/catalog.json +0 -0
  141. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedream/__init__.py +0 -0
  142. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/byteplus_seedream/actions.py +0 -0
  143. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/__init__.py +0 -0
  144. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/actions.py +0 -0
  145. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/assets/icon.png +0 -0
  146. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/catalog.json +0 -0
  147. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/clay/docs/protocol.md +0 -0
  148. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/__init__.py +0 -0
  149. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/actions.py +0 -0
  150. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/assets/icon.png +0 -0
  151. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/docs/cloudflare-dns.md +0 -0
  152. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/cloudflare/integration.py +0 -0
  153. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/__init__.py +0 -0
  154. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/actions.py +0 -0
  155. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/assets/icon.jpeg +0 -0
  156. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/dataforseo/integration.py +0 -0
  157. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/__init__.py +0 -0
  158. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/actions.py +0 -0
  159. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/assets/icon.png +0 -0
  160. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/firecrawl/integration.py +0 -0
  161. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/__init__.py +0 -0
  162. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/assets/icon.svg +0 -0
  163. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/docs/ftp.md +0 -0
  164. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/integration.py +0 -0
  165. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ftp/remote_tree.py +0 -0
  166. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/__init__.py +0 -0
  167. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/actions.py +0 -0
  168. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/assets/icon.png +0 -0
  169. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ghost/integration.py +0 -0
  170. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/__init__.py +0 -0
  171. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/actions.py +0 -0
  172. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/assets/icon.png +0 -0
  173. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_ads/docs/protocol.md +0 -0
  174. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/__init__.py +0 -0
  175. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/actions.py +0 -0
  176. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/assets/icon.png +0 -0
  177. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_analytics/integration.py +0 -0
  178. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/__init__.py +0 -0
  179. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/actions.py +0 -0
  180. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/assets/icon.webp +0 -0
  181. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_gemini_image/integration.py +0 -0
  182. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/__init__.py +0 -0
  183. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/actions.py +0 -0
  184. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/docs/google-indexing.md +0 -0
  185. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_indexing/integration.py +0 -0
  186. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/__init__.py +0 -0
  187. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/actions.py +0 -0
  188. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/assets/icon.png +0 -0
  189. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/docs/google-search-console.md +0 -0
  190. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_search_console/integration.py +0 -0
  191. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/__init__.py +0 -0
  192. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/actions.py +0 -0
  193. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/assets/icon.png +0 -0
  194. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_tag_manager/integration.py +0 -0
  195. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/__init__.py +0 -0
  196. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/actions.py +0 -0
  197. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/assets/icon.png +0 -0
  198. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_veo/integration.py +0 -0
  199. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/__init__.py +0 -0
  200. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/actions.py +0 -0
  201. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/assets/icon.png +0 -0
  202. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/google_workspace/docs/protocol.md +0 -0
  203. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/http/__init__.py +0 -0
  204. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/http/actions.py +0 -0
  205. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/http/catalog.json +0 -0
  206. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/__init__.py +0 -0
  207. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/actions.py +0 -0
  208. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/assets/icon.png +0 -0
  209. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/contract.py +0 -0
  210. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/docs/hubspot.md +0 -0
  211. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/hubspot/integration.py +0 -0
  212. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/__init__.py +0 -0
  213. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/actions.py +0 -0
  214. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/assets/icon.png +0 -0
  215. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/ideogram/integration.py +0 -0
  216. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/__init__.py +0 -0
  217. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/actions.py +0 -0
  218. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/assets/icon.svg +0 -0
  219. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/docs/protocol.md +0 -0
  220. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/imap/integration.py +0 -0
  221. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/__init__.py +0 -0
  222. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/actions.py +0 -0
  223. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/assets/icon.png +0 -0
  224. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/jina/integration.py +0 -0
  225. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/__init__.py +0 -0
  226. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/actions.py +0 -0
  227. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/assets/icon.png +0 -0
  228. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/catalog.json +0 -0
  229. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/kling_video/integration.py +0 -0
  230. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/__init__.py +0 -0
  231. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/actions.py +0 -0
  232. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/auth/viewer-organization.graphql +0 -0
  233. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/create.graphql +0 -0
  234. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/delete.graphql +0 -0
  235. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/get.graphql +0 -0
  236. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/list.graphql +0 -0
  237. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/resolve.graphql +0 -0
  238. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/unresolve.graphql +0 -0
  239. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/comments/update.graphql +0 -0
  240. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/get.graphql +0 -0
  241. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/cycles/list.graphql +0 -0
  242. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/get.graphql +0 -0
  243. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-labels/list.graphql +0 -0
  244. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/create.graphql +0 -0
  245. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/delete.graphql +0 -0
  246. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/get.graphql +0 -0
  247. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/list.graphql +0 -0
  248. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issue-relations/update.graphql +0 -0
  249. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/add-label.graphql +0 -0
  250. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/archive.graphql +0 -0
  251. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/create.graphql +0 -0
  252. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/get.graphql +0 -0
  253. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/list.graphql +0 -0
  254. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/remove-label.graphql +0 -0
  255. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/search.graphql +0 -0
  256. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/unarchive.graphql +0 -0
  257. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/issues/update.graphql +0 -0
  258. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/projects/get.graphql +0 -0
  259. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/projects/list.graphql +0 -0
  260. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/teams/get.graphql +0 -0
  261. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/teams/list.graphql +0 -0
  262. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/users/get.graphql +0 -0
  263. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/users/list.graphql +0 -0
  264. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/viewer/get.graphql +0 -0
  265. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/get.graphql +0 -0
  266. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/graphql/workflow-states/list.graphql +0 -0
  267. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/assets/icon.png +0 -0
  268. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/contract.py +0 -0
  269. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/docs/linear.md +0 -0
  270. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/integration.py +0 -0
  271. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.json +0 -0
  272. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/schemas/introspection-2026-07-23.metadata.json +0 -0
  273. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/linear/schemas/root-policy-2026-07-23.json +0 -0
  274. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/__init__.py +0 -0
  275. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/actions.py +0 -0
  276. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/meta_ads/assets/icon.png +0 -0
  277. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/__init__.py +0 -0
  278. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/actions.py +0 -0
  279. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/assets/icon.png +0 -0
  280. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/microsoft_365/docs/protocol.md +0 -0
  281. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/__init__.py +0 -0
  282. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/actions.py +0 -0
  283. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/assets/icon.webp +0 -0
  284. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openai_images/integration.py +0 -0
  285. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/__init__.py +0 -0
  286. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/assets/icon.png +0 -0
  287. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/openrouter/integration.py +0 -0
  288. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/__init__.py +0 -0
  289. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/actions.py +0 -0
  290. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/assets/icon.png +0 -0
  291. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/outreach/docs/protocol.md +0 -0
  292. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/__init__.py +0 -0
  293. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/actions.py +0 -0
  294. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/assets/icon.png +0 -0
  295. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/docs/protocol.md +0 -0
  296. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/pipedrive/integration.py +0 -0
  297. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/__init__.py +0 -0
  298. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/actions.py +0 -0
  299. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/assets/icon.png +0 -0
  300. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reddit/integration.py +0 -0
  301. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/__init__.py +0 -0
  302. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/actions.py +0 -0
  303. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/assets/icon.png +0 -0
  304. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/reve/integration.py +0 -0
  305. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/__init__.py +0 -0
  306. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/actions.py +0 -0
  307. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/assets/icon.png +0 -0
  308. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesforce/docs/protocol.md +0 -0
  309. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/__init__.py +0 -0
  310. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/actions.py +0 -0
  311. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/assets/icon.jpeg +0 -0
  312. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/docs/protocol.md +0 -0
  313. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/salesloft/integration.py +0 -0
  314. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/__init__.py +0 -0
  315. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/actions.py +0 -0
  316. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/assets/icon.svg +0 -0
  317. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/serper/integration.py +0 -0
  318. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/__init__.py +0 -0
  319. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/actions.py +0 -0
  320. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/add-customer-tag.graphql +0 -0
  321. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/create-customer.graphql +0 -0
  322. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-lifetime-value.graphql +0 -0
  323. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer-orders.graphql +0 -0
  324. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/get-customer.graphql +0 -0
  325. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/list-customers.graphql +0 -0
  326. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/remove-customer-tag.graphql +0 -0
  327. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/search-customers.graphql +0 -0
  328. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/customers/update-customer.graphql +0 -0
  329. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/adjust-inventory.graphql +0 -0
  330. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-by-sku.graphql +0 -0
  331. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-inventory-item.graphql +0 -0
  332. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/get-location-inventory.graphql +0 -0
  333. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-item-availability.graphql +0 -0
  334. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-inventory-levels.graphql +0 -0
  335. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/list-product-variant-inventory.graphql +0 -0
  336. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/inventory/set-inventory-level.graphql +0 -0
  337. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-note.graphql +0 -0
  338. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/add-order-tag.graphql +0 -0
  339. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/create-draft-order.graphql +0 -0
  340. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-by-name.graphql +0 -0
  341. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-fulfillment-status.graphql +0 -0
  342. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order-timeline.graphql +0 -0
  343. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/get-order.graphql +0 -0
  344. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-order-variant-quantities.graphql +0 -0
  345. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/list-orders.graphql +0 -0
  346. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/mark-order-paid.graphql +0 -0
  347. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/search-orders.graphql +0 -0
  348. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-note.graphql +0 -0
  349. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/orders/update-order-tags.graphql +0 -0
  350. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-collection.graphql +0 -0
  351. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product-variant.graphql +0 -0
  352. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/create-product.graphql +0 -0
  353. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-collection.graphql +0 -0
  354. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-by-handle.graphql +0 -0
  355. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product-variant.graphql +0 -0
  356. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/get-product.graphql +0 -0
  357. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-collections.graphql +0 -0
  358. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-product-variants.graphql +0 -0
  359. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/list-products.graphql +0 -0
  360. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/search-products.graphql +0 -0
  361. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-status.graphql +0 -0
  362. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product-variant.graphql +0 -0
  363. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/products/update-product.graphql +0 -0
  364. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/graphql/shopifyql.graphql +0 -0
  365. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/assets/icon.png +0 -0
  366. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/docs/shopify.md +0 -0
  367. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/integration.py +0 -0
  368. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/shopify/payloads.py +0 -0
  369. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/__init__.py +0 -0
  370. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/actions.py +0 -0
  371. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/catalog.json +0 -0
  372. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/sitemap/integration.py +0 -0
  373. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/__init__.py +0 -0
  374. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/actions.py +0 -0
  375. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/assets/icon.png +0 -0
  376. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/constants.py +0 -0
  377. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/docs/protocol.md +0 -0
  378. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/files.py +0 -0
  379. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/http.py +0 -0
  380. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/integration.py +0 -0
  381. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/payloads.py +0 -0
  382. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/results.py +0 -0
  383. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/slack_bot/validation.py +0 -0
  384. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/__init__.py +0 -0
  385. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/actions.py +0 -0
  386. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/assets/icon.svg +0 -0
  387. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/docs/protocol.md +0 -0
  388. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/smtp/integration.py +0 -0
  389. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/__init__.py +0 -0
  390. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/actions.py +0 -0
  391. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/assets/icon.jpeg +0 -0
  392. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/contract.py +0 -0
  393. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/docs/stripe.md +0 -0
  394. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/stripe/integration.py +0 -0
  395. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/__init__.py +0 -0
  396. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/actions.py +0 -0
  397. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/taboola/assets/icon.svg +0 -0
  398. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/__init__.py +0 -0
  399. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/actions.py +0 -0
  400. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/assets/icon.png +0 -0
  401. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/catalog.json +0 -0
  402. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/docs/protocol.md +0 -0
  403. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/payloads.py +0 -0
  404. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/schema.py +0 -0
  405. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/__init__.py +0 -0
  406. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/native.py +0 -0
  407. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/proxy.py +0 -0
  408. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/telegram/tdlib/sessions.py +0 -0
  409. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/__init__.py +0 -0
  410. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/actions.py +0 -0
  411. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/catalog.json +0 -0
  412. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/openapi.json +0 -0
  413. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/agent-api/stackos-tools.json +0 -0
  414. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets/icon.png +0 -0
  415. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/assets.py +0 -0
  416. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/contract.py +0 -0
  417. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/docs/agent-api/README.md +0 -0
  418. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/docs/trackbooth.md +0 -0
  419. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/integration.py +0 -0
  420. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/schema.py +0 -0
  421. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/trackbooth/transport.py +0 -0
  422. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/__init__.py +0 -0
  423. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/actions.py +0 -0
  424. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/assets/icon.png +0 -0
  425. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/wordpress/integration.py +0 -0
  426. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/__init__.py +0 -0
  427. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/actions.py +0 -0
  428. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/assets/icon.png +0 -0
  429. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/connectors/xai_imagine/integration.py +0 -0
  430. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/errors.py +0 -0
  431. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/py.typed +0 -0
  432. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/redaction.py +0 -0
  433. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/registry.py +0 -0
  434. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/__init__.py +0 -0
  435. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/base.py +0 -0
  436. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/byteplus/__init__.py +0 -0
  437. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/byteplus/ark.py +0 -0
  438. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/byteplus/media.py +0 -0
  439. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/google/__init__.py +0 -0
  440. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/google/batch.py +0 -0
  441. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/icons/integration.svg +0 -0
  442. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/media.py +0 -0
  443. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/provider_utils.py +0 -0
  444. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/rate_limit.py +0 -0
  445. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/shared/vendor_utils.py +0 -0
  446. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/src/stackos_connectors/validation.py +0 -0
  447. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/conftest.py +0 -0
  448. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/fixtures/wire-contracts.json +0 -0
  449. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_named_actions.py +0 -0
  450. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_pipedrive_probes.py +0 -0
  451. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_probe_boundary.py +0 -0
  452. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/business/test_salesloft_probes.py +0 -0
  453. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/catalog/test_catalog.py +0 -0
  454. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/catalog/test_nested_resources.py +0 -0
  455. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/catalog/test_presentation.py +0 -0
  456. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_contract.py +0 -0
  457. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_native_result_boundary.py +0 -0
  458. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_nested_auth_redaction.py +0 -0
  459. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_preflight_redaction.py +0 -0
  460. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_public_key_facts.py +0 -0
  461. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_runtime.py +0 -0
  462. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_timeout_options.py +0 -0
  463. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_validation_data.py +0 -0
  464. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/core/test_validation_execution_outcome.py +0 -0
  465. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/mail_slack/__init__.py +0 -0
  466. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/mail_slack/test_native.py +0 -0
  467. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/mail_slack/test_probes_catalog.py +0 -0
  468. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_aignc_native.py +0 -0
  469. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_generation_outcomes.py +0 -0
  470. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_media_files.py +0 -0
  471. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/media/test_named_media.py +0 -0
  472. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/conftest.py +0 -0
  473. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/test_linear_transport.py +0 -0
  474. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/test_safe_refs_named_actions.py +0 -0
  475. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/safe_refs/test_stripe_transport_transport.py +0 -0
  476. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/__init__.py +0 -0
  477. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_actions.py +0 -0
  478. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_closure_outcomes.py +0 -0
  479. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_native.py +0 -0
  480. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_payloads.py +0 -0
  481. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_proxy.py +0 -0
  482. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/telegram/test_sessions.py +0 -0
  483. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/trackbooth/__init__.py +0 -0
  484. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/trackbooth/test_native.py +0 -0
  485. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/__init__.py +0 -0
  486. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/catalog_fixture.py +0 -0
  487. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/conftest.py +0 -0
  488. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_ahrefs.py +0 -0
  489. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_boundary_timeout.py +0 -0
  490. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_cloudflare.py +0 -0
  491. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_dataforseo.py +0 -0
  492. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_firecrawl.py +0 -0
  493. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_ftp.py +0 -0
  494. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_analytics.py +0 -0
  495. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_indexing.py +0 -0
  496. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_indexing_batch.py +0 -0
  497. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_search_console.py +0 -0
  498. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_search_console_batch.py +0 -0
  499. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_google_tag_manager.py +0 -0
  500. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_jina_reader.py +0 -0
  501. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_named_clients.py +0 -0
  502. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_native_boundary.py +0 -0
  503. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_openrouter.py +0 -0
  504. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_reddit.py +0 -0
  505. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_s3.py +0 -0
  506. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_s3_actions.py +0 -0
  507. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_serper.py +0 -0
  508. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_shopify.py +0 -0
  509. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_sitemap.py +0 -0
  510. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_transport_defaults.py +0 -0
  511. {stackos_connectors-0.1.0 → stackos_connectors-0.2.0}/tests/web/test_wordpress_ghost.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: stackos-connectors
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Named provider connectors with plain data and caller-owned authentication.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -20,8 +20,10 @@ A Python library of named provider connectors. A caller supplies a connector,
20
20
  action, input data and resolved authentication. The library maps that action to
21
21
  the provider protocol and returns provider output, metadata and file descriptors.
22
22
 
23
- The consumer owns credential storage and refresh, authorization, persistent state,
24
- workflow decisions and audit. Provider implementations use plain contracts and
23
+ The consumer owns credential storage, when to authorize or refresh, persistent
24
+ state, workflow decisions and audit. Explicit package functions implement provider
25
+ authorization URLs, token grants, probes and signature checks. They never start
26
+ authorization, refresh tokens or persist state implicitly. Provider implementations use plain contracts and
25
27
  can accept caller-owned HTTP clients, rate buckets and native protocol sessions.
26
28
 
27
29
  Each integration is grouped under `src/stackos_connectors/connectors/`:
@@ -71,6 +73,74 @@ execution; existing names cannot be replaced.
71
73
  `CallOptions.timeout=None` preserves each provider's default. A numeric timeout
72
74
  overrides that default. A supplied HTTP client remains caller-owned.
73
75
 
76
+ ## Explicit authentication
77
+
78
+ `get_auth_contract(connector, method=..., config=...)` reads immutable provider
79
+ facts from the bundled catalog. `build_authorization_request` formats a consent
80
+ URL using the caller's redirect URI, state and optional PKCE challenge. The caller
81
+ opens that URL, handles the callback and checks its state. `request_token` performs
82
+ one requested `authorization_code`, `refresh_token`, `client_credentials` or
83
+ `jwt_bearer` grant, where the selected method declares support. Meta's declared
84
+ second token exchange is part of that explicit request.
85
+
86
+ ```python
87
+ from stackos_connectors import ConnectorAuth, request_token
88
+
89
+ token = await request_token(
90
+ "google-search-console",
91
+ auth=ConnectorAuth(
92
+ method="oauth2_authorization_code",
93
+ fields={"client_id": client_id, "client_secret": client_secret},
94
+ ),
95
+ grant_type="authorization_code",
96
+ code=validated_callback_code,
97
+ redirect_uri=registered_redirect_uri,
98
+ code_verifier=stored_pkce_verifier,
99
+ http=caller_http,
100
+ )
101
+ ```
102
+
103
+ Grant calls accept resolved application/key fields; action and probe calls accept
104
+ the method's resolved execution fields, usually an access token. The catalog's
105
+ `setup` and `protocol` describe acquisition separately from `fields_schema` and
106
+ `config_schema`. Manual token methods retain their declared refresh compatibility;
107
+ the library does not infer an auth method from token shape.
108
+
109
+ `TokenResult` holds sensitive in-process values. An absent `refresh_token` means
110
+ the response did not rotate it. `scopes_present=False` distinguishes omitted
111
+ scope evidence from an explicitly empty grant. For a successful Google JWT grant,
112
+ the immutable contract supplies the signed request's scopes; the consumer can
113
+ apply the reviewed omission rule without changing the token response's provenance.
114
+ The caller decides how to preserve prior evidence, enforce permissions and store
115
+ results. `OAuthTokenError` exposes bounded categories/status and repair facts,
116
+ without raw provider response bodies. Repr suppression is not a storage policy.
117
+
118
+ `probe_credentials(connector, auth=..., options=..., context=...)` explicitly
119
+ tests a resolved credential through a fixed provider binding. It returns safe
120
+ provider facts and optional `AuthProbeEvidence`; it does not establish application
121
+ readiness or permissions. `project_probe_config` projects portable config and
122
+ retains supported legacy probe aliases. The caller chooses the IMAP native mailbox
123
+ through `CallOptions(provider_context={"mailbox": ...})`. Google Ads/Workspace
124
+ service-account probes only report resolved-token presence and unverified resource
125
+ access; they make no HTTP call or new-grant claim.
126
+
127
+ Google JWT validation/signing is shared across the five declared service-account
128
+ methods. Credentials never come from ambient identity or key-supplied endpoints.
129
+ Provider details live in `connectors/<provider>/docs/auth.md` and the catalog.
130
+ Google Indexing retains its existing resolved-token action/probe contract; this
131
+ release adds no Indexing JWT acquisition method.
132
+
133
+ Provider-local pure helpers cover Telegram authorization request/challenge/state
134
+ translation (`connectors.telegram.auth`), Slack v0 HMAC verification
135
+ (`connectors.slack_bot.auth.verify_signature_v0`) and HubSpot v3 HMAC verification
136
+ (`connectors.hubspot.signature.verify_signature_v3`). Callers own native sessions,
137
+ encrypted custody, challenge expiry, ingress routing, trusted canonical URI,
138
+ timestamp/replay checks and policy. HubSpot v2 verification is not implemented.
139
+
140
+ No library call to discovery, probe or action execution starts an authorization
141
+ flow, refreshes a token, opens a native session, stores credentials or selects
142
+ readiness. Remote token revocation is not part of this API.
143
+
74
144
  For file-producing actions, pass `CallOptions(output_dir=Path(...))` and consume
75
145
  the plain descriptors in `result.files`. The library does not create application
76
146
  artifacts or public download URLs. Telegram actions require an already authorized
@@ -118,10 +188,10 @@ Python 3.12 or newer is required. Source:
118
188
  Published releases can be installed with:
119
189
 
120
190
  ```bash
121
- python -m pip install stackos-connectors==0.1.0
191
+ python -m pip install stackos-connectors==0.2.0
122
192
  ```
123
193
 
124
- Or add `stackos-connectors==0.1.0` to your Python dependency requirements.
194
+ Or add `stackos-connectors==0.2.0` to your Python dependency requirements.
125
195
 
126
196
  Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
127
197
  build a wheel with `python -m build --wheel` and install that wheel. Runtime use
@@ -4,8 +4,10 @@ A Python library of named provider connectors. A caller supplies a connector,
4
4
  action, input data and resolved authentication. The library maps that action to
5
5
  the provider protocol and returns provider output, metadata and file descriptors.
6
6
 
7
- The consumer owns credential storage and refresh, authorization, persistent state,
8
- workflow decisions and audit. Provider implementations use plain contracts and
7
+ The consumer owns credential storage, when to authorize or refresh, persistent
8
+ state, workflow decisions and audit. Explicit package functions implement provider
9
+ authorization URLs, token grants, probes and signature checks. They never start
10
+ authorization, refresh tokens or persist state implicitly. Provider implementations use plain contracts and
9
11
  can accept caller-owned HTTP clients, rate buckets and native protocol sessions.
10
12
 
11
13
  Each integration is grouped under `src/stackos_connectors/connectors/`:
@@ -55,6 +57,74 @@ execution; existing names cannot be replaced.
55
57
  `CallOptions.timeout=None` preserves each provider's default. A numeric timeout
56
58
  overrides that default. A supplied HTTP client remains caller-owned.
57
59
 
60
+ ## Explicit authentication
61
+
62
+ `get_auth_contract(connector, method=..., config=...)` reads immutable provider
63
+ facts from the bundled catalog. `build_authorization_request` formats a consent
64
+ URL using the caller's redirect URI, state and optional PKCE challenge. The caller
65
+ opens that URL, handles the callback and checks its state. `request_token` performs
66
+ one requested `authorization_code`, `refresh_token`, `client_credentials` or
67
+ `jwt_bearer` grant, where the selected method declares support. Meta's declared
68
+ second token exchange is part of that explicit request.
69
+
70
+ ```python
71
+ from stackos_connectors import ConnectorAuth, request_token
72
+
73
+ token = await request_token(
74
+ "google-search-console",
75
+ auth=ConnectorAuth(
76
+ method="oauth2_authorization_code",
77
+ fields={"client_id": client_id, "client_secret": client_secret},
78
+ ),
79
+ grant_type="authorization_code",
80
+ code=validated_callback_code,
81
+ redirect_uri=registered_redirect_uri,
82
+ code_verifier=stored_pkce_verifier,
83
+ http=caller_http,
84
+ )
85
+ ```
86
+
87
+ Grant calls accept resolved application/key fields; action and probe calls accept
88
+ the method's resolved execution fields, usually an access token. The catalog's
89
+ `setup` and `protocol` describe acquisition separately from `fields_schema` and
90
+ `config_schema`. Manual token methods retain their declared refresh compatibility;
91
+ the library does not infer an auth method from token shape.
92
+
93
+ `TokenResult` holds sensitive in-process values. An absent `refresh_token` means
94
+ the response did not rotate it. `scopes_present=False` distinguishes omitted
95
+ scope evidence from an explicitly empty grant. For a successful Google JWT grant,
96
+ the immutable contract supplies the signed request's scopes; the consumer can
97
+ apply the reviewed omission rule without changing the token response's provenance.
98
+ The caller decides how to preserve prior evidence, enforce permissions and store
99
+ results. `OAuthTokenError` exposes bounded categories/status and repair facts,
100
+ without raw provider response bodies. Repr suppression is not a storage policy.
101
+
102
+ `probe_credentials(connector, auth=..., options=..., context=...)` explicitly
103
+ tests a resolved credential through a fixed provider binding. It returns safe
104
+ provider facts and optional `AuthProbeEvidence`; it does not establish application
105
+ readiness or permissions. `project_probe_config` projects portable config and
106
+ retains supported legacy probe aliases. The caller chooses the IMAP native mailbox
107
+ through `CallOptions(provider_context={"mailbox": ...})`. Google Ads/Workspace
108
+ service-account probes only report resolved-token presence and unverified resource
109
+ access; they make no HTTP call or new-grant claim.
110
+
111
+ Google JWT validation/signing is shared across the five declared service-account
112
+ methods. Credentials never come from ambient identity or key-supplied endpoints.
113
+ Provider details live in `connectors/<provider>/docs/auth.md` and the catalog.
114
+ Google Indexing retains its existing resolved-token action/probe contract; this
115
+ release adds no Indexing JWT acquisition method.
116
+
117
+ Provider-local pure helpers cover Telegram authorization request/challenge/state
118
+ translation (`connectors.telegram.auth`), Slack v0 HMAC verification
119
+ (`connectors.slack_bot.auth.verify_signature_v0`) and HubSpot v3 HMAC verification
120
+ (`connectors.hubspot.signature.verify_signature_v3`). Callers own native sessions,
121
+ encrypted custody, challenge expiry, ingress routing, trusted canonical URI,
122
+ timestamp/replay checks and policy. HubSpot v2 verification is not implemented.
123
+
124
+ No library call to discovery, probe or action execution starts an authorization
125
+ flow, refreshes a token, opens a native session, stores credentials or selects
126
+ readiness. Remote token revocation is not part of this API.
127
+
58
128
  For file-producing actions, pass `CallOptions(output_dir=Path(...))` and consume
59
129
  the plain descriptors in `result.files`. The library does not create application
60
130
  artifacts or public download URLs. Telegram actions require an already authorized
@@ -102,10 +172,10 @@ Python 3.12 or newer is required. Source:
102
172
  Published releases can be installed with:
103
173
 
104
174
  ```bash
105
- python -m pip install stackos-connectors==0.1.0
175
+ python -m pip install stackos-connectors==0.2.0
106
176
  ```
107
177
 
108
- Or add `stackos-connectors==0.1.0` to your Python dependency requirements.
178
+ Or add `stackos-connectors==0.2.0` to your Python dependency requirements.
109
179
 
110
180
  Install from a local checkout with `pip install /path/to/StackOSConnectors`, or
111
181
  build a wheel with `python -m build --wheel` and install that wheel. Runtime use
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "stackos-connectors"
7
- version = "0.1.0"
7
+ version = "0.2.0"
8
8
  description = "Named provider connectors with plain data and caller-owned authentication."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -4,6 +4,15 @@ from collections.abc import Mapping
4
4
  from functools import lru_cache
5
5
  from typing import Any
6
6
 
7
+ from .auth import (
8
+ AuthorizationRequest,
9
+ OAuthProviderContract,
10
+ OAuthTokenError,
11
+ TokenResult,
12
+ build_authorization_request,
13
+ get_auth_contract,
14
+ request_token,
15
+ )
7
16
  from .contracts import (
8
17
  ActionDefinition,
9
18
  AuthMethodDefinition,
@@ -18,6 +27,12 @@ from .contracts import (
18
27
  ValidationIssue,
19
28
  )
20
29
  from .errors import ConnectorError, IntegrationDownError, RateLimitedError, ValidationError
30
+ from .probe import (
31
+ AuthMethodProbeContext,
32
+ AuthProbeEvidence,
33
+ probe_credentials,
34
+ project_probe_config,
35
+ )
21
36
  from .registry import ConnectorClient, ConnectorRegistry
22
37
 
23
38
 
@@ -74,6 +89,9 @@ def describe(connector: str, action: str | None = None) -> dict[str, Any]:
74
89
  __all__ = [
75
90
  "ActionDefinition",
76
91
  "AuthMethodDefinition",
92
+ "AuthMethodProbeContext",
93
+ "AuthProbeEvidence",
94
+ "AuthorizationRequest",
77
95
  "CallOptions",
78
96
  "Connector",
79
97
  "ConnectorAuth",
@@ -85,15 +103,23 @@ __all__ = [
85
103
  "ConnectorResult",
86
104
  "IntegrationDownError",
87
105
  "NativeSession",
106
+ "OAuthProviderContract",
107
+ "OAuthTokenError",
88
108
  "RateLimitedError",
89
109
  "RateLimiter",
110
+ "TokenResult",
90
111
  "ValidationError",
91
112
  "ValidationIssue",
113
+ "build_authorization_request",
92
114
  "describe",
93
115
  "estimate_cost",
94
116
  "execute",
117
+ "get_auth_contract",
95
118
  "get_default_client",
96
119
  "list_connectors",
120
+ "probe_credentials",
121
+ "project_probe_config",
122
+ "request_token",
97
123
  "validate",
98
124
  "validate_data",
99
125
  ]
@@ -0,0 +1,245 @@
1
+ """Explicit provider authentication protocols; the caller owns every lifecycle decision.
2
+
3
+ These functions never store credentials, launch consent, choose when to renew, or
4
+ enforce application readiness. Token results are sensitive in-process values.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from collections.abc import Mapping, Sequence
10
+ from dataclasses import dataclass, field, fields, replace
11
+ from importlib import import_module
12
+ from typing import Any, Literal
13
+ from urllib.parse import urlencode
14
+
15
+ import httpx
16
+
17
+ from .contracts import ConnectorAuth, freeze, thaw
18
+
19
+
20
+ class OAuthTokenError(ValueError):
21
+ """Allowlisted protocol diagnostics, never provider bodies or request objects."""
22
+
23
+ def __init__(
24
+ self,
25
+ detail: str,
26
+ *,
27
+ provider_key: str | None = None,
28
+ category: str = "invalid_input",
29
+ retryable: bool = False,
30
+ repair_required: bool = False,
31
+ status_code: int | None = None,
32
+ invalid_fields: Sequence[str] = (),
33
+ ) -> None:
34
+ super().__init__(detail)
35
+ self.provider_key = provider_key
36
+ self.category = category
37
+ self.retryable = retryable
38
+ self.repair_required = repair_required
39
+ self.status_code = status_code
40
+ self.invalid_fields = tuple(invalid_fields)
41
+
42
+
43
+ @dataclass(frozen=True)
44
+ class OAuthProviderContract:
45
+ provider_key: str
46
+ flow: Literal["authorization_code", "client_credentials", "jwt_bearer"]
47
+ token_endpoint: str
48
+ authorization_endpoint: str | None = None
49
+ include_response_type: bool = True
50
+ scopes: tuple[str, ...] = ()
51
+ scope_separator: str = " "
52
+ optional_scope_parameter: str | None = None
53
+ client_auth_style: Literal["body", "basic"] = "body"
54
+ pkce_mode: Literal["required", "supported", "unavailable"] = "unavailable"
55
+ authorization_params: tuple[tuple[str, str], ...] = ()
56
+ token_params: tuple[tuple[str, str], ...] = ()
57
+ response_metadata_fields: tuple[str, ...] = ()
58
+ response_scope_fields: tuple[str, ...] = ("scope",)
59
+ response_account_id_field: str | None = "id"
60
+ authorization_code_response_requirements: tuple[str, ...] = ()
61
+ refresh_token_response_requirements: tuple[str, ...] = ()
62
+ required_token_type: str | None = None
63
+ required_scope_subset: tuple[str, ...] = ()
64
+ hook: str | None = None
65
+ delegated_subject: str | None = field(default=None, repr=False)
66
+ grant_types: tuple[str, ...] = ()
67
+ response_config_fields: tuple[tuple[str, str, str], ...] = ()
68
+ optional_scope_bundles: Mapping[str, Any] = field(default_factory=dict)
69
+
70
+ def __post_init__(self) -> None:
71
+ for descriptor in fields(self):
72
+ value = getattr(self, descriptor.name)
73
+ if isinstance(value, Mapping | list | tuple):
74
+ object.__setattr__(self, descriptor.name, freeze(value))
75
+
76
+
77
+ @dataclass(frozen=True)
78
+ class AuthorizationRequest:
79
+ url: str = field(repr=False)
80
+ required_scopes: tuple[str, ...] = ()
81
+ optional_scopes: tuple[str, ...] = ()
82
+
83
+
84
+ @dataclass(frozen=True)
85
+ class TokenResult:
86
+ access_token: str = field(repr=False)
87
+ refresh_token: str | None = field(default=None, repr=False)
88
+ expires_in: int | float | None = None
89
+ token_type: str | None = field(default=None, repr=False)
90
+ scopes: tuple[str, ...] | None = field(default=None, repr=False)
91
+ scopes_present: bool = False
92
+ account_id: str | None = field(default=None, repr=False)
93
+ metadata: Mapping[str, Any] = field(default_factory=dict, repr=False)
94
+ config_updates: Mapping[str, Any] = field(default_factory=dict, repr=False)
95
+
96
+ def __post_init__(self) -> None:
97
+ object.__setattr__(self, "metadata", freeze(self.metadata))
98
+ object.__setattr__(self, "config_updates", freeze(self.config_updates))
99
+ if self.scopes is not None:
100
+ object.__setattr__(self, "scopes", tuple(self.scopes))
101
+
102
+
103
+ def _declaration(connector: str, method: str) -> tuple[Mapping, Mapping]:
104
+ from . import get_default_client
105
+
106
+ metadata = get_default_client().registry.connector_metadata.get(connector)
107
+ if metadata is None:
108
+ raise OAuthTokenError("connector has no supported authentication protocol")
109
+ declaration = next(
110
+ (item for item in metadata.get("auth_methods", ()) if item["key"] == method),
111
+ None,
112
+ )
113
+ if declaration is None or "protocol" not in declaration or "auth_protocol" not in metadata:
114
+ raise OAuthTokenError(
115
+ "auth method has no supported authentication protocol", provider_key=connector
116
+ )
117
+ return metadata, declaration
118
+
119
+
120
+ def get_auth_contract(
121
+ connector: str,
122
+ *,
123
+ method: str,
124
+ config: Mapping[str, Any] | None = None,
125
+ ) -> OAuthProviderContract:
126
+ """Read trusted provider facts; configuration cannot replace protocol endpoints."""
127
+ metadata, declaration = _declaration(connector, method)
128
+ data = thaw(metadata["auth_protocol"])
129
+ method_data = thaw(declaration["protocol"])
130
+ direct_scopes = method_data.pop("direct_scopes", None)
131
+ data.update(method_data)
132
+ contract = OAuthProviderContract(provider_key=connector, **data)
133
+ if contract.flow == "jwt_bearer":
134
+ from .shared.google.service_account import delegated_subject
135
+
136
+ subject = delegated_subject(connector, (config or {}).get("delegated_subject"))
137
+ contract = replace(contract, delegated_subject=subject)
138
+ if subject is None and direct_scopes is not None:
139
+ contract = replace(contract, scopes=tuple(direct_scopes))
140
+ if binding := metadata.get("auth_implementation"):
141
+ module_name, function_name = binding.split(":", 1)
142
+ contract = getattr(import_module(module_name), function_name)(contract, config or {})
143
+ return contract
144
+
145
+
146
+ def build_authorization_request(
147
+ connector: str,
148
+ *,
149
+ auth: ConnectorAuth,
150
+ redirect_uri: str,
151
+ state: str,
152
+ code_challenge: str | None = None,
153
+ optional_scopes: Sequence[str] = (),
154
+ ) -> AuthorizationRequest:
155
+ """Format one consent URL using caller-generated state and PKCE challenge."""
156
+ contract = get_auth_contract(connector, method=auth.method, config=auth.config)
157
+ if "authorization_code" not in contract.grant_types or not contract.authorization_endpoint:
158
+ raise OAuthTokenError(
159
+ "auth method does not support authorization-code consent", provider_key=connector
160
+ )
161
+ client_id = auth.fields.get("client_id")
162
+ if not isinstance(client_id, str) or not client_id.strip():
163
+ raise OAuthTokenError("OAuth application id is missing", provider_key=connector)
164
+ if (
165
+ not isinstance(redirect_uri, str)
166
+ or not redirect_uri
167
+ or not isinstance(state, str)
168
+ or not state
169
+ ):
170
+ raise OAuthTokenError("callback URI and state are required", provider_key=connector)
171
+ if code_challenge is not None and (not isinstance(code_challenge, str) or not code_challenge):
172
+ raise OAuthTokenError("PKCE challenge is invalid", provider_key=connector)
173
+ if contract.pkce_mode == "required" and not code_challenge:
174
+ raise OAuthTokenError("provider requires PKCE S256", provider_key=connector)
175
+ if contract.pkce_mode == "unavailable" and code_challenge is not None:
176
+ raise OAuthTokenError("provider does not support PKCE", provider_key=connector)
177
+ allowed_optional = {
178
+ scope
179
+ for bundle in contract.optional_scope_bundles.values()
180
+ for scope in bundle.get("optional_scopes", ())
181
+ }
182
+ if isinstance(optional_scopes, str) or any(
183
+ not isinstance(s, str) or s not in allowed_optional for s in optional_scopes
184
+ ):
185
+ raise OAuthTokenError("optional scopes must be provider-declared", provider_key=connector)
186
+ optional = tuple(dict.fromkeys(optional_scopes))
187
+ if optional and not contract.optional_scope_parameter:
188
+ raise OAuthTokenError(
189
+ "provider does not support optional consent scopes", provider_key=connector
190
+ )
191
+ query = {"client_id": client_id.strip(), "redirect_uri": redirect_uri, "state": state}
192
+ if contract.include_response_type:
193
+ query["response_type"] = "code"
194
+ if contract.scopes:
195
+ query["scope"] = contract.scope_separator.join(contract.scopes)
196
+ if optional and contract.optional_scope_parameter:
197
+ query[contract.optional_scope_parameter] = contract.scope_separator.join(optional)
198
+ query.update(contract.authorization_params)
199
+ if code_challenge:
200
+ query.update(code_challenge=code_challenge, code_challenge_method="S256")
201
+ return AuthorizationRequest(
202
+ f"{contract.authorization_endpoint}?{urlencode(query)}",
203
+ contract.scopes,
204
+ optional,
205
+ )
206
+
207
+
208
+ async def request_token(
209
+ connector: str,
210
+ *,
211
+ auth: ConnectorAuth,
212
+ grant_type: Literal["authorization_code", "refresh_token", "client_credentials", "jwt_bearer"],
213
+ code: str | None = None,
214
+ redirect_uri: str | None = None,
215
+ code_verifier: str | None = None,
216
+ refresh_token: str | None = None,
217
+ http: httpx.AsyncClient | None = None,
218
+ timeout: float = 30,
219
+ ) -> TokenResult:
220
+ """Perform exactly one explicit grant (including a declared provider second exchange)."""
221
+ from .shared.oauth import request_token as perform
222
+
223
+ contract = get_auth_contract(connector, method=auth.method, config=auth.config)
224
+ return await perform(
225
+ contract=contract,
226
+ auth=auth,
227
+ grant_type=grant_type,
228
+ code=code,
229
+ redirect_uri=redirect_uri,
230
+ code_verifier=code_verifier,
231
+ refresh_token=refresh_token,
232
+ http=http,
233
+ timeout=timeout,
234
+ )
235
+
236
+
237
+ __all__ = [
238
+ "AuthorizationRequest",
239
+ "OAuthProviderContract",
240
+ "OAuthTokenError",
241
+ "TokenResult",
242
+ "build_authorization_request",
243
+ "get_auth_contract",
244
+ "request_token",
245
+ ]