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.
Files changed (206) hide show
  1. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/CHANGELOG.md +50 -0
  2. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/PKG-INFO +1 -1
  3. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/__init__.py +1 -1
  4. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/extension.py +34 -26
  5. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/validator.py +11 -2
  6. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_panels.py +4 -1
  7. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.github/workflows/identity-contract.yml +0 -0
  8. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.github/workflows/publish.yml +0 -0
  9. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.github/workflows/test.yml +0 -0
  10. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/.gitignore +0 -0
  11. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/LICENSE +0 -0
  12. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/README.md +0 -0
  13. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/api_surface.json +0 -0
  14. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/pyproject.toml +0 -0
  15. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/.codebase-index-cache.pkl +0 -0
  16. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ai/__init__.py +0 -0
  17. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ai/client.py +0 -0
  18. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/auth/__init__.py +0 -0
  19. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/auth/client.py +0 -0
  20. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/auth/middleware.py +0 -0
  21. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/billing/__init__.py +0 -0
  22. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/billing/client.py +0 -0
  23. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cache/__init__.py +0 -0
  24. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cache/client.py +0 -0
  25. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cache/protocol.py +0 -0
  26. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/__init__.py +0 -0
  27. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/action_result.py +0 -0
  28. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/error_codes.py +0 -0
  29. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/extension.py +0 -0
  30. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/filters.py +0 -0
  31. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/guards.py +0 -0
  32. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/handler.py +0 -0
  33. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
  34. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/narration.py +0 -0
  35. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/narration_guard.py +0 -0
  36. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/prompt.py +0 -0
  37. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/refusal.py +0 -0
  38. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/chat/retry.py +0 -0
  39. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cli/__init__.py +0 -0
  40. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/cli/main.py +0 -0
  41. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/config/__init__.py +0 -0
  42. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/config/client.py +0 -0
  43. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/context.py +0 -0
  44. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/db/__init__.py +0 -0
  45. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/db/client.py +0 -0
  46. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/errors.py +0 -0
  47. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/extensions/__init__.py +0 -0
  48. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/extensions/client.py +0 -0
  49. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/http/__init__.py +0 -0
  50. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/http/client.py +0 -0
  51. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/manifest.py +0 -0
  52. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/manifest_schema.py +0 -0
  53. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/notify/__init__.py +0 -0
  54. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/notify/client.py +0 -0
  55. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/__init__.py +0 -0
  56. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
  57. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
  58. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
  59. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/protocols.py +0 -0
  60. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/rpc/__init__.py +0 -0
  61. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/rpc/codec.py +0 -0
  62. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/rpc/contract.py +0 -0
  63. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/__init__.py +0 -0
  64. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/executor.py +0 -0
  65. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/llm_provider.py +0 -0
  66. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/runtime/message_adapter.py +0 -0
  67. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
  68. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
  69. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
  70. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
  71. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/document.schema.json +0 -0
  72. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/event.schema.json +0 -0
  73. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
  74. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
  75. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
  76. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
  77. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
  78. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
  79. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/__init__.py +0 -0
  80. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/client.py +0 -0
  81. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/exceptions.py +0 -0
  82. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/panel_handler.py +0 -0
  83. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/secrets/spec.py +0 -0
  84. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/security/__init__.py +0 -0
  85. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/security/call_token.py +0 -0
  86. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/skeleton/__init__.py +0 -0
  87. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/skeleton/client.py +0 -0
  88. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/storage/__init__.py +0 -0
  89. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/storage/client.py +0 -0
  90. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/store/__init__.py +0 -0
  91. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/store/client.py +0 -0
  92. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/store/exceptions.py +0 -0
  93. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/testing/__init__.py +0 -0
  94. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/testing/mock_context.py +0 -0
  95. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/testing/mock_secrets.py +0 -0
  96. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/__init__.py +0 -0
  97. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/client.py +0 -0
  98. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/generate_api_surface.py +0 -0
  99. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/tools/validate_identity_contract.py +0 -0
  100. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/__init__.py +0 -0
  101. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/action_result.py +0 -0
  102. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/chat_result.py +0 -0
  103. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/client_contracts.py +0 -0
  104. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/contracts.py +0 -0
  105. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/contributions.py +0 -0
  106. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/events.py +0 -0
  107. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/health.py +0 -0
  108. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/identity.py +0 -0
  109. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/models.py +0 -0
  110. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/pagination.py +0 -0
  111. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/types/store_contracts.py +0 -0
  112. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/__init__.py +0 -0
  113. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/actions.py +0 -0
  114. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/base.py +0 -0
  115. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/data.py +0 -0
  116. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/display.py +0 -0
  117. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/feedback.py +0 -0
  118. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/graph.py +0 -0
  119. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/input_components.py +0 -0
  120. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/interactive.py +0 -0
  121. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/layout.py +0 -0
  122. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/ui/theme.py +0 -0
  123. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/src/imperal_sdk/validator_v1_6_0.py +0 -0
  124. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/conftest.py +0 -0
  125. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/contracts/__init__.py +0 -0
  126. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/contracts/test_store_contracts.py +0 -0
  127. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/fixtures/openapi/auth-gateway.json +0 -0
  128. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/fixtures/openapi/registry.json +0 -0
  129. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/fixtures/openapi/sharelock-cases.json +0 -0
  130. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/rpc/__init__.py +0 -0
  131. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/rpc/test_codec.py +0 -0
  132. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/rpc/test_contract.py +0 -0
  133. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/runtime/__init__.py +0 -0
  134. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/runtime/test_llm_provider_config_store.py +0 -0
  135. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
  136. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/store/__init__.py +0 -0
  137. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/store/test_list_users_client.py +0 -0
  138. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/store/test_query_all_client.py +0 -0
  139. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_action_result_typed.py +0 -0
  140. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_as_user.py +0 -0
  141. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_auth.py +0 -0
  142. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_billing.py +0 -0
  143. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_cache_client.py +0 -0
  144. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_cache_model.py +0 -0
  145. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_call_token.py +0 -0
  146. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_extension_deprecation.py +0 -0
  147. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_filters.py +0 -0
  148. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_guards.py +0 -0
  149. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_guards_bleed.py +0 -0
  150. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_prompt.py +0 -0
  151. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_pydantic_retry.py +0 -0
  152. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_chat_result.py +0 -0
  153. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_cli.py +0 -0
  154. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_client_contracts.py +0 -0
  155. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_config_client.py +0 -0
  156. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_context.py +0 -0
  157. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_context_guards.py +0 -0
  158. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_contracts.py +0 -0
  159. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_contracts_live.py +0 -0
  160. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_contributions.py +0 -0
  161. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_document_contract.py +0 -0
  162. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_emits_decorator.py +0 -0
  163. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_error_codes.py +0 -0
  164. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_errors.py +0 -0
  165. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_event_schema_v2.py +0 -0
  166. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_events_health.py +0 -0
  167. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_extension.py +0 -0
  168. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_extension_v2.py +0 -0
  169. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_extensions_emit.py +0 -0
  170. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_handler_p2.py +0 -0
  171. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_id_shape_guard.py +0 -0
  172. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_identity_contract.py +0 -0
  173. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_imperal_schema_v2.py +0 -0
  174. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_kernel_primitives.py +0 -0
  175. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest.py +0 -0
  176. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_roundtrip_gate.py +0 -0
  177. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_schema.py +0 -0
  178. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_v2_events.py +0 -0
  179. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_v2_other_sections.py +0 -0
  180. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_v2_webhooks.py +0 -0
  181. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_manifest_validator_v2.py +0 -0
  182. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_mock_context.py +0 -0
  183. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_models.py +0 -0
  184. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_narration_emission.py +0 -0
  185. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_narration_guard.py +0 -0
  186. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_openai_max_completion_tokens.py +0 -0
  187. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_pagination.py +0 -0
  188. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_panel_rendering_contract.py +0 -0
  189. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_skeleton_decorator.py +0 -0
  190. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_spec_validation.py +0 -0
  191. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_tools_client.py +0 -0
  192. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui.py +0 -0
  193. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_fileupload_enhanced.py +0 -0
  194. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_html.py +0 -0
  195. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_image_enhanced.py +0 -0
  196. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_open.py +0 -0
  197. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_ui_theme.py +0 -0
  198. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_user.py +0 -0
  199. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_v7_emit_refusal.py +0 -0
  200. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator.py +0 -0
  201. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator_drift.py +0 -0
  202. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator_pep563.py +0 -0
  203. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_validator_v1_6_0_rules.py +0 -0
  204. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/test_write_arg_bleed.py +0 -0
  205. {imperal_sdk-4.2.3 → imperal_sdk-4.2.5}/tests/tools/__init__.py +0 -0
  206. {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**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: imperal-sdk
3
- Version: 4.2.3
3
+ Version: 4.2.5
4
4
  Summary: SDK for building Imperal Cloud extensions
5
5
  Author: Valentin Scerbacov, Imperal, Inc.
6
6
  License-Expression: AGPL-3.0-or-later
@@ -39,7 +39,7 @@ from imperal_sdk.secrets import (
39
39
  SecretValueTooLarge, SecretDeclarationConflict,
40
40
  )
41
41
 
42
- __version__ = "4.2.3"
42
+ __version__ = "4.2.5"
43
43
 
44
44
  __all__ = [
45
45
  # Core
@@ -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.3): auto-register synthetic 'secrets' panel
199
- # on first @ext.secret call so the Secrets tab appears alongside
200
- # the extension's own tabs without the author writing panel code.
201
- # The handler is shipped in imperal_sdk.secrets.panel_handler.
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
- tools = getattr(ext, "_tools", {})
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
- assert len(ext.panels) == 2
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