imperal-sdk 5.4.0__tar.gz → 5.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/CHANGELOG.md +14 -0
  2. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/PKG-INFO +1 -1
  3. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/sdk_claims.json +1 -1
  4. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/__init__.py +1 -1
  5. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/billing/client.py +22 -0
  6. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/context.py +2 -0
  7. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/contract/kernel-contract.sample.json +6 -0
  8. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_billing.py +36 -0
  9. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.github/workflows/identity-contract.yml +0 -0
  10. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.github/workflows/publish.yml +0 -0
  11. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.github/workflows/test.yml +0 -0
  12. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.gitignore +0 -0
  13. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/LICENSE +0 -0
  14. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/README.md +0 -0
  15. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/api_surface.json +0 -0
  16. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/docs/sdl-facets.md +0 -0
  17. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/pyproject.toml +0 -0
  18. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/sdl_roles.json +0 -0
  19. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/.codebase-index-cache.pkl +0 -0
  20. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ai/__init__.py +0 -0
  21. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ai/client.py +0 -0
  22. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/auth/__init__.py +0 -0
  23. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/auth/client.py +0 -0
  24. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/auth/middleware.py +0 -0
  25. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/billing/__init__.py +0 -0
  26. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cache/__init__.py +0 -0
  27. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cache/client.py +0 -0
  28. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cache/protocol.py +0 -0
  29. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/__init__.py +0 -0
  30. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/action_result.py +0 -0
  31. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/error_codes.py +0 -0
  32. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/exceptions.py +0 -0
  33. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/extension.py +0 -0
  34. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/filters.py +0 -0
  35. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/guards.py +0 -0
  36. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
  37. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/narration.py +0 -0
  38. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/narration_guard.py +0 -0
  39. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/prompt.py +0 -0
  40. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/refusal.py +0 -0
  41. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cli/__init__.py +0 -0
  42. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cli/main.py +0 -0
  43. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/config/__init__.py +0 -0
  44. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/config/client.py +0 -0
  45. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/__init__.py +0 -0
  46. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/contract_checks.py +0 -0
  47. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/generate_api_surface.py +0 -0
  48. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/generate_sdk_claims.py +0 -0
  49. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/validate_identity_contract.py +0 -0
  50. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/errors.py +0 -0
  51. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/extension.py +0 -0
  52. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/extensions/__init__.py +0 -0
  53. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/extensions/client.py +0 -0
  54. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/http/__init__.py +0 -0
  55. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/http/client.py +0 -0
  56. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/manifest.py +0 -0
  57. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/manifest_schema.py +0 -0
  58. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/notify/__init__.py +0 -0
  59. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/notify/client.py +0 -0
  60. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/__init__.py +0 -0
  61. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
  62. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
  63. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
  64. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/protocols.py +0 -0
  65. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/rpc/__init__.py +0 -0
  66. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/rpc/codec.py +0 -0
  67. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/rpc/contract.py +0 -0
  68. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/__init__.py +0 -0
  69. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/executor.py +0 -0
  70. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/llm_provider.py +0 -0
  71. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/message_adapter.py +0 -0
  72. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
  73. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
  74. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
  75. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
  76. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/document.schema.json +0 -0
  77. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/event.schema.json +0 -0
  78. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
  79. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
  80. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
  81. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
  82. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
  83. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
  84. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/__init__.py +0 -0
  85. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/_generate_roles_json.py +0 -0
  86. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/entity.py +0 -0
  87. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/__init__.py +0 -0
  88. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/catalog.py +0 -0
  89. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/comm.py +0 -0
  90. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/content.py +0 -0
  91. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/device.py +0 -0
  92. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/event.py +0 -0
  93. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/geo.py +0 -0
  94. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/identity.py +0 -0
  95. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/media.py +0 -0
  96. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/metric.py +0 -0
  97. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/money.py +0 -0
  98. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/net.py +0 -0
  99. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/people.py +0 -0
  100. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/quantity.py +0 -0
  101. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/rating.py +0 -0
  102. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/security.py +0 -0
  103. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/task.py +0 -0
  104. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/time.py +0 -0
  105. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/field.py +0 -0
  106. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/roles.py +0 -0
  107. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/__init__.py +0 -0
  108. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/client.py +0 -0
  109. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/exceptions.py +0 -0
  110. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/panel_handler.py +0 -0
  111. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/spec.py +0 -0
  112. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/security/__init__.py +0 -0
  113. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/security/call_token.py +0 -0
  114. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/skeleton/__init__.py +0 -0
  115. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/skeleton/client.py +0 -0
  116. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/storage/__init__.py +0 -0
  117. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/storage/client.py +0 -0
  118. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/store/__init__.py +0 -0
  119. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/store/client.py +0 -0
  120. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/store/exceptions.py +0 -0
  121. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/testing/__init__.py +0 -0
  122. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/testing/mock_context.py +0 -0
  123. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/testing/mock_secrets.py +0 -0
  124. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/__init__.py +0 -0
  125. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/action_result.py +0 -0
  126. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/chat_result.py +0 -0
  127. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/client_contracts.py +0 -0
  128. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/contracts.py +0 -0
  129. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/contributions.py +0 -0
  130. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/events.py +0 -0
  131. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/health.py +0 -0
  132. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/identity.py +0 -0
  133. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/models.py +0 -0
  134. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/pagination.py +0 -0
  135. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/store_contracts.py +0 -0
  136. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/__init__.py +0 -0
  137. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/actions.py +0 -0
  138. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/base.py +0 -0
  139. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/data.py +0 -0
  140. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/display.py +0 -0
  141. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/feedback.py +0 -0
  142. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/graph.py +0 -0
  143. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/input_components.py +0 -0
  144. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/interactive.py +0 -0
  145. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/layout.py +0 -0
  146. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/theme.py +0 -0
  147. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/validator.py +0 -0
  148. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/validator_v1_6_0.py +0 -0
  149. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/conftest.py +0 -0
  150. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/__init__.py +0 -0
  151. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_artifacts_freshness.py +0 -0
  152. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_contract_checks_selftest.py +0 -0
  153. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_generate_sdk_claims.py +0 -0
  154. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_sample_contract_shape.py +0 -0
  155. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_sdk_matches_kernel_contract.py +0 -0
  156. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contracts/__init__.py +0 -0
  157. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contracts/test_store_contracts.py +0 -0
  158. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/openapi/auth-gateway.json +0 -0
  159. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/openapi/registry.json +0 -0
  160. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/openapi/sharelock-cases.json +0 -0
  161. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/rpc/__init__.py +0 -0
  162. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/rpc/test_codec.py +0 -0
  163. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/rpc/test_contract.py +0 -0
  164. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/runtime/__init__.py +0 -0
  165. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/runtime/test_llm_provider_config_store.py +0 -0
  166. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
  167. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/store/__init__.py +0 -0
  168. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/store/test_list_users_client.py +0 -0
  169. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/store/test_query_all_client.py +0 -0
  170. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_action_result_typed.py +0 -0
  171. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_as_user.py +0 -0
  172. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_auth.py +0 -0
  173. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_cache_client.py +0 -0
  174. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_cache_model.py +0 -0
  175. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_call_token.py +0 -0
  176. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_extension_deprecation.py +0 -0
  177. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_extension_no_llm_router.py +0 -0
  178. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_filters.py +0 -0
  179. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_function_background_flag.py +0 -0
  180. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_guards.py +0 -0
  181. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_guards_bleed.py +0 -0
  182. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_prompt.py +0 -0
  183. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_result.py +0 -0
  184. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_cli.py +0 -0
  185. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_client_contracts.py +0 -0
  186. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_config_client.py +0 -0
  187. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context.py +0 -0
  188. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context_background_task.py +0 -0
  189. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context_deliver_chat_message.py +0 -0
  190. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context_guards.py +0 -0
  191. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_contracts.py +0 -0
  192. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_contracts_live.py +0 -0
  193. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_contributions.py +0 -0
  194. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_data_model_kwarg.py +0 -0
  195. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_document_contract.py +0 -0
  196. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_emits_decorator.py +0 -0
  197. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_error_codes.py +0 -0
  198. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_errors.py +0 -0
  199. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_event_schema_v2.py +0 -0
  200. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_events_health.py +0 -0
  201. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_extension.py +0 -0
  202. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_extension_v2.py +0 -0
  203. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_extensions_emit.py +0 -0
  204. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_http_timeout_override.py +0 -0
  205. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_id_shape_guard.py +0 -0
  206. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_identity_contract.py +0 -0
  207. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_imperal_schema_v2.py +0 -0
  208. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_import_light.py +0 -0
  209. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_kernel_primitives.py +0 -0
  210. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest.py +0 -0
  211. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_no_orchestrator_tool.py +0 -0
  212. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_roundtrip_gate.py +0 -0
  213. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_schema.py +0 -0
  214. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_v2_events.py +0 -0
  215. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_v2_other_sections.py +0 -0
  216. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_v2_webhooks.py +0 -0
  217. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_validator_v2.py +0 -0
  218. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_mock_context.py +0 -0
  219. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_models.py +0 -0
  220. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_narration_emission.py +0 -0
  221. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_narration_guard.py +0 -0
  222. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_openai_max_completion_tokens.py +0 -0
  223. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_pagination.py +0 -0
  224. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_panel_rendering_contract.py +0 -0
  225. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_panels.py +0 -0
  226. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_phase_a_dead_removal.py +0 -0
  227. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_phase_a_drift.py +0 -0
  228. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_phase_a_text.py +0 -0
  229. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdk_version_stamp.py +0 -0
  230. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_entity.py +0 -0
  231. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_entity_marker.py +0 -0
  232. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_exports.py +0 -0
  233. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_catalog.py +0 -0
  234. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_collisions.py +0 -0
  235. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_comm.py +0 -0
  236. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_content.py +0 -0
  237. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_device.py +0 -0
  238. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_event.py +0 -0
  239. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_exports.py +0 -0
  240. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_field.py +0 -0
  241. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_geo.py +0 -0
  242. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_identity.py +0 -0
  243. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_media.py +0 -0
  244. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_metric.py +0 -0
  245. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_money.py +0 -0
  246. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_net.py +0 -0
  247. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_people.py +0 -0
  248. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_quantity.py +0 -0
  249. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_rating.py +0 -0
  250. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_security.py +0 -0
  251. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_task.py +0 -0
  252. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_time.py +0 -0
  253. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facets_catalog.py +0 -0
  254. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facets_doc.py +0 -0
  255. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facets_pkg.py +0 -0
  256. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_field.py +0 -0
  257. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_roles.py +0 -0
  258. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_roles_json.py +0 -0
  259. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_roles_of_facets.py +0 -0
  260. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_skeleton_decorator.py +0 -0
  261. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_spec_validation.py +0 -0
  262. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui.py +0 -0
  263. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_fileupload_enhanced.py +0 -0
  264. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_html.py +0 -0
  265. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_image_enhanced.py +0 -0
  266. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_open.py +0 -0
  267. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_theme.py +0 -0
  268. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_user.py +0 -0
  269. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_v7_emit_refusal.py +0 -0
  270. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator.py +0 -0
  271. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_drift.py +0 -0
  272. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_pep563.py +0 -0
  273. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_v1_6_0_rules.py +0 -0
  274. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_v25.py +0 -0
  275. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_write_arg_bleed.py +0 -0
  276. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/tools/__init__.py +0 -0
  277. {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/tools/test_generate_api_surface.py +0 -0
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to `imperal-sdk` are documented here.
4
4
 
5
+ ## 5.4.1 — 2026-06-16 — BillingClient resume + cancel_at_period_end
6
+
7
+ Additive — **nothing to migrate**.
8
+
9
+ ### Added
10
+ - `ctx.billing.resume_subscription()` — undoes a pending cancel-at-period-end
11
+ (POST `/v1/billing/resume`); returns the gateway result dict
12
+ (`{status, plan, expires_at, cancel_at_period_end}`). Surfaces errors.
13
+ - `SubscriptionInfo.cancel_at_period_end: bool` (defaults `False`) —
14
+ `get_subscription()` now maps it from the gateway response so extensions can
15
+ show whether an active subscription is set to cancel at period end.
16
+
17
+ `BillingProtocol` 17 → 18 methods.
18
+
5
19
  ## 5.4.0 — 2026-06-16 — BillingClient portal + full Webbee parity
6
20
 
7
21
  Additive — **nothing to migrate**.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: imperal-sdk
3
- Version: 5.4.0
3
+ Version: 5.4.2
4
4
  Summary: SDK for building Imperal Cloud extensions
5
5
  Author: Valentin Scerbacov, Imperal, Inc.
6
6
  License-Expression: AGPL-3.0-or-later
@@ -1,5 +1,5 @@
1
1
  {
2
- "_sdk_version": "5.4.0",
2
+ "_sdk_version": "5.4.2",
3
3
  "constants": {
4
4
  "max_call_depth": {
5
5
  "counts_root": true,
@@ -1,7 +1,7 @@
1
1
  """Imperal Cloud SDK — build extensions for the Imperal platform."""
2
2
  from typing import TYPE_CHECKING
3
3
 
4
- __version__ = "5.4.0"
4
+ __version__ = "5.4.2"
5
5
 
6
6
  # 5.2.2 (2026-06-11): the package root resolves its public surface lazily
7
7
  # (PEP 562). The eager imports pulled the HTTP transport (Context / client
@@ -35,6 +35,7 @@ class SubscriptionInfo:
35
35
  status: str
36
36
  started_at: str | None = None
37
37
  expires_at: str | None = None
38
+ cancel_at_period_end: bool = False
38
39
 
39
40
 
40
41
  class BillingClient:
@@ -108,6 +109,7 @@ class BillingClient:
108
109
  status=data.get("status", "unknown"),
109
110
  started_at=data.get("started_at"),
110
111
  expires_at=data.get("expires_at"),
112
+ cancel_at_period_end=bool(data.get("cancel_at_period_end", False)),
111
113
  )
112
114
  except Exception as e:
113
115
  log.warning("Billing get_subscription failed: %s", e)
@@ -316,6 +318,26 @@ class BillingClient:
316
318
  resp.raise_for_status()
317
319
  return resp.json() if resp.content else {}
318
320
 
321
+ async def resume_subscription(self, user: Any = None) -> dict:
322
+ """Undo a pending cancel-at-period-end. Surfaces errors. Returns the
323
+ gateway result dict ({status, plan, expires_at, cancel_at_period_end})."""
324
+ async with httpx.AsyncClient() as client:
325
+ resp = await client.post(f"{self._gateway_url}/v1/billing/resume",
326
+ headers=self._headers(), timeout=15)
327
+ resp.raise_for_status()
328
+ return resp.json() if resp.content else {}
329
+
330
+ async def renew_subscription(self, user: Any = None) -> dict:
331
+ """Renew an EXPIRED subscription for the same plan — charges the saved
332
+ default card for one fresh period and restores access immediately.
333
+ Surfaces errors (402 no-card / SCA, 409 not-expired). Returns the
334
+ gateway result dict ({status, plan, expires_at, payment_intent_id})."""
335
+ async with httpx.AsyncClient() as client:
336
+ resp = await client.post(f"{self._gateway_url}/v1/billing/renew",
337
+ headers=self._headers(), timeout=20)
338
+ resp.raise_for_status()
339
+ return resp.json() if resp.content else {}
340
+
319
341
  async def update_billing_profile(self, profile: dict, user: Any = None) -> bool:
320
342
  """Surfaces errors. profile keys: name/company/vat/country."""
321
343
  async with httpx.AsyncClient() as client:
@@ -62,6 +62,8 @@ class BillingProtocol(Protocol):
62
62
  async def get_auto_topup(self, user: Any = None): ...
63
63
  async def set_auto_topup(self, enabled: bool, threshold_pct: int = 10, recharge_tokens: int = 20000, payment_method_id: str = "", user: Any = None) -> bool: ...
64
64
  async def cancel_subscription(self, user: Any = None) -> dict: ...
65
+ async def resume_subscription(self, user: Any = None) -> dict: ...
66
+ async def renew_subscription(self, user: Any = None) -> dict: ...
65
67
  async def update_billing_profile(self, profile: dict, user: Any = None) -> bool: ...
66
68
 
67
69
 
@@ -40,6 +40,8 @@
40
40
  "list_payments",
41
41
  "list_plans",
42
42
  "remove_payment_method",
43
+ "renew_subscription",
44
+ "resume_subscription",
43
45
  "set_auto_topup",
44
46
  "set_default_payment_method",
45
47
  "topup",
@@ -137,6 +139,10 @@
137
139
  "fields": {},
138
140
  "source": "gateway_spec (auth-gateway billing/stripe_router.py::create_portal_session)"
139
141
  },
142
+ "POST /v1/billing/resume": {
143
+ "fields": {},
144
+ "source": "gateway_spec (auth-gateway billing/router.py::resume)"
145
+ },
140
146
  "POST /v1/billing/topup": {
141
147
  "fields": {
142
148
  "price_cents": {
@@ -184,6 +184,42 @@ async def test_cancel_subscription_posts_and_returns_dict():
184
184
  assert req.headers["X-Acting-User"] == "imp_u_x"
185
185
 
186
186
 
187
+ @respx.mock
188
+ async def test_resume_subscription_posts_and_returns_dict():
189
+ route = respx.post(f"{_GW}/v1/billing/resume").mock(return_value=httpx.Response(200,
190
+ json={"status": "active", "plan": "pro", "expires_at": "2026-08-01",
191
+ "cancel_at_period_end": False}))
192
+ c = BillingClient(gateway_url=_GW, service_token="svc", user_id="imp_u_x")
193
+ res = await c.resume_subscription()
194
+ assert res == {"status": "active", "plan": "pro", "expires_at": "2026-08-01",
195
+ "cancel_at_period_end": False}
196
+ req = route.calls.last.request
197
+ assert req.url.path == "/v1/billing/resume"
198
+ assert req.headers["X-Service-Token"] == "svc"
199
+ assert req.headers["X-Acting-User"] == "imp_u_x"
200
+
201
+
202
+ @respx.mock
203
+ async def test_get_subscription_parses_cancel_at_period_end():
204
+ respx.get(f"{_GW}/v1/billing/internal/subscription/imp_u_x").mock(
205
+ return_value=httpx.Response(200, json={"plan": "pro", "status": "active",
206
+ "started_at": "2026-01-01T00:00:00", "expires_at": "2026-08-01",
207
+ "cancel_at_period_end": True}))
208
+ c = BillingClient(gateway_url=_GW, service_token="svc", user_id="imp_u_x")
209
+ sub = await c.get_subscription()
210
+ assert sub.plan == "pro" and sub.status == "active"
211
+ assert sub.cancel_at_period_end is True
212
+
213
+
214
+ @respx.mock
215
+ async def test_get_subscription_defaults_cancel_at_period_end_false():
216
+ respx.get(f"{_GW}/v1/billing/internal/subscription/imp_u_x").mock(
217
+ return_value=httpx.Response(200, json={"plan": "free", "status": "active"}))
218
+ c = BillingClient(gateway_url=_GW, service_token="svc", user_id="imp_u_x")
219
+ sub = await c.get_subscription()
220
+ assert sub.cancel_at_period_end is False
221
+
222
+
187
223
  @respx.mock
188
224
  async def test_update_billing_profile_puts_profile():
189
225
  route = respx.put(f"{_GW}/v1/billing/profile").mock(return_value=httpx.Response(200,
File without changes
File without changes
File without changes
File without changes
File without changes