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.
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/PKG-INFO +1 -1
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/sdk-reference.json +1 -1
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/sdk_claims.json +1 -1
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/__init__.py +14 -1
- imperal_sdk-6.0.2/src/imperal_sdk/adversarial_oracle.py +245 -0
- imperal_sdk-6.0.2/src/imperal_sdk/bom_extractor.py +194 -0
- imperal_sdk-6.0.2/src/imperal_sdk/cross_surface_bus.py +77 -0
- imperal_sdk-6.0.2/src/imperal_sdk/gnc_guard.py +155 -0
- imperal_sdk-6.0.2/src/imperal_sdk/schema/marathon_ram.sql +80 -0
- imperal_sdk-6.0.2/src/imperal_sdk/security/deactivation_guard.py +140 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/__init__.py +3 -0
- imperal_sdk-6.0.2/src/imperal_sdk/ui/stage.py +91 -0
- imperal_sdk-6.0.2/src/imperal_sdk/vault_ram_client.py +292 -0
- imperal_sdk-6.0.2/tests/test_stage.py +41 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.cm.txt +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.github/workflows/identity-contract.yml +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.github/workflows/publish.yml +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.github/workflows/test.yml +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/.gitignore +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/CHANGELOG.md +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/LICENSE +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/README.md +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/docs/sdl-facets.md +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/pyproject.toml +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/sdl_roles.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/.codebase-index-cache.pkl +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/_gateway.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/_http_retry.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/_shared_http.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ai/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ai/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/app.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/apps/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/apps/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auth/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auth/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auth/middleware.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/auto_ui.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/billing/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/billing/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cache/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cache/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cache/protocol.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/catalog.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/action_result.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/error_codes.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/exceptions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/extension.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/filters.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/guards.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/kernel_primitives.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/narration.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/narration_guard.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/prompt.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/chat/refusal.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cli/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cli/linter.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/cli/main.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/config/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/config/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/context.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/conversations/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/conversations/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/core.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/contract_checks.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/generate_api_surface.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/generate_reference.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/generate_sdk_claims.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/_flags.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/_introspect.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/client_methods.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/dataclasses_kind.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/decorators.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/sdl_funcs.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/sdl_roles.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/reference/ui_components.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/devtools/validate_identity_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/errors.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/extension.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/extensions/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/extensions/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/http/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/http/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/_impl.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/actions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/custom_roles.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/migrate.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/produce.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/schema.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/skeleton.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/ui.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/ui_children.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/ui_template.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ir/validator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/manifest.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/manifest_schema.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/manifest_schema_ui.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/notify/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/notify/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/oauth_state.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/oauth_tokens.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/pipes.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/icnli_integrity_rules.txt +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/kernel_formatting_rule.txt +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/prompts/kernel_proactivity_rule.txt +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/protocols.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rbac/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rbac/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rpc/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rpc/codec.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/rpc/contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/_platform.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/canon.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/engine.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/executor.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/hosted_client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/interpreter.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/llm_provider.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/local_engine.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/message_adapter.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/template.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/runtime/verbs.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/action_result.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/ai_complete.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/call.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/conditional.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/navigate.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/open.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/send.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_create.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_delete.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_get.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_list.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/actions/store_update.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/balance_info.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/chat_result.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/completion_result.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/document.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/event.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/file_info.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/function_call.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/http_response.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/imperal.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ir.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/limits_result.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/metered_event.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/subscription_info.schema.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/accordion.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/datatable_columns.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/datatable_rows.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/menu.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/select.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/tabs.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/timeline.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/schemas/ui_children/tree.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/_generate_roles_json.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/entity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facet_resolve.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/catalog.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/comm.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/content.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/device.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/event.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/geo.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/identity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/media.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/metric.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/money.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/net.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/people.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/quantity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/rating.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/security.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/task.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/facets/time.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/field.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/sdl/roles.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/search.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/exceptions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/panel_handler.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/secrets/spec.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/security/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/security/call_token.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/signals/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/signals/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/skeleton/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/skeleton/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/storage/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/storage/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/store/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/store/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/store/exceptions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/autonomous_mock.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/mock_context.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/testing/mock_secrets.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/transport.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/typed_context.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/action_result.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/chat_result.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/client_contracts.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/contracts.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/contributions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/events.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/health.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/identity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/metered_event.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/models.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/pagination.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/types/store_contracts.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/actions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/base.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/canvas.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/data.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/display.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/feedback.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/graph.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/input_components.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/interactive.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/layout.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/liquid.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/signals.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/ui/theme.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/users/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/users/client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/validator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/src/imperal_sdk/validator_v1_6_0.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/conftest.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_action_schemas.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_artifacts_freshness.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_contract_checks_selftest.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_generate_sdk_claims.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_identity_nonempty.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_ir_schema_fresh.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_meter_lua_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_metered_event_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_notify_wire_payload.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_public_docstrings_engine_neutral.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_reference_completeness.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_reference_no_leak.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_sample_contract_shape.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contract/test_sdk_matches_kernel_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contracts/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/contracts/test_store_contracts.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/contract/kernel-contract.sample.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/README.md +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/archive_ended.ir.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/link_saver.ir.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/ir/test_fixtures_valid.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/openapi/auth-gateway.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/openapi/registry.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/fixtures/openapi/sharelock-cases.json +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_custom_roles.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_impl.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_mapping_real_ext.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_migrate.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_produce.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_schema.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_skeleton.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_ui.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_ui_produce.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_validator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ir_versions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ui_children.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ir/test_ui_template.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/test_boundary_seal.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/test_codec.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/rpc/test_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_canon.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_canon_template.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_engine_abc.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_engine_parity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_executor_neutral.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_hosted_client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_interpreter.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_llm_provider_config_store.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_llm_provider_ctx_injection.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_local_engine.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_platform_shim.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_template.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_ai.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_call_directives.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_conditional.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/runtime/test_verb_store.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/store/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/store/test_list_users_client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/store/test_query_all_client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_action_result_time_travel.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_action_result_typed.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_agent_presence.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_as_user.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_auth.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_autonomous_mock.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_billing.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cache_client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cache_model.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_call_token.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_callable_surface_single_source.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_extension_deprecation.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_extension_no_llm_router.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_filters.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_function_background_flag.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_guards.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_guards_bleed.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_prompt.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_chat_result.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cli.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_cli_sdk_commands.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_client_contracts.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_client_emit_neutral.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_config_client.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context_background_task.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context_deliver_chat_message.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_context_guards.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_contracts.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_contracts_live.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_contributions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_core_primitives.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_data_model_kwarg.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_document_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_emits_decorator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_error_codes.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_errors.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_event_schema_v2.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_events_health.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extension.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extension_pipes.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extension_v2.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_extensions_emit.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_gateway_namespaces.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_http_json_and_mock.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_http_retry.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_http_timeout_override.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_id_shape_guard.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_identity_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_imperal_schema_v2.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_import_light.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_init_onboarding.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_kernel_primitives.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_liquid_ui.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_file_sinks.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_linter.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_no_orchestrator_tool.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_oauth.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_panels.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_roundtrip_gate.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_schema.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_v2_events.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_v2_other_sections.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_v2_webhooks.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_manifest_validator_v2.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_mock_context.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_models.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_narration_emission.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_narration_guard.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_oauth_authorize_url.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_oauth_tokens_shared.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_openai_max_completion_tokens.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_pagination.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_panel_rendering_contract.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_panel_swr_caching.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_panels.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_phase_a_dead_removal.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_phase_a_drift.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_phase_a_text.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_quantum_app.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdk_version_stamp.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_entity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_entity_marker.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_exports.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_catalog.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_collisions.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_comm.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_content.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_device.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_event.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_exports.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_field.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_geo.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_identity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_media.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_metric.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_money.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_net.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_people.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_quantity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_rating.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_resolve.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_security.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_task.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facet_time.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facets_catalog.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facets_doc.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_facets_pkg.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_field.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_roles.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_roles_json.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_roles_of_facets.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sdl_vocab_version.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_search_provider.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_secret_scope_decorator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_secret_spec_scope.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_skeleton_decorator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_spec_validation.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_surface_adaptation.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_sync_async_parity.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_transport_isolation.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_canvas.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_fileupload_enhanced.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_html.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_image_enhanced.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_modal.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_open.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_signals.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_ui_theme.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_user.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_v7_emit_refusal.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_drift.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_pep563.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_v1_6_0_rules.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_validator_v25.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/test_write_arg_bleed.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/__init__.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_generate_api_surface.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_generate_reference.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_reference_description.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_reference_flags.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/tools/test_reference_typegraph.py +0 -0
- {imperal_sdk-6.0.1 → imperal_sdk-6.0.2}/tests/ui/test_input_type_enum.py +0 -0
|
@@ -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.
|
|
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:]
|