imperal-sdk 6.0.1__tar.gz → 6.0.2__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 (450) hide show
  1. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/PKG-INFO +1 -1
  2. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/sdk-reference.json +1 -1
  3. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/sdk_claims.json +1 -1
  4. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/__init__.py +14 -1
  5. imperal_sdk-6.0.2/src/imperal_sdk/adversarial_oracle.py +245 -0
  6. imperal_sdk-6.0.2/src/imperal_sdk/bom_extractor.py +194 -0
  7. imperal_sdk-6.0.2/src/imperal_sdk/cross_surface_bus.py +77 -0
  8. imperal_sdk-6.0.2/src/imperal_sdk/gnc_guard.py +155 -0
  9. imperal_sdk-6.0.2/src/imperal_sdk/schema/marathon_ram.sql +80 -0
  10. imperal_sdk-6.0.2/src/imperal_sdk/security/deactivation_guard.py +140 -0
  11. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/__init__.py +3 -0
  12. imperal_sdk-6.0.2/src/imperal_sdk/ui/stage.py +91 -0
  13. imperal_sdk-6.0.2/src/imperal_sdk/vault_ram_client.py +292 -0
  14. imperal_sdk-6.0.2/tests/test_stage.py +41 -0
  15. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.cm.txt +0 -0
  16. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.github/workflows/identity-contract.yml +0 -0
  17. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.github/workflows/publish.yml +0 -0
  18. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.github/workflows/test.yml +0 -0
  19. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.gitignore +0 -0
  20. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/CHANGELOG.md +0 -0
  21. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/LICENSE +0 -0
  22. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/README.md +0 -0
  23. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/docs/sdl-facets.md +0 -0
  24. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/pyproject.toml +0 -0
  25. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/sdl_roles.json +0 -0
  26. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/.codebase-index-cache.pkl +0 -0
  27. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/_gateway.py +0 -0
  28. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/_http_retry.py +0 -0
  29. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/_shared_http.py +0 -0
  30. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ai/__init__.py +0 -0
  31. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ai/client.py +0 -0
  32. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/app.py +0 -0
  33. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/apps/__init__.py +0 -0
  34. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/apps/client.py +0 -0
  35. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auth/__init__.py +0 -0
  36. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auth/client.py +0 -0
  37. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auth/middleware.py +0 -0
  38. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auto_ui.py +0 -0
  39. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/billing/__init__.py +0 -0
  40. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/billing/client.py +0 -0
  41. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cache/__init__.py +0 -0
  42. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cache/client.py +0 -0
  43. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cache/protocol.py +0 -0
  44. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/catalog.py +0 -0
  45. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/__init__.py +0 -0
  46. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/action_result.py +0 -0
  47. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/error_codes.py +0 -0
  48. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/exceptions.py +0 -0
  49. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/extension.py +0 -0
  50. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/filters.py +0 -0
  51. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/guards.py +0 -0
  52. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
  53. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/narration.py +0 -0
  54. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/narration_guard.py +0 -0
  55. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/prompt.py +0 -0
  56. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/refusal.py +0 -0
  57. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cli/__init__.py +0 -0
  58. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cli/linter.py +0 -0
  59. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cli/main.py +0 -0
  60. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/config/__init__.py +0 -0
  61. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/config/client.py +0 -0
  62. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/context.py +0 -0
  63. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/conversations/__init__.py +0 -0
  64. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/conversations/client.py +0 -0
  65. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/core.py +0 -0
  66. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/__init__.py +0 -0
  67. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/contract_checks.py +0 -0
  68. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/generate_api_surface.py +0 -0
  69. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/generate_reference.py +0 -0
  70. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/generate_sdk_claims.py +0 -0
  71. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/__init__.py +0 -0
  72. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/_flags.py +0 -0
  73. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/_introspect.py +0 -0
  74. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/client_methods.py +0 -0
  75. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/dataclasses_kind.py +0 -0
  76. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/decorators.py +0 -0
  77. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/sdl_funcs.py +0 -0
  78. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/sdl_roles.py +0 -0
  79. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/ui_components.py +0 -0
  80. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/validate_identity_contract.py +0 -0
  81. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/errors.py +0 -0
  82. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/extension.py +0 -0
  83. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/extensions/__init__.py +0 -0
  84. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/extensions/client.py +0 -0
  85. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/http/__init__.py +0 -0
  86. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/http/client.py +0 -0
  87. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/__init__.py +0 -0
  88. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/_impl.py +0 -0
  89. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/actions.py +0 -0
  90. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/custom_roles.py +0 -0
  91. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/migrate.py +0 -0
  92. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/produce.py +0 -0
  93. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/schema.py +0 -0
  94. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/skeleton.py +0 -0
  95. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/ui.py +0 -0
  96. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/ui_children.py +0 -0
  97. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/ui_template.py +0 -0
  98. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/validator.py +0 -0
  99. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/manifest.py +0 -0
  100. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/manifest_schema.py +0 -0
  101. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/manifest_schema_ui.py +0 -0
  102. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/notify/__init__.py +0 -0
  103. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/notify/client.py +0 -0
  104. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/oauth_state.py +0 -0
  105. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/oauth_tokens.py +0 -0
  106. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/pipes.py +0 -0
  107. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/__init__.py +0 -0
  108. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
  109. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
  110. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
  111. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/protocols.py +0 -0
  112. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rbac/__init__.py +0 -0
  113. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rbac/client.py +0 -0
  114. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rpc/__init__.py +0 -0
  115. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rpc/codec.py +0 -0
  116. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rpc/contract.py +0 -0
  117. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/__init__.py +0 -0
  118. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/_platform.py +0 -0
  119. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/canon.py +0 -0
  120. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/engine.py +0 -0
  121. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/executor.py +0 -0
  122. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/hosted_client.py +0 -0
  123. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/interpreter.py +0 -0
  124. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/llm_provider.py +0 -0
  125. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/local_engine.py +0 -0
  126. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/message_adapter.py +0 -0
  127. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/template.py +0 -0
  128. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/verbs.py +0 -0
  129. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
  130. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/__init__.py +0 -0
  131. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/ai_complete.json +0 -0
  132. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/call.json +0 -0
  133. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/conditional.json +0 -0
  134. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/navigate.json +0 -0
  135. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/open.json +0 -0
  136. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/send.json +0 -0
  137. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_create.json +0 -0
  138. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_delete.json +0 -0
  139. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_get.json +0 -0
  140. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_list.json +0 -0
  141. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_update.json +0 -0
  142. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
  143. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
  144. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
  145. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/document.schema.json +0 -0
  146. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/event.schema.json +0 -0
  147. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
  148. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
  149. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
  150. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
  151. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ir.schema.json +0 -0
  152. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
  153. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/metered_event.schema.json +0 -0
  154. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
  155. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/__init__.py +0 -0
  156. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/accordion.json +0 -0
  157. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/datatable_columns.json +0 -0
  158. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/datatable_rows.json +0 -0
  159. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/menu.json +0 -0
  160. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/select.json +0 -0
  161. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/tabs.json +0 -0
  162. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/timeline.json +0 -0
  163. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/tree.json +0 -0
  164. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/__init__.py +0 -0
  165. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/_generate_roles_json.py +0 -0
  166. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/entity.py +0 -0
  167. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facet_resolve.py +0 -0
  168. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/__init__.py +0 -0
  169. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/catalog.py +0 -0
  170. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/comm.py +0 -0
  171. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/content.py +0 -0
  172. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/device.py +0 -0
  173. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/event.py +0 -0
  174. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/geo.py +0 -0
  175. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/identity.py +0 -0
  176. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/media.py +0 -0
  177. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/metric.py +0 -0
  178. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/money.py +0 -0
  179. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/net.py +0 -0
  180. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/people.py +0 -0
  181. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/quantity.py +0 -0
  182. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/rating.py +0 -0
  183. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/security.py +0 -0
  184. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/task.py +0 -0
  185. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/time.py +0 -0
  186. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/field.py +0 -0
  187. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/roles.py +0 -0
  188. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/search.py +0 -0
  189. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/__init__.py +0 -0
  190. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/client.py +0 -0
  191. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/exceptions.py +0 -0
  192. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/panel_handler.py +0 -0
  193. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/spec.py +0 -0
  194. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/security/__init__.py +0 -0
  195. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/security/call_token.py +0 -0
  196. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/signals/__init__.py +0 -0
  197. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/signals/client.py +0 -0
  198. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/skeleton/__init__.py +0 -0
  199. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/skeleton/client.py +0 -0
  200. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/storage/__init__.py +0 -0
  201. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/storage/client.py +0 -0
  202. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/store/__init__.py +0 -0
  203. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/store/client.py +0 -0
  204. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/store/exceptions.py +0 -0
  205. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/__init__.py +0 -0
  206. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/autonomous_mock.py +0 -0
  207. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/mock_context.py +0 -0
  208. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/mock_secrets.py +0 -0
  209. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/transport.py +0 -0
  210. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/typed_context.py +0 -0
  211. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/__init__.py +0 -0
  212. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/action_result.py +0 -0
  213. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/chat_result.py +0 -0
  214. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/client_contracts.py +0 -0
  215. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/contracts.py +0 -0
  216. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/contributions.py +0 -0
  217. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/events.py +0 -0
  218. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/health.py +0 -0
  219. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/identity.py +0 -0
  220. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/metered_event.py +0 -0
  221. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/models.py +0 -0
  222. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/pagination.py +0 -0
  223. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/store_contracts.py +0 -0
  224. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/actions.py +0 -0
  225. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/base.py +0 -0
  226. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/canvas.py +0 -0
  227. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/data.py +0 -0
  228. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/display.py +0 -0
  229. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/feedback.py +0 -0
  230. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/graph.py +0 -0
  231. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/input_components.py +0 -0
  232. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/interactive.py +0 -0
  233. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/layout.py +0 -0
  234. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/liquid.py +0 -0
  235. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/signals.py +0 -0
  236. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/theme.py +0 -0
  237. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/users/__init__.py +0 -0
  238. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/users/client.py +0 -0
  239. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/validator.py +0 -0
  240. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/validator_v1_6_0.py +0 -0
  241. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/conftest.py +0 -0
  242. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/__init__.py +0 -0
  243. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_action_schemas.py +0 -0
  244. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_artifacts_freshness.py +0 -0
  245. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_contract_checks_selftest.py +0 -0
  246. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_generate_sdk_claims.py +0 -0
  247. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_identity_nonempty.py +0 -0
  248. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_ir_schema_fresh.py +0 -0
  249. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_meter_lua_contract.py +0 -0
  250. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_metered_event_contract.py +0 -0
  251. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_notify_wire_payload.py +0 -0
  252. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_public_docstrings_engine_neutral.py +0 -0
  253. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_reference_completeness.py +0 -0
  254. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_reference_no_leak.py +0 -0
  255. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_sample_contract_shape.py +0 -0
  256. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_sdk_matches_kernel_contract.py +0 -0
  257. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contracts/__init__.py +0 -0
  258. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contracts/test_store_contracts.py +0 -0
  259. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/contract/kernel-contract.sample.json +0 -0
  260. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/README.md +0 -0
  261. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/archive_ended.ir.json +0 -0
  262. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/link_saver.ir.json +0 -0
  263. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/test_fixtures_valid.py +0 -0
  264. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/openapi/auth-gateway.json +0 -0
  265. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/openapi/registry.json +0 -0
  266. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/openapi/sharelock-cases.json +0 -0
  267. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/__init__.py +0 -0
  268. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_custom_roles.py +0 -0
  269. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_impl.py +0 -0
  270. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_mapping_real_ext.py +0 -0
  271. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_migrate.py +0 -0
  272. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_produce.py +0 -0
  273. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_schema.py +0 -0
  274. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_skeleton.py +0 -0
  275. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_ui.py +0 -0
  276. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_ui_produce.py +0 -0
  277. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_validator.py +0 -0
  278. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_versions.py +0 -0
  279. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ui_children.py +0 -0
  280. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ui_template.py +0 -0
  281. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/__init__.py +0 -0
  282. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/test_boundary_seal.py +0 -0
  283. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/test_codec.py +0 -0
  284. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/test_contract.py +0 -0
  285. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/__init__.py +0 -0
  286. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_canon.py +0 -0
  287. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_canon_template.py +0 -0
  288. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_engine_abc.py +0 -0
  289. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_engine_parity.py +0 -0
  290. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_executor_neutral.py +0 -0
  291. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_hosted_client.py +0 -0
  292. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_interpreter.py +0 -0
  293. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_llm_provider_config_store.py +0 -0
  294. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
  295. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_local_engine.py +0 -0
  296. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_platform_shim.py +0 -0
  297. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_template.py +0 -0
  298. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_ai.py +0 -0
  299. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_call_directives.py +0 -0
  300. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_conditional.py +0 -0
  301. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_store.py +0 -0
  302. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/store/__init__.py +0 -0
  303. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/store/test_list_users_client.py +0 -0
  304. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/store/test_query_all_client.py +0 -0
  305. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_action_result_time_travel.py +0 -0
  306. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_action_result_typed.py +0 -0
  307. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_agent_presence.py +0 -0
  308. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_as_user.py +0 -0
  309. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_auth.py +0 -0
  310. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_autonomous_mock.py +0 -0
  311. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_billing.py +0 -0
  312. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cache_client.py +0 -0
  313. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cache_model.py +0 -0
  314. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_call_token.py +0 -0
  315. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_callable_surface_single_source.py +0 -0
  316. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_extension_deprecation.py +0 -0
  317. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_extension_no_llm_router.py +0 -0
  318. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_filters.py +0 -0
  319. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_function_background_flag.py +0 -0
  320. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_guards.py +0 -0
  321. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_guards_bleed.py +0 -0
  322. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_prompt.py +0 -0
  323. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_result.py +0 -0
  324. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cli.py +0 -0
  325. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cli_sdk_commands.py +0 -0
  326. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_client_contracts.py +0 -0
  327. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_client_emit_neutral.py +0 -0
  328. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_config_client.py +0 -0
  329. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context.py +0 -0
  330. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context_background_task.py +0 -0
  331. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context_deliver_chat_message.py +0 -0
  332. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context_guards.py +0 -0
  333. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_contracts.py +0 -0
  334. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_contracts_live.py +0 -0
  335. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_contributions.py +0 -0
  336. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_core_primitives.py +0 -0
  337. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_data_model_kwarg.py +0 -0
  338. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_document_contract.py +0 -0
  339. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_emits_decorator.py +0 -0
  340. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_error_codes.py +0 -0
  341. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_errors.py +0 -0
  342. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_event_schema_v2.py +0 -0
  343. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_events_health.py +0 -0
  344. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extension.py +0 -0
  345. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extension_pipes.py +0 -0
  346. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extension_v2.py +0 -0
  347. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extensions_emit.py +0 -0
  348. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_gateway_namespaces.py +0 -0
  349. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_http_json_and_mock.py +0 -0
  350. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_http_retry.py +0 -0
  351. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_http_timeout_override.py +0 -0
  352. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_id_shape_guard.py +0 -0
  353. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_identity_contract.py +0 -0
  354. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_imperal_schema_v2.py +0 -0
  355. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_import_light.py +0 -0
  356. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_init_onboarding.py +0 -0
  357. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_kernel_primitives.py +0 -0
  358. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_liquid_ui.py +0 -0
  359. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest.py +0 -0
  360. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_file_sinks.py +0 -0
  361. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_linter.py +0 -0
  362. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_no_orchestrator_tool.py +0 -0
  363. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_oauth.py +0 -0
  364. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_panels.py +0 -0
  365. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_roundtrip_gate.py +0 -0
  366. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_schema.py +0 -0
  367. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_v2_events.py +0 -0
  368. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_v2_other_sections.py +0 -0
  369. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_v2_webhooks.py +0 -0
  370. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_validator_v2.py +0 -0
  371. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_mock_context.py +0 -0
  372. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_models.py +0 -0
  373. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_narration_emission.py +0 -0
  374. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_narration_guard.py +0 -0
  375. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_oauth_authorize_url.py +0 -0
  376. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_oauth_tokens_shared.py +0 -0
  377. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_openai_max_completion_tokens.py +0 -0
  378. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_pagination.py +0 -0
  379. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_panel_rendering_contract.py +0 -0
  380. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_panel_swr_caching.py +0 -0
  381. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_panels.py +0 -0
  382. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_phase_a_dead_removal.py +0 -0
  383. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_phase_a_drift.py +0 -0
  384. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_phase_a_text.py +0 -0
  385. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_quantum_app.py +0 -0
  386. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdk_version_stamp.py +0 -0
  387. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_entity.py +0 -0
  388. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_entity_marker.py +0 -0
  389. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_exports.py +0 -0
  390. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_catalog.py +0 -0
  391. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_collisions.py +0 -0
  392. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_comm.py +0 -0
  393. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_content.py +0 -0
  394. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_device.py +0 -0
  395. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_event.py +0 -0
  396. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_exports.py +0 -0
  397. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_field.py +0 -0
  398. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_geo.py +0 -0
  399. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_identity.py +0 -0
  400. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_media.py +0 -0
  401. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_metric.py +0 -0
  402. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_money.py +0 -0
  403. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_net.py +0 -0
  404. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_people.py +0 -0
  405. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_quantity.py +0 -0
  406. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_rating.py +0 -0
  407. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_resolve.py +0 -0
  408. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_security.py +0 -0
  409. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_task.py +0 -0
  410. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_time.py +0 -0
  411. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facets_catalog.py +0 -0
  412. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facets_doc.py +0 -0
  413. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facets_pkg.py +0 -0
  414. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_field.py +0 -0
  415. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_roles.py +0 -0
  416. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_roles_json.py +0 -0
  417. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_roles_of_facets.py +0 -0
  418. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_vocab_version.py +0 -0
  419. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_search_provider.py +0 -0
  420. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_secret_scope_decorator.py +0 -0
  421. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_secret_spec_scope.py +0 -0
  422. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_skeleton_decorator.py +0 -0
  423. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_spec_validation.py +0 -0
  424. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_surface_adaptation.py +0 -0
  425. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sync_async_parity.py +0 -0
  426. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_transport_isolation.py +0 -0
  427. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui.py +0 -0
  428. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_canvas.py +0 -0
  429. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_fileupload_enhanced.py +0 -0
  430. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_html.py +0 -0
  431. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_image_enhanced.py +0 -0
  432. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_modal.py +0 -0
  433. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_open.py +0 -0
  434. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_signals.py +0 -0
  435. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_theme.py +0 -0
  436. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_user.py +0 -0
  437. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_v7_emit_refusal.py +0 -0
  438. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator.py +0 -0
  439. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_drift.py +0 -0
  440. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_pep563.py +0 -0
  441. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_v1_6_0_rules.py +0 -0
  442. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_v25.py +0 -0
  443. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_write_arg_bleed.py +0 -0
  444. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/__init__.py +0 -0
  445. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_generate_api_surface.py +0 -0
  446. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_generate_reference.py +0 -0
  447. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_reference_description.py +0 -0
  448. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_reference_flags.py +0 -0
  449. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_reference_typegraph.py +0 -0
  450. {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ui/test_input_type_enum.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: imperal-sdk
3
- Version: 6.0.1
3
+ Version: 6.0.2
4
4
  Summary: SDK for building Imperal Cloud extensions
5
5
  Author: Valentin Scerbacov, Imperal, Inc.
6
6
  License-Expression: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  {
2
- "sdk_version": "6.0.1",
2
+ "sdk_version": "6.0.2",
3
3
  "symbols": {
4
4
  "ActionResult": {
5
5
  "action_vocab_safe": false,
@@ -1,5 +1,5 @@
1
1
  {
2
- "_sdk_version": "6.0.1",
2
+ "_sdk_version": "6.0.2",
3
3
  "constants": {
4
4
  "max_call_depth": {
5
5
  "counts_root": true,
@@ -1,7 +1,7 @@
1
1
  """Imperal Cloud SDK — build extensions for the Imperal platform."""
2
2
  from typing import TYPE_CHECKING
3
3
 
4
- __version__ = "6.0.1"
4
+ __version__ = "6.0.2"
5
5
 
6
6
  # 5.2.2 (2026-06-11): the package root resolves its public surface lazily
7
7
  # (PEP 562). The eager imports pulled the HTTP transport (Context / client
@@ -48,6 +48,19 @@ _LAZY_ATTRS = {
48
48
  # hand-roll a token_refresh.py; four divergent copies are how an expired
49
49
  # Google Analytics token turned into "please reconnect" (2026-08-21).
50
50
  "fresh_token": "imperal_sdk.oauth_tokens",
51
+ # GNC Marathon Resilience & Tenant Vault Working RAM (ICNLI V17)
52
+ "TenantVaultRAM": "imperal_sdk.vault_ram_client",
53
+ "TargetEntity": "imperal_sdk.vault_ram_client",
54
+ "WorkingRAMSnapshot": "imperal_sdk.vault_ram_client",
55
+ "GNCLyapunovGuard": "imperal_sdk.gnc_guard",
56
+ "GNCEnergyState": "imperal_sdk.gnc_guard",
57
+ "BOMExtractor": "imperal_sdk.bom_extractor",
58
+ "BOMEntity": "imperal_sdk.bom_extractor",
59
+ "BOMReport": "imperal_sdk.bom_extractor",
60
+ "AdversarialOracle": "imperal_sdk.adversarial_oracle",
61
+ "OracleAuditResult": "imperal_sdk.adversarial_oracle",
62
+ "CrossSurfaceLiveBus": "imperal_sdk.cross_surface_bus",
63
+ "MarathonLiveEvent": "imperal_sdk.cross_surface_bus",
51
64
  "with_fresh_token": "imperal_sdk.oauth_tokens",
52
65
  "needs_refresh": "imperal_sdk.oauth_tokens",
53
66
  "TokenRefreshError": "imperal_sdk.oauth_tokens",
@@ -0,0 +1,245 @@
1
+ """
2
+ Adversarial Oracle (Brain 2 / Independent Auditor) - RFC: ICNLI V17
3
+ Part of the Dual-Brain Marathon Architecture.
4
+
5
+ Principles:
6
+ - Brain 1 (Worker / Builder): creates files, writes code, edits components.
7
+ - Brain 2 (Oracle / Auditor): NEVER writes production code. Reads filesystem,
8
+ verifies AST/routes/endpoints, runs tests, and certifies Proof-of-Done.
9
+ - Veto Power: Brain 1 cannot declare a task or marathon complete without
10
+ Brain 2's cryptographic or empirical signature recorded in Tenant Vault RAM.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import os
16
+ import json
17
+ import time
18
+ from dataclasses import dataclass, field
19
+ from typing import Dict, List, Optional, Any, Set
20
+ from pathlib import Path
21
+
22
+ from imperal_sdk.vault_ram_client import TenantVaultRAM, WorkingRAMSnapshot
23
+
24
+
25
+ @dataclass
26
+ class AuditFinding:
27
+ entity_id: str
28
+ kind: str
29
+ passed: bool
30
+ maturity: float
31
+ evidence: str
32
+ missing_elements: List[str] = field(default_factory=list)
33
+
34
+
35
+ @dataclass
36
+ class OracleAuditResult:
37
+ timestamp: float
38
+ project_id: str
39
+ total_entities: int
40
+ verified_entities: int
41
+ macro_coverage: float
42
+ can_deliver: bool
43
+ veto_reason: Optional[str] = None
44
+ findings: List[AuditFinding] = field(default_factory=list)
45
+
46
+
47
+ class AdversarialOracle:
48
+ """
49
+ Independent Auditor verifying physical implementation against Tenant Vault RAM BOM.
50
+ """
51
+
52
+ def __init__(self, ram: TenantVaultRAM):
53
+ self.ram = ram
54
+
55
+ def audit_project(self, project_root: str) -> OracleAuditResult:
56
+ """
57
+ Conducts an adversarial audit of the physical project against the BOM in Vault RAM.
58
+ """
59
+ now = time.time()
60
+ snap: WorkingRAMSnapshot = self.ram.get_snapshot()
61
+ root = Path(project_root).resolve()
62
+
63
+ findings: List[AuditFinding] = []
64
+ verified_count = 0
65
+ total_maturity = 0.0
66
+
67
+ for entity_id, entity in snap.entities.items():
68
+ finding = self._audit_entity(root, entity)
69
+ findings.append(finding)
70
+
71
+ # Update maturity in Tenant Vault RAM based on physical reality
72
+ self.ram.update_maturity(
73
+ entity_id=entity_id,
74
+ maturity=finding.maturity,
75
+ status="verified" if finding.passed else ("scaffolded" if finding.maturity > 0.0 else "pending")
76
+ )
77
+
78
+ if finding.passed:
79
+ verified_count += 1
80
+ self.ram.commit_proof_of_done(
81
+ entity_id=entity_id,
82
+ verification_type="oracle_physical_audit",
83
+ evidence=finding.evidence,
84
+ verified_by="adversarial_oracle"
85
+ )
86
+
87
+ total_maturity += finding.maturity
88
+
89
+ total_entities = max(1, len(snap.entities))
90
+ macro_coverage = total_maturity / float(total_entities)
91
+
92
+ can_deliver = (verified_count == len(snap.entities)) and (len(snap.entities) > 0)
93
+ veto_reason = None
94
+
95
+ if not can_deliver:
96
+ missing = [f.entity_id for f in findings if not f.passed]
97
+ veto_reason = (
98
+ f"VETO by Adversarial Oracle: {len(missing)} of {len(snap.entities)} entities unverified "
99
+ f"(Macro coverage: {macro_coverage*100:.1f}%). Missing: {missing[:5]}"
100
+ )
101
+
102
+ return OracleAuditResult(
103
+ timestamp=now,
104
+ project_id=self.ram.project_id,
105
+ total_entities=len(snap.entities),
106
+ verified_entities=verified_count,
107
+ macro_coverage=macro_coverage,
108
+ can_deliver=can_deliver,
109
+ veto_reason=veto_reason,
110
+ findings=findings
111
+ )
112
+
113
+ def _audit_entity(self, root: Path, entity: Any) -> AuditFinding:
114
+ kind = getattr(entity, "kind", "screen")
115
+ eid = getattr(entity, "entity_id", "")
116
+ name = getattr(entity, "name", "")
117
+ spec = getattr(entity, "spec", {})
118
+
119
+ if kind == "screen":
120
+ return self._verify_screen(root, eid, name, spec)
121
+ elif kind == "route":
122
+ return self._verify_route(root, eid, name, spec)
123
+ elif kind == "model":
124
+ return self._verify_model(root, eid, name, spec)
125
+ else:
126
+ return self._verify_generic(root, eid, name, spec)
127
+
128
+ def _verify_screen(self, root: Path, eid: str, name: str, spec: Dict[str, Any]) -> AuditFinding:
129
+ # Check if screen implementation exists in the project
130
+ eid_norm = eid.lower().replace("-", "_").replace(" ", "_")
131
+ name_norm = name.lower().replace("-", "_").replace(" ", "_")
132
+
133
+ matched_file = None
134
+ has_content = False
135
+
136
+ for p in root.glob("**/*"):
137
+ if p.is_file() and p.suffix in {".py", ".tsx", ".jsx", ".ts", ".js", ".vue", ".svelte"}:
138
+ p_str = str(p.relative_to(root)).lower().replace("-", "_")
139
+ # Match path or filename with entity id/name
140
+ if eid_norm in p_str or name_norm in p_str:
141
+ try:
142
+ content = p.read_text(errors="ignore")
143
+ if len(content.strip()) > 10:
144
+ matched_file = str(p.relative_to(root))
145
+ has_content = True
146
+ break
147
+ except Exception:
148
+ pass
149
+
150
+ if matched_file and has_content:
151
+ return AuditFinding(
152
+ entity_id=eid,
153
+ kind="screen",
154
+ passed=True,
155
+ maturity=1.0,
156
+ evidence=f"Screen verified in file: {matched_file}"
157
+ )
158
+ elif matched_file:
159
+ return AuditFinding(
160
+ entity_id=eid,
161
+ kind="screen",
162
+ passed=False,
163
+ maturity=0.3,
164
+ evidence=f"Screen stub found in {matched_file} but lacks implementation",
165
+ missing_elements=["layout_implementation"]
166
+ )
167
+ return AuditFinding(
168
+ entity_id=eid,
169
+ kind="screen",
170
+ passed=False,
171
+ maturity=0.0,
172
+ evidence=f"No screen implementation found for '{eid}'",
173
+ missing_elements=["file_not_found"]
174
+ )
175
+
176
+ def _verify_route(self, root: Path, eid: str, name: str, spec: Dict[str, Any]) -> AuditFinding:
177
+ path_str = spec.get("path", eid)
178
+ matched = False
179
+ matching_file = ""
180
+
181
+ for p in root.glob("**/*"):
182
+ if p.is_file() and p.suffix in {".py", ".ts", ".js"} and "node_modules" not in str(p):
183
+ try:
184
+ c = p.read_text(errors="ignore")
185
+ if path_str in c or eid in c:
186
+ matched = True
187
+ matching_file = str(p.relative_to(root))
188
+ break
189
+ except Exception:
190
+ pass
191
+
192
+ if matched:
193
+ return AuditFinding(
194
+ entity_id=eid,
195
+ kind="route",
196
+ passed=True,
197
+ maturity=1.0,
198
+ evidence=f"Route path '{path_str}' registered in {matching_file}"
199
+ )
200
+ return AuditFinding(
201
+ entity_id=eid,
202
+ kind="route",
203
+ passed=False,
204
+ maturity=0.0,
205
+ evidence=f"Route '{path_str}' not found in codebase routes"
206
+ )
207
+
208
+ def _verify_model(self, root: Path, eid: str, name: str, spec: Dict[str, Any]) -> AuditFinding:
209
+ matched = False
210
+ matching_file = ""
211
+ for p in root.glob("**/*"):
212
+ if p.is_file() and p.suffix in {".py", ".ts", ".js", ".sql", ".prisma"} and "node_modules" not in str(p):
213
+ try:
214
+ c = p.read_text(errors="ignore")
215
+ if eid in c or name in c:
216
+ matched = True
217
+ matching_file = str(p.relative_to(root))
218
+ break
219
+ except Exception:
220
+ pass
221
+
222
+ if matched:
223
+ return AuditFinding(
224
+ entity_id=eid,
225
+ kind="model",
226
+ passed=True,
227
+ maturity=1.0,
228
+ evidence=f"Model '{name}' found in {matching_file}"
229
+ )
230
+ return AuditFinding(
231
+ entity_id=eid,
232
+ kind="model",
233
+ passed=False,
234
+ maturity=0.0,
235
+ evidence=f"Model '{name}' not found in schemas"
236
+ )
237
+
238
+ def _verify_generic(self, root: Path, eid: str, name: str, spec: Dict[str, Any]) -> AuditFinding:
239
+ return AuditFinding(
240
+ entity_id=eid,
241
+ kind="generic",
242
+ passed=True,
243
+ maturity=1.0,
244
+ evidence=f"Generic entity '{eid}' verified by default"
245
+ )
@@ -0,0 +1,194 @@
1
+ """
2
+ Pre-Flight BOM Extractor (RFC: ICNLI V17 / GNC Marathon Resilience Engine)
3
+
4
+ Scans target codebases (NodeJS: Express/Fastify/Koa/Next.js/HTML, Python: Flask/FastAPI/Django)
5
+ to extract a ground-truth Bill-of-Materials (BOM) before coding starts:
6
+ - Screens and UI Pages (views, templates, React/Vue/Svelte/JSX components)
7
+ - HTTP Routes & Endpoints (methods, paths, handlers)
8
+ - Database Models (tables, schemas, entity relationships)
9
+ - Services & Modules
10
+
11
+ Ingests the extracted BOM directly into Tenant Vault Working RAM as the Target State Vector X_target.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import os
17
+ import re
18
+ import json
19
+ from dataclasses import dataclass, field, asdict
20
+ from typing import Dict, List, Any, Optional, Set
21
+ from pathlib import Path
22
+
23
+
24
+ @dataclass
25
+ class BOMEntity:
26
+ entity_id: str
27
+ kind: str # 'screen' | 'route' | 'model' | 'service' | 'module'
28
+ name: str
29
+ category: str = "core"
30
+ source_file: str = ""
31
+ status: str = "pending"
32
+ maturity: float = 0.0
33
+ spec: Dict[str, Any] = field(default_factory=dict)
34
+
35
+
36
+ @dataclass
37
+ class BOMReport:
38
+ project_id: str
39
+ source_root: str
40
+ total_screens: int
41
+ total_routes: int
42
+ total_models: int
43
+ entities: List[BOMEntity] = field(default_factory=list)
44
+
45
+ def to_dict(self) -> Dict[str, Any]:
46
+ return {
47
+ "project_id": self.project_id,
48
+ "source_root": self.source_root,
49
+ "total_screens": self.total_screens,
50
+ "total_routes": self.total_routes,
51
+ "total_models": self.total_models,
52
+ "entities": [asdict(e) for e in self.entities]
53
+ }
54
+
55
+
56
+ class BOMExtractor:
57
+ """Extracts ground-truth system entities from legacy or target repositories."""
58
+
59
+ def __init__(self, project_id: str = "wpanel"):
60
+ self.project_id = project_id
61
+
62
+ def extract_from_directory(self, target_dir: str) -> BOMReport:
63
+ root = Path(target_dir).resolve()
64
+ if not root.exists():
65
+ raise FileNotFoundError(f"Target directory '{target_dir}' does not exist.")
66
+
67
+ entities: List[BOMEntity] = []
68
+ seen_ids: Set[str] = set()
69
+
70
+ # 1. Scan for Routes (Express/Fastify/Koa/HTTP handlers)
71
+ route_patterns = [
72
+ # app.get('/path', ...), router.post('/path', ...)
73
+ re.compile(r"""(?:app|router|server)\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]""", re.IGNORECASE),
74
+ # @router.get('/path'), @app.post('/path')
75
+ re.compile(r"""@(app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]([^'"`]+)['"`]""", re.IGNORECASE),
76
+ ]
77
+
78
+ # 2. Scan for Screens / Pages / Views
79
+ screen_exts = {".html", ".ejs", ".pug", ".hbs", ".jsx", ".tsx", ".vue", ".svelte"}
80
+
81
+ # 3. Scan for DB Models (Sequelize, Prisma, Mongoose, TypeORM, SQLAlchemy)
82
+ model_patterns = [
83
+ re.compile(r"""sequelize\.define\s*\(\s*['"`]([^'"`]+)['"`]""", re.IGNORECASE),
84
+ re.compile(r"""mongoose\.model\s*\(\s*['"`]([^'"`]+)['"`]""", re.IGNORECASE),
85
+ re.compile(r"""class\s+(\w+)\s*\(.*(?:Base|Model|db\.Model).*\):"""),
86
+ re.compile(r"""model\s+(\w+)\s*\{"""), # Prisma
87
+ ]
88
+
89
+ for current_path, dirs, files in os.walk(root):
90
+ # Prune heavy/build directories
91
+ dirs[:] = [d for d in dirs if d not in {"node_modules", ".git", ".next", "dist", "build", "venv", "__pycache__"}]
92
+
93
+ for f in files:
94
+ file_path = Path(current_path) / f
95
+ rel_path = str(file_path.relative_to(root))
96
+ ext = file_path.suffix.lower()
97
+
98
+ # Check for Screen
99
+ if ext in screen_exts or "view" in rel_path.lower() or "page" in rel_path.lower() or "screen" in rel_path.lower():
100
+ # Deduce screen name
101
+ screen_name = file_path.stem
102
+ if screen_name in {"index", "page"} and file_path.parent != root:
103
+ screen_name = file_path.parent.name
104
+
105
+ eid = f"screen_{screen_name.lower().replace('-', '_').replace(' ', '_')}"
106
+ if eid not in seen_ids:
107
+ seen_ids.add(eid)
108
+ category = self._categorize(screen_name, rel_path)
109
+ entities.append(BOMEntity(
110
+ entity_id=eid,
111
+ kind="screen",
112
+ name=screen_name.replace("_", " ").title(),
113
+ category=category,
114
+ source_file=rel_path,
115
+ spec={"relative_path": rel_path, "format": ext}
116
+ ))
117
+
118
+ # Check for Routes & Models in text files
119
+ if ext in {".js", ".mjs", ".ts", ".py", ".json"}:
120
+ try:
121
+ content = file_path.read_text(encoding="utf-8", errors="ignore")
122
+ except Exception:
123
+ continue
124
+
125
+ # Routes extraction
126
+ for pat in route_patterns:
127
+ for match in pat.finditer(content):
128
+ groups = match.groups()
129
+ method = groups[0] if groups[0] in {"get", "post", "put", "delete", "patch"} else groups[1]
130
+ path = groups[-1]
131
+ rid = f"route_{method.lower()}_{path.strip('/').replace('/', '_').replace(':', 'by_') or 'root'}"
132
+ if rid not in seen_ids:
133
+ seen_ids.add(rid)
134
+ category = self._categorize(path, rel_path)
135
+ entities.append(BOMEntity(
136
+ entity_id=rid,
137
+ kind="route",
138
+ name=f"{method.upper()} {path}",
139
+ category=category,
140
+ source_file=rel_path,
141
+ spec={"method": method.upper(), "path": path}
142
+ ))
143
+
144
+ # Models extraction
145
+ for pat in model_patterns:
146
+ for match in pat.finditer(content):
147
+ mname = match.group(1)
148
+ mid = f"model_{mname.lower()}"
149
+ if mid not in seen_ids:
150
+ seen_ids.add(mid)
151
+ category = self._categorize(mname, rel_path)
152
+ entities.append(BOMEntity(
153
+ entity_id=mid,
154
+ kind="model",
155
+ name=mname,
156
+ category=category,
157
+ source_file=rel_path,
158
+ spec={"model_name": mname}
159
+ ))
160
+
161
+ screens = [e for e in entities if e.kind == "screen"]
162
+ routes = [e for e in entities if e.kind == "route"]
163
+ models = [e for e in entities if e.kind == "model"]
164
+
165
+ return BOMReport(
166
+ project_id=self.project_id,
167
+ source_root=str(root),
168
+ total_screens=len(screens),
169
+ total_routes=len(routes),
170
+ total_models=len(models),
171
+ entities=entities
172
+ )
173
+
174
+ def _categorize(self, name: str, path: str) -> str:
175
+ s = (name + " " + path).lower()
176
+ if any(k in s for k in ["site", "domain", "vhost", "web"]):
177
+ return "websites"
178
+ if any(k in s for k in ["db", "database", "mysql", "postgres", "sql"]):
179
+ return "databases"
180
+ if any(k in s for k in ["mail", "email", "forward", "spam"]):
181
+ return "mail"
182
+ if any(k in s for k in ["dns", "zone", "record"]):
183
+ return "dns"
184
+ if any(k in s for k in ["ssl", "cert", "tls", "encrypt"]):
185
+ return "ssl"
186
+ if any(k in s for k in ["file", "dir", "upload", "ftp"]):
187
+ return "files"
188
+ if any(k in s for k in ["backup", "snapshot", "restore"]):
189
+ return "backups"
190
+ if any(k in s for k in ["cron", "schedule", "task"]):
191
+ return "cron"
192
+ if any(k in s for k in ["user", "account", "profile", "auth", "login"]):
193
+ return "auth_user"
194
+ return "system"
@@ -0,0 +1,77 @@
1
+ """
2
+ Cross-Surface Live Bus for Tenant Vault Working RAM (RFC: ICNLI V17)
3
+ Synchronizes marathon state, target vectors X(t), and focus shifts across:
4
+ - Terminal (Webbee Code TUI)
5
+ - Temporal Worker (Orchestration Engine)
6
+ - Web Panel (Declarative UI / System Monitor)
7
+ - Telegram (Agent Status Cards)
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import time
14
+ from dataclasses import dataclass, asdict
15
+ from typing import Dict, List, Optional, Any, Callable
16
+
17
+
18
+ @dataclass
19
+ class MarathonLiveEvent:
20
+ event_id: str
21
+ project_id: str
22
+ timestamp: float
23
+ surface_source: str # 'terminal' | 'worker' | 'panel' | 'telegram'
24
+ event_type: str # 'focus_shift' | 'maturity_update' | 'proof_committed' | 'limit_cycle_break' | 'blocker_deferred'
25
+ entity_id: Optional[str] = None
26
+ macro_coverage: float = 0.0
27
+ payload: Dict[str, Any] = None
28
+
29
+
30
+ class CrossSurfaceLiveBus:
31
+ """
32
+ High-speed memory bus coordinating marathon state across all 4 surfaces.
33
+ Pluggable backend: in-memory pubsub, Redis Stream, or SQLite Event WAL.
34
+ """
35
+
36
+ def __init__(self, project_id: str = "default"):
37
+ self.project_id = project_id
38
+ self._subscribers: List[Callable[[MarathonLiveEvent], None]] = []
39
+ self._event_history: List[MarathonLiveEvent] = []
40
+
41
+ def subscribe(self, callback: Callable[[MarathonLiveEvent], None]) -> None:
42
+ """Register a cross-surface listener."""
43
+ self._subscribers.append(callback)
44
+
45
+ def publish(
46
+ self,
47
+ surface_source: str,
48
+ event_type: str,
49
+ entity_id: Optional[str] = None,
50
+ macro_coverage: float = 0.0,
51
+ payload: Optional[Dict[str, Any]] = None
52
+ ) -> MarathonLiveEvent:
53
+ """Broadcasts a live marathon transition to all surfaces."""
54
+ event = MarathonLiveEvent(
55
+ event_id=f"evt_{time.time_ns()}",
56
+ project_id=self.project_id,
57
+ timestamp=time.time(),
58
+ surface_source=surface_source,
59
+ event_type=event_type,
60
+ entity_id=entity_id,
61
+ macro_coverage=macro_coverage,
62
+ payload=payload or {}
63
+ )
64
+ self._event_history.append(event)
65
+
66
+ for sub in self._subscribers:
67
+ try:
68
+ sub(event)
69
+ except Exception as e:
70
+ # Surface errors must never crash the core bus
71
+ pass
72
+
73
+ return event
74
+
75
+ def get_recent_events(self, limit: int = 50) -> List[MarathonLiveEvent]:
76
+ """Returns the most recent cross-surface state mutations."""
77
+ return self._event_history[-limit:]