agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
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.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""Merge native Codex facts and fixed-expert facts under Kernel ownership."""
|
|
2
|
+
import asyncio
|
|
3
|
+
from contextlib import aclosing
|
|
4
|
+
from dataclasses import replace
|
|
5
|
+
|
|
6
|
+
from ksadk.a2a.codex import CodexInvocationContextProvider, CodexToolCall
|
|
7
|
+
from ksadk.codex.a2a_tools import denied_tool_result, failed_tool_result
|
|
8
|
+
from ksadk.events.run_authority import current_run_event_authority
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class CodexRecoveryCancelled(RuntimeError):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def managed_codex_events(client, bootstrap, native_events, *, request, owner=None, recovery=None):
|
|
16
|
+
authority = current_run_event_authority()
|
|
17
|
+
if authority is None:
|
|
18
|
+
raise RuntimeError('A2A_KERNEL_AUTHORITY_REQUIRED')
|
|
19
|
+
if not bootstrap.outbound_enabled:
|
|
20
|
+
raise RuntimeError('A2A_OUTBOUND_DISABLED')
|
|
21
|
+
bridge = client._a2a_expert_bridge
|
|
22
|
+
services = {}
|
|
23
|
+
authority.register_managed_a2a(bootstrap)
|
|
24
|
+
policy = authority.managed_invocation_policy()
|
|
25
|
+
|
|
26
|
+
def service_for_space(space):
|
|
27
|
+
if space not in services:
|
|
28
|
+
recovery_options = {"recover_checkpoint_leases": True} if recovery is not None else {}
|
|
29
|
+
services[space] = bootstrap.invocation_service_for_space(
|
|
30
|
+
space, event_store=authority, policy=policy, **recovery_options)
|
|
31
|
+
return services[space]
|
|
32
|
+
|
|
33
|
+
provider = CodexInvocationContextProvider(authority=authority,
|
|
34
|
+
service_for_space=service_for_space, caller_agent_id=bootstrap.runtime_metadata.agent_id,
|
|
35
|
+
require_durable=recovery is not None)
|
|
36
|
+
output = asyncio.Queue(maxsize=1)
|
|
37
|
+
persisted = asyncio.Condition()
|
|
38
|
+
triggers = set()
|
|
39
|
+
calls = {}
|
|
40
|
+
from ksadk.a2a.codex_checkpoint import CodexCheckpointUnavailable, CodexCheckpointWriter
|
|
41
|
+
|
|
42
|
+
checkpoints = CodexCheckpointWriter(
|
|
43
|
+
client=client, authority=authority, request=request, experts=bridge.experts, recovery=recovery,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
async def cancel_experts():
|
|
47
|
+
pending = [task for task in calls.values() if not task.done()]
|
|
48
|
+
for call_task in pending:
|
|
49
|
+
call_task.cancel()
|
|
50
|
+
await asyncio.gather(*pending, return_exceptions=True)
|
|
51
|
+
|
|
52
|
+
if owner is not None:
|
|
53
|
+
owner.cancel_experts = cancel_experts
|
|
54
|
+
|
|
55
|
+
async def emit(event):
|
|
56
|
+
ack = asyncio.Event()
|
|
57
|
+
await output.put((event, ack))
|
|
58
|
+
await ack.wait()
|
|
59
|
+
|
|
60
|
+
async def invoke(call):
|
|
61
|
+
try:
|
|
62
|
+
# A server request may win the race with its earlier native item
|
|
63
|
+
# notification. Continue draining native events until Kernel has
|
|
64
|
+
# consumed that trigger; provider then verifies the persisted fact.
|
|
65
|
+
async with persisted:
|
|
66
|
+
await persisted.wait_for(lambda: bridge.key(call) in triggers)
|
|
67
|
+
response = await bridge.experts[call.tool].invoke(
|
|
68
|
+
call, provider=provider, emit=emit, before_invoke=checkpoints.before_invoke,
|
|
69
|
+
)
|
|
70
|
+
except asyncio.CancelledError:
|
|
71
|
+
client.resolve_a2a_tool(call, failed_tool_result('A2A_CODEX_TOOL_CANCELED'))
|
|
72
|
+
raise
|
|
73
|
+
except TimeoutError:
|
|
74
|
+
# Settle the parent as failed instead of returning a retryable tool
|
|
75
|
+
# result to the model, which could create another remote task.
|
|
76
|
+
await output.put((RuntimeError('A2A_CODEX_EXPERT_TIMEOUT'), None))
|
|
77
|
+
return
|
|
78
|
+
except CodexCheckpointUnavailable as exc:
|
|
79
|
+
# Never turn an uncertain private write into a model-retryable tool error.
|
|
80
|
+
await output.put((exc, None))
|
|
81
|
+
return
|
|
82
|
+
except PermissionError as exc:
|
|
83
|
+
if str(exc) in {'A2A_APPROVAL_DENIED', 'A2A_INPUT_REJECTED'}:
|
|
84
|
+
bridge.mark_denied(call)
|
|
85
|
+
response = denied_tool_result()
|
|
86
|
+
else:
|
|
87
|
+
response = failed_tool_result('A2A_CODEX_EXPERT_FAILED')
|
|
88
|
+
except Exception:
|
|
89
|
+
response = failed_tool_result('A2A_CODEX_EXPERT_FAILED')
|
|
90
|
+
client.resolve_a2a_tool(call, response)
|
|
91
|
+
|
|
92
|
+
async def recover_call(call):
|
|
93
|
+
# The provider finds the original request/attempt from the same durable
|
|
94
|
+
# canonical trigger; invoke_with_input rejoins that service checkpoint.
|
|
95
|
+
try:
|
|
96
|
+
response = await bridge.experts[call.tool].invoke(
|
|
97
|
+
call, provider=provider, emit=emit, before_invoke=checkpoints.before_invoke,
|
|
98
|
+
)
|
|
99
|
+
except TimeoutError:
|
|
100
|
+
raise RuntimeError("A2A_CODEX_EXPERT_TIMEOUT") from None
|
|
101
|
+
items = response.get("contentItems", [])
|
|
102
|
+
if (len(items) != 1 or items[0].get("type") != "inputText"
|
|
103
|
+
or not isinstance(items[0].get("text"), str)):
|
|
104
|
+
raise ValueError("A2A_CODEX_RECOVERY_OUTPUT_INVALID")
|
|
105
|
+
# Native dynamic tools persist the text content, not their RPC envelope.
|
|
106
|
+
# Match that representation for calls already resolved before the crash.
|
|
107
|
+
try:
|
|
108
|
+
rollout = await client.ensure_managed_a2a_output(call, items[0]["text"])
|
|
109
|
+
except TimeoutError:
|
|
110
|
+
# This run's uncertain injection must not close the app-owned
|
|
111
|
+
# transport and interrupt unrelated threads.
|
|
112
|
+
raise RuntimeError("A2A_CODEX_RECOVERY_OUTPUT_UNCERTAIN") from None
|
|
113
|
+
# Persist the flushed output before any new native turn may start.
|
|
114
|
+
await checkpoints.before_invoke(call)
|
|
115
|
+
from ksadk.a2a.codex_recovery_events import recovered_expert_terminal
|
|
116
|
+
|
|
117
|
+
terminal = await recovered_expert_terminal(authority, call, rollout, response)
|
|
118
|
+
if terminal is not None:
|
|
119
|
+
await emit(terminal)
|
|
120
|
+
|
|
121
|
+
async def pump():
|
|
122
|
+
try:
|
|
123
|
+
if recovery is not None:
|
|
124
|
+
for call in recovery.calls:
|
|
125
|
+
calls[bridge.key(call)] = asyncio.create_task(recover_call(call))
|
|
126
|
+
await asyncio.gather(*calls.values())
|
|
127
|
+
await checkpoints.mark_continuation_started()
|
|
128
|
+
async with aclosing(native_events):
|
|
129
|
+
async for event in native_events:
|
|
130
|
+
if isinstance(event, dict):
|
|
131
|
+
call = CodexToolCall.model_validate(event['params'])
|
|
132
|
+
key = bridge.key(call)
|
|
133
|
+
if event['method'] == 'ksadk/a2a/toolCall':
|
|
134
|
+
if key not in calls:
|
|
135
|
+
calls[key] = asyncio.create_task(invoke(call))
|
|
136
|
+
elif event['method'] == 'ksadk/a2a/toolCancel':
|
|
137
|
+
await cancel_experts()
|
|
138
|
+
raise RuntimeError('A2A_CODEX_EXPERT_TIMEOUT')
|
|
139
|
+
else:
|
|
140
|
+
raise ValueError('A2A_CODEX_INTERNAL_EVENT_INVALID')
|
|
141
|
+
continue
|
|
142
|
+
if event.event_type == 'run.completed' and event.source.framework == 'codex':
|
|
143
|
+
await checkpoints.completed_turn(event)
|
|
144
|
+
await emit(event)
|
|
145
|
+
source = event.source
|
|
146
|
+
if getattr(event, 'item_kind', None) == 'tool_call' and source.framework == 'codex':
|
|
147
|
+
async with persisted:
|
|
148
|
+
triggers.add((source.metadata.get('thread_id'), source.native_run_id, source.native_item_id))
|
|
149
|
+
persisted.notify_all()
|
|
150
|
+
await output.put((None, None))
|
|
151
|
+
except asyncio.CancelledError:
|
|
152
|
+
# A canceled recovery child can finish before any native turn
|
|
153
|
+
# exists. Wake the consumer; ordinary generator teardown must not
|
|
154
|
+
# enqueue into a queue whose consumer has already gone away.
|
|
155
|
+
if recovery is not None and not asyncio.current_task().cancelling():
|
|
156
|
+
await output.put((CodexRecoveryCancelled(), None))
|
|
157
|
+
else:
|
|
158
|
+
raise
|
|
159
|
+
except Exception as exc:
|
|
160
|
+
await output.put((exc, None))
|
|
161
|
+
|
|
162
|
+
from ksadk.runtime_context import (
|
|
163
|
+
TRUSTED_IDENTITY_METADATA_KEY, get_current_invocation_context,
|
|
164
|
+
platform_invocation_scope, session_invocation_context,
|
|
165
|
+
)
|
|
166
|
+
context = get_current_invocation_context() or session_invocation_context(
|
|
167
|
+
request.metadata.get("session_context"), agent_id=bootstrap.runtime_metadata.agent_id,
|
|
168
|
+
user_id=request.user_id, session_id=request.session_id, runner_type="codex",
|
|
169
|
+
identity=request.metadata.get(TRUSTED_IDENTITY_METADATA_KEY),
|
|
170
|
+
)
|
|
171
|
+
profile = request.metadata.get("tool_approval_mode")
|
|
172
|
+
if isinstance(profile, str) and profile in {"ask", "risk", "full"}:
|
|
173
|
+
# Kernel's per-run choice must win over an environment default or a
|
|
174
|
+
# surrounding invocation. Keep the caller's context object unchanged.
|
|
175
|
+
context = replace(context, tool_approval_mode=profile)
|
|
176
|
+
with platform_invocation_scope(context):
|
|
177
|
+
task = asyncio.create_task(pump())
|
|
178
|
+
try:
|
|
179
|
+
while True:
|
|
180
|
+
event, ack = await output.get()
|
|
181
|
+
if event is None:
|
|
182
|
+
break
|
|
183
|
+
if isinstance(event, Exception):
|
|
184
|
+
if isinstance(event, CodexCheckpointUnavailable):
|
|
185
|
+
await cancel_experts()
|
|
186
|
+
await client.interrupt_active_turn(event.thread_id)
|
|
187
|
+
raise event
|
|
188
|
+
try:
|
|
189
|
+
yield event
|
|
190
|
+
finally:
|
|
191
|
+
ack.set()
|
|
192
|
+
finally:
|
|
193
|
+
if owner is not None:
|
|
194
|
+
owner.cancel_experts = None
|
|
195
|
+
task.cancel()
|
|
196
|
+
for call_task in calls.values():
|
|
197
|
+
call_task.cancel()
|
|
198
|
+
await asyncio.gather(task, *calls.values(), return_exceptions=True)
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Private completed-turn handoff, distinct from interrupted invocation recovery."""
|
|
2
|
+
|
|
3
|
+
from typing import Literal
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, Field, model_validator
|
|
6
|
+
|
|
7
|
+
from ksadk.a2a.invocation_types import RemoteAgentSpec
|
|
8
|
+
from ksadk.codex.rollout_checkpoint import NativeRolloutCheckpoint
|
|
9
|
+
from ksadk.events.canonical import RunCompleted
|
|
10
|
+
from ksadk.kernel.state import RunState
|
|
11
|
+
from ksadk.runtime.adapter import RunHandle, StartRequest
|
|
12
|
+
from ksadk.runtime.executor import handle_digest
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CodexSessionCheckpoint(BaseModel):
|
|
16
|
+
model_config = ConfigDict(extra="forbid", frozen=True, hide_input_in_errors=True)
|
|
17
|
+
|
|
18
|
+
schema_version: Literal["codex.a2a.session/v1"] = Field(alias="schema")
|
|
19
|
+
run_id: str = Field(min_length=1)
|
|
20
|
+
session_id: str = Field(min_length=1)
|
|
21
|
+
tenant_id: str = Field(min_length=1)
|
|
22
|
+
agent_instance_id: str = Field(min_length=1)
|
|
23
|
+
thread_id: str = Field(min_length=1)
|
|
24
|
+
turn_id: str = Field(min_length=1)
|
|
25
|
+
start_request: StartRequest
|
|
26
|
+
bindings: dict[str, RemoteAgentSpec]
|
|
27
|
+
rollout: NativeRolloutCheckpoint
|
|
28
|
+
terminal_event: RunCompleted
|
|
29
|
+
|
|
30
|
+
@model_validator(mode="after")
|
|
31
|
+
def validate_completed_scope(self):
|
|
32
|
+
if (
|
|
33
|
+
self.rollout.thread_id != self.thread_id
|
|
34
|
+
or self.start_request.session_id != self.session_id
|
|
35
|
+
):
|
|
36
|
+
raise ValueError("A2A_CODEX_SESSION_SCOPE_CONFLICT")
|
|
37
|
+
if not self.bindings or any(
|
|
38
|
+
name != spec.local_name for name, spec in self.bindings.items()
|
|
39
|
+
):
|
|
40
|
+
raise ValueError("A2A_CODEX_SESSION_BINDING_CONFLICT")
|
|
41
|
+
self.rollout.require_completed_turn(self.turn_id)
|
|
42
|
+
event = self.terminal_event
|
|
43
|
+
if (
|
|
44
|
+
event.run_id != self.run_id
|
|
45
|
+
or event.source.framework != "codex"
|
|
46
|
+
or event.source.native_run_id != self.turn_id
|
|
47
|
+
or event.source.metadata.get("thread_id") != self.thread_id
|
|
48
|
+
):
|
|
49
|
+
raise ValueError("A2A_CODEX_SESSION_TERMINAL_CONFLICT")
|
|
50
|
+
return self
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def validated_terminal_recovery_checkpoint(run, handle: RunHandle, *, experts):
|
|
54
|
+
"""Authorize only replay of an already captured terminal fact for this Run."""
|
|
55
|
+
try:
|
|
56
|
+
checkpoint = CodexSessionCheckpoint.model_validate(run.metadata.get("runtime_checkpoint"))
|
|
57
|
+
saved = RunHandle.model_validate(run.metadata.get("handle"))
|
|
58
|
+
request = checkpoint.start_request
|
|
59
|
+
if (
|
|
60
|
+
run.state != RunState.RUNNING
|
|
61
|
+
or run.run_id != checkpoint.run_id
|
|
62
|
+
or run.session_id != checkpoint.session_id
|
|
63
|
+
or run.agent_instance_id != checkpoint.agent_instance_id
|
|
64
|
+
or run.metadata.get("tenant_id") != checkpoint.tenant_id
|
|
65
|
+
or saved != handle
|
|
66
|
+
or handle_digest(saved) != run.metadata.get("handle_digest")
|
|
67
|
+
or handle.runtime_type != "codex"
|
|
68
|
+
or handle.session_id != run.session_id
|
|
69
|
+
or handle.run_id != checkpoint.thread_id
|
|
70
|
+
or handle.native_ref.get("thread_id") != checkpoint.thread_id
|
|
71
|
+
or handle.native_ref.get("user_id") != request.user_id
|
|
72
|
+
or request.metadata.get("run_id") != run.run_id
|
|
73
|
+
or not request.metadata.get("command_id")
|
|
74
|
+
or request.metadata.get("command_id") != run.metadata.get("command_id")
|
|
75
|
+
or (
|
|
76
|
+
request.metadata.get("invocation_id")
|
|
77
|
+
and request.metadata["invocation_id"] != run.run_id
|
|
78
|
+
)
|
|
79
|
+
or checkpoint.bindings != {name: expert.spec for name, expert in experts.items()}
|
|
80
|
+
):
|
|
81
|
+
raise ValueError("scope mismatch")
|
|
82
|
+
return checkpoint
|
|
83
|
+
except (ValueError, TypeError, AttributeError):
|
|
84
|
+
raise ValueError("A2A_CODEX_TERMINAL_CHECKPOINT_INVALID") from None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
async def terminal_recovery_event(checkpoint):
|
|
88
|
+
from ksadk.events.canonical import ItemCompleted
|
|
89
|
+
from ksadk.events.run_authority import current_run_event_authority
|
|
90
|
+
|
|
91
|
+
authority = current_run_event_authority()
|
|
92
|
+
if authority is None:
|
|
93
|
+
raise RuntimeError("A2A_KERNEL_AUTHORITY_REQUIRED")
|
|
94
|
+
identity = authority.runtime_checkpoint_identity()
|
|
95
|
+
if (
|
|
96
|
+
authority.run_id != checkpoint.run_id
|
|
97
|
+
or authority.session_id != checkpoint.session_id
|
|
98
|
+
or identity["tenant_id"] != checkpoint.tenant_id
|
|
99
|
+
or identity["agent_instance_id"] != checkpoint.agent_instance_id
|
|
100
|
+
):
|
|
101
|
+
raise ValueError("A2A_CODEX_TERMINAL_AUTHORITY_CONFLICT")
|
|
102
|
+
prior = await authority.list(checkpoint.session_id)
|
|
103
|
+
items = {(event.scope_id, event.item_id) for event in prior if isinstance(event, ItemCompleted)}
|
|
104
|
+
if any(
|
|
105
|
+
(ref.scope_id, ref.item_id) not in items for ref in checkpoint.terminal_event.output_refs
|
|
106
|
+
):
|
|
107
|
+
raise ValueError("A2A_CODEX_TERMINAL_OUTPUT_NOT_DURABLE")
|
|
108
|
+
return checkpoint.terminal_event
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def validated_session_checkpoint(
|
|
112
|
+
run,
|
|
113
|
+
handle: RunHandle,
|
|
114
|
+
request: StartRequest,
|
|
115
|
+
*,
|
|
116
|
+
agent_instance_id: str,
|
|
117
|
+
tenant_id: str,
|
|
118
|
+
experts,
|
|
119
|
+
):
|
|
120
|
+
"""Validate a Kernel-loaded predecessor against the current trusted owner.
|
|
121
|
+
|
|
122
|
+
The caller supplies the canonical predecessor, never a caller-uploaded run.
|
|
123
|
+
This performs no I/O and never replays an outbound invocation.
|
|
124
|
+
"""
|
|
125
|
+
try:
|
|
126
|
+
checkpoint = CodexSessionCheckpoint.model_validate(run.metadata.get("runtime_checkpoint"))
|
|
127
|
+
saved = RunHandle.model_validate(run.metadata.get("handle"))
|
|
128
|
+
previous = checkpoint.start_request
|
|
129
|
+
if (
|
|
130
|
+
run.state != RunState.COMPLETED
|
|
131
|
+
or run.run_id != checkpoint.run_id
|
|
132
|
+
or run.agent_instance_id != checkpoint.agent_instance_id
|
|
133
|
+
or run.agent_instance_id != agent_instance_id
|
|
134
|
+
or run.metadata.get("tenant_id") != checkpoint.tenant_id
|
|
135
|
+
or checkpoint.tenant_id != tenant_id
|
|
136
|
+
or run.session_id != checkpoint.session_id
|
|
137
|
+
or request.session_id != checkpoint.session_id
|
|
138
|
+
or not previous.user_id
|
|
139
|
+
or request.user_id != previous.user_id
|
|
140
|
+
or saved != handle
|
|
141
|
+
or handle_digest(saved) != run.metadata.get("handle_digest")
|
|
142
|
+
or handle.runtime_type != "codex"
|
|
143
|
+
or handle.session_id != run.session_id
|
|
144
|
+
or handle.run_id != checkpoint.thread_id
|
|
145
|
+
or handle.native_ref.get("thread_id") != checkpoint.thread_id
|
|
146
|
+
or handle.native_ref.get("user_id") != previous.user_id
|
|
147
|
+
or request.metadata.get("thread_id") != checkpoint.thread_id
|
|
148
|
+
or previous.metadata.get("run_id") != run.run_id
|
|
149
|
+
or not previous.metadata.get("command_id")
|
|
150
|
+
or previous.metadata.get("command_id") != run.metadata.get("command_id")
|
|
151
|
+
or (
|
|
152
|
+
previous.metadata.get("invocation_id")
|
|
153
|
+
and previous.metadata["invocation_id"] != run.run_id
|
|
154
|
+
)
|
|
155
|
+
or not request.metadata.get("run_id")
|
|
156
|
+
or request.metadata["run_id"] == run.run_id
|
|
157
|
+
or checkpoint.bindings != {name: expert.spec for name, expert in experts.items()}
|
|
158
|
+
):
|
|
159
|
+
raise ValueError("scope mismatch")
|
|
160
|
+
return checkpoint
|
|
161
|
+
except (ValueError, TypeError, AttributeError):
|
|
162
|
+
raise ValueError("A2A_CODEX_SESSION_CHECKPOINT_INVALID") from None
|
ksadk/a2a/composition.py
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""Load immutable Studio compositions without modifying code-first projects."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import hashlib
|
|
5
|
+
import importlib
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from types import ModuleType
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def load_source_module(root: Path, entry_point: str):
|
|
12
|
+
root = root.resolve()
|
|
13
|
+
relative = entry_point[:-3] if entry_point.endswith(".py") else entry_point
|
|
14
|
+
parts = relative.replace("\\", "/").replace("/", ".").split(".")
|
|
15
|
+
if not parts or any(not part.isidentifier() for part in parts):
|
|
16
|
+
raise ValueError("A2A_SOURCE_ENTRY_INVALID")
|
|
17
|
+
source = root.joinpath(*parts).with_suffix(".py").resolve()
|
|
18
|
+
if not source.is_relative_to(root) or not source.is_file():
|
|
19
|
+
raise ValueError("A2A_SOURCE_ENTRY_INVALID")
|
|
20
|
+
# Each bundle gets its own package namespace, including relative imports.
|
|
21
|
+
namespace = "_ksadk_a2a_bundle_" + hashlib.sha256(str(root).encode()).hexdigest()[:24]
|
|
22
|
+
if namespace not in sys.modules:
|
|
23
|
+
package = ModuleType(namespace)
|
|
24
|
+
package.__path__ = [str(root)]
|
|
25
|
+
package.__package__ = namespace
|
|
26
|
+
sys.modules[namespace] = package
|
|
27
|
+
return importlib.import_module(namespace + "." + ".".join(parts))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def compose_project(source, compose, *, framework, local_ids, handoff_sources,
|
|
31
|
+
agent_variable, checkpointer=None, resource_tools=()):
|
|
32
|
+
provider = getattr(source, "ksadk_a2a_local_nodes", None)
|
|
33
|
+
if provider is not None:
|
|
34
|
+
if not callable(provider):
|
|
35
|
+
raise ValueError("A2A_LOCAL_NODE_PROVIDER_INVALID")
|
|
36
|
+
nodes = provider()
|
|
37
|
+
if not isinstance(nodes, dict) or set(nodes) != set(local_ids):
|
|
38
|
+
raise ValueError("A2A_LOCAL_NODE_MAPPING_INVALID")
|
|
39
|
+
nodes = dict(nodes)
|
|
40
|
+
elif len(local_ids) == 1:
|
|
41
|
+
nodes = {local_ids[0]: getattr(source, agent_variable)}
|
|
42
|
+
elif local_ids:
|
|
43
|
+
raise ValueError("A2A_LOCAL_NODE_PROVIDER_REQUIRED")
|
|
44
|
+
else:
|
|
45
|
+
nodes = {}
|
|
46
|
+
factories = getattr(source, "ksadk_a2a_local_factories", {})
|
|
47
|
+
if not isinstance(factories, dict):
|
|
48
|
+
raise ValueError("A2A_LOCAL_TOOL_FACTORY_REQUIRED")
|
|
49
|
+
factories = dict(factories)
|
|
50
|
+
if framework == "langgraph":
|
|
51
|
+
factory = getattr(source, "ksadk_graph_factory", None)
|
|
52
|
+
if len(local_ids) == 1 and callable(factory) and provider is None:
|
|
53
|
+
local_id = local_ids[0]
|
|
54
|
+
# Nested graphs inherit the outer saver; never keep a private
|
|
55
|
+
# MemorySaver inside a graph that claims durable recovery.
|
|
56
|
+
if local_id in handoff_sources and local_id not in factories:
|
|
57
|
+
import inspect
|
|
58
|
+
if "resource_tools" not in inspect.signature(factory).parameters:
|
|
59
|
+
raise ValueError("A2A_LOCAL_TOOL_FACTORY_REQUIRED")
|
|
60
|
+
factories[local_id] = lambda tools: factory(
|
|
61
|
+
checkpointer=None, resource_tools=tuple(resource_tools) + tuple(tools))
|
|
62
|
+
elif local_id not in handoff_sources:
|
|
63
|
+
if resource_tools:
|
|
64
|
+
nodes[local_id] = factory(checkpointer=None, resource_tools=tuple(resource_tools))
|
|
65
|
+
else:
|
|
66
|
+
nodes[local_id] = factory(checkpointer=None)
|
|
67
|
+
elif resource_tools:
|
|
68
|
+
raise ValueError("A2A_RESOURCE_TOOL_FACTORY_REQUIRED")
|
|
69
|
+
for local_id, node in nodes.items():
|
|
70
|
+
if local_id not in handoff_sources and getattr(node, "checkpointer", None) is not None:
|
|
71
|
+
raise ValueError("A2A_LOCAL_CHECKPOINTER_MUST_INHERIT")
|
|
72
|
+
return compose(nodes, local_factories=factories, checkpointer=checkpointer)
|
|
73
|
+
if resource_tools:
|
|
74
|
+
raise ValueError("A2A_RESOURCE_TOOL_FACTORY_REQUIRED")
|
|
75
|
+
return compose(nodes)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def prepare_composed_state(source, payload, session_context):
|
|
79
|
+
hook = getattr(source, "ksadk_prepare_state", None)
|
|
80
|
+
if callable(hook):
|
|
81
|
+
return hook(payload, session_context)
|
|
82
|
+
# The default MessagesState contract admits the current textual turn only.
|
|
83
|
+
# Non-text/custom state requires the project's explicit projection hook.
|
|
84
|
+
from langchain_core.messages import HumanMessage
|
|
85
|
+
current = payload.get("input")
|
|
86
|
+
if not isinstance(current, str):
|
|
87
|
+
raise ValueError("A2A_PREPARE_STATE_HOOK_REQUIRED")
|
|
88
|
+
return {"messages": [HumanMessage(content=current)]}
|
ksadk/a2a/context_store.py
CHANGED
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import hashlib
|
|
7
|
+
import json
|
|
7
8
|
import os
|
|
8
9
|
import sqlite3
|
|
9
10
|
import uuid
|
|
@@ -11,6 +12,9 @@ from abc import ABC, abstractmethod
|
|
|
11
12
|
from dataclasses import dataclass
|
|
12
13
|
from pathlib import Path
|
|
13
14
|
|
|
15
|
+
from sqlalchemy import text
|
|
16
|
+
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
17
|
+
|
|
14
18
|
|
|
15
19
|
@dataclass(frozen=True)
|
|
16
20
|
class A2AContextIdentity:
|
|
@@ -20,6 +24,7 @@ class A2AContextIdentity:
|
|
|
20
24
|
tenant_id: str
|
|
21
25
|
caller_principal_type: str
|
|
22
26
|
caller_principal_id: str
|
|
27
|
+
sub_account_id: str | None = None
|
|
23
28
|
|
|
24
29
|
def canonical_owner(self) -> str:
|
|
25
30
|
values = (
|
|
@@ -29,9 +34,15 @@ class A2AContextIdentity:
|
|
|
29
34
|
self.caller_principal_id.strip(),
|
|
30
35
|
)
|
|
31
36
|
if not values[0] or not values[2] or not values[3]:
|
|
32
|
-
raise ValueError(
|
|
33
|
-
|
|
34
|
-
|
|
37
|
+
raise ValueError("A2A context identity requires verified account, type, and principal")
|
|
38
|
+
if self.caller_principal_type == "user":
|
|
39
|
+
# Product identifiers are opaque. Preserve exact values and field
|
|
40
|
+
# boundaries instead of trimming or joining with an escapable delimiter.
|
|
41
|
+
owner = [self.account_id, self.tenant_id, self.caller_principal_type,
|
|
42
|
+
self.caller_principal_id]
|
|
43
|
+
if self.sub_account_id is not None:
|
|
44
|
+
owner.append(self.sub_account_id)
|
|
45
|
+
return json.dumps(owner, ensure_ascii=False, separators=(",", ":"))
|
|
35
46
|
return "\x1f".join(values)
|
|
36
47
|
|
|
37
48
|
|
|
@@ -43,6 +54,19 @@ class A2AContextStore(ABC):
|
|
|
43
54
|
"""Verify durable storage is ready before inbound A2A starts serving."""
|
|
44
55
|
raise NotImplementedError
|
|
45
56
|
|
|
57
|
+
|
|
58
|
+
def _mapping_key(
|
|
59
|
+
identity: A2AContextIdentity,
|
|
60
|
+
external_context_id: str,
|
|
61
|
+
isolation_scope: str | None,
|
|
62
|
+
) -> tuple[str, str, str]:
|
|
63
|
+
context = external_context_id.strip()
|
|
64
|
+
if not context:
|
|
65
|
+
raise ValueError("external_context_id must be non-empty")
|
|
66
|
+
owner_hash = hashlib.sha256(identity.canonical_owner().encode("utf-8")).hexdigest()
|
|
67
|
+
context_hash = hashlib.sha256(context.encode("utf-8")).hexdigest()
|
|
68
|
+
return owner_hash, context_hash, str(isolation_scope or "")
|
|
69
|
+
|
|
46
70
|
@abstractmethod
|
|
47
71
|
async def resolve_or_create(
|
|
48
72
|
self,
|
|
@@ -97,7 +121,7 @@ class SQLiteA2AContextStore(A2AContextStore):
|
|
|
97
121
|
isolation_scope: str | None = None,
|
|
98
122
|
) -> str:
|
|
99
123
|
await self.initialize()
|
|
100
|
-
key =
|
|
124
|
+
key = _mapping_key(identity, external_context_id, isolation_scope)
|
|
101
125
|
return await asyncio.to_thread(self._resolve_or_create_sync, key)
|
|
102
126
|
|
|
103
127
|
async def get(
|
|
@@ -108,7 +132,7 @@ class SQLiteA2AContextStore(A2AContextStore):
|
|
|
108
132
|
isolation_scope: str | None = None,
|
|
109
133
|
) -> str | None:
|
|
110
134
|
await self.initialize()
|
|
111
|
-
key =
|
|
135
|
+
key = _mapping_key(identity, external_context_id, isolation_scope)
|
|
112
136
|
return await asyncio.to_thread(self._get_sync, key)
|
|
113
137
|
|
|
114
138
|
def _initialize_sync(self) -> None:
|
|
@@ -136,19 +160,6 @@ class SQLiteA2AContextStore(A2AContextStore):
|
|
|
136
160
|
connection.close()
|
|
137
161
|
os.chmod(self._path, 0o600)
|
|
138
162
|
|
|
139
|
-
@staticmethod
|
|
140
|
-
def _mapping_key(
|
|
141
|
-
identity: A2AContextIdentity,
|
|
142
|
-
external_context_id: str,
|
|
143
|
-
isolation_scope: str | None,
|
|
144
|
-
) -> tuple[str, str, str]:
|
|
145
|
-
context = external_context_id.strip()
|
|
146
|
-
if not context:
|
|
147
|
-
raise ValueError("external_context_id must be non-empty")
|
|
148
|
-
owner_hash = hashlib.sha256(identity.canonical_owner().encode("utf-8")).hexdigest()
|
|
149
|
-
context_hash = hashlib.sha256(context.encode("utf-8")).hexdigest()
|
|
150
|
-
return owner_hash, context_hash, str(isolation_scope or "")
|
|
151
|
-
|
|
152
163
|
def _resolve_or_create_sync(self, key: tuple[str, str, str]) -> str:
|
|
153
164
|
owner_hash, context_hash, scope = key
|
|
154
165
|
connection = sqlite3.connect(self._path, timeout=5, isolation_level=None)
|
|
@@ -200,4 +211,92 @@ class SQLiteA2AContextStore(A2AContextStore):
|
|
|
200
211
|
connection.close()
|
|
201
212
|
|
|
202
213
|
|
|
203
|
-
|
|
214
|
+
class PostgresA2AContextStore(A2AContextStore):
|
|
215
|
+
"""Shared context mapping for multi-replica managed Runtimes."""
|
|
216
|
+
|
|
217
|
+
def __init__(self, engine: AsyncEngine) -> None:
|
|
218
|
+
self._engine = engine
|
|
219
|
+
|
|
220
|
+
async def initialize(self) -> None:
|
|
221
|
+
async with self._engine.begin() as connection:
|
|
222
|
+
await connection.execute(
|
|
223
|
+
text(
|
|
224
|
+
"""
|
|
225
|
+
CREATE TABLE IF NOT EXISTS ksadk_a2a_context_mappings (
|
|
226
|
+
schema_version INTEGER NOT NULL,
|
|
227
|
+
owner_key_sha256 TEXT NOT NULL,
|
|
228
|
+
external_context_sha256 TEXT NOT NULL,
|
|
229
|
+
isolation_scope TEXT NOT NULL,
|
|
230
|
+
internal_session_id TEXT NOT NULL,
|
|
231
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
232
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
233
|
+
PRIMARY KEY(owner_key_sha256, external_context_sha256, isolation_scope)
|
|
234
|
+
)
|
|
235
|
+
"""
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
async def resolve_or_create(
|
|
240
|
+
self,
|
|
241
|
+
identity: A2AContextIdentity,
|
|
242
|
+
external_context_id: str,
|
|
243
|
+
*,
|
|
244
|
+
isolation_scope: str | None = None,
|
|
245
|
+
) -> str:
|
|
246
|
+
owner_hash, context_hash, scope = _mapping_key(
|
|
247
|
+
identity, external_context_id, isolation_scope
|
|
248
|
+
)
|
|
249
|
+
session_id = f"a2a-session-{uuid.uuid4().hex}"
|
|
250
|
+
async with self._engine.begin() as connection:
|
|
251
|
+
result = await connection.execute(
|
|
252
|
+
text(
|
|
253
|
+
"""
|
|
254
|
+
INSERT INTO ksadk_a2a_context_mappings(
|
|
255
|
+
schema_version, owner_key_sha256, external_context_sha256,
|
|
256
|
+
isolation_scope, internal_session_id
|
|
257
|
+
) VALUES (1, :owner_hash, :context_hash, :scope, :session_id)
|
|
258
|
+
ON CONFLICT(owner_key_sha256, external_context_sha256, isolation_scope)
|
|
259
|
+
DO UPDATE SET updated_at = CURRENT_TIMESTAMP
|
|
260
|
+
RETURNING internal_session_id
|
|
261
|
+
"""
|
|
262
|
+
),
|
|
263
|
+
{
|
|
264
|
+
"owner_hash": owner_hash,
|
|
265
|
+
"context_hash": context_hash,
|
|
266
|
+
"scope": scope,
|
|
267
|
+
"session_id": session_id,
|
|
268
|
+
},
|
|
269
|
+
)
|
|
270
|
+
return str(result.scalar_one())
|
|
271
|
+
|
|
272
|
+
async def get(
|
|
273
|
+
self,
|
|
274
|
+
identity: A2AContextIdentity,
|
|
275
|
+
external_context_id: str,
|
|
276
|
+
*,
|
|
277
|
+
isolation_scope: str | None = None,
|
|
278
|
+
) -> str | None:
|
|
279
|
+
owner_hash, context_hash, scope = _mapping_key(
|
|
280
|
+
identity, external_context_id, isolation_scope
|
|
281
|
+
)
|
|
282
|
+
async with self._engine.connect() as connection:
|
|
283
|
+
result = await connection.execute(
|
|
284
|
+
text(
|
|
285
|
+
"""
|
|
286
|
+
SELECT internal_session_id FROM ksadk_a2a_context_mappings
|
|
287
|
+
WHERE owner_key_sha256 = :owner_hash
|
|
288
|
+
AND external_context_sha256 = :context_hash
|
|
289
|
+
AND isolation_scope = :scope
|
|
290
|
+
"""
|
|
291
|
+
),
|
|
292
|
+
{"owner_hash": owner_hash, "context_hash": context_hash, "scope": scope},
|
|
293
|
+
)
|
|
294
|
+
value = result.scalar_one_or_none()
|
|
295
|
+
return str(value) if value is not None else None
|
|
296
|
+
|
|
297
|
+
__all__ = [
|
|
298
|
+
"A2AContextIdentity",
|
|
299
|
+
"A2AContextStore",
|
|
300
|
+
"PostgresA2AContextStore",
|
|
301
|
+
"SQLiteA2AContextStore",
|
|
302
|
+
]
|