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.
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/CHANGELOG.md +14 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/PKG-INFO +1 -1
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/sdk_claims.json +1 -1
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/__init__.py +1 -1
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/billing/client.py +22 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/context.py +2 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/contract/kernel-contract.sample.json +6 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_billing.py +36 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.github/workflows/identity-contract.yml +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.github/workflows/publish.yml +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.github/workflows/test.yml +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/.gitignore +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/LICENSE +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/README.md +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/api_surface.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/docs/sdl-facets.md +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/pyproject.toml +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/sdl_roles.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/.codebase-index-cache.pkl +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ai/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ai/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/auth/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/auth/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/auth/middleware.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/billing/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cache/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cache/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cache/protocol.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/action_result.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/error_codes.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/exceptions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/extension.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/filters.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/guards.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/narration.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/narration_guard.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/prompt.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/chat/refusal.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cli/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/cli/main.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/config/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/config/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/contract_checks.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/generate_api_surface.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/generate_sdk_claims.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/validate_identity_contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/errors.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/extension.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/extensions/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/extensions/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/http/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/http/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/manifest.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/manifest_schema.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/notify/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/notify/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/protocols.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/rpc/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/rpc/codec.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/rpc/contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/executor.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/llm_provider.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/runtime/message_adapter.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/document.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/event.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/_generate_roles_json.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/entity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/catalog.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/comm.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/content.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/device.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/event.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/geo.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/identity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/media.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/metric.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/money.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/net.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/people.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/quantity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/rating.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/security.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/task.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/facets/time.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/field.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/sdl/roles.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/exceptions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/panel_handler.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/secrets/spec.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/security/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/security/call_token.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/skeleton/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/skeleton/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/storage/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/storage/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/store/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/store/client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/store/exceptions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/testing/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/testing/mock_context.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/testing/mock_secrets.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/action_result.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/chat_result.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/client_contracts.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/contracts.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/contributions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/events.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/health.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/identity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/models.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/pagination.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/types/store_contracts.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/actions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/base.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/data.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/display.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/feedback.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/graph.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/input_components.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/interactive.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/layout.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/ui/theme.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/validator.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/validator_v1_6_0.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/conftest.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_artifacts_freshness.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_contract_checks_selftest.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_generate_sdk_claims.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_sample_contract_shape.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contract/test_sdk_matches_kernel_contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contracts/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/contracts/test_store_contracts.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/openapi/auth-gateway.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/openapi/registry.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/fixtures/openapi/sharelock-cases.json +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/rpc/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/rpc/test_codec.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/rpc/test_contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/runtime/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/runtime/test_llm_provider_config_store.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/store/__init__.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/store/test_list_users_client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/store/test_query_all_client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_action_result_typed.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_as_user.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_auth.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_cache_client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_cache_model.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_call_token.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_extension_deprecation.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_extension_no_llm_router.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_filters.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_function_background_flag.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_guards.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_guards_bleed.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_prompt.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_chat_result.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_cli.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_client_contracts.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_config_client.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context_background_task.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context_deliver_chat_message.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_context_guards.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_contracts.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_contracts_live.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_contributions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_data_model_kwarg.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_document_contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_emits_decorator.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_error_codes.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_errors.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_event_schema_v2.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_events_health.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_extension.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_extension_v2.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_extensions_emit.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_http_timeout_override.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_id_shape_guard.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_identity_contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_imperal_schema_v2.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_import_light.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_kernel_primitives.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_no_orchestrator_tool.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_roundtrip_gate.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_schema.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_v2_events.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_v2_other_sections.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_v2_webhooks.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_manifest_validator_v2.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_mock_context.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_models.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_narration_emission.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_narration_guard.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_openai_max_completion_tokens.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_pagination.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_panel_rendering_contract.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_panels.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_phase_a_dead_removal.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_phase_a_drift.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_phase_a_text.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdk_version_stamp.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_entity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_entity_marker.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_exports.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_catalog.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_collisions.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_comm.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_content.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_device.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_event.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_exports.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_field.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_geo.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_identity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_media.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_metric.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_money.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_net.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_people.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_quantity.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_rating.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_security.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_task.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facet_time.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facets_catalog.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facets_doc.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_facets_pkg.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_field.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_roles.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_roles_json.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_sdl_roles_of_facets.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_skeleton_decorator.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_spec_validation.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_fileupload_enhanced.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_html.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_image_enhanced.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_open.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_ui_theme.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_user.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_v7_emit_refusal.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_drift.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_pep563.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_v1_6_0_rules.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_validator_v25.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/test_write_arg_bleed.py +0 -0
- {imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/tests/tools/__init__.py +0 -0
- {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,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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/devtools/validate_identity_contract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/completion_result.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{imperal_sdk-5.4.0 → imperal_sdk-5.4.2}/src/imperal_sdk/schemas/subscription_info.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|