imperal-sdk 4.2.7__tar.gz → 4.2.9__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.7 → imperal_sdk-4.2.9}/CHANGELOG.md +49 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/PKG-INFO +1 -1
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/__init__.py +1 -1
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/manifest_schema.py +28 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/imperal.schema.json +73 -1
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/.github/workflows/identity-contract.yml +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/.github/workflows/publish.yml +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/.github/workflows/test.yml +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/.gitignore +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/LICENSE +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/README.md +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/api_surface.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/pyproject.toml +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/.codebase-index-cache.pkl +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ai/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ai/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/auth/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/auth/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/auth/middleware.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/billing/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/billing/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/cache/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/cache/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/cache/protocol.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/action_result.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/error_codes.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/extension.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/filters.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/guards.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/handler.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/narration.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/narration_guard.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/prompt.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/refusal.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/chat/retry.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/cli/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/cli/main.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/config/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/config/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/context.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/db/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/db/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/errors.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/extension.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/extensions/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/extensions/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/http/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/http/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/manifest.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/notify/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/notify/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/prompts/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/protocols.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/rpc/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/rpc/codec.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/rpc/contract.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/runtime/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/runtime/executor.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/runtime/llm_provider.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/runtime/message_adapter.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/document.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/event.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/secrets/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/secrets/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/secrets/exceptions.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/secrets/panel_handler.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/secrets/spec.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/security/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/security/call_token.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/skeleton/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/skeleton/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/storage/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/storage/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/store/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/store/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/store/exceptions.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/testing/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/testing/mock_context.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/testing/mock_secrets.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/tools/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/tools/client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/tools/generate_api_surface.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/tools/validate_identity_contract.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/action_result.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/chat_result.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/client_contracts.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/contracts.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/contributions.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/events.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/health.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/identity.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/models.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/pagination.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/types/store_contracts.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/actions.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/base.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/data.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/display.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/feedback.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/graph.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/input_components.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/interactive.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/layout.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/ui/theme.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/validator.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/src/imperal_sdk/validator_v1_6_0.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/conftest.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/contracts/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/contracts/test_store_contracts.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/fixtures/openapi/auth-gateway.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/fixtures/openapi/registry.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/fixtures/openapi/sharelock-cases.json +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/rpc/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/rpc/test_codec.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/rpc/test_contract.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/runtime/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/runtime/test_llm_provider_config_store.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/store/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/store/test_list_users_client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/store/test_query_all_client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_action_result_typed.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_as_user.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_auth.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_billing.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_cache_client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_cache_model.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_call_token.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_extension_deprecation.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_filters.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_guards.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_guards_bleed.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_prompt.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_pydantic_retry.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_chat_result.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_cli.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_client_contracts.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_config_client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_context.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_context_guards.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_contracts.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_contracts_live.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_contributions.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_document_contract.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_emits_decorator.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_error_codes.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_errors.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_event_schema_v2.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_events_health.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_extension.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_extension_v2.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_extensions_emit.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_handler_p2.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_id_shape_guard.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_identity_contract.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_imperal_schema_v2.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_kernel_primitives.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest_roundtrip_gate.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest_schema.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest_v2_events.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest_v2_other_sections.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest_v2_webhooks.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_manifest_validator_v2.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_mock_context.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_models.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_narration_emission.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_narration_guard.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_openai_max_completion_tokens.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_pagination.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_panel_rendering_contract.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_panels.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_skeleton_decorator.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_spec_validation.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_tools_client.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_ui.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_ui_fileupload_enhanced.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_ui_html.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_ui_image_enhanced.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_ui_open.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_ui_theme.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_user.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_v7_emit_refusal.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_validator.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_validator_drift.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_validator_pep563.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_validator_v1_6_0_rules.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/test_write_arg_bleed.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/tools/__init__.py +0 -0
- {imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/tests/tools/test_generate_api_surface.py +0 -0
|
@@ -2,6 +2,55 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `imperal-sdk` are documented here.
|
|
4
4
|
|
|
5
|
+
## 4.2.9 — 2026-05-13
|
|
6
|
+
|
|
7
|
+
**Fix: regenerate `src/imperal_sdk/schemas/imperal.schema.json` after SecretDecl addition**
|
|
8
|
+
|
|
9
|
+
v4.2.8 added the `SecretDecl` Pydantic model + `Manifest.secrets` field but
|
|
10
|
+
forgot to regenerate the committed static JSON Schema mirror. CI gate
|
|
11
|
+
`test_spec_validation.py::test_static_schema_matches_runtime_export[imperal]`
|
|
12
|
+
caught the drift — runtime Pydantic schema (with `SecretDecl` + `secrets[]`)
|
|
13
|
+
no longer matched the committed file.
|
|
14
|
+
|
|
15
|
+
This release ships the regenerated `imperal.schema.json` so the static
|
|
16
|
+
artifact equals the runtime model again. No public API change.
|
|
17
|
+
|
|
18
|
+
## 4.2.8 — 2026-05-13
|
|
19
|
+
|
|
20
|
+
**Fix: `secrets[]` finally in `Manifest` Pydantic schema**
|
|
21
|
+
|
|
22
|
+
EXT-SECRETS-V1 manifest emitter has been writing `manifest["secrets"] = [...]`
|
|
23
|
+
since v4.2.2, but the `Manifest` Pydantic model in `manifest_schema.py` had
|
|
24
|
+
no matching field. With `model_config = ConfigDict(extra="forbid")`, this
|
|
25
|
+
should have caused `validate_manifest_dict()` to reject every manifest that
|
|
26
|
+
declared secrets — but publish-time validators didn't gate through this
|
|
27
|
+
schema, so the drift lived silently for six PATCH releases.
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **`SecretDecl` Pydantic model** in `manifest_schema.py` — mirrors
|
|
32
|
+
`imperal_sdk.secrets.spec.SecretSpec.to_manifest_dict()`. Validates
|
|
33
|
+
`name` regex (`^[a-z][a-z0-9_]{0,62}$`), `write_mode` in
|
|
34
|
+
`{user, extension, both}`, `max_bytes` in `[1, 65536]`,
|
|
35
|
+
`rotation_hint_days >= 1` when present, non-empty `description`.
|
|
36
|
+
- **`Manifest.secrets: Optional[List[SecretDecl]]`** field — additive,
|
|
37
|
+
back-compatible with manifests that don't declare any secrets.
|
|
38
|
+
|
|
39
|
+
### Federal invariants
|
|
40
|
+
|
|
41
|
+
| Invariant | What it pins |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `I-MANIFEST-EMITTER-SCHEMA-SYMMETRIC` | (already declared in v4.1.6 canary roundtrip test) Now actually holds for `secrets[]` — emitter and schema agree. |
|
|
44
|
+
|
|
45
|
+
### Migration notes
|
|
46
|
+
|
|
47
|
+
- **No code change required** in any extension. Existing manifests with
|
|
48
|
+
`secrets[]` (emitted since v4.2.2) now pass strict Pydantic validation
|
|
49
|
+
instead of relying on validators that didn't gate through the schema.
|
|
50
|
+
- Manifests with malformed secret entries (e.g. `name` with uppercase or
|
|
51
|
+
invalid `write_mode`) will now fail `validate_manifest_dict()` at
|
|
52
|
+
publish time. Previously they slipped through.
|
|
53
|
+
|
|
5
54
|
## 4.2.7 — 2026-05-13
|
|
6
55
|
|
|
7
56
|
**OAuth callback infrastructure + `ctx.webhook_url()` helper**
|
|
@@ -240,6 +240,26 @@ class TrayDecl(BaseModel):
|
|
|
240
240
|
tooltip: Optional[str] = None
|
|
241
241
|
|
|
242
242
|
|
|
243
|
+
class SecretDecl(BaseModel):
|
|
244
|
+
"""One entry in `manifest['secrets']` — EXT-SECRETS-V1 (v4.2.2+).
|
|
245
|
+
|
|
246
|
+
Mirrors :class:`imperal_sdk.secrets.spec.SecretSpec` after
|
|
247
|
+
``to_manifest_dict()``. The Pydantic model exists so
|
|
248
|
+
:func:`validate_manifest_dict` round-trips the emitted shape — closes
|
|
249
|
+
the `I-MANIFEST-EMITTER-SCHEMA-SYMMETRIC` drift gap that lived
|
|
250
|
+
silently from v4.2.2 → v4.2.7.
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
model_config = ConfigDict(extra="forbid")
|
|
254
|
+
|
|
255
|
+
name: str = Field(..., pattern=r"^[a-z][a-z0-9_]{0,62}$")
|
|
256
|
+
description: str = Field(..., min_length=1)
|
|
257
|
+
required: bool = False
|
|
258
|
+
write_mode: Literal["user", "extension", "both"] = "user"
|
|
259
|
+
max_bytes: int = Field(default=4096, ge=1, le=65536)
|
|
260
|
+
rotation_hint_days: Optional[int] = Field(default=None, ge=1)
|
|
261
|
+
|
|
262
|
+
|
|
243
263
|
# === Root model =======================================================
|
|
244
264
|
|
|
245
265
|
class Manifest(BaseModel):
|
|
@@ -290,6 +310,14 @@ class Manifest(BaseModel):
|
|
|
290
310
|
# Reserved for first-party Imperal authors (validator V31).
|
|
291
311
|
system: Optional[bool] = None
|
|
292
312
|
|
|
313
|
+
# Federal v4.2.2 — EXT-SECRETS-V1. Optional array of per-user encrypted
|
|
314
|
+
# credential declarations the extension reads via ``ctx.secrets.get()``.
|
|
315
|
+
# Closes the `I-MANIFEST-EMITTER-SCHEMA-SYMMETRIC` drift where the
|
|
316
|
+
# emitter wrote `secrets[]` from v4.2.2 onwards but this Pydantic model
|
|
317
|
+
# had no matching field (extra="forbid" would have rejected — but
|
|
318
|
+
# publish-time validators didn't gate through here).
|
|
319
|
+
secrets: Optional[List[SecretDecl]] = None
|
|
320
|
+
|
|
293
321
|
# --- Marketplace merge (docs/imperal-cloud/developer-portal.md) ---
|
|
294
322
|
name: Optional[str] = None
|
|
295
323
|
description: Optional[str] = None
|
|
@@ -224,6 +224,63 @@
|
|
|
224
224
|
"title": "Schedule",
|
|
225
225
|
"type": "object"
|
|
226
226
|
},
|
|
227
|
+
"SecretDecl": {
|
|
228
|
+
"additionalProperties": false,
|
|
229
|
+
"description": "One entry in `manifest['secrets']` — EXT-SECRETS-V1 (v4.2.2+).\n\nMirrors :class:`imperal_sdk.secrets.spec.SecretSpec` after\n``to_manifest_dict()``. The Pydantic model exists so\n:func:`validate_manifest_dict` round-trips the emitted shape — closes\nthe `I-MANIFEST-EMITTER-SCHEMA-SYMMETRIC` drift gap that lived\nsilently from v4.2.2 → v4.2.7.",
|
|
230
|
+
"properties": {
|
|
231
|
+
"name": {
|
|
232
|
+
"pattern": "^[a-z][a-z0-9_]{0,62}$",
|
|
233
|
+
"title": "Name",
|
|
234
|
+
"type": "string"
|
|
235
|
+
},
|
|
236
|
+
"description": {
|
|
237
|
+
"minLength": 1,
|
|
238
|
+
"title": "Description",
|
|
239
|
+
"type": "string"
|
|
240
|
+
},
|
|
241
|
+
"required": {
|
|
242
|
+
"default": false,
|
|
243
|
+
"title": "Required",
|
|
244
|
+
"type": "boolean"
|
|
245
|
+
},
|
|
246
|
+
"write_mode": {
|
|
247
|
+
"default": "user",
|
|
248
|
+
"enum": [
|
|
249
|
+
"user",
|
|
250
|
+
"extension",
|
|
251
|
+
"both"
|
|
252
|
+
],
|
|
253
|
+
"title": "Write Mode",
|
|
254
|
+
"type": "string"
|
|
255
|
+
},
|
|
256
|
+
"max_bytes": {
|
|
257
|
+
"default": 4096,
|
|
258
|
+
"maximum": 65536,
|
|
259
|
+
"minimum": 1,
|
|
260
|
+
"title": "Max Bytes",
|
|
261
|
+
"type": "integer"
|
|
262
|
+
},
|
|
263
|
+
"rotation_hint_days": {
|
|
264
|
+
"anyOf": [
|
|
265
|
+
{
|
|
266
|
+
"minimum": 1,
|
|
267
|
+
"type": "integer"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"type": "null"
|
|
271
|
+
}
|
|
272
|
+
],
|
|
273
|
+
"default": null,
|
|
274
|
+
"title": "Rotation Hint Days"
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"required": [
|
|
278
|
+
"name",
|
|
279
|
+
"description"
|
|
280
|
+
],
|
|
281
|
+
"title": "SecretDecl",
|
|
282
|
+
"type": "object"
|
|
283
|
+
},
|
|
227
284
|
"Signal": {
|
|
228
285
|
"additionalProperties": false,
|
|
229
286
|
"description": "One entry in `manifest['signals']`.",
|
|
@@ -254,7 +311,7 @@
|
|
|
254
311
|
},
|
|
255
312
|
"Tool": {
|
|
256
313
|
"additionalProperties": false,
|
|
257
|
-
"description": "One entry in `manifest['tools']`.\n\nFederal v4.0.0
|
|
314
|
+
"description": "One entry in `manifest['tools']`.\n\nFederal v4.0.0 — typed dispatch fields (action_type, chain_callable,\neffects, params_schema, return_schema, event) declared at top level so\nthe kernel chain planner can route deterministically without\nre-deriving from extension code.",
|
|
258
315
|
"properties": {
|
|
259
316
|
"name": {
|
|
260
317
|
"minLength": 1,
|
|
@@ -704,6 +761,21 @@
|
|
|
704
761
|
"default": null,
|
|
705
762
|
"title": "System"
|
|
706
763
|
},
|
|
764
|
+
"secrets": {
|
|
765
|
+
"anyOf": [
|
|
766
|
+
{
|
|
767
|
+
"items": {
|
|
768
|
+
"$ref": "#/$defs/SecretDecl"
|
|
769
|
+
},
|
|
770
|
+
"type": "array"
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
"type": "null"
|
|
774
|
+
}
|
|
775
|
+
],
|
|
776
|
+
"default": null,
|
|
777
|
+
"title": "Secrets"
|
|
778
|
+
},
|
|
707
779
|
"name": {
|
|
708
780
|
"anyOf": [
|
|
709
781
|
{
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.7 → imperal_sdk-4.2.9}/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
|
{imperal_sdk-4.2.7 → imperal_sdk-4.2.9}/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
|