imperal-sdk 4.2.6__tar.gz → 4.2.7__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-4.2.6 → imperal_sdk-4.2.7}/CHANGELOG.md +77 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/PKG-INFO +1 -1
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/__init__.py +1 -1
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/context.py +41 -1
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/.github/workflows/identity-contract.yml +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/.github/workflows/publish.yml +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/.github/workflows/test.yml +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/.gitignore +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/LICENSE +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/README.md +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/api_surface.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/pyproject.toml +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/.codebase-index-cache.pkl +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ai/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ai/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/auth/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/auth/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/auth/middleware.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/billing/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/billing/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/cache/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/cache/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/cache/protocol.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/action_result.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/error_codes.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/extension.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/filters.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/guards.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/handler.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/narration.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/narration_guard.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/prompt.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/refusal.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/chat/retry.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/cli/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/cli/main.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/config/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/config/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/db/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/db/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/errors.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/extension.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/extensions/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/extensions/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/http/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/http/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/manifest.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/manifest_schema.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/notify/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/notify/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/prompts/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/protocols.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/rpc/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/rpc/codec.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/rpc/contract.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/runtime/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/runtime/executor.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/runtime/llm_provider.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/runtime/message_adapter.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/document.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/event.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/secrets/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/secrets/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/secrets/exceptions.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/secrets/panel_handler.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/secrets/spec.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/security/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/security/call_token.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/skeleton/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/skeleton/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/storage/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/storage/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/store/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/store/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/store/exceptions.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/testing/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/testing/mock_context.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/testing/mock_secrets.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/tools/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/tools/client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/tools/generate_api_surface.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/tools/validate_identity_contract.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/action_result.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/chat_result.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/client_contracts.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/contracts.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/contributions.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/events.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/health.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/identity.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/models.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/pagination.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/types/store_contracts.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/actions.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/base.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/data.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/display.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/feedback.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/graph.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/input_components.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/interactive.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/layout.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/ui/theme.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/validator.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/src/imperal_sdk/validator_v1_6_0.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/conftest.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/contracts/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/contracts/test_store_contracts.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/fixtures/openapi/auth-gateway.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/fixtures/openapi/registry.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/fixtures/openapi/sharelock-cases.json +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/rpc/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/rpc/test_codec.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/rpc/test_contract.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/runtime/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/runtime/test_llm_provider_config_store.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/store/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/store/test_list_users_client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/store/test_query_all_client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_action_result_typed.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_as_user.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_auth.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_billing.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_cache_client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_cache_model.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_call_token.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_extension_deprecation.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_filters.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_guards.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_guards_bleed.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_prompt.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_pydantic_retry.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_chat_result.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_cli.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_client_contracts.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_config_client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_context.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_context_guards.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_contracts.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_contracts_live.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_contributions.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_document_contract.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_emits_decorator.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_error_codes.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_errors.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_event_schema_v2.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_events_health.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_extension.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_extension_v2.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_extensions_emit.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_handler_p2.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_id_shape_guard.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_identity_contract.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_imperal_schema_v2.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_kernel_primitives.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest_roundtrip_gate.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest_schema.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest_v2_events.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest_v2_other_sections.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest_v2_webhooks.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_manifest_validator_v2.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_mock_context.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_models.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_narration_emission.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_narration_guard.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_openai_max_completion_tokens.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_pagination.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_panel_rendering_contract.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_panels.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_skeleton_decorator.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_spec_validation.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_tools_client.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_ui.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_ui_fileupload_enhanced.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_ui_html.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_ui_image_enhanced.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_ui_open.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_ui_theme.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_user.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_v7_emit_refusal.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_validator.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_validator_drift.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_validator_pep563.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_validator_v1_6_0_rules.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/test_write_arg_bleed.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/tools/__init__.py +0 -0
- {imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/tests/tools/test_generate_api_surface.py +0 -0
|
@@ -2,6 +2,83 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `imperal-sdk` are documented here.
|
|
4
4
|
|
|
5
|
+
## 4.2.7 — 2026-05-13
|
|
6
|
+
|
|
7
|
+
**OAuth callback infrastructure + `ctx.webhook_url()` helper**
|
|
8
|
+
|
|
9
|
+
Closes the architectural gap that made `@ext.webhook("/callback", method="GET")`
|
|
10
|
+
non-functional for OAuth providers (Spotify, GitHub, Google). Before this
|
|
11
|
+
release: hardcoded redirect URIs in `*_config.py` landed users on a Next.js
|
|
12
|
+
404 (no nginx route for `/v1/ext/*`), and even if they reached auth-gw the
|
|
13
|
+
`ext_router` was POST-only.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **`Context.webhook_url(path)`** — builds the canonical public callback
|
|
18
|
+
URL from kernel-authoritative `_extension_id` (folder/manifest name, not
|
|
19
|
+
the drift-prone Python `Extension("X", ...)` value). Returns
|
|
20
|
+
`https://{IMPERAL_PUBLIC_HOST}/v1/ext/{app_id}/webhook/{path}` — default
|
|
21
|
+
host `panel.imperal.io`. Path leading slash is normalised. Use this
|
|
22
|
+
instead of hardcoding the URL in config files; hardcoded URLs are the
|
|
23
|
+
#1 cause of OAuth-callback drift bugs.
|
|
24
|
+
|
|
25
|
+
- **Federal `ctx.secrets` inject moved to `ContextFactory._build_context`** —
|
|
26
|
+
every dispatch path (chat tool, panel, skeleton, schedule, webhook,
|
|
27
|
+
lifecycle, health check) now gets `ctx.secrets` uniformly. Previously
|
|
28
|
+
the inject lived in `pipeline/extension_runner.py` and only fired for
|
|
29
|
+
chat tool dispatch; panel handlers and others crashed with
|
|
30
|
+
`AttributeError` when reading `ctx.secrets` despite the documented
|
|
31
|
+
federal contract. `_HealthCheckCtx` gained a `_StubSecrets` graceful
|
|
32
|
+
no-op so `@ext.health_check` handlers that read `ctx.secrets` don't
|
|
33
|
+
crash with `AttributeError`.
|
|
34
|
+
|
|
35
|
+
- **Kernel-authoritative `app_id` in `ctx.cache`** — `CacheClient` is now
|
|
36
|
+
constructed with `self._extension_id` (kernel parameter) instead of
|
|
37
|
+
`getattr(self._extension, "app_id", ...)` (Python runtime). Fixes the
|
|
38
|
+
401 class observed in production when an ext author writes
|
|
39
|
+
`Extension("X-extension", ...)` while the deployed folder/manifest is
|
|
40
|
+
`X` — auth-gw extcache row uses the deployed app_id and would never
|
|
41
|
+
authorise the drifted Python value.
|
|
42
|
+
|
|
43
|
+
### Platform changes (live, not in the package)
|
|
44
|
+
|
|
45
|
+
- **nginx** on `panel.imperal.io` now routes `/v1/ext/*` to Imperal Auth
|
|
46
|
+
Gateway (was: caught by Next.js catch-all → 404). Renamed config from
|
|
47
|
+
`sharelock-panel*` → `imperal-panel`.
|
|
48
|
+
- **Auth-gw `ext_router`** accepts both `GET` (OAuth callbacks,
|
|
49
|
+
verification challenges) and `POST` (server-to-server hooks) on the
|
|
50
|
+
same `/v1/ext/{app_id}/webhook/{path}` endpoint.
|
|
51
|
+
- **Auth-gw `marketplace/router.py`** new public endpoint
|
|
52
|
+
`GET /v1/marketplace/apps/{app_id}/webhooks` returns `[{path, method}]`
|
|
53
|
+
for each declared `@ext.webhook`. Strips `secret_header`.
|
|
54
|
+
- **Imperal Panel** Secrets tab renders a blue info card listing every
|
|
55
|
+
webhook URL with Copy buttons so end-users know what to paste into
|
|
56
|
+
OAuth provider developer consoles.
|
|
57
|
+
- **Dev Portal App Details** gained a Webhooks tab (`imperal-ext-developer`
|
|
58
|
+
v1.3.0) showing the per-app callback URLs with method badges.
|
|
59
|
+
|
|
60
|
+
### Migration notes
|
|
61
|
+
|
|
62
|
+
- Replace `SP_REDIRECT_URI = "https://..."` hardcodes with
|
|
63
|
+
`ctx.webhook_url("/callback")` at runtime. Existing hardcoded URLs that
|
|
64
|
+
match the canonical shape keep working — but new extensions should
|
|
65
|
+
prefer the helper. No SDK-blocking change in this release.
|
|
66
|
+
- `@ext.health_check` handlers that call `await ctx.secrets.list()` /
|
|
67
|
+
`.get(...)` now receive a graceful no-op stub instead of
|
|
68
|
+
`AttributeError`. Reads return `None`/`[]`/`False`; writes raise
|
|
69
|
+
`RuntimeError` (health checks have no per-user context).
|
|
70
|
+
- All shadow patches applied on 2026-05-13 to platform-worker and
|
|
71
|
+
session-worker venvs are superseded by this release. Run
|
|
72
|
+
`pip install --upgrade imperal-sdk==4.2.7` to clear them.
|
|
73
|
+
|
|
74
|
+
### Federal invariants
|
|
75
|
+
|
|
76
|
+
| Invariant | What it pins |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `I-SECRETS-HANDLER-SCOPE-MEMORY` | Already pinned; the ContextFactory move preserves it — plaintext stays a local variable in the handler call. |
|
|
79
|
+
| `I-EXT-CACHE-APP-ID-KERNEL-AUTHORITATIVE` | (new) `CacheClient.app_id` sourced from kernel `_extension_id`, never from Python `ext.app_id`. |
|
|
80
|
+
| `I-WEBHOOK-URL-CANONICAL` | (new) `ctx.webhook_url(path)` returns `https://{IMPERAL_PUBLIC_HOST}/v1/ext/{kernel-authoritative-app_id}/webhook/{path}`. Source-inspection-friendly: env var lookup + no Python-instance attribute drift. |
|
|
81
|
+
|
|
5
82
|
## 4.2.6 — 2026-05-13
|
|
6
83
|
|
|
7
84
|
**New: `ui.Password` primitive + `ui.Input(type=)` kwarg**
|
|
@@ -218,7 +218,14 @@ class Context:
|
|
|
218
218
|
try:
|
|
219
219
|
from imperal_sdk.cache.client import CacheClient
|
|
220
220
|
self._cache = CacheClient(
|
|
221
|
-
|
|
221
|
+
# 2026-05-13: kernel-authoritative app_id (folder/manifest
|
|
222
|
+
# name passed by ContextFactory). ext.app_id is the Python
|
|
223
|
+
# runtime value and can drift from the deployed app_id
|
|
224
|
+
# (e.g. Extension("spotify-extension") in app.py while
|
|
225
|
+
# /opt/extensions/spotify/ + Dev Portal row are "spotify"
|
|
226
|
+
# — auth-gw extcache 401'd every request). Fall back to
|
|
227
|
+
# ext.app_id only when factory didn't pass _extension_id.
|
|
228
|
+
app_id=self._extension_id or getattr(self._extension, "app_id", ""),
|
|
222
229
|
user_id=self.user.imperal_id,
|
|
223
230
|
gw_url=gw,
|
|
224
231
|
service_token=svc,
|
|
@@ -289,6 +296,39 @@ class Context:
|
|
|
289
296
|
logger = logging.getLogger(f"ext.{self._extension_id}")
|
|
290
297
|
getattr(logger, level, logger.info)(message)
|
|
291
298
|
|
|
299
|
+
def webhook_url(self, path: str) -> str:
|
|
300
|
+
"""Build the public OAuth/webhook callback URL for this extension.
|
|
301
|
+
|
|
302
|
+
Returns the URL the extension author must register in the OAuth
|
|
303
|
+
provider's developer console (Spotify, GitHub, Google, etc.).
|
|
304
|
+
|
|
305
|
+
Path is the same string passed to ``@ext.webhook("/path")``. Both
|
|
306
|
+
forms work — leading slash is normalised:
|
|
307
|
+
|
|
308
|
+
ctx.webhook_url("/callback") # → .../webhook/callback
|
|
309
|
+
ctx.webhook_url("callback") # → .../webhook/callback
|
|
310
|
+
ctx.webhook_url("/oauth/return") # → .../webhook/oauth/return
|
|
311
|
+
|
|
312
|
+
Host comes from the ``IMPERAL_PUBLIC_HOST`` env var (default
|
|
313
|
+
``panel.imperal.io``). Path-component ``{app_id}`` comes from the
|
|
314
|
+
kernel-authoritative ``_extension_id`` (folder/manifest name),
|
|
315
|
+
not from ``ext.app_id`` (Python runtime, can drift).
|
|
316
|
+
|
|
317
|
+
Use this instead of hardcoding the URL in ``spotify_config.py``
|
|
318
|
+
et al. — that pattern is what caused the 2026-05-13 Spotify 401
|
|
319
|
+
class (auth-gw never saw the drifted `spotify-extension` row).
|
|
320
|
+
"""
|
|
321
|
+
import os as _os_wh
|
|
322
|
+
host = _os_wh.environ.get("IMPERAL_PUBLIC_HOST", "panel.imperal.io")
|
|
323
|
+
clean_path = (path or "").lstrip("/")
|
|
324
|
+
app_id = self._extension_id or getattr(self._extension, "app_id", "")
|
|
325
|
+
if not app_id:
|
|
326
|
+
raise RuntimeError(
|
|
327
|
+
"ctx.webhook_url() called without an extension_id — "
|
|
328
|
+
"kernel must build ctx via ContextFactory."
|
|
329
|
+
)
|
|
330
|
+
return f"https://{host}/v1/ext/{app_id}/webhook/{clean_path}"
|
|
331
|
+
|
|
292
332
|
def as_user(self, user_id: str) -> "Context":
|
|
293
333
|
"""Return scoped Context for target user_id.
|
|
294
334
|
|
|
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
|
{imperal_sdk-4.2.6 → imperal_sdk-4.2.7}/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-4.2.6 → imperal_sdk-4.2.7}/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
|
|
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
|