UncountablePythonSDK 0.0.175__tar.gz → 0.0.176__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 (429) hide show
  1. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/.github/workflows/publish.yml +1 -1
  2. {uncountablepythonsdk-0.0.175/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.176}/PKG-INFO +2 -2
  3. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176/UncountablePythonSDK.egg-info}/PKG-INFO +2 -2
  4. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/UncountablePythonSDK.egg-info/SOURCES.txt +5 -0
  5. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/UncountablePythonSDK.egg-info/requires.txt +1 -1
  6. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/actions_registry/__main__.py +1 -0
  7. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/actions_registry/emit_python.py +4 -0
  8. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/actions_registry/emit_typescript.py +4 -0
  9. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/value_spec/__main__.py +10 -0
  10. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/value_spec/emit_python.py +9 -0
  11. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pyproject.toml +1 -1
  12. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/cli.py +29 -0
  13. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/construct_client.py +6 -6
  14. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/job.py +27 -6
  15. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/command_client.py +20 -0
  16. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/command_server.py +19 -0
  17. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +9 -0
  18. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +9 -5
  19. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +12 -0
  20. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +47 -0
  21. uncountablepythonsdk-0.0.176/uncountable/integration/queue_runner/command_server/provision_webhook.py +28 -0
  22. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/scan_profiles.py +2 -0
  23. uncountablepythonsdk-0.0.176/uncountable/integration/secret_retrieval/__init__.py +7 -0
  24. uncountablepythonsdk-0.0.175/uncountable/integration/secret_retrieval/retrieve_secret.py → uncountablepythonsdk-0.0.176/uncountable/integration/secret_retrieval/basic_secret.py +12 -4
  25. uncountablepythonsdk-0.0.176/uncountable/integration/secret_retrieval/retrieve_secret.py +108 -0
  26. uncountablepythonsdk-0.0.176/uncountable/integration/webhook_signature_key.py +110 -0
  27. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/__init__.py +2 -0
  28. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/notebooks/add_notebook_content.py +3 -2
  29. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_recipes_data.py +1 -1
  30. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/auth_retrieval_t.py +3 -3
  31. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/client_base.py +2 -2
  32. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/entity_t.py +4 -0
  33. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/integration_server_t.py +1 -0
  34. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/job_definition.py +1 -0
  35. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/job_definition_t.py +18 -1
  36. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/secret_retrieval.py +2 -0
  37. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/secret_retrieval_t.py +33 -1
  38. uncountablepythonsdk-0.0.176/uncountable/types/webhook.py +7 -0
  39. uncountablepythonsdk-0.0.176/uncountable/types/webhook_t.py +22 -0
  40. uncountablepythonsdk-0.0.175/uncountable/integration/secret_retrieval/__init__.py +0 -3
  41. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/.github/workflows/documentation.yml +0 -0
  42. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/.gitignore +0 -0
  43. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/README.md +0 -0
  44. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  45. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  46. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/.flowmarkignore +0 -0
  47. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/.gitignore +0 -0
  48. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/conf.py +0 -0
  49. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/index.md +0 -0
  50. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/integration_examples/add_file_to_folder.md +0 -0
  51. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/integration_examples/create_ingredient.md +0 -0
  52. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/integration_examples/create_output.md +0 -0
  53. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/integration_examples/index.md +0 -0
  54. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/integration_examples/upload_file.md +0 -0
  55. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/justfile +0 -0
  56. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/requirements.txt +0 -0
  57. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/android-chrome-192x192.png +0 -0
  58. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/android-chrome-512x512.png +0 -0
  59. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/apple-touch-icon.png +0 -0
  60. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/browserconfig.xml +0 -0
  61. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/favicon-16x16.png +0 -0
  62. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/favicon-32x32.png +0 -0
  63. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/manifest.json +0 -0
  64. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/mstile-150x150.png +0 -0
  65. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  66. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/docs/static/logo_blue.png +0 -0
  67. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/async_batch.py +0 -0
  68. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/async_batch_large_parse.py +0 -0
  69. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/basic_auth.py +0 -0
  70. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/create_entity.py +0 -0
  71. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/create_ingredient_sdk.py +0 -0
  72. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/download_files.py +0 -0
  73. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/edit_recipe_inputs.py +0 -0
  74. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  75. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  76. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  77. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  78. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  79. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  80. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  81. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  82. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  83. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/integration-server/pyproject.toml +0 -0
  84. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/invoke_uploader.py +0 -0
  85. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/oauth.py +0 -0
  86. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/set_input_pdf_attribute.py +0 -0
  87. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/set_recipe_metadata_file.py +0 -0
  88. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/set_recipe_output_file_sdk.py +0 -0
  89. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/examples/upload_files.py +0 -0
  90. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/__init__.py +0 -0
  91. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/__init__.py +0 -0
  92. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/cached_parser.py +0 -0
  93. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/case_convert.py +0 -0
  94. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_base.py +0 -0
  95. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_builder.py +0 -0
  96. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_cache.py +0 -0
  97. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_error.py +0 -0
  98. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_function_type.py +0 -0
  99. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_inner.py +0 -0
  100. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/parser_options.py +0 -0
  101. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/argument_parser/type_predicates.py +0 -0
  102. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/__init__.py +0 -0
  103. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_blob_session.py +0 -0
  104. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_file_share_session.py +0 -0
  105. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  106. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_local_session.py +0 -0
  107. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_s3_session.py +0 -0
  108. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_sftp_connection.py +0 -0
  109. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  110. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  111. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  112. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/py.typed +0 -0
  113. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/__init__.py +0 -0
  114. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/annotation.py +0 -0
  115. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/missing_sentry.py +0 -0
  116. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/opaque_key.py +0 -0
  117. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/serial_alias.py +0 -0
  118. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/serial_class.py +0 -0
  119. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/serial_generic.py +0 -0
  120. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/serial_union.py +0 -0
  121. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/unknown.py +0 -0
  122. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization/yaml.py +0 -0
  123. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization_util/__init__.py +0 -0
  124. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  125. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  126. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization_util/dataclasses.py +0 -0
  127. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/serialization_util/serialization_helpers.py +0 -0
  128. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/strenum_compat/__init__.py +0 -0
  129. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/strenum_compat/strenum_compat.py +0 -0
  130. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/__init__.py +0 -0
  131. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/__main__.py +0 -0
  132. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  133. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/builder.py +0 -0
  134. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/builder_types.py +0 -0
  135. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/config.py +0 -0
  136. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/cross_output_links.py +0 -0
  137. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/emit_io_ts.py +0 -0
  138. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/emit_open_api.py +0 -0
  139. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/emit_open_api_util.py +0 -0
  140. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/emit_python.py +0 -0
  141. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/emit_typescript.py +0 -0
  142. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/emit_typescript_util.py +0 -0
  143. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/load_types.py +0 -0
  144. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  145. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/open_api_util.py +0 -0
  146. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/parts/base.py.prepart +0 -0
  147. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  148. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/test.py +0 -0
  149. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/type_info/__main__.py +0 -0
  150. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  151. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  152. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  153. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/util.py +0 -0
  154. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/value_spec/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  156. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/pkgs/type_spec/value_spec/types.py +0 -0
  157. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/setup.cfg +0 -0
  158. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/async_batch.py +0 -0
  161. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/client.py +0 -0
  162. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/environment.py +0 -0
  163. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/file_upload.py +0 -0
  164. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/query/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/query/builder.py +0 -0
  166. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/query/column.py +0 -0
  167. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/query/row.py +0 -0
  168. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/query/types.py +0 -0
  169. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/core/types.py +0 -0
  170. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/cron.py +0 -0
  172. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/db/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/db/connect.py +0 -0
  174. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/db/session.py +0 -0
  175. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/entrypoint.py +0 -0
  176. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/executors/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/executors/executors.py +0 -0
  178. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  179. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/executors/script_executor.py +0 -0
  180. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/http_server/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/http_server/types.py +0 -0
  182. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/__init__.py +0 -0
  183. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  185. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  187. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  189. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  190. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  191. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  192. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  193. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/types.py +0 -0
  194. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/queue_runner/worker.py +0 -0
  195. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/request_context.py +0 -0
  196. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/scheduler.py +0 -0
  197. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/server.py +0 -0
  198. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/telemetry.py +0 -0
  199. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  200. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/py.typed +0 -0
  201. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/__init__.py +0 -0
  202. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/batch/__init__.py +0 -0
  203. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/batch/execute_batch.py +0 -0
  204. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  205. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/chemical/__init__.py +0 -0
  206. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  207. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  208. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  209. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +0 -0
  210. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/create_entities.py +0 -0
  212. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/create_entity.py +0 -0
  213. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/create_or_update_entities.py +0 -0
  214. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  215. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/export_entities.py +0 -0
  216. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/get_entities_data.py +0 -0
  217. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  218. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/list_aggregate.py +0 -0
  219. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/list_entities.py +0 -0
  220. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/lock_entity.py +0 -0
  221. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/lookup_entity.py +0 -0
  222. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  223. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/set_barcode.py +0 -0
  224. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/set_entities_field_values.py +0 -0
  225. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  226. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/set_values.py +0 -0
  227. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  228. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/entity/unlock_entity.py +0 -0
  229. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/equipment/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  231. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/field_options/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  233. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/file_folders/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/file_folders/add_file_to_folder.py +0 -0
  235. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/file_folders/modify_file_system.py +0 -0
  236. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/files/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/files/download_file.py +0 -0
  238. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/id_source/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/id_source/list_id_source.py +0 -0
  240. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/id_source/match_id_source.py +0 -0
  241. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/input_groups/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  243. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/create_inputs.py +0 -0
  245. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/get_input_data.py +0 -0
  246. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/get_input_names.py +0 -0
  247. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  248. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  249. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/set_input_category.py +0 -0
  250. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  251. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  252. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/integrations/__init__.py +0 -0
  253. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  254. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/integrations/push_notification.py +0 -0
  255. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  256. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/listing/__init__.py +0 -0
  257. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/listing/export_listing.py +0 -0
  258. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/listing/fetch_listing.py +0 -0
  259. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/material_families/__init__.py +0 -0
  260. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  261. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/notebooks/__init__.py +0 -0
  262. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/notebooks/get_notebook_content.py +0 -0
  263. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/output_parameters/__init__.py +0 -0
  264. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +0 -0
  265. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/outputs/__init__.py +0 -0
  266. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/outputs/get_output_data.py +0 -0
  267. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/outputs/get_output_names.py +0 -0
  268. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  269. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  270. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/outputs/update_output_condition_parameter.py +0 -0
  271. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/permissions/__init__.py +0 -0
  272. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  273. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/permissions/set_entity_permission.py +0 -0
  274. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/project/__init__.py +0 -0
  275. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/project/get_projects.py +0 -0
  276. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/project/get_projects_data.py +0 -0
  277. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipe_links/__init__.py +0 -0
  278. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  279. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipe_links/create_recipe_links.py +0 -0
  280. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  281. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  282. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  283. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/__init__.py +0 -0
  284. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  285. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  286. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  287. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  288. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  289. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  290. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  291. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/create_recipe.py +0 -0
  292. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/create_recipes.py +0 -0
  293. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  294. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  295. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  296. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_curve.py +0 -0
  297. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  298. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  299. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  300. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  301. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  302. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  303. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  304. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  305. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  306. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  307. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  308. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  309. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  310. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  311. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  312. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +0 -0
  313. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/recipes/upsert_step_relationships.py +0 -0
  314. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/runsheet/__init__.py +0 -0
  315. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  316. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  317. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/triggers/__init__.py +0 -0
  318. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/triggers/run_trigger.py +0 -0
  319. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/uploader/__init__.py +0 -0
  320. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  321. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  322. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/user/__init__.py +0 -0
  323. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/api/user/get_current_user_info.py +0 -0
  324. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/async_batch.py +0 -0
  325. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/async_batch_processor.py +0 -0
  326. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/async_batch_t.py +0 -0
  327. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/async_jobs.py +0 -0
  328. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/async_jobs_t.py +0 -0
  329. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/auth_retrieval.py +0 -0
  330. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/base.py +0 -0
  331. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/base_t.py +0 -0
  332. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/calculations.py +0 -0
  333. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/calculations_t.py +0 -0
  334. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/chemical_structure.py +0 -0
  335. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/chemical_structure_t.py +0 -0
  336. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/client_config.py +0 -0
  337. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/client_config_t.py +0 -0
  338. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/condition_match.py +0 -0
  339. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/condition_match_t.py +0 -0
  340. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/curves.py +0 -0
  341. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/curves_t.py +0 -0
  342. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/data.py +0 -0
  343. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/data_t.py +0 -0
  344. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/entity.py +0 -0
  345. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/experiment_groups.py +0 -0
  346. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/experiment_groups_t.py +0 -0
  347. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/exports.py +0 -0
  348. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/exports_t.py +0 -0
  349. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/field_values.py +0 -0
  350. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/field_values_t.py +0 -0
  351. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/fields.py +0 -0
  352. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/fields_t.py +0 -0
  353. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/generic_upload.py +0 -0
  354. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/generic_upload_t.py +0 -0
  355. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/id_source.py +0 -0
  356. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/id_source_t.py +0 -0
  357. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/identifier.py +0 -0
  358. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/identifier_t.py +0 -0
  359. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/input_attributes.py +0 -0
  360. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/input_attributes_t.py +0 -0
  361. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/inputs.py +0 -0
  362. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/inputs_t.py +0 -0
  363. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/integration_server.py +0 -0
  364. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/integration_session.py +0 -0
  365. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/integration_session_t.py +0 -0
  366. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/integrations.py +0 -0
  367. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/integrations_t.py +0 -0
  368. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/listing.py +0 -0
  369. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/listing_t.py +0 -0
  370. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/notices.py +0 -0
  371. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/notices_t.py +0 -0
  372. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/notifications.py +0 -0
  373. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/notifications_t.py +0 -0
  374. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/outputs.py +0 -0
  375. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/outputs_t.py +0 -0
  376. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/overrides.py +0 -0
  377. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/overrides_t.py +0 -0
  378. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/permissions.py +0 -0
  379. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/permissions_t.py +0 -0
  380. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/phases.py +0 -0
  381. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/phases_t.py +0 -0
  382. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/post_base.py +0 -0
  383. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/post_base_t.py +0 -0
  384. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/queued_job.py +0 -0
  385. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/queued_job_t.py +0 -0
  386. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_identifiers.py +0 -0
  387. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_identifiers_t.py +0 -0
  388. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_inputs.py +0 -0
  389. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_inputs_t.py +0 -0
  390. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_links.py +0 -0
  391. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_links_t.py +0 -0
  392. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_metadata.py +0 -0
  393. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_metadata_t.py +0 -0
  394. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_output_metadata.py +0 -0
  395. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_output_metadata_t.py +0 -0
  396. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_step_relationships.py +0 -0
  397. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_step_relationships_t.py +0 -0
  398. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_tags.py +0 -0
  399. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_tags_t.py +0 -0
  400. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_workflow_step_types.py +0 -0
  401. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_workflow_step_types_t.py +0 -0
  402. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_workflow_steps.py +0 -0
  403. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  404. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipes.py +0 -0
  405. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/recipes_t.py +0 -0
  406. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/request_headers.py +0 -0
  407. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/request_headers_t.py +0 -0
  408. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/response.py +0 -0
  409. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/response_t.py +0 -0
  410. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/runsheet.py +0 -0
  411. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/runsheet_format.py +0 -0
  412. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/runsheet_format_t.py +0 -0
  413. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/runsheet_t.py +0 -0
  414. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/sockets.py +0 -0
  415. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/sockets_t.py +0 -0
  416. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/specs.py +0 -0
  417. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/specs_t.py +0 -0
  418. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/step_relationships.py +0 -0
  419. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/step_relationships_t.py +0 -0
  420. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/units.py +0 -0
  421. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/units_t.py +0 -0
  422. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/uploader.py +0 -0
  423. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/uploader_t.py +0 -0
  424. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/users.py +0 -0
  425. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/users_t.py +0 -0
  426. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/webhook_job.py +0 -0
  427. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/webhook_job_t.py +0 -0
  428. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/workflows.py +0 -0
  429. {uncountablepythonsdk-0.0.175 → uncountablepythonsdk-0.0.176}/uncountable/types/workflows_t.py +0 -0
@@ -28,7 +28,7 @@ jobs:
28
28
  with:
29
29
  version: "0.11.0"
30
30
  activate-environment: true
31
- enable-cache: true
31
+ enable-cache: false
32
32
  - name: Install build dependencies
33
33
  run: |
34
34
  uv pip install --upgrade build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.175
3
+ Version: 0.0.176
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -17,7 +17,7 @@ Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: aiotus==1.*
20
- Requires-Dist: aiohttp==3.*
20
+ Requires-Dist: aiohttp>=3.14.1
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
23
23
  Requires-Dist: APScheduler==3.*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.175
3
+ Version: 0.0.176
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -17,7 +17,7 @@ Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  Requires-Dist: aiotus==1.*
20
- Requires-Dist: aiohttp==3.*
20
+ Requires-Dist: aiohttp>=3.14.1
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
23
23
  Requires-Dist: APScheduler==3.*
@@ -148,6 +148,7 @@ uncountable/integration/scan_profiles.py
148
148
  uncountable/integration/scheduler.py
149
149
  uncountable/integration/server.py
150
150
  uncountable/integration/telemetry.py
151
+ uncountable/integration/webhook_signature_key.py
151
152
  uncountable/integration/db/__init__.py
152
153
  uncountable/integration/db/connect.py
153
154
  uncountable/integration/db/session.py
@@ -166,6 +167,7 @@ uncountable/integration/queue_runner/command_server/__init__.py
166
167
  uncountable/integration/queue_runner/command_server/command_client.py
167
168
  uncountable/integration/queue_runner/command_server/command_server.py
168
169
  uncountable/integration/queue_runner/command_server/constants.py
170
+ uncountable/integration/queue_runner/command_server/provision_webhook.py
169
171
  uncountable/integration/queue_runner/command_server/types.py
170
172
  uncountable/integration/queue_runner/command_server/protocol/__init__.py
171
173
  uncountable/integration/queue_runner/command_server/protocol/command_server.proto
@@ -177,6 +179,7 @@ uncountable/integration/queue_runner/datastore/datastore_sqlite.py
177
179
  uncountable/integration/queue_runner/datastore/interface.py
178
180
  uncountable/integration/queue_runner/datastore/model.py
179
181
  uncountable/integration/secret_retrieval/__init__.py
182
+ uncountable/integration/secret_retrieval/basic_secret.py
180
183
  uncountable/integration/secret_retrieval/retrieve_secret.py
181
184
  uncountable/integration/webhook_server/entrypoint.py
182
185
  uncountable/types/__init__.py
@@ -290,8 +293,10 @@ uncountable/types/uploader.py
290
293
  uncountable/types/uploader_t.py
291
294
  uncountable/types/users.py
292
295
  uncountable/types/users_t.py
296
+ uncountable/types/webhook.py
293
297
  uncountable/types/webhook_job.py
294
298
  uncountable/types/webhook_job_t.py
299
+ uncountable/types/webhook_t.py
295
300
  uncountable/types/workflows.py
296
301
  uncountable/types/workflows_t.py
297
302
  uncountable/types/api/__init__.py
@@ -1,5 +1,5 @@
1
1
  aiotus==1.*
2
- aiohttp==3.*
2
+ aiohttp>=3.14.1
3
3
  requests==2.*
4
4
  SQLAlchemy>=1.4.0
5
5
  APScheduler==3.*
@@ -92,6 +92,7 @@ def main() -> None:
92
92
  ]
93
93
  if definition.visibility_scope is not None
94
94
  else None,
95
+ kind=definition.kind,
95
96
  arguments=definition.arguments,
96
97
  )
97
98
  action_definitions_with_arguments_list.append(
@@ -54,6 +54,10 @@ def _emit_action_definition(
54
54
  out.write(
55
55
  f"{sub_indent}visibility_scope={_emit_visibility_scope(action.visibility_scope)},\n"
56
56
  )
57
+ if action.kind is not None:
58
+ out.write(
59
+ f"{sub_indent}kind=actions_registry_t.ActionDefinitionKind.{action.kind.name},\n"
60
+ )
57
61
  if action.arguments is not None:
58
62
  out.write(f"{sub_indent}arguments={_py_str(action.arguments)},\n")
59
63
  out.write(f"{indent}),\n")
@@ -147,6 +147,10 @@ def _emit_action_definition(
147
147
  out.write(
148
148
  f"{sub_indent}visibilityScope: {_emit_visibility_scope(action_definition.visibility_scope)},\n"
149
149
  )
150
+ if action_definition.kind is not None:
151
+ out.write(
152
+ f"{sub_indent}kind: ActionsRegistryT.ActionDefinitionKind.{ts_name(action_definition.kind, name_case=builder.NameCase.convert)},\n"
153
+ )
150
154
  out.write(f"{indent}}} as ActionsRegistryT.ActionDefinition{argument_type},\n")
151
155
  return out.getvalue()
152
156
 
@@ -173,6 +173,7 @@ key_description = "description"
173
173
  key_brief = "brief"
174
174
  key_name = "name"
175
175
  key_draft = "draft"
176
+ key_deferred_value_spec = "deferred_value_spec"
176
177
 
177
178
 
178
179
  TypeT = TypeVar("TypeT")
@@ -236,6 +237,14 @@ def main() -> None:
236
237
  arg_meta = get(args_meta, in_argument.ref_name)
237
238
  arg_description = get_as(arg_meta, key_description, str)
238
239
  arg_name = get_as(arg_meta, key_name, str)
240
+ deferred_value_spec = None
241
+ if (
242
+ isinstance(arg_meta, dict)
243
+ and arg_meta.get(key_deferred_value_spec) is not None
244
+ ):
245
+ deferred_value_spec = get_as(
246
+ arg_meta, key_deferred_value_spec, bool
247
+ )
239
248
 
240
249
  arguments.append(
241
250
  value_spec_t.FunctionArgument(
@@ -245,6 +254,7 @@ def main() -> None:
245
254
  type=convert_to_value_spec_type(in_argument.type_path),
246
255
  on_null=in_argument.on_null,
247
256
  extant=in_argument.extant,
257
+ deferred_value_spec=deferred_value_spec,
248
258
  )
249
259
  )
250
260
 
@@ -29,6 +29,7 @@ from decimal import Decimal
29
29
 
30
30
  from main.base.types import value_spec_t, base_t
31
31
 
32
+ from . import expression
32
33
  from .function_wrapper import ExtractorArgs, WrapArgs
33
34
  """
34
35
  )
@@ -70,6 +71,12 @@ def _emit_function_wrapper(function: value_spec_t.Function) -> str:
70
71
 
71
72
  {INDENT}def get_{argument.ref_name}_at(self, at: int) -> base_t.ExtJsonValue:
72
73
  {INDENT}{INDENT}return self._extract_at({index}, at)
74
+ """
75
+ )
76
+ elif argument.deferred_value_spec:
77
+ out.write(
78
+ f"""{INDENT}def get_{argument.ref_name}(self) -> expression.ParseNode | None:
79
+ {INDENT}{INDENT}return self.extract_node({index})
73
80
  """
74
81
  )
75
82
  else:
@@ -213,6 +220,8 @@ def _emit_argument(argument: value_spec_t.FunctionArgument, indent: str) -> str:
213
220
  out.write(
214
221
  f"{sub_indent}extant=value_spec_t.ArgumentExtant.{argument.extant.name},\n"
215
222
  )
223
+ if argument.deferred_value_spec:
224
+ out.write(f"{sub_indent}deferred_value_spec={argument.deferred_value_spec},\n")
216
225
  out.write(f"{sub_indent}type={_emit_type(argument.type, sub_indent)},\n")
217
226
  out.write(f"{indent})")
218
227
 
@@ -52,7 +52,7 @@ requires-python = ">=3.12"
52
52
  # May be compatible with older versions
53
53
  dependencies = [
54
54
  "aiotus ==1.*",
55
- "aiohttp == 3.*",
55
+ "aiohttp >= 3.14.1",
56
56
  "requests == 2.*",
57
57
  "SQLAlchemy >= 1.4.0",
58
58
  "APScheduler == 3.*",
@@ -12,6 +12,7 @@ from uncountable.integration.queue_runner.command_server.command_client import (
12
12
  send_job_cancellation_message,
13
13
  send_job_queue_message,
14
14
  send_list_queued_jobs_message,
15
+ send_provision_webhook_message,
15
16
  send_retry_job_message,
16
17
  )
17
18
  from uncountable.integration.queue_runner.command_server.types import (
@@ -220,6 +221,33 @@ def register_retry_job_parser(
220
221
  retry_failed_jobs_parser.set_defaults(func=_handle_retry_job)
221
222
 
222
223
 
224
+ def register_provision_webhook_parser(
225
+ sub_parser_manager: argparse._SubParsersAction,
226
+ parents: list[argparse.ArgumentParser],
227
+ ) -> None:
228
+ provision_parser = sub_parser_manager.add_parser(
229
+ "provision-webhook",
230
+ parents=parents,
231
+ help="Provision an Uncountable webhook job by creating its webhook entity and signature key",
232
+ description="Provision an Uncountable webhook job by creating its webhook entity and signature key",
233
+ )
234
+ provision_parser.add_argument(
235
+ "job_id",
236
+ type=str,
237
+ help="The id of the Uncountable webhook job to provision",
238
+ )
239
+
240
+ def _handle_provision_webhook(args: argparse.Namespace) -> None:
241
+ profile_name = send_provision_webhook_message(
242
+ job_id=args.job_id,
243
+ host=args.host,
244
+ port=get_local_admin_server_port(),
245
+ )
246
+ print(f"provisioned webhook {profile_name}/{args.job_id}")
247
+
248
+ provision_parser.set_defaults(func=_handle_provision_webhook)
249
+
250
+
223
251
  def main() -> None:
224
252
  logger = Logger(get_current_span())
225
253
 
@@ -242,6 +270,7 @@ def main() -> None:
242
270
  register_retry_job_parser(subparser_action, parents=[base_parser])
243
271
  register_list_queued_jobs(subparser_action, parents=[base_parser])
244
272
  register_cancel_queued_job_parser(subparser_action, parents=[base_parser])
273
+ register_provision_webhook_parser(subparser_action, parents=[base_parser])
245
274
 
246
275
  args = main_parser.parse_args()
247
276
  with logger.push_scope(args.command):
@@ -1,8 +1,8 @@
1
1
  from uncountable.core import AuthDetailsApiKey, Client
2
2
  from uncountable.core.client import ClientConfig
3
3
  from uncountable.core.types import AuthDetailsAll, AuthDetailsOAuth
4
- from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
5
- from uncountable.integration.telemetry import JobLogger
4
+ from uncountable.integration.secret_retrieval.basic_secret import retrieve_basic_secret
5
+ from uncountable.integration.telemetry import Logger
6
6
  from uncountable.types import auth_retrieval_t
7
7
  from uncountable.types.client_config_t import RequestContext
8
8
  from uncountable.types.job_definition_t import (
@@ -13,16 +13,16 @@ from uncountable.types.job_definition_t import (
13
13
  def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
14
14
  match profile_meta.auth_retrieval:
15
15
  case auth_retrieval_t.AuthRetrievalOAuth():
16
- refresh_token = retrieve_secret(
16
+ refresh_token = retrieve_basic_secret(
17
17
  profile_meta.auth_retrieval.refresh_token_secret,
18
18
  profile_metadata=profile_meta,
19
19
  )
20
20
  return AuthDetailsOAuth(refresh_token=refresh_token)
21
21
  case auth_retrieval_t.AuthRetrievalBasic():
22
- api_id = retrieve_secret(
22
+ api_id = retrieve_basic_secret(
23
23
  profile_meta.auth_retrieval.api_id_secret, profile_metadata=profile_meta
24
24
  )
25
- api_key = retrieve_secret(
25
+ api_key = retrieve_basic_secret(
26
26
  profile_meta.auth_retrieval.api_key_secret,
27
27
  profile_metadata=profile_meta,
28
28
  )
@@ -32,7 +32,7 @@ def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
32
32
 
33
33
  def construct_uncountable_client(
34
34
  profile_meta: ProfileMetadata,
35
- logger: JobLogger,
35
+ logger: Logger,
36
36
  *,
37
37
  request_context: RequestContext | None = None,
38
38
  headers: dict[str, str] | None = None,
@@ -25,8 +25,11 @@ from uncountable.integration.queue_runner.command_server.types import (
25
25
  CommandServerException,
26
26
  )
27
27
  from uncountable.integration.request_context import extract_request_context
28
- from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
28
+ from uncountable.integration.secret_retrieval import retrieve_secret
29
29
  from uncountable.integration.telemetry import JobLogger
30
+ from uncountable.integration.webhook_signature_key import (
31
+ webhook_signature_key_retrieval,
32
+ )
30
33
  from uncountable.types import (
31
34
  base_t,
32
35
  job_definition_t,
@@ -166,6 +169,26 @@ class CustomHttpJob(Job[GenericHttpRequest]):
166
169
  return JobResult(success=False)
167
170
 
168
171
 
172
+ def _resolve_webhook_signature_key(
173
+ *,
174
+ job_definition: job_definition_t.HttpJobDefinitionBase,
175
+ profile_meta: ProfileMetadata,
176
+ ) -> str:
177
+ if isinstance(job_definition, job_definition_t.WebhookJobDefinition):
178
+ return retrieve_secret(job_definition.signature_key_secret, profile_meta)
179
+ if isinstance(job_definition, job_definition_t.UncountableWebhookJobDefinition):
180
+ return retrieve_secret(
181
+ webhook_signature_key_retrieval(job_id=job_definition.id),
182
+ profile_meta,
183
+ )
184
+ raise HttpException.configuration_error(
185
+ message=(
186
+ "[internal] non-webhook job definition passed to webhook validation: "
187
+ f"{profile_meta.name}/{job_definition.id}"
188
+ )
189
+ )
190
+
191
+
169
192
  class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
170
193
  @property
171
194
  def payload_type(self) -> type[webhook_job_t.WebhookEventPayload]:
@@ -182,10 +205,8 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
182
205
  job_definition: job_definition_t.HttpJobDefinitionBase,
183
206
  profile_meta: ProfileMetadata,
184
207
  ) -> None:
185
- assert isinstance(job_definition, job_definition_t.WebhookJobDefinition)
186
- signature_key = retrieve_secret(
187
- profile_metadata=profile_meta,
188
- secret_retrieval=job_definition.signature_key_secret,
208
+ signature_key = _resolve_webhook_signature_key(
209
+ job_definition=job_definition, profile_meta=profile_meta
189
210
  )
190
211
  passed_signature = request.headers.get("Uncountable-Webhook-Signature")
191
212
  if passed_signature is None:
@@ -195,7 +216,7 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
195
216
  signature_key.encode("utf-8"), msg=request.body_bytes, digestmod="sha256"
196
217
  ).hexdigest()
197
218
 
198
- if request_body_signature != passed_signature:
219
+ if not hmac.compare_digest(request_body_signature, passed_signature):
199
220
  raise HttpException.payload_failed_signature()
200
221
 
201
222
  @staticmethod
@@ -17,6 +17,8 @@ from uncountable.integration.queue_runner.command_server.protocol.command_server
17
17
  EnqueueJobResult,
18
18
  ListQueuedJobsRequest,
19
19
  ListQueuedJobsResult,
20
+ ProvisionWebhookRequest,
21
+ ProvisionWebhookResult,
20
22
  RetryJobRequest,
21
23
  RetryJobResult,
22
24
  VaccuumQueuedJobsRequest,
@@ -33,6 +35,7 @@ from .protocol.command_server_pb2_grpc import CommandServerStub
33
35
 
34
36
  _LOCAL_RPC_HOST = "localhost"
35
37
  _DEFAULT_MESSAGE_TIMEOUT_SECS = 2
38
+ _PROVISION_WEBHOOK_TIMEOUT_SECS = 30
36
39
 
37
40
 
38
41
  @contextmanager
@@ -171,3 +174,20 @@ def send_vaccuum_queued_jobs_message(*, host: str = "localhost", port: int) -> N
171
174
 
172
175
  assert isinstance(response, VaccuumQueuedJobsResult)
173
176
  return None
177
+
178
+
179
+ def send_provision_webhook_message(
180
+ *, job_id: str, host: str = "localhost", port: int
181
+ ) -> str:
182
+ with command_server_connection(host=host, port=port) as stub:
183
+ request = ProvisionWebhookRequest(job_id=job_id)
184
+
185
+ try:
186
+ response = stub.ProvisionWebhook(
187
+ request, timeout=_PROVISION_WEBHOOK_TIMEOUT_SECS
188
+ )
189
+ except grpc.RpcError as e:
190
+ raise ValueError(e.details())
191
+
192
+ assert isinstance(response, ProvisionWebhookResult)
193
+ return response.profile_name
@@ -19,11 +19,16 @@ from uncountable.integration.queue_runner.command_server.protocol.command_server
19
19
  EnqueueJobResult,
20
20
  ListQueuedJobsRequest,
21
21
  ListQueuedJobsResult,
22
+ ProvisionWebhookRequest,
23
+ ProvisionWebhookResult,
22
24
  RetryJobRequest,
23
25
  RetryJobResult,
24
26
  VaccuumQueuedJobsRequest,
25
27
  VaccuumQueuedJobsResult,
26
28
  )
29
+ from uncountable.integration.queue_runner.command_server.provision_webhook import (
30
+ provision_webhook,
31
+ )
27
32
  from uncountable.integration.queue_runner.command_server.types import (
28
33
  CommandCancelJob,
29
34
  CommandCancelJobResponse,
@@ -199,6 +204,20 @@ async def serve(command_queue: CommandQueue, datastore: DatastoreSqlite) -> None
199
204
  )
200
205
  return VaccuumQueuedJobsResult()
201
206
 
207
+ async def ProvisionWebhook(
208
+ self, request: ProvisionWebhookRequest, context: grpc_aio.ServicerContext
209
+ ) -> ProvisionWebhookResult:
210
+ loop = asyncio.get_running_loop()
211
+ profile_name = await loop.run_in_executor(
212
+ None, lambda: provision_webhook(job_id=request.job_id)
213
+ )
214
+ if profile_name is None:
215
+ await context.abort(
216
+ StatusCode.INVALID_ARGUMENT,
217
+ f"no Uncountable webhook job found with id {request.job_id}",
218
+ )
219
+ return ProvisionWebhookResult(profile_name=profile_name)
220
+
202
221
  add_CommandServerServicer_to_server(CommandServerHandler(), server)
203
222
 
204
223
  listen_addr = f"[::]:{get_local_admin_server_port()}"
@@ -8,6 +8,7 @@ service CommandServer {
8
8
  rpc ListQueuedJobs(ListQueuedJobsRequest) returns (ListQueuedJobsResult) {}
9
9
  rpc VaccuumQueuedJobs(VaccuumQueuedJobsRequest) returns (VaccuumQueuedJobsResult) {}
10
10
  rpc CancelJob(CancelJobRequest) returns (CancelJobResult) {}
11
+ rpc ProvisionWebhook(ProvisionWebhookRequest) returns (ProvisionWebhookResult) {}
11
12
  }
12
13
 
13
14
  message EnqueueJobRequest {
@@ -75,3 +76,11 @@ enum CancelJobStatus {
75
76
  message CancelJobResult {
76
77
  CancelJobStatus status = 1;
77
78
  }
79
+
80
+ message ProvisionWebhookRequest {
81
+ string job_id = 1;
82
+ }
83
+
84
+ message ProvisionWebhookResult {
85
+ string profile_name = 1;
86
+ }
@@ -29,7 +29,7 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__
29
29
 
30
30
 
31
31
  DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
32
- b'\nQuncountable/integration/queue_runner/command_server/protocol/command_server.proto\x1a\x1fgoogle/protobuf/timestamp.proto"E\n\x11\x45nqueueJobRequest\x12\x14\n\x0cjob_ref_name\x18\x01 \x01(\t\x12\x1a\n\x12serialized_payload\x18\x02 \x01(\t"H\n\x10\x45nqueueJobResult\x12\x1b\n\x13successfully_queued\x18\x01 \x01(\x08\x12\x17\n\x0fqueued_job_uuid\x18\x02 \x01(\t"\x1f\n\x0fRetryJobRequest\x12\x0c\n\x04uuid\x18\x01 \x01(\t"F\n\x0eRetryJobResult\x12\x1b\n\x13successfully_queued\x18\x01 \x01(\x08\x12\x17\n\x0fqueued_job_uuid\x18\x02 \x01(\t"\x1a\n\x18VaccuumQueuedJobsRequest"\x19\n\x17VaccuumQueuedJobsResult"\x14\n\x12\x43heckHealthRequest"$\n\x11\x43heckHealthResult\x12\x0f\n\x07success\x18\x01 \x01(\x08"\xc2\x01\n\x15ListQueuedJobsRequest\x12\x0e\n\x06offset\x18\x01 \x01(\r\x12\r\n\x05limit\x18\x02 \x01(\r\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x14\n\x0cjob_ref_name\x18\x04 \x01(\t\x12\x32\n\x0esubmitted_from\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0csubmitted_to\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xf4\x01\n\x14ListQueuedJobsResult\x12\x43\n\x0bqueued_jobs\x18\x01 \x03(\x0b\x32..ListQueuedJobsResult.ListQueuedJobsResultItem\x1a\x96\x01\n\x18ListQueuedJobsResultItem\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x14\n\x0cjob_ref_name\x18\x02 \x01(\t\x12\x14\n\x0cnum_attempts\x18\x03 \x01(\x03\x12\x30\n\x0csubmitted_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06status\x18\x05 \x01(\t"$\n\x10\x43\x61ncelJobRequest\x12\x10\n\x08job_uuid\x18\x01 \x01(\t"3\n\x0f\x43\x61ncelJobResult\x12 \n\x06status\x18\x01 \x01(\x0e\x32\x10.CancelJobStatus*Z\n\x0f\x43\x61ncelJobStatus\x12\x1a\n\x16\x43\x41NCELLED_WITH_RESTART\x10\x00\x12\x10\n\x0cNO_JOB_FOUND\x10\x01\x12\x19\n\x15JOB_ALREADY_COMPLETED\x10\x02\x32\xf4\x02\n\rCommandServer\x12\x35\n\nEnqueueJob\x12\x12.EnqueueJobRequest\x1a\x11.EnqueueJobResult"\x00\x12/\n\x08RetryJob\x12\x10.RetryJobRequest\x1a\x0f.RetryJobResult"\x00\x12\x38\n\x0b\x43heckHealth\x12\x13.CheckHealthRequest\x1a\x12.CheckHealthResult"\x00\x12\x41\n\x0eListQueuedJobs\x12\x16.ListQueuedJobsRequest\x1a\x15.ListQueuedJobsResult"\x00\x12J\n\x11VaccuumQueuedJobs\x12\x19.VaccuumQueuedJobsRequest\x1a\x18.VaccuumQueuedJobsResult"\x00\x12\x32\n\tCancelJob\x12\x11.CancelJobRequest\x1a\x10.CancelJobResult"\x00\x62\x06proto3'
32
+ b'\nQuncountable/integration/queue_runner/command_server/protocol/command_server.proto\x1a\x1fgoogle/protobuf/timestamp.proto"E\n\x11\x45nqueueJobRequest\x12\x14\n\x0cjob_ref_name\x18\x01 \x01(\t\x12\x1a\n\x12serialized_payload\x18\x02 \x01(\t"H\n\x10\x45nqueueJobResult\x12\x1b\n\x13successfully_queued\x18\x01 \x01(\x08\x12\x17\n\x0fqueued_job_uuid\x18\x02 \x01(\t"\x1f\n\x0fRetryJobRequest\x12\x0c\n\x04uuid\x18\x01 \x01(\t"F\n\x0eRetryJobResult\x12\x1b\n\x13successfully_queued\x18\x01 \x01(\x08\x12\x17\n\x0fqueued_job_uuid\x18\x02 \x01(\t"\x1a\n\x18VaccuumQueuedJobsRequest"\x19\n\x17VaccuumQueuedJobsResult"\x14\n\x12\x43heckHealthRequest"$\n\x11\x43heckHealthResult\x12\x0f\n\x07success\x18\x01 \x01(\x08"\xc2\x01\n\x15ListQueuedJobsRequest\x12\x0e\n\x06offset\x18\x01 \x01(\r\x12\r\n\x05limit\x18\x02 \x01(\r\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x14\n\x0cjob_ref_name\x18\x04 \x01(\t\x12\x32\n\x0esubmitted_from\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x30\n\x0csubmitted_to\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp"\xf4\x01\n\x14ListQueuedJobsResult\x12\x43\n\x0bqueued_jobs\x18\x01 \x03(\x0b\x32..ListQueuedJobsResult.ListQueuedJobsResultItem\x1a\x96\x01\n\x18ListQueuedJobsResultItem\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x14\n\x0cjob_ref_name\x18\x02 \x01(\t\x12\x14\n\x0cnum_attempts\x18\x03 \x01(\x03\x12\x30\n\x0csubmitted_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0e\n\x06status\x18\x05 \x01(\t"$\n\x10\x43\x61ncelJobRequest\x12\x10\n\x08job_uuid\x18\x01 \x01(\t"3\n\x0f\x43\x61ncelJobResult\x12 \n\x06status\x18\x01 \x01(\x0e\x32\x10.CancelJobStatus")\n\x17ProvisionWebhookRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\t".\n\x16ProvisionWebhookResult\x12\x14\n\x0cprofile_name\x18\x01 \x01(\t*Z\n\x0f\x43\x61ncelJobStatus\x12\x1a\n\x16\x43\x41NCELLED_WITH_RESTART\x10\x00\x12\x10\n\x0cNO_JOB_FOUND\x10\x01\x12\x19\n\x15JOB_ALREADY_COMPLETED\x10\x02\x32\xbd\x03\n\rCommandServer\x12\x35\n\nEnqueueJob\x12\x12.EnqueueJobRequest\x1a\x11.EnqueueJobResult"\x00\x12/\n\x08RetryJob\x12\x10.RetryJobRequest\x1a\x0f.RetryJobResult"\x00\x12\x38\n\x0b\x43heckHealth\x12\x13.CheckHealthRequest\x1a\x12.CheckHealthResult"\x00\x12\x41\n\x0eListQueuedJobs\x12\x16.ListQueuedJobsRequest\x1a\x15.ListQueuedJobsResult"\x00\x12J\n\x11VaccuumQueuedJobs\x12\x19.VaccuumQueuedJobsRequest\x1a\x18.VaccuumQueuedJobsResult"\x00\x12\x32\n\tCancelJob\x12\x11.CancelJobRequest\x1a\x10.CancelJobResult"\x00\x12G\n\x10ProvisionWebhook\x12\x18.ProvisionWebhookRequest\x1a\x17.ProvisionWebhookResult"\x00\x62\x06proto3'
33
33
  )
34
34
 
35
35
  _globals = globals()
@@ -41,8 +41,8 @@ _builder.BuildTopDescriptorsAndMessages(
41
41
  )
42
42
  if not _descriptor._USE_C_DESCRIPTORS:
43
43
  DESCRIPTOR._loaded_options = None
44
- _globals["_CANCELJOBSTATUS"]._serialized_start = 1018
45
- _globals["_CANCELJOBSTATUS"]._serialized_end = 1108
44
+ _globals["_CANCELJOBSTATUS"]._serialized_start = 1109
45
+ _globals["_CANCELJOBSTATUS"]._serialized_end = 1199
46
46
  _globals["_ENQUEUEJOBREQUEST"]._serialized_start = 118
47
47
  _globals["_ENQUEUEJOBREQUEST"]._serialized_end = 187
48
48
  _globals["_ENQUEUEJOBRESULT"]._serialized_start = 189
@@ -69,6 +69,10 @@ if not _descriptor._USE_C_DESCRIPTORS:
69
69
  _globals["_CANCELJOBREQUEST"]._serialized_end = 963
70
70
  _globals["_CANCELJOBRESULT"]._serialized_start = 965
71
71
  _globals["_CANCELJOBRESULT"]._serialized_end = 1016
72
- _globals["_COMMANDSERVER"]._serialized_start = 1111
73
- _globals["_COMMANDSERVER"]._serialized_end = 1483
72
+ _globals["_PROVISIONWEBHOOKREQUEST"]._serialized_start = 1018
73
+ _globals["_PROVISIONWEBHOOKREQUEST"]._serialized_end = 1059
74
+ _globals["_PROVISIONWEBHOOKRESULT"]._serialized_start = 1061
75
+ _globals["_PROVISIONWEBHOOKRESULT"]._serialized_end = 1107
76
+ _globals["_COMMANDSERVER"]._serialized_start = 1202
77
+ _globals["_COMMANDSERVER"]._serialized_end = 1647
74
78
  # @@protoc_insertion_point(module_scope)
@@ -161,3 +161,15 @@ class CancelJobResult(_message.Message):
161
161
  def __init__(
162
162
  self, status: _Optional[_Union[CancelJobStatus, str]] = ...
163
163
  ) -> None: ...
164
+
165
+ class ProvisionWebhookRequest(_message.Message):
166
+ __slots__ = ("job_id",)
167
+ JOB_ID_FIELD_NUMBER: _ClassVar[int]
168
+ job_id: str
169
+ def __init__(self, job_id: _Optional[str] = ...) -> None: ...
170
+
171
+ class ProvisionWebhookResult(_message.Message):
172
+ __slots__ = ("profile_name",)
173
+ PROFILE_NAME_FIELD_NUMBER: _ClassVar[int]
174
+ profile_name: str
175
+ def __init__(self, profile_name: _Optional[str] = ...) -> None: ...
@@ -78,6 +78,12 @@ class CommandServerStub(object):
78
78
  response_deserializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.CancelJobResult.FromString,
79
79
  _registered_method=True,
80
80
  )
81
+ self.ProvisionWebhook = channel.unary_unary(
82
+ "/CommandServer/ProvisionWebhook",
83
+ request_serializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.ProvisionWebhookRequest.SerializeToString,
84
+ response_deserializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.ProvisionWebhookResult.FromString,
85
+ _registered_method=True,
86
+ )
81
87
 
82
88
 
83
89
  class CommandServerServicer(object):
@@ -119,6 +125,12 @@ class CommandServerServicer(object):
119
125
  context.set_details("Method not implemented!")
120
126
  raise NotImplementedError("Method not implemented!")
121
127
 
128
+ def ProvisionWebhook(self, request, context):
129
+ """Missing associated documentation comment in .proto file."""
130
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
131
+ context.set_details("Method not implemented!")
132
+ raise NotImplementedError("Method not implemented!")
133
+
122
134
 
123
135
  def add_CommandServerServicer_to_server(servicer, server):
124
136
  rpc_method_handlers = {
@@ -152,6 +164,11 @@ def add_CommandServerServicer_to_server(servicer, server):
152
164
  request_deserializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.CancelJobRequest.FromString,
153
165
  response_serializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.CancelJobResult.SerializeToString,
154
166
  ),
167
+ "ProvisionWebhook": grpc.unary_unary_rpc_method_handler(
168
+ servicer.ProvisionWebhook,
169
+ request_deserializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.ProvisionWebhookRequest.FromString,
170
+ response_serializer=uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.ProvisionWebhookResult.SerializeToString,
171
+ ),
155
172
  }
156
173
  generic_handler = grpc.method_handlers_generic_handler(
157
174
  "CommandServer", rpc_method_handlers
@@ -343,3 +360,33 @@ class CommandServer(object):
343
360
  metadata,
344
361
  _registered_method=True,
345
362
  )
363
+
364
+ @staticmethod
365
+ def ProvisionWebhook(
366
+ request,
367
+ target,
368
+ options=(),
369
+ channel_credentials=None,
370
+ call_credentials=None,
371
+ insecure=False,
372
+ compression=None,
373
+ wait_for_ready=None,
374
+ timeout=None,
375
+ metadata=None,
376
+ ):
377
+ return grpc.experimental.unary_unary(
378
+ request,
379
+ target,
380
+ "/CommandServer/ProvisionWebhook",
381
+ uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.ProvisionWebhookRequest.SerializeToString,
382
+ uncountable_dot_integration_dot_queue__runner_dot_command__server_dot_protocol_dot_command__server__pb2.ProvisionWebhookResult.FromString,
383
+ options,
384
+ channel_credentials,
385
+ insecure,
386
+ call_credentials,
387
+ compression,
388
+ wait_for_ready,
389
+ timeout,
390
+ metadata,
391
+ _registered_method=True,
392
+ )
@@ -0,0 +1,28 @@
1
+ from opentelemetry.trace import get_current_span
2
+
3
+ from uncountable.integration.construct_client import construct_uncountable_client
4
+ from uncountable.integration.scan_profiles import load_profiles
5
+ from uncountable.integration.telemetry import Logger
6
+ from uncountable.integration.webhook_signature_key import (
7
+ bootstrap_webhook_signature_key,
8
+ )
9
+ from uncountable.types import job_definition_t
10
+
11
+
12
+ def provision_webhook(*, job_id: str) -> str | None:
13
+ logger = Logger(get_current_span())
14
+ for profile_metadata in load_profiles():
15
+ for job in profile_metadata.jobs:
16
+ if (
17
+ isinstance(job, job_definition_t.UncountableWebhookJobDefinition)
18
+ and job.id == job_id
19
+ ):
20
+ client = construct_uncountable_client(profile_metadata, logger)
21
+ bootstrap_webhook_signature_key(
22
+ client=client,
23
+ profile_metadata=profile_metadata,
24
+ job_id=job.id,
25
+ purpose=job.purpose,
26
+ )
27
+ return profile_metadata.name
28
+ return None
@@ -43,6 +43,7 @@ def load_profiles() -> list[job_definition_t.ProfileMetadata]:
43
43
  name=profile_name,
44
44
  jobs=definition.jobs,
45
45
  base_url=environment_config.base_url,
46
+ integration_server_base_url=environment_config.integration_server_base_url,
46
47
  app_base_url=environment_config.app_base_url,
47
48
  auth_retrieval=environment_config.auth_retrieval,
48
49
  client_options=environment_config.client_options,
@@ -58,6 +59,7 @@ def load_profiles() -> list[job_definition_t.ProfileMetadata]:
58
59
  name=profile_name,
59
60
  jobs=definition.jobs,
60
61
  base_url=definition.base_url,
62
+ integration_server_base_url=definition.integration_server_base_url,
61
63
  app_base_url=definition.app_base_url,
62
64
  auth_retrieval=definition.auth_retrieval,
63
65
  client_options=definition.client_options,
@@ -0,0 +1,7 @@
1
+ from .basic_secret import retrieve_basic_secret
2
+ from .retrieve_secret import retrieve_secret
3
+
4
+ __all__: list[str] = [
5
+ "retrieve_basic_secret",
6
+ "retrieve_secret",
7
+ ]