embed-client 4.0.22__tar.gz → 4.0.23__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 (233) hide show
  1. {embed_client-4.0.22/embed_client.egg-info → embed_client-4.0.23}/PKG-INFO +1 -1
  2. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/__init__.py +1 -1
  3. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/embedding_client.py +102 -4
  4. {embed_client-4.0.22 → embed_client-4.0.23/embed_client.egg-info}/PKG-INFO +1 -1
  5. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client.egg-info/SOURCES.txt +1 -0
  6. {embed_client-4.0.22 → embed_client-4.0.23}/pyproject.toml +1 -1
  7. embed_client-4.0.23/tests/test_wait_for_job_ws_fallback.py +113 -0
  8. {embed_client-4.0.22 → embed_client-4.0.23}/CONFIGURATION.md +0 -0
  9. {embed_client-4.0.22 → embed_client-4.0.23}/LICENSE +0 -0
  10. {embed_client-4.0.22 → embed_client-4.0.23}/MANIFEST.in +0 -0
  11. {embed_client-4.0.22 → embed_client-4.0.23}/README.md +0 -0
  12. {embed_client-4.0.22 → embed_client-4.0.23}/configs/basic_auth.json +0 -0
  13. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http.json +0 -0
  14. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_8001_test.json +0 -0
  15. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_correct.json +0 -0
  16. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_simple.json +0 -0
  17. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_test.json +0 -0
  18. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_token.json +0 -0
  19. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_token_correct.json +0 -0
  20. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_token_roles.json +0 -0
  21. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_token_roles_token_roles.json +0 -0
  22. {embed_client-4.0.22 → embed_client-4.0.23}/configs/http_token_token_roles.json +0 -0
  23. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https.json +0 -0
  24. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_8001_test.json +0 -0
  25. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_api_test.json +0 -0
  26. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_simple.json +0 -0
  27. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_test.json +0 -0
  28. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_token.json +0 -0
  29. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_token_8001.json +0 -0
  30. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_token_roles.json +0 -0
  31. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_token_roles_token_roles.json +0 -0
  32. {embed_client-4.0.22 → embed_client-4.0.23}/configs/https_token_token_roles.json +0 -0
  33. {embed_client-4.0.22 → embed_client-4.0.23}/configs/jwt.json +0 -0
  34. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls.json +0 -0
  35. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_8001.json +0 -0
  36. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_8001_test.json +0 -0
  37. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_correct.json +0 -0
  38. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_roles.json +0 -0
  39. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_roles_token_roles.json +0 -0
  40. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_test.json +0 -0
  41. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_token_roles.json +0 -0
  42. {embed_client-4.0.22 → embed_client-4.0.23}/configs/mtls_via_adapter.json +0 -0
  43. {embed_client-4.0.22 → embed_client-4.0.23}/configs/roles.json +0 -0
  44. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_http_simple.json +0 -0
  45. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_http_token.json +0 -0
  46. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_http_token_roles.json +0 -0
  47. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_https_simple.json +0 -0
  48. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_https_token.json +0 -0
  49. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_https_token_roles.json +0 -0
  50. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_mtls_roles.json +0 -0
  51. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_mtls_simple.json +0 -0
  52. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_server_http.json +0 -0
  53. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_server_https.json +0 -0
  54. {embed_client-4.0.22 → embed_client-4.0.23}/configs/test_server_mtls.json +0 -0
  55. {embed_client-4.0.22 → embed_client-4.0.23}/docs/BUGREPORT_queue_manager_daemonic.md +0 -0
  56. {embed_client-4.0.22 → embed_client-4.0.23}/docs/IDENTIFIER_ANALYSIS_REPORT.md +0 -0
  57. {embed_client-4.0.22 → embed_client-4.0.23}/docs/PROPOSAL_SERVER_REQUEST_COALESCING.md +0 -0
  58. {embed_client-4.0.22 → embed_client-4.0.23}/docs/PROPOSAL_TWO_CHANNEL_OR_PUSH.md +0 -0
  59. {embed_client-4.0.22 → embed_client-4.0.23}/docs/SERVER_MODES_AND_CLIENT.md +0 -0
  60. {embed_client-4.0.22 → embed_client-4.0.23}/docs/api_format.md +0 -0
  61. {embed_client-4.0.22 → embed_client-4.0.23}/docs/client_integration_guide.md +0 -0
  62. {embed_client-4.0.22 → embed_client-4.0.23}/docs/coverage_report.md +0 -0
  63. {embed_client-4.0.22 → embed_client-4.0.23}/docs/error_500_analysis.md +0 -0
  64. {embed_client-4.0.22 → embed_client-4.0.23}/docs/error_handling_complete.md +0 -0
  65. {embed_client-4.0.22 → embed_client-4.0.23}/docs/error_handling_issue.md +0 -0
  66. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/_template/README.md +0 -0
  67. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/_template/example_global_step/example_tactical_step/example_atomic_step.md +0 -0
  68. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/_template/example_global_step/example_tactical_step/spec.md +0 -0
  69. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/_template/example_global_step/spec.md +0 -0
  70. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/_template/spec.md +0 -0
  71. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/baseline_audit_and_contract_capture/migration_baseline_deliverable/ATOMIC_STEPS_INDEX.md +0 -0
  72. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/baseline_audit_and_contract_capture/migration_baseline_deliverable/freeze-migration-baseline-evidence-links.md +0 -0
  73. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/baseline_audit_and_contract_capture/migration_baseline_deliverable/spec.md +0 -0
  74. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/baseline_audit_and_contract_capture/spec.md +0 -0
  75. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/spec.md +0 -0
  76. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/ATOMIC_STEPS_INDEX.md +0 -0
  77. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-01.md +0 -0
  78. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-02.md +0 -0
  79. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-03.md +0 -0
  80. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-04.md +0 -0
  81. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-05.md +0 -0
  82. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-06.md +0 -0
  83. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-07.md +0 -0
  84. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-08.md +0 -0
  85. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-09.md +0 -0
  86. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-10.md +0 -0
  87. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-11.md +0 -0
  88. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-12.md +0 -0
  89. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-13.md +0 -0
  90. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-14.md +0 -0
  91. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-15.md +0 -0
  92. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-16.md +0 -0
  93. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-17.md +0 -0
  94. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-18.md +0 -0
  95. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-19.md +0 -0
  96. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-20.md +0 -0
  97. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-21.md +0 -0
  98. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/documentation_normalization/steps/DN-AT-22.md +0 -0
  99. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/plan.md +0 -0
  100. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/ATOMIC_STEPS_INDEX.md +0 -0
  101. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/PARALLEL_WAVES.md +0 -0
  102. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-01-port-constants-and-exceptions.md +0 -0
  103. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-02-port-embedding-client-helpers-and-status-store.md +0 -0
  104. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-03-port-embedding-client-core.md +0 -0
  105. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-04-package-init-version-and-canonical-exports.md +0 -0
  106. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-05-remove-legacy-async-stack-and-adapter-transport.md +0 -0
  107. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-06-remove-testing-client-and-duplicate-helpers.md +0 -0
  108. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/atomic-07-rewire-cli-factory-and-minimal-entry-points.md +0 -0
  109. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/canonical_client_migration/spec.md +0 -0
  110. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/production_migration_and_legacy_removal/spec.md +0 -0
  111. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/README.md +0 -0
  112. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/rv_automated_security_matrix/spec.md +0 -0
  113. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/rv_canonical_mtls_real_server_gate/spec.md +0 -0
  114. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/rv_localhost_vectorization/spec.md +0 -0
  115. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/rv_packaging_and_prereqs/spec.md +0 -0
  116. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/rv_pypi_publication/spec.md +0 -0
  117. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/rv_surviving_examples_executable/spec.md +0 -0
  118. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/spec.md +0 -0
  119. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/ATOMIC_STEPS_INDEX.md +0 -0
  120. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/placeholder-corrective-rv01-security-matrix.md +0 -0
  121. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/placeholder-corrective-rv02-vectorization.md +0 -0
  122. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/placeholder-corrective-rv03-broken-example.md +0 -0
  123. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/placeholder-corrective-rv04-canonical-gate.md +0 -0
  124. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/placeholder-corrective-rv05-packaging.md +0 -0
  125. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/placeholder-corrective-rv06-duplicate-version-or-auth.md +0 -0
  126. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv01-execute-automated-security-matrix.md +0 -0
  127. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv02-execute-localhost-vectorization-mtls-8001.md +0 -0
  128. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv03-execute-surviving-examples-sweep.md +0 -0
  129. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv04-execute-canonical-mtls-real-server-gate.md +0 -0
  130. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv04-supplementary-pytest-canonical-example-contract.md +0 -0
  131. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv05-build-artifacts-twine-version-gate.md +0 -0
  132. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/release_validation_and_pypi_publication/steps/rv06-pypi-upload.md +0 -0
  133. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/spec.md +0 -0
  134. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/spec.md +0 -0
  135. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/ATOMIC_STEPS_INDEX.md +0 -0
  136. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/align-package-version-with-pyproject-metadata.md +0 -0
  137. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/canonical-localhost-8001-mtls-example-and-execution-tests.md +0 -0
  138. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/consolidate-pytest-configuration-single-source.md +0 -0
  139. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/consolidate-redundant-coverage-test-modules.md +0 -0
  140. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/delete-or-replace-skipped-auth-and-ssl-test-modules.md +0 -0
  141. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/extract-async-client-adapter-tests-remove-legacy-aiohttp.md +0 -0
  142. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/fix-or-remove-embed-client-auth-examples.md +0 -0
  143. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/normalize-pyproject-runtime-deps-and-optional-extras.md +0 -0
  144. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/steps/replace-hardcoded-venv-site-packages-in-scripts-and-tests.md +0 -0
  145. {embed_client-4.0.22 → embed_client-4.0.23}/docs/specs/server_client_convergence_and_release/tests_scripts_and_dependency_cleanup/tasks/tsc_linter_exclusions_and_migration_inventory.md +0 -0
  146. {embed_client-4.0.22 → embed_client-4.0.23}/docs/tech_spec/branches/documentation_normalization/README.md +0 -0
  147. {embed_client-4.0.22 → embed_client-4.0.23}/docs/tech_spec/branches/documentation_normalization/tasks/doc_alignment_verification_and_closure.md +0 -0
  148. {embed_client-4.0.22 → embed_client-4.0.23}/docs/tech_spec/branches/documentation_normalization/tasks/doc_guides_examples_canonical_mtls.md +0 -0
  149. {embed_client-4.0.22 → embed_client-4.0.23}/docs/tech_spec/branches/documentation_normalization/tasks/doc_legacy_tree_prune_and_governance.md +0 -0
  150. {embed_client-4.0.22 → embed_client-4.0.23}/docs/tech_spec/branches/documentation_normalization/tasks/doc_root_metadata_and_pypi_surface.md +0 -0
  151. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/__main__.py +0 -0
  152. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/adapter_config_factory.py +0 -0
  153. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/adapter_config_normalizer.py +0 -0
  154. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/adapter_generator_bridge.py +0 -0
  155. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/auth.py +0 -0
  156. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/cli.py +0 -0
  157. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/cli_core.py +0 -0
  158. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/client_factory.py +0 -0
  159. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/client_factory_examples.py +0 -0
  160. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/client_factory_helpers.py +0 -0
  161. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config.py +0 -0
  162. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_defaults.py +0 -0
  163. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_examples.py +0 -0
  164. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_generator.py +0 -0
  165. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_generator_cli.py +0 -0
  166. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_presets.py +0 -0
  167. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_validator.py +0 -0
  168. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/config_validator_cli.py +0 -0
  169. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/constants.py +0 -0
  170. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/demo_cli.py +0 -0
  171. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/demo_security_cli.py +0 -0
  172. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/embed_file_output_validate.py +0 -0
  173. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/embed_file_status_store.py +0 -0
  174. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/embedding_client_helpers.py +0 -0
  175. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/example_async_usage.py +0 -0
  176. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/example_async_usage_demo.py +0 -0
  177. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/example_async_usage_ru.py +0 -0
  178. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/example_async_usage_ru_demo.py +0 -0
  179. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/exceptions.py +0 -0
  180. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/identifier_types.py +0 -0
  181. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/json_embed_file_preflight.py +0 -0
  182. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/local_json_embed_file.py +0 -0
  183. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/md_embed_file_prep.py +0 -0
  184. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/response_normalizer.py +0 -0
  185. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/response_parsers.py +0 -0
  186. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/security_cli.py +0 -0
  187. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/security_cli_core.py +0 -0
  188. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/ssl_examples.py +0 -0
  189. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client/ssl_manager.py +0 -0
  190. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client.egg-info/dependency_links.txt +0 -0
  191. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client.egg-info/entry_points.txt +0 -0
  192. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client.egg-info/requires.txt +0 -0
  193. {embed_client-4.0.22 → embed_client-4.0.23}/embed_client.egg-info/top_level.txt +0 -0
  194. {embed_client-4.0.22 → embed_client-4.0.23}/examples/README.md +0 -0
  195. {embed_client-4.0.22 → embed_client-4.0.23}/examples/__init__.py +0 -0
  196. {embed_client-4.0.22 → embed_client-4.0.23}/examples/async_testing_client_example.py +0 -0
  197. {embed_client-4.0.22 → embed_client-4.0.23}/examples/canonical_mtls_localhost_8001.py +0 -0
  198. {embed_client-4.0.22 → embed_client-4.0.23}/examples/configs/http_simple.json +0 -0
  199. {embed_client-4.0.22 → embed_client-4.0.23}/examples/configs/https_token.json +0 -0
  200. {embed_client-4.0.22 → embed_client-4.0.23}/examples/configs/mtls_roles.json +0 -0
  201. {embed_client-4.0.22 → embed_client-4.0.23}/examples/data/embed_file_json_array_sample.json +0 -0
  202. {embed_client-4.0.22 → embed_client-4.0.23}/examples/embed_file_json_local.py +0 -0
  203. {embed_client-4.0.22 → embed_client-4.0.23}/examples/security_examples.py +0 -0
  204. {embed_client-4.0.22 → embed_client-4.0.23}/examples/security_examples_ru.py +0 -0
  205. {embed_client-4.0.22 → embed_client-4.0.23}/setup.cfg +0 -0
  206. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_adapter_integration.py +0 -0
  207. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_adapter_phase1.py +0 -0
  208. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_adapter_phase2.py +0 -0
  209. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_all_security_modes.py +0 -0
  210. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_async_client_adapter.py +0 -0
  211. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_async_client_real.py +0 -0
  212. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_async_client_real_fixtures.py +0 -0
  213. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_async_client_stress.py +0 -0
  214. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_async_client_stress_new.py +0 -0
  215. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_async_client_stress_updated.py +0 -0
  216. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_auth_manager.py +0 -0
  217. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_canonical_mtls_example.py +0 -0
  218. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_cli_embed_file_json.py +0 -0
  219. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_cli_exit_codes_insecure.py +0 -0
  220. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_client_factory.py +0 -0
  221. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_client_factory_convenience.py +0 -0
  222. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_client_factory_integration.py +0 -0
  223. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_config.py +0 -0
  224. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_embed_file_aggregation_method.py +0 -0
  225. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_embed_file_output_validate.py +0 -0
  226. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_embed_immediate_mode.py +0 -0
  227. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_example_async_usage.py +0 -0
  228. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_json_embed_file_preflight.py +0 -0
  229. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_local_json_embed_file.py +0 -0
  230. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_md_embed_file_prep.py +0 -0
  231. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_security_matrix.py +0 -0
  232. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_ssl_manager.py +0 -0
  233. {embed_client-4.0.22 → embed_client-4.0.23}/tests/test_with_auth.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: embed-client
3
- Version: 4.0.22
3
+ Version: 4.0.23
4
4
  Summary: Async client for the Embedding Service API. Canonical class: EmbeddingClient (JSON-RPC via mcp-proxy-adapter >=8.10).
5
5
  Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
6
6
  License-Expression: MIT
@@ -27,7 +27,7 @@ try:
27
27
  __version__ = version("embed-client")
28
28
  except PackageNotFoundError:
29
29
  # Editable checkout without install metadata (e.g. some unit-test sandboxes).
30
- __version__ = "4.0.22"
30
+ __version__ = "4.0.23"
31
31
 
32
32
  __all__ = [
33
33
  "EmbeddingClient",
@@ -31,6 +31,31 @@ from embed_client.exceptions import EmbedAPIError, EmbedClientError, EmbedError
31
31
 
32
32
  logger = logging.getLogger(__name__)
33
33
 
34
+ try: # mcp-proxy-adapter >= 8.10 raises this when /ws closes mid-wait
35
+ from mcp_proxy_adapter.client.jsonrpc_client.exceptions import (
36
+ ClientWebSocketClosedError as _AdapterWsClosedError,
37
+ )
38
+ except ImportError: # pragma: no cover - older adapter builds
39
+ _AdapterWsClosedError = None # type: ignore[assignment,misc]
40
+
41
+ # Terminal queue states reported by queue_get_job_status / embed_job_status.
42
+ _POLL_COMPLETED_STATES = ("completed", "success")
43
+ _POLL_FAILED_STATES = ("failed", "error")
44
+ _POLL_STOPPED_STATES = ("stopped", "cancelled", "canceled")
45
+
46
+
47
+ def _is_ws_closed_before_terminal(exc: BaseException) -> bool:
48
+ """Whether *exc* means the /ws stream closed before a terminal job event.
49
+
50
+ The job itself is unaffected by a dropped stream: the server keeps
51
+ executing it and ``queue_get_job_status`` still reports its terminal
52
+ state. A heartbeat miss while the server is busy closes the stream
53
+ without any job having failed.
54
+ """
55
+ if _AdapterWsClosedError is not None and isinstance(exc, _AdapterWsClosedError):
56
+ return True
57
+ return "websocket closed" in str(exc).lower()
58
+
34
59
 
35
60
  def _client_has_async_method(client: Any, name: str) -> bool:
36
61
  fn = getattr(client, name, None)
@@ -757,6 +782,7 @@ class EmbeddingClient:
757
782
  """
758
783
  if _client_has_async_method(self.client, "wait_for_job"):
759
784
  t_arg = float(timeout) if timeout > 0 else 0.0
785
+ started = asyncio.get_running_loop().time()
760
786
  try:
761
787
  raw = await self.client.wait_for_job(job_id, timeout=t_arg)
762
788
  except asyncio.TimeoutError as e:
@@ -765,13 +791,78 @@ class EmbeddingClient:
765
791
  else:
766
792
  msg = f"Job {job_id} WebSocket wait timed out"
767
793
  raise TimeoutError(msg) from e
768
- except RuntimeError as e:
769
- raise EmbedClientError(f"WebSocket error: {e}") from e
794
+ except Exception as e: # noqa: BLE001 - classified below
795
+ if not _is_ws_closed_before_terminal(e):
796
+ if isinstance(e, RuntimeError):
797
+ raise EmbedClientError(f"WebSocket error: {e}") from e
798
+ raise
799
+ return await self._poll_terminal_after_ws_close(
800
+ job_id, t_arg, started, e, poll_interval=poll_interval
801
+ )
770
802
  return _normalize_terminal_job_payload(raw)
771
803
  return await wait_for_job_poll(
772
804
  self.job_status, job_id, timeout=timeout, poll_interval=poll_interval
773
805
  )
774
806
 
807
+ async def _poll_terminal_after_ws_close(
808
+ self,
809
+ job_id: str,
810
+ timeout: float,
811
+ started: float,
812
+ cause: BaseException,
813
+ poll_interval: float = 1.0,
814
+ ) -> Dict[str, Any]:
815
+ """Finish a wait whose /ws stream closed before the terminal event.
816
+
817
+ Polls :meth:`job_status` (``queue_get_job_status``) for the rest of the
818
+ caller's *timeout* and returns exactly what the WebSocket path would
819
+ have returned: the terminal status is wrapped as the equivalent
820
+ ``job_completed`` / ``job_failed`` event and passed through the same
821
+ normalizer, so a failed command inside a completed envelope is still
822
+ reported as a failure. ``timeout`` 0 means no deadline, as on the WS path.
823
+ """
824
+ loop = asyncio.get_running_loop()
825
+ deadline = None if timeout <= 0 else started + timeout
826
+ logger.warning(
827
+ "WebSocket closed before a terminal event for job %s (%s); "
828
+ "polling queue_get_job_status for its terminal state",
829
+ job_id,
830
+ cause,
831
+ )
832
+ interval = poll_interval if poll_interval and poll_interval > 0 else 1.0
833
+ while True:
834
+ status = await self.job_status(job_id)
835
+ if isinstance(status, dict):
836
+ if status.get("exists") is False:
837
+ raise EmbedClientError(f"Job {job_id} not found") from cause
838
+ state = str(status.get("status") or "").lower()
839
+ if state in _POLL_COMPLETED_STATES:
840
+ return _normalize_terminal_job_payload(
841
+ {
842
+ "event": "job_completed",
843
+ "job_id": job_id,
844
+ "result": status.get("result") or {},
845
+ }
846
+ )
847
+ if state in _POLL_FAILED_STATES:
848
+ return _normalize_terminal_job_payload(
849
+ {
850
+ "event": "job_failed",
851
+ "job_id": job_id,
852
+ "error": status.get("error")
853
+ or status.get("description")
854
+ or status.get("message")
855
+ or "Unknown error",
856
+ }
857
+ )
858
+ if state in _POLL_STOPPED_STATES:
859
+ raise EmbedClientError(f"Job {job_id} was stopped") from cause
860
+ if deadline is not None and loop.time() >= deadline:
861
+ raise TimeoutError(
862
+ f"Job {job_id} did not complete within {timeout} seconds"
863
+ ) from cause
864
+ await asyncio.sleep(interval)
865
+
775
866
  async def _embed_via_execute_async(
776
867
  self, params: Dict[str, Any], timeout: int = 60
777
868
  ) -> Dict[str, Any]:
@@ -833,6 +924,7 @@ class EmbeddingClient:
833
924
  """
834
925
  if _client_has_async_method(self.client, "wait_for_job"):
835
926
  t_arg = float(timeout) if timeout > 0 else 0.0
927
+ started = asyncio.get_running_loop().time()
836
928
 
837
929
  async def _on_event(msg: Dict[str, Any]) -> None:
838
930
  if on_ws_event is not None:
@@ -850,8 +942,14 @@ class EmbeddingClient:
850
942
  else:
851
943
  msg = f"Job {job_id} WebSocket wait timed out"
852
944
  raise TimeoutError(msg) from e
853
- except RuntimeError as e:
854
- raise EmbedClientError(f"WebSocket error: {e}") from e
945
+ except Exception as e: # noqa: BLE001 - classified below
946
+ if not _is_ws_closed_before_terminal(e):
947
+ if isinstance(e, RuntimeError):
948
+ raise EmbedClientError(f"WebSocket error: {e}") from e
949
+ raise
950
+ return await self._poll_terminal_after_ws_close(
951
+ job_id, t_arg, started, e
952
+ )
855
953
  return _normalize_terminal_job_payload(payload)
856
954
 
857
955
  timeout_sec = float(timeout) if timeout > 0 else 60.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: embed-client
3
- Version: 4.0.22
3
+ Version: 4.0.23
4
4
  Summary: Async client for the Embedding Service API. Canonical class: EmbeddingClient (JSON-RPC via mcp-proxy-adapter >=8.10).
5
5
  Author-email: Vasiliy Zdanovskiy <vasilyvz@gmail.com>
6
6
  License-Expression: MIT
@@ -227,4 +227,5 @@ tests/test_local_json_embed_file.py
227
227
  tests/test_md_embed_file_prep.py
228
228
  tests/test_security_matrix.py
229
229
  tests/test_ssl_manager.py
230
+ tests/test_wait_for_job_ws_fallback.py
230
231
  tests/test_with_auth.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "embed-client"
7
- version = "4.0.22"
7
+ version = "4.0.23"
8
8
  description = """Async client for the Embedding Service API. Canonical class: EmbeddingClient (JSON-RPC via mcp-proxy-adapter >=8.10).
9
9
 
10
10
  Public API highlights:
@@ -0,0 +1,113 @@
1
+ """
2
+ wait_for_job: a /ws stream that closes before the terminal event falls back to
3
+ queue_get_job_status polling and returns the same normalized result.
4
+
5
+ Live evidence (embed 4.0.22, 2026-09-24): jobs completed on the server while the
6
+ client's WebSocket wait raised "WebSocket closed before a job terminal event"
7
+ because the busy server missed the 30 s heartbeat.
8
+
9
+ Author: Vasiliy Zdanovskiy
10
+ email: vasilyvz@gmail.com
11
+ """
12
+
13
+ import asyncio
14
+ from typing import Any, Dict, List
15
+
16
+ import pytest
17
+ from mcp_proxy_adapter.client.jsonrpc_client.exceptions import (
18
+ ClientWebSocketClosedError,
19
+ )
20
+
21
+ from embed_client.embedding_client import EmbeddingClient
22
+ from embed_client.exceptions import EmbedClientError
23
+
24
+ _ROW = {"body": "x", "embedding": [0.1, 0.2], "tokens": ["x"], "bm25_tokens": ["x"], "error": None}
25
+
26
+
27
+ def _completed_status(success: bool = True) -> Dict[str, Any]:
28
+ inner: Dict[str, Any]
29
+ if success:
30
+ inner = {"success": True, "data": {"results": [_ROW], "model": "m", "dimension": 2}}
31
+ else:
32
+ inner = {"success": False, "error": {"message": "Worker unreachable", "code": -32603}}
33
+ return {
34
+ "job_id": "j1",
35
+ "status": "completed",
36
+ "result": {"job_id": "j1", "command": "embed_thin", "result": inner},
37
+ }
38
+
39
+
40
+ class _FakeTransport:
41
+ """Adapter client double: WS wait closes, status polls follow a script."""
42
+
43
+ def __init__(self, statuses: List[Dict[str, Any]], ws_error: Exception) -> None:
44
+ self._statuses = list(statuses)
45
+ self._ws_error = ws_error
46
+ self.status_calls = 0
47
+
48
+ async def wait_for_job(self, job_id: str, timeout: float = 0.0, on_event: Any = None) -> Dict[str, Any]:
49
+ raise self._ws_error
50
+
51
+ async def jsonrpc_call(self, method: str, params: Dict[str, Any]) -> Dict[str, Any]:
52
+ assert method == "queue_get_job_status"
53
+ self.status_calls += 1
54
+ status = self._statuses.pop(0) if len(self._statuses) > 1 else self._statuses[0]
55
+ return {"jsonrpc": "2.0", "id": 1, "result": {"success": True, "data": status}}
56
+
57
+
58
+ def _client(transport: _FakeTransport) -> EmbeddingClient:
59
+ client = EmbeddingClient.__new__(EmbeddingClient)
60
+ client.client = transport # type: ignore[attr-defined]
61
+ return client
62
+
63
+
64
+ def _ws_closed() -> ClientWebSocketClosedError:
65
+ return ClientWebSocketClosedError(
66
+ "WebSocket closed before a job terminal event",
67
+ operation="websocket.wait_for_job",
68
+ url="wss://example/ws",
69
+ )
70
+
71
+
72
+ def test_ws_close_falls_back_to_polling_and_returns_normalized_result() -> None:
73
+ transport = _FakeTransport(
74
+ [{"job_id": "j1", "status": "running"}, _completed_status()], _ws_closed()
75
+ )
76
+ result = asyncio.run(_client(transport).wait_for_job("j1", timeout=10, poll_interval=0.01))
77
+ assert result["results"] == [_ROW]
78
+ assert result["model"] == "m"
79
+ assert result["dimension"] == 2
80
+ assert transport.status_calls == 2
81
+
82
+
83
+ def test_ws_close_then_failed_command_inside_completed_envelope_raises() -> None:
84
+ transport = _FakeTransport([_completed_status(success=False)], _ws_closed())
85
+ with pytest.raises(EmbedClientError, match="Worker unreachable"):
86
+ asyncio.run(_client(transport).wait_for_job("j1", timeout=10, poll_interval=0.01))
87
+
88
+
89
+ def test_ws_close_then_failed_job_raises_job_failed() -> None:
90
+ transport = _FakeTransport(
91
+ [{"job_id": "j1", "status": "failed", "error": "boom"}], _ws_closed()
92
+ )
93
+ with pytest.raises(EmbedClientError, match="Job failed: boom"):
94
+ asyncio.run(_client(transport).wait_for_job("j1", timeout=10, poll_interval=0.01))
95
+
96
+
97
+ def test_ws_close_poll_respects_the_callers_timeout() -> None:
98
+ transport = _FakeTransport([{"job_id": "j1", "status": "running"}], _ws_closed())
99
+ with pytest.raises(TimeoutError, match="did not complete within"):
100
+ asyncio.run(_client(transport).wait_for_job("j1", timeout=0.2, poll_interval=0.05))
101
+
102
+
103
+ def test_other_ws_errors_are_not_masked_by_the_fallback() -> None:
104
+ transport = _FakeTransport([_completed_status()], RuntimeError("TLS handshake failed"))
105
+ with pytest.raises(EmbedClientError, match="WebSocket error: TLS handshake failed"):
106
+ asyncio.run(_client(transport).wait_for_job("j1", timeout=10, poll_interval=0.01))
107
+ assert transport.status_calls == 0
108
+
109
+
110
+ def test_adapter_ws_path_used_by_embed_file_also_falls_back() -> None:
111
+ transport = _FakeTransport([_completed_status()], _ws_closed())
112
+ result = asyncio.run(_client(transport)._wait_for_job_via_adapter_ws("j1", timeout=10))
113
+ assert result["results"] == [_ROW]
File without changes
File without changes
File without changes