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