imperal-sdk 4.2.3__tar.gz → 4.2.5__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.3 → imperal_sdk-4.2.5}/CHANGELOG.md +50 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/PKG-INFO +1 -1
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/__init__.py +1 -1
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/extension.py +34 -26
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/validator.py +11 -2
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_panels.py +4 -1
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.github/workflows/identity-contract.yml +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.github/workflows/publish.yml +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.github/workflows/test.yml +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.gitignore +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/LICENSE +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/README.md +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/api_surface.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/pyproject.toml +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/.codebase-index-cache.pkl +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ai/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ai/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/auth/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/auth/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/auth/middleware.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/billing/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/billing/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cache/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cache/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cache/protocol.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/action_result.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/error_codes.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/extension.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/filters.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/guards.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/handler.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/narration.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/narration_guard.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/prompt.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/refusal.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/retry.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cli/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cli/main.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/config/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/config/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/context.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/db/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/db/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/errors.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/extensions/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/extensions/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/http/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/http/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/manifest.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/manifest_schema.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/notify/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/notify/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/protocols.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/rpc/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/rpc/codec.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/rpc/contract.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/executor.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/llm_provider.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/message_adapter.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/document.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/event.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/exceptions.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/panel_handler.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/spec.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/security/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/security/call_token.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/skeleton/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/skeleton/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/storage/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/storage/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/store/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/store/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/store/exceptions.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/testing/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/testing/mock_context.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/testing/mock_secrets.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/generate_api_surface.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/validate_identity_contract.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/action_result.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/chat_result.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/client_contracts.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/contracts.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/contributions.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/events.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/health.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/identity.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/models.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/pagination.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/store_contracts.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/actions.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/base.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/data.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/display.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/feedback.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/graph.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/input_components.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/interactive.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/layout.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/theme.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/validator_v1_6_0.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/conftest.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/contracts/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/contracts/test_store_contracts.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/fixtures/openapi/auth-gateway.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/fixtures/openapi/registry.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/fixtures/openapi/sharelock-cases.json +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/rpc/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/rpc/test_codec.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/rpc/test_contract.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/runtime/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/runtime/test_llm_provider_config_store.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/store/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/store/test_list_users_client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/store/test_query_all_client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_action_result_typed.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_as_user.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_auth.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_billing.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_cache_client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_cache_model.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_call_token.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_extension_deprecation.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_filters.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_guards.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_guards_bleed.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_prompt.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_pydantic_retry.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_result.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_cli.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_client_contracts.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_config_client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_context.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_context_guards.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_contracts.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_contracts_live.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_contributions.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_document_contract.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_emits_decorator.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_error_codes.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_errors.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_event_schema_v2.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_events_health.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_extension.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_extension_v2.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_extensions_emit.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_handler_p2.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_id_shape_guard.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_identity_contract.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_imperal_schema_v2.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_kernel_primitives.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_roundtrip_gate.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_schema.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_v2_events.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_v2_other_sections.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_v2_webhooks.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_validator_v2.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_mock_context.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_models.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_narration_emission.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_narration_guard.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_openai_max_completion_tokens.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_pagination.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_panel_rendering_contract.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_skeleton_decorator.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_spec_validation.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_tools_client.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_fileupload_enhanced.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_html.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_image_enhanced.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_open.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_theme.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_user.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_v7_emit_refusal.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator_drift.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator_pep563.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator_v1_6_0_rules.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_write_arg_bleed.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/tools/__init__.py +0 -0
- {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/tools/test_generate_api_surface.py +0 -0
|
@@ -2,6 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `imperal-sdk` are documented here.
|
|
4
4
|
|
|
5
|
+
## 4.2.5 — 2026-05-13
|
|
6
|
+
|
|
7
|
+
**Fix: synthetic `__panel__*` tools excluded from validator tool_count + tests**
|
|
8
|
+
|
|
9
|
+
v4.2.4 introduced an unconditional synthetic `secrets` panel via `Extension.__init__`,
|
|
10
|
+
which auto-registers a `__panel__secrets` tool internally. The validator's `tool_count`
|
|
11
|
+
logic was counting this synthetic tool as a user-authored tool, masking V3 ("at least
|
|
12
|
+
one tool") error detection for extensions with zero user tools and inflating
|
|
13
|
+
marketplace tool counts.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- **`validator.tool_count`** now excludes any tool whose name matches the
|
|
18
|
+
synthetic-prefix allowlist (`__panel__`, `__widget__`, `__tray__`, `__webhook__`).
|
|
19
|
+
These are platform-provided, not author-authored, and shouldn't count.
|
|
20
|
+
- **`V3 "at least one tool"`** check now correctly fires for ext'ы with only
|
|
21
|
+
synthetic auto-registered tools.
|
|
22
|
+
- `tests/test_panels.py::test_multiple_panels` updated to assert +1 for the
|
|
23
|
+
always-present synthetic `secrets` panel.
|
|
24
|
+
|
|
25
|
+
### Notes
|
|
26
|
+
|
|
27
|
+
- No behavior change for extensions with at least one real `@ext.tool` or
|
|
28
|
+
ChatExtension. Strict-tool-count-zero ext'ы now properly fail V3 again.
|
|
29
|
+
- Marketplace tool counts shown to users no longer count synthetic panels.
|
|
30
|
+
|
|
31
|
+
## 4.2.4 — 2026-05-13
|
|
32
|
+
|
|
33
|
+
**EXT-SECRETS-V1 — unconditional synthetic Secrets panel**
|
|
34
|
+
|
|
35
|
+
In v4.2.3 the synthetic Secrets panel was registered conditionally on the
|
|
36
|
+
first `@ext.secret(...)` call, which meant extensions that did not declare
|
|
37
|
+
secrets had no menu entry — leaving end-users without a discoverable place
|
|
38
|
+
to manage credentials when developers later add declarations.
|
|
39
|
+
|
|
40
|
+
This release flips the registration to **unconditional**: every Extension
|
|
41
|
+
instance auto-registers the synthetic `secrets` panel in `__init__` (slot
|
|
42
|
+
`right`, title `Secrets`, icon `KeyRound`). When the manifest has zero
|
|
43
|
+
declared secrets, the panel renders an empty state with developer guidance
|
|
44
|
+
(`@ext.secret(...)` code example + link to docs). When declarations exist,
|
|
45
|
+
it renders one card per secret with `is_set` status + Manage button.
|
|
46
|
+
|
|
47
|
+
### Migration notes
|
|
48
|
+
|
|
49
|
+
- **No code changes required**. Bump your ext's SDK pin to `>= 4.2.4` and
|
|
50
|
+
redeploy via Dev Portal — the Secrets tab appears automatically.
|
|
51
|
+
- Extensions that genuinely never need credentials still get the tab; this
|
|
52
|
+
is intentional for UX consistency. Federal V32 contract still requires
|
|
53
|
+
`@ext.secret` for any real credential access at runtime.
|
|
54
|
+
|
|
5
55
|
## 4.2.3 — 2026-05-13
|
|
6
56
|
|
|
7
57
|
**EXT-SECRETS-V1 UX polish — synthetic `secrets` panel auto-injected**
|
|
@@ -142,6 +142,36 @@ class Extension:
|
|
|
142
142
|
# EXT-SECRETS-V1 (v4.2.2) — declared secrets emitted into manifest.secrets[]
|
|
143
143
|
self._secrets: dict[str, "SecretSpec"] = {}
|
|
144
144
|
|
|
145
|
+
# EXT-SECRETS-V1 (v4.2.4) — auto-register synthetic 'secrets' panel
|
|
146
|
+
# unconditionally for every Extension. Empty state (no @ext.secret
|
|
147
|
+
# declared) renders developer guidance with code example. Federal
|
|
148
|
+
# contract enforced platform-side regardless of UI presence.
|
|
149
|
+
self._auto_register_secrets_panel()
|
|
150
|
+
|
|
151
|
+
def _auto_register_secrets_panel(self) -> None:
|
|
152
|
+
"""Register the platform-provided 'secrets' panel.
|
|
153
|
+
|
|
154
|
+
Idempotent — only registers once per Extension instance. Slot
|
|
155
|
+
defaults to 'right' (least-used by typical extensions, lowest
|
|
156
|
+
collision risk with deploy-sync logic that keeps one panel per slot).
|
|
157
|
+
"""
|
|
158
|
+
if "secrets" in self._panels:
|
|
159
|
+
return
|
|
160
|
+
try:
|
|
161
|
+
from imperal_sdk.secrets.panel_handler import (
|
|
162
|
+
builtin_secrets_panel_handler,
|
|
163
|
+
)
|
|
164
|
+
except Exception:
|
|
165
|
+
# If secrets package import fails, don't break Extension init.
|
|
166
|
+
return
|
|
167
|
+
self.panel(
|
|
168
|
+
"secrets",
|
|
169
|
+
slot="right",
|
|
170
|
+
title="Secrets",
|
|
171
|
+
icon="KeyRound",
|
|
172
|
+
refresh="manual",
|
|
173
|
+
)(builtin_secrets_panel_handler)
|
|
174
|
+
|
|
145
175
|
def secret(
|
|
146
176
|
self,
|
|
147
177
|
name: str,
|
|
@@ -195,32 +225,10 @@ class Extension:
|
|
|
195
225
|
)
|
|
196
226
|
self._secrets[name] = spec
|
|
197
227
|
|
|
198
|
-
# EXT-SECRETS-V1 (v4.2.
|
|
199
|
-
#
|
|
200
|
-
#
|
|
201
|
-
|
|
202
|
-
# Subsequent @ext.secret calls are no-ops here — registration is
|
|
203
|
-
# idempotent.
|
|
204
|
-
#
|
|
205
|
-
# Slot choice: ``right`` is defensively chosen. Most extensions
|
|
206
|
-
# use ``left`` (sidebar nav) and ``center`` (main content); ``right``
|
|
207
|
-
# is rarely-used so the synthetic Secrets tab is least likely to be
|
|
208
|
-
# overwritten by the deploy-sync logic in imperal-ext-developer
|
|
209
|
-
# which currently keeps only one panel per slot. If your extension
|
|
210
|
-
# already uses ``right``, your panel wins; users can still reach
|
|
211
|
-
# the Secrets UI via the chat-top ribbon and at /ext/{ext_id}/secrets.
|
|
212
|
-
if "secrets" not in self._panels:
|
|
213
|
-
from imperal_sdk.secrets.panel_handler import (
|
|
214
|
-
builtin_secrets_panel_handler,
|
|
215
|
-
)
|
|
216
|
-
# Call self.panel(...) the same way an extension author would.
|
|
217
|
-
self.panel(
|
|
218
|
-
"secrets",
|
|
219
|
-
slot="right",
|
|
220
|
-
title="Secrets",
|
|
221
|
-
icon="KeyRound",
|
|
222
|
-
refresh="manual",
|
|
223
|
-
)(builtin_secrets_panel_handler)
|
|
228
|
+
# EXT-SECRETS-V1 (v4.2.4): synthetic Secrets panel is now registered
|
|
229
|
+
# unconditionally in Extension.__init__ via _auto_register_secrets_panel.
|
|
230
|
+
# This call site is a no-op safety net for older bytecode paths.
|
|
231
|
+
self._auto_register_secrets_panel()
|
|
224
232
|
|
|
225
233
|
def _decorator(target):
|
|
226
234
|
return target # syntactic anchor only — decorator is a no-op wrapper
|
|
@@ -145,8 +145,17 @@ def validate_extension(ext) -> ValidationReport:
|
|
|
145
145
|
fix="Set version to a valid semver string",
|
|
146
146
|
))
|
|
147
147
|
|
|
148
|
-
# Count registered @ext.tool entries
|
|
149
|
-
|
|
148
|
+
# Count registered @ext.tool entries. Exclude synthetic tools that the
|
|
149
|
+
# SDK auto-registers internally (e.g. __panel__secrets from the
|
|
150
|
+
# EXT-SECRETS-V1 unconditional synthetic Secrets panel, v4.2.4) — those
|
|
151
|
+
# are platform-provided, not user-authored, and shouldn't count toward
|
|
152
|
+
# V3 "at least one tool" or marketplace tool counts.
|
|
153
|
+
_all_tools = getattr(ext, "_tools", {})
|
|
154
|
+
_SYNTHETIC_PREFIXES = ("__panel__", "__widget__", "__tray__", "__webhook__")
|
|
155
|
+
tools = {
|
|
156
|
+
name: t for name, t in _all_tools.items()
|
|
157
|
+
if not any(name.startswith(p) for p in _SYNTHETIC_PREFIXES)
|
|
158
|
+
}
|
|
150
159
|
report.tool_count = len(tools)
|
|
151
160
|
|
|
152
161
|
# Collect all ChatExtension instances registered on this extension
|
|
@@ -34,9 +34,12 @@ class TestPanelDecorator:
|
|
|
34
34
|
async def left(ctx): pass
|
|
35
35
|
@ext.panel("stats", slot="right", title="Right")
|
|
36
36
|
async def right(ctx): pass
|
|
37
|
-
|
|
37
|
+
# +1 for the synthetic 'secrets' panel auto-injected by Extension.__init__
|
|
38
|
+
# (EXT-SECRETS-V1 v4.2.4) — see Extension._auto_register_secrets_panel.
|
|
39
|
+
assert len(ext.panels) == 3
|
|
38
40
|
assert "sidebar" in ext.panels
|
|
39
41
|
assert "stats" in ext.panels
|
|
42
|
+
assert "secrets" in ext.panels
|
|
40
43
|
|
|
41
44
|
def test_default_slot(self):
|
|
42
45
|
ext = Extension("test-app")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.3 → imperal_sdk-4.2.5}/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.3 → imperal_sdk-4.2.5}/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
|