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
ksadk/a2a/server.py
CHANGED
|
@@ -14,7 +14,6 @@ from typing import Any, cast
|
|
|
14
14
|
|
|
15
15
|
from a2a.server.agent_execution import RequestContext, SimpleRequestContextBuilder
|
|
16
16
|
from a2a.server.context import ServerCallContext
|
|
17
|
-
from a2a.server.request_handlers import DefaultRequestHandler
|
|
18
17
|
from a2a.server.routes import (
|
|
19
18
|
create_agent_card_routes,
|
|
20
19
|
create_jsonrpc_routes,
|
|
@@ -25,8 +24,10 @@ from a2a.types import AgentCard, SendMessageRequest, Task
|
|
|
25
24
|
|
|
26
25
|
from ksadk.a2a.card import JSONRPC_PATH, REST_PATH_PREFIX
|
|
27
26
|
from ksadk.a2a.executor import A2ARuntimeExecutor
|
|
27
|
+
from ksadk.a2a.protocol_errors import ProtocolRequestHandler, correct_cancel_rest_route
|
|
28
28
|
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
29
29
|
from ksadk.a2a.task_store import A2AOwnerContextBuilder
|
|
30
|
+
from ksadk.a2a.tool_activity import PublicToolActivityPolicy
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
class _DurableRequestContextBuilder(SimpleRequestContextBuilder):
|
|
@@ -76,6 +77,7 @@ class A2AProtocolServer:
|
|
|
76
77
|
task_adapter: A2ARuntimeTaskAdapter,
|
|
77
78
|
context_builder: A2AOwnerContextBuilder | None = None,
|
|
78
79
|
include_reasoning: bool = False,
|
|
80
|
+
public_tool_policy: PublicToolActivityPolicy | None = None,
|
|
79
81
|
) -> None:
|
|
80
82
|
self.agent_card = agent_card
|
|
81
83
|
self.task_store = task_store
|
|
@@ -84,14 +86,18 @@ class A2AProtocolServer:
|
|
|
84
86
|
self.executor = A2ARuntimeExecutor(
|
|
85
87
|
task_adapter=task_adapter,
|
|
86
88
|
include_reasoning=include_reasoning,
|
|
89
|
+
public_tool_policy=public_tool_policy,
|
|
87
90
|
)
|
|
88
|
-
self.request_handler =
|
|
91
|
+
self.request_handler = ProtocolRequestHandler(
|
|
89
92
|
agent_executor=self.executor,
|
|
90
93
|
task_store=task_store,
|
|
91
94
|
agent_card=agent_card,
|
|
92
95
|
request_context_builder=_DurableRequestContextBuilder(task_store),
|
|
93
96
|
)
|
|
94
97
|
|
|
98
|
+
self.request_handler.terminal_task_reconciler = getattr(
|
|
99
|
+
task_adapter, "reconcile_terminal_task", None)
|
|
100
|
+
|
|
95
101
|
def agent_card_routes(self) -> list[Any]:
|
|
96
102
|
return cast(list[Any], create_agent_card_routes(self.agent_card))
|
|
97
103
|
|
|
@@ -108,11 +114,14 @@ class A2AProtocolServer:
|
|
|
108
114
|
def rest_routes(self) -> list[Any]:
|
|
109
115
|
return cast(
|
|
110
116
|
list[Any],
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
117
|
+
[
|
|
118
|
+
correct_cancel_rest_route(route)
|
|
119
|
+
for route in create_rest_routes(
|
|
120
|
+
self.request_handler,
|
|
121
|
+
path_prefix=REST_PATH_PREFIX,
|
|
122
|
+
context_builder=self.context_builder,
|
|
123
|
+
)
|
|
124
|
+
],
|
|
116
125
|
)
|
|
117
126
|
|
|
118
127
|
|
ksadk/a2a/space_client.py
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import asyncio
|
|
5
6
|
import hashlib
|
|
6
7
|
import json
|
|
7
8
|
import logging
|
|
8
9
|
import os
|
|
10
|
+
import time
|
|
9
11
|
import uuid
|
|
10
12
|
from collections.abc import AsyncIterator
|
|
11
13
|
from contextlib import AsyncExitStack, asynccontextmanager
|
|
@@ -34,6 +36,7 @@ from ksadk.a2a._space_client_events import _SpaceClientEventMixin
|
|
|
34
36
|
from ksadk.a2a.control_plane import (
|
|
35
37
|
A2AAgentCardClient,
|
|
36
38
|
A2AControlPlane,
|
|
39
|
+
A2AControlPlaneError,
|
|
37
40
|
A2ARouteInterface,
|
|
38
41
|
CredentialInjection,
|
|
39
42
|
DiscoveredAgent,
|
|
@@ -61,6 +64,7 @@ ERR_PUBLIC_EGRESS_DISABLED = "A2A_PUBLIC_EGRESS_DISABLED"
|
|
|
61
64
|
MAX_A2A_MESSAGE_BYTES = 1024 * 1024
|
|
62
65
|
MAX_A2A_MESSAGE_PARTS = 64
|
|
63
66
|
MAX_A2A_MESSAGE_ID_LENGTH = 128
|
|
67
|
+
INITIAL_SEND_BIND_WAIT_SECONDS = 120.0
|
|
64
68
|
|
|
65
69
|
|
|
66
70
|
def _require_opaque_space_id(value: str, *, field_name: str) -> str:
|
|
@@ -190,6 +194,14 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
190
194
|
f"{ENV_A2A_SPACE_IDS} contains multiple Space IDs; pass space_id explicitly"
|
|
191
195
|
)
|
|
192
196
|
selected_space_id = normalized_space_ids[0]
|
|
197
|
+
if backend is None and os.getenv("KSADK_A2A_CONTROL_PLANE_URL", "").strip():
|
|
198
|
+
from ksadk.a2a.control_plane import InternalA2AControlPlaneClient
|
|
199
|
+
from ksadk.a2a.platform import _managed_http_verify
|
|
200
|
+
|
|
201
|
+
backend = InternalA2AControlPlaneClient(
|
|
202
|
+
os.environ["KSADK_A2A_CONTROL_PLANE_URL"].strip(),
|
|
203
|
+
httpx_client=httpx_client, verify=_managed_http_verify(),
|
|
204
|
+
)
|
|
193
205
|
if backend is None:
|
|
194
206
|
from ksadk.a2a.service_env import (
|
|
195
207
|
resolve_a2a_service_token,
|
|
@@ -284,6 +296,46 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
284
296
|
self._check_egress(agent)
|
|
285
297
|
return agent
|
|
286
298
|
|
|
299
|
+
@property
|
|
300
|
+
def control_plane(self) -> A2AControlPlane:
|
|
301
|
+
return self._backend
|
|
302
|
+
|
|
303
|
+
@asynccontextmanager
|
|
304
|
+
async def open_prepared_message_stream(self, prepared: PreparedA2AOperation, message: Message):
|
|
305
|
+
"""Guarded wire port; the invocation service owns mapping and persistence."""
|
|
306
|
+
self._validate_prepared_ids(prepared)
|
|
307
|
+
agent = self._agent_from_prepared(prepared)
|
|
308
|
+
async with self._operation_client(agent, prepared) as (client, context):
|
|
309
|
+
yield client.send_message(SendMessageRequest(message=message), context=context)
|
|
310
|
+
|
|
311
|
+
async def get_prepared_task(self, prepared: PreparedA2AOperation):
|
|
312
|
+
self._validate_prepared_ids(prepared)
|
|
313
|
+
remote = self._require_remote_task(prepared)
|
|
314
|
+
async with self._operation_client(self._agent_from_prepared(prepared), prepared) as (
|
|
315
|
+
client,
|
|
316
|
+
context,
|
|
317
|
+
):
|
|
318
|
+
task = await client.get_task(GetTaskRequest(id=remote.remote_task_id), context=context)
|
|
319
|
+
self._validate_remote_task_observation(
|
|
320
|
+
remote.remote_task_id, remote.remote_context_id, task
|
|
321
|
+
)
|
|
322
|
+
return task
|
|
323
|
+
|
|
324
|
+
async def cancel_prepared_task(self, prepared: PreparedA2AOperation):
|
|
325
|
+
self._validate_prepared_ids(prepared)
|
|
326
|
+
remote = self._require_remote_task(prepared)
|
|
327
|
+
async with self._operation_client(self._agent_from_prepared(prepared), prepared) as (
|
|
328
|
+
client,
|
|
329
|
+
context,
|
|
330
|
+
):
|
|
331
|
+
task = await client.cancel_task(
|
|
332
|
+
CancelTaskRequest(id=remote.remote_task_id), context=context
|
|
333
|
+
)
|
|
334
|
+
self._validate_remote_task_observation(
|
|
335
|
+
remote.remote_task_id, remote.remote_context_id, task
|
|
336
|
+
)
|
|
337
|
+
return task
|
|
338
|
+
|
|
287
339
|
async def send_message(
|
|
288
340
|
self,
|
|
289
341
|
agent_id: str,
|
|
@@ -294,15 +346,31 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
294
346
|
) -> A2APlatformTask:
|
|
295
347
|
agent = await self._resolve_agent(agent_id)
|
|
296
348
|
normalized = self._normalize_initial_message(message)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
349
|
+
token = idempotency_token or f"idem-{uuid.uuid4().hex}"
|
|
350
|
+
deadline = time.monotonic() + INITIAL_SEND_BIND_WAIT_SECONDS
|
|
351
|
+
while True:
|
|
352
|
+
try:
|
|
353
|
+
prepared = await self._backend.prepare_call(
|
|
354
|
+
space_id=self._space_id,
|
|
355
|
+
target_agent_id=agent.agent_id,
|
|
356
|
+
expected_version_id=agent.version_id,
|
|
357
|
+
message_id=normalized.message_id,
|
|
358
|
+
message_sha256=_canonical_sha256(normalized),
|
|
359
|
+
idempotency_token=token,
|
|
360
|
+
)
|
|
361
|
+
break
|
|
362
|
+
except A2AControlPlaneError as exc:
|
|
363
|
+
if exc.error_code != "A2A_INITIAL_SEND_PENDING" or time.monotonic() >= deadline:
|
|
364
|
+
raise
|
|
365
|
+
await asyncio.sleep(min(0.5, max(0.0, deadline - time.monotonic())))
|
|
305
366
|
self._validate_prepared_target(agent, prepared)
|
|
367
|
+
if prepared.remote_task is not None:
|
|
368
|
+
# The control plane resolved this idempotency key to an existing
|
|
369
|
+
# task. Its send permit is bound to that remote task, so replaying
|
|
370
|
+
# the initial message would be rejected by the Gateway.
|
|
371
|
+
self._agents_by_task[prepared.platform_task_id] = agent
|
|
372
|
+
await self._record_agent_for_task(prepared.platform_task_id, agent)
|
|
373
|
+
return await self.get_task(prepared.platform_task_id)
|
|
306
374
|
handle = await self._send_prepared_message(
|
|
307
375
|
prepared,
|
|
308
376
|
agent,
|
|
@@ -323,6 +391,16 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
323
391
|
) -> A2APlatformTask:
|
|
324
392
|
require_a2a_resource_id(task_id, "a2a-task-", field_name="task_id")
|
|
325
393
|
normalized = self._normalize_initial_message(message)
|
|
394
|
+
# Resolve the durable binding before hashing the final continuation wire
|
|
395
|
+
# message. The send permit binds the hash including task/context IDs.
|
|
396
|
+
binding = await self._backend.prepare_task_operation(
|
|
397
|
+
platform_task_id=task_id, operation="get_task"
|
|
398
|
+
)
|
|
399
|
+
self._validate_prepared_ids(binding)
|
|
400
|
+
remote_task = self._require_remote_task(binding)
|
|
401
|
+
normalized.task_id = remote_task.remote_task_id
|
|
402
|
+
if remote_task.remote_context_id:
|
|
403
|
+
normalized.context_id = remote_task.remote_context_id
|
|
326
404
|
prepared = await self._backend.prepare_task_operation(
|
|
327
405
|
platform_task_id=task_id,
|
|
328
406
|
operation="send_message",
|
|
@@ -331,10 +409,8 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
331
409
|
idempotency_token=idempotency_token or f"idem-{uuid.uuid4().hex}",
|
|
332
410
|
)
|
|
333
411
|
self._validate_prepared_ids(prepared)
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
if remote_task.remote_context_id:
|
|
337
|
-
normalized.context_id = remote_task.remote_context_id
|
|
412
|
+
if self._require_remote_task(prepared) != remote_task:
|
|
413
|
+
raise RuntimeError("A2A_REMOTE_BINDING_CONFLICT")
|
|
338
414
|
agent = self._agent_from_prepared(prepared)
|
|
339
415
|
return await self._send_prepared_message(
|
|
340
416
|
prepared,
|
|
@@ -603,7 +679,11 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
603
679
|
cached = self._agents_by_id.get(prepared.target.agent_id)
|
|
604
680
|
if cached is not None and cached.version_id == prepared.target.version_id:
|
|
605
681
|
return cached
|
|
606
|
-
card = self._route_only_card(
|
|
682
|
+
card = self._route_only_card(
|
|
683
|
+
prepared.target.agent_id,
|
|
684
|
+
prepared.target.version_id,
|
|
685
|
+
streaming=prepared.route.streaming,
|
|
686
|
+
)
|
|
607
687
|
return DiscoveredAgent(
|
|
608
688
|
agent_id=prepared.target.agent_id,
|
|
609
689
|
version_id=prepared.target.version_id,
|
|
@@ -613,14 +693,14 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
613
693
|
route_kind=prepared.route.kind,
|
|
614
694
|
)
|
|
615
695
|
|
|
616
|
-
def _route_only_card(self, name: str, version: str) -> AgentCard:
|
|
696
|
+
def _route_only_card(self, name: str, version: str, *, streaming: bool = False) -> AgentCard:
|
|
617
697
|
return ParseDict(
|
|
618
698
|
{
|
|
619
699
|
"name": name,
|
|
620
700
|
"description": "AgentEngine prepared A2A route",
|
|
621
701
|
"version": version,
|
|
622
702
|
"supportedInterfaces": [],
|
|
623
|
-
"capabilities": {},
|
|
703
|
+
"capabilities": {"streaming": streaming},
|
|
624
704
|
"defaultInputModes": ["text/plain"],
|
|
625
705
|
"defaultOutputModes": ["text/plain"],
|
|
626
706
|
"skills": [],
|
|
@@ -687,7 +767,12 @@ class A2ASpaceClient(_SpaceClientEventMixin):
|
|
|
687
767
|
owned_http = None
|
|
688
768
|
if http is None:
|
|
689
769
|
# 外部调用方需自行传入已配置 verify 的 httpx_client。
|
|
690
|
-
|
|
770
|
+
verify = True
|
|
771
|
+
if prepared.route.kind == "hosted_gateway":
|
|
772
|
+
from ksadk.a2a.platform import _gateway_http_verify
|
|
773
|
+
|
|
774
|
+
verify = _gateway_http_verify()
|
|
775
|
+
owned_http = httpx.AsyncClient(trust_env=False, verify=verify)
|
|
691
776
|
http = owned_http
|
|
692
777
|
client = await create_client(
|
|
693
778
|
agent=route_card,
|
ksadk/a2a/task_adapter.py
CHANGED
|
@@ -16,6 +16,7 @@ cancel 一律走 G0.3 冻结的 ``RuntimeAdapter.cancel``(含 pending-cancel 语
|
|
|
16
16
|
from __future__ import annotations
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
|
+
import os
|
|
19
20
|
from collections.abc import AsyncIterator, Mapping
|
|
20
21
|
from typing import Any, Optional
|
|
21
22
|
|
|
@@ -140,16 +141,31 @@ class A2ARuntimeTaskAdapter:
|
|
|
140
141
|
input_data: Any,
|
|
141
142
|
) -> RunHandle:
|
|
142
143
|
"""通过 RuntimeAdapter 启动 A2A task,返回后续共用的真实 handle。"""
|
|
143
|
-
await self.prepare_context(context)
|
|
144
|
+
session_id = await self.prepare_context(context)
|
|
144
145
|
context_metadata = self._as_dict(getattr(context, "metadata", None))
|
|
145
146
|
context_metadata.pop("user_id", None)
|
|
146
147
|
context_metadata.pop("agent_id", None)
|
|
147
148
|
tenant = self._trusted_tenant(context)
|
|
149
|
+
from ksadk.sessions import resolve_session_service
|
|
150
|
+
|
|
151
|
+
service = resolve_session_service()
|
|
152
|
+
call_context = getattr(context, "call_context", None)
|
|
153
|
+
state = getattr(call_context, "state", None)
|
|
154
|
+
identity = state.get("a2a_identity") if isinstance(state, Mapping) else None
|
|
155
|
+
agent_id = (
|
|
156
|
+
str(identity.target_agent_id).strip()
|
|
157
|
+
if isinstance(identity, A2AIngressIdentity)
|
|
158
|
+
else os.environ.get("KSADK_A2A_AGENT_ID", "").strip()
|
|
159
|
+
)
|
|
160
|
+
if agent_id:
|
|
161
|
+
existing = await service.get_session_metadata(session_id)
|
|
162
|
+
if existing is None:
|
|
163
|
+
await service.create_session(agent_id, tenant, session_id=session_id)
|
|
148
164
|
handle = await self._adapter.start(
|
|
149
165
|
StartRequest(
|
|
150
166
|
input=input_data,
|
|
151
167
|
user_id=tenant,
|
|
152
|
-
session_id=
|
|
168
|
+
session_id=session_id,
|
|
153
169
|
agent_id=None,
|
|
154
170
|
metadata={**context_metadata, "invocation_id": task_id},
|
|
155
171
|
)
|
|
@@ -374,9 +390,7 @@ class A2ARuntimeTaskAdapter:
|
|
|
374
390
|
@classmethod
|
|
375
391
|
def _resume_payload(cls, state: A2AResumeState, *, answer: Any) -> ResumePayload:
|
|
376
392
|
data = (
|
|
377
|
-
cls._approval_decision(answer)
|
|
378
|
-
if state.payload_kind == "approval_decision"
|
|
379
|
-
else answer
|
|
393
|
+
cls._approval_decision(answer) if state.payload_kind == "approval_decision" else answer
|
|
380
394
|
)
|
|
381
395
|
return ResumePayload(kind=state.payload_kind, call_id=state.call_id, data=data)
|
|
382
396
|
|
|
@@ -10,6 +10,17 @@ from ksadk.a2a.task_event_outbox import A2ATaskEventOutbox
|
|
|
10
10
|
|
|
11
11
|
logger = logging.getLogger(__name__)
|
|
12
12
|
|
|
13
|
+
PERMANENT_TASK_EVENT_ERRORS = frozenset(
|
|
14
|
+
{
|
|
15
|
+
"A2A_EVENT_BATCH_TOO_LARGE",
|
|
16
|
+
"A2A_KERNEL_FACT_INVALID",
|
|
17
|
+
"A2A_EVENT_REF_CAPACITY",
|
|
18
|
+
"A2A_EVENT_REF_CONFLICT",
|
|
19
|
+
"A2A_EVENT_REF_INVALID",
|
|
20
|
+
"A2A_TASK_NOT_FOUND",
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
|
|
13
24
|
|
|
14
25
|
class A2ATaskEventSink(Protocol):
|
|
15
26
|
async def append_task_events(
|
|
@@ -45,6 +56,7 @@ class A2ATaskEventDispatcher:
|
|
|
45
56
|
self._background_task: asyncio.Task[None] | None = None
|
|
46
57
|
self._started = False
|
|
47
58
|
self._last_error: str | None = None
|
|
59
|
+
self._permanent_error: str | None = None
|
|
48
60
|
|
|
49
61
|
@property
|
|
50
62
|
def outbox(self) -> A2ATaskEventOutbox:
|
|
@@ -124,7 +136,15 @@ class A2ATaskEventDispatcher:
|
|
|
124
136
|
while True:
|
|
125
137
|
batches = await self._outbox.pending(limit=100)
|
|
126
138
|
if not batches:
|
|
127
|
-
|
|
139
|
+
# A background drain may have dead-lettered a batch before
|
|
140
|
+
# an explicit flush acquires this lock. Empty pending work
|
|
141
|
+
# is not proof that every queued batch was delivered.
|
|
142
|
+
self._last_error = self._permanent_error
|
|
143
|
+
if raise_on_error and self._permanent_error:
|
|
144
|
+
raise RuntimeError(
|
|
145
|
+
"A2A task event delivery was permanently rejected: "
|
|
146
|
+
+ self._permanent_error
|
|
147
|
+
)
|
|
128
148
|
return delivered
|
|
129
149
|
for batch in batches:
|
|
130
150
|
try:
|
|
@@ -139,6 +159,19 @@ class A2ATaskEventDispatcher:
|
|
|
139
159
|
error = str(getattr(exc, "error_code", "") or type(exc).__name__)
|
|
140
160
|
self._last_error = error
|
|
141
161
|
await self._outbox.record_failure(batch.batch_id, error)
|
|
162
|
+
if error in PERMANENT_TASK_EVENT_ERRORS:
|
|
163
|
+
await self._outbox.dead_letter(batch.batch_id, error)
|
|
164
|
+
self._permanent_error = error
|
|
165
|
+
logger.error(
|
|
166
|
+
"A2A task event batch was permanently rejected and moved "
|
|
167
|
+
"to dead letters: task=%s batch=%s error=%s",
|
|
168
|
+
batch.platform_task_id,
|
|
169
|
+
batch.batch_id,
|
|
170
|
+
error,
|
|
171
|
+
)
|
|
172
|
+
if raise_on_error:
|
|
173
|
+
raise
|
|
174
|
+
continue
|
|
142
175
|
if raise_on_error:
|
|
143
176
|
raise
|
|
144
177
|
logger.warning(
|
|
@@ -164,4 +197,8 @@ class A2ATaskEventDispatcher:
|
|
|
164
197
|
self._wake_event.clear()
|
|
165
198
|
|
|
166
199
|
|
|
167
|
-
__all__ = [
|
|
200
|
+
__all__ = [
|
|
201
|
+
"A2ATaskEventDispatcher",
|
|
202
|
+
"A2ATaskEventSink",
|
|
203
|
+
"PERMANENT_TASK_EVENT_ERRORS",
|
|
204
|
+
]
|
ksadk/a2a/task_event_outbox.py
CHANGED
|
@@ -12,6 +12,9 @@ from dataclasses import dataclass
|
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from typing import Any
|
|
14
14
|
|
|
15
|
+
from sqlalchemy import text
|
|
16
|
+
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
17
|
+
|
|
15
18
|
ENV_A2A_EVENT_OUTBOX_PATH = "KSADK_A2A_EVENT_OUTBOX_PATH"
|
|
16
19
|
DEFAULT_A2A_EVENT_OUTBOX_PATH = ".agentengine/a2a_event_outbox.sqlite3"
|
|
17
20
|
|
|
@@ -57,6 +60,12 @@ class A2ATaskEventOutbox(ABC):
|
|
|
57
60
|
async def record_failure(self, batch_id: str, error: str) -> None:
|
|
58
61
|
raise NotImplementedError
|
|
59
62
|
|
|
63
|
+
@abstractmethod
|
|
64
|
+
async def dead_letter(self, batch_id: str, error: str) -> None:
|
|
65
|
+
"""Preserve a permanently rejected batch outside the live FIFO."""
|
|
66
|
+
|
|
67
|
+
raise NotImplementedError
|
|
68
|
+
|
|
60
69
|
|
|
61
70
|
def _serialize_events(events: list[dict[str, Any]]) -> str:
|
|
62
71
|
return json.dumps(events, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
|
|
@@ -72,6 +81,7 @@ class InMemoryA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
|
72
81
|
|
|
73
82
|
def __init__(self) -> None:
|
|
74
83
|
self._batches: dict[str, A2ATaskEventBatch] = {}
|
|
84
|
+
self._dead_letters: dict[str, tuple[A2ATaskEventBatch, str]] = {}
|
|
75
85
|
self._lock = asyncio.Lock()
|
|
76
86
|
self._next_sequence = 0
|
|
77
87
|
|
|
@@ -120,6 +130,12 @@ class InMemoryA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
|
120
130
|
attempt_count=batch.attempt_count + 1,
|
|
121
131
|
)
|
|
122
132
|
|
|
133
|
+
async def dead_letter(self, batch_id: str, error: str) -> None:
|
|
134
|
+
async with self._lock:
|
|
135
|
+
batch = self._batches.pop(batch_id, None)
|
|
136
|
+
if batch is not None:
|
|
137
|
+
self._dead_letters[batch_id] = (batch, error[:512])
|
|
138
|
+
|
|
123
139
|
|
|
124
140
|
class SQLiteA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
125
141
|
"""SQLite adapter with stable batch IDs and crash-safe acknowledgement."""
|
|
@@ -178,6 +194,20 @@ class SQLiteA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
|
178
194
|
)
|
|
179
195
|
"""
|
|
180
196
|
)
|
|
197
|
+
connection.execute(
|
|
198
|
+
"""
|
|
199
|
+
CREATE TABLE IF NOT EXISTS a2a_task_event_dead_letters (
|
|
200
|
+
sequence INTEGER NOT NULL,
|
|
201
|
+
batch_id TEXT PRIMARY KEY,
|
|
202
|
+
platform_task_id TEXT NOT NULL,
|
|
203
|
+
events_json TEXT NOT NULL,
|
|
204
|
+
created_at TEXT NOT NULL,
|
|
205
|
+
attempt_count INTEGER NOT NULL,
|
|
206
|
+
last_error TEXT NOT NULL,
|
|
207
|
+
dead_lettered_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
208
|
+
)
|
|
209
|
+
"""
|
|
210
|
+
)
|
|
181
211
|
connection.execute(
|
|
182
212
|
"""
|
|
183
213
|
INSERT OR IGNORE INTO a2a_task_event_outbox_sequence(sequence)
|
|
@@ -250,6 +280,10 @@ class SQLiteA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
|
250
280
|
(error[:512], batch_id),
|
|
251
281
|
)
|
|
252
282
|
|
|
283
|
+
async def dead_letter(self, batch_id: str, error: str) -> None:
|
|
284
|
+
await self.initialize()
|
|
285
|
+
await asyncio.to_thread(self._dead_letter_sync, batch_id, error[:512])
|
|
286
|
+
|
|
253
287
|
def _execute(self, statement: str, params: tuple[Any, ...]) -> None:
|
|
254
288
|
connection = sqlite3.connect(self._path, timeout=5)
|
|
255
289
|
try:
|
|
@@ -298,6 +332,35 @@ class SQLiteA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
|
298
332
|
finally:
|
|
299
333
|
connection.close()
|
|
300
334
|
|
|
335
|
+
def _dead_letter_sync(self, batch_id: str, error: str) -> None:
|
|
336
|
+
connection = sqlite3.connect(self._path, timeout=5, isolation_level=None)
|
|
337
|
+
try:
|
|
338
|
+
connection.execute("PRAGMA synchronous=FULL")
|
|
339
|
+
connection.execute("BEGIN IMMEDIATE")
|
|
340
|
+
connection.execute(
|
|
341
|
+
"""
|
|
342
|
+
INSERT OR IGNORE INTO a2a_task_event_dead_letters(
|
|
343
|
+
sequence, batch_id, platform_task_id, events_json, created_at,
|
|
344
|
+
attempt_count, last_error
|
|
345
|
+
)
|
|
346
|
+
SELECT sequence, batch_id, platform_task_id, events_json, created_at,
|
|
347
|
+
attempt_count, ?
|
|
348
|
+
FROM a2a_task_event_outbox
|
|
349
|
+
WHERE batch_id = ?
|
|
350
|
+
""",
|
|
351
|
+
(error, batch_id),
|
|
352
|
+
)
|
|
353
|
+
connection.execute(
|
|
354
|
+
"DELETE FROM a2a_task_event_outbox WHERE batch_id = ?",
|
|
355
|
+
(batch_id,),
|
|
356
|
+
)
|
|
357
|
+
connection.execute("COMMIT")
|
|
358
|
+
except BaseException:
|
|
359
|
+
connection.rollback()
|
|
360
|
+
raise
|
|
361
|
+
finally:
|
|
362
|
+
connection.close()
|
|
363
|
+
|
|
301
364
|
def _pending_sync(self, limit: int) -> list[tuple[Any, ...]]:
|
|
302
365
|
connection = sqlite3.connect(self._path, timeout=5)
|
|
303
366
|
try:
|
|
@@ -316,11 +379,163 @@ class SQLiteA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
|
316
379
|
connection.close()
|
|
317
380
|
|
|
318
381
|
|
|
382
|
+
class PostgresA2ATaskEventOutbox(A2ATaskEventOutbox):
|
|
383
|
+
"""Shared ordered outbox for multi-replica managed Runtimes."""
|
|
384
|
+
|
|
385
|
+
def __init__(self, engine: AsyncEngine) -> None:
|
|
386
|
+
self._engine = engine
|
|
387
|
+
|
|
388
|
+
async def initialize(self) -> None:
|
|
389
|
+
async with self._engine.begin() as connection:
|
|
390
|
+
await connection.execute(
|
|
391
|
+
text(
|
|
392
|
+
"""
|
|
393
|
+
CREATE TABLE IF NOT EXISTS ksadk_a2a_task_event_outbox (
|
|
394
|
+
sequence BIGSERIAL PRIMARY KEY,
|
|
395
|
+
batch_id TEXT NOT NULL UNIQUE,
|
|
396
|
+
platform_task_id TEXT NOT NULL,
|
|
397
|
+
events_json TEXT NOT NULL,
|
|
398
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
399
|
+
attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
400
|
+
last_error TEXT
|
|
401
|
+
)
|
|
402
|
+
"""
|
|
403
|
+
)
|
|
404
|
+
)
|
|
405
|
+
await connection.execute(
|
|
406
|
+
text(
|
|
407
|
+
"""
|
|
408
|
+
CREATE TABLE IF NOT EXISTS ksadk_a2a_task_event_dead_letters (
|
|
409
|
+
sequence BIGINT NOT NULL,
|
|
410
|
+
batch_id TEXT PRIMARY KEY,
|
|
411
|
+
platform_task_id TEXT NOT NULL,
|
|
412
|
+
events_json TEXT NOT NULL,
|
|
413
|
+
created_at TIMESTAMPTZ NOT NULL,
|
|
414
|
+
attempt_count INTEGER NOT NULL,
|
|
415
|
+
last_error TEXT NOT NULL,
|
|
416
|
+
dead_lettered_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
417
|
+
)
|
|
418
|
+
"""
|
|
419
|
+
)
|
|
420
|
+
)
|
|
421
|
+
await connection.execute(
|
|
422
|
+
text(
|
|
423
|
+
"CREATE INDEX IF NOT EXISTS ix_ksadk_a2a_outbox_created "
|
|
424
|
+
"ON ksadk_a2a_task_event_outbox(sequence)"
|
|
425
|
+
)
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
async def ensure_writable(self) -> None:
|
|
429
|
+
await self.initialize()
|
|
430
|
+
async with self._engine.begin() as connection:
|
|
431
|
+
await connection.execute(
|
|
432
|
+
text("LOCK TABLE ksadk_a2a_task_event_outbox IN ROW EXCLUSIVE MODE")
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
async def enqueue(
|
|
436
|
+
self,
|
|
437
|
+
*,
|
|
438
|
+
platform_task_id: str,
|
|
439
|
+
events: list[dict[str, Any]],
|
|
440
|
+
) -> str:
|
|
441
|
+
events_json = _serialize_events(events)
|
|
442
|
+
batch_id = _batch_id(platform_task_id, events_json)
|
|
443
|
+
async with self._engine.begin() as connection:
|
|
444
|
+
await connection.execute(
|
|
445
|
+
text(
|
|
446
|
+
"""
|
|
447
|
+
INSERT INTO ksadk_a2a_task_event_outbox(
|
|
448
|
+
batch_id, platform_task_id, events_json
|
|
449
|
+
) VALUES (:batch_id, :platform_task_id, :events_json)
|
|
450
|
+
ON CONFLICT(batch_id) DO NOTHING
|
|
451
|
+
"""
|
|
452
|
+
),
|
|
453
|
+
{
|
|
454
|
+
"batch_id": batch_id,
|
|
455
|
+
"platform_task_id": platform_task_id,
|
|
456
|
+
"events_json": events_json,
|
|
457
|
+
},
|
|
458
|
+
)
|
|
459
|
+
return batch_id
|
|
460
|
+
|
|
461
|
+
async def pending(self, *, limit: int = 100) -> list[A2ATaskEventBatch]:
|
|
462
|
+
async with self._engine.connect() as connection:
|
|
463
|
+
result = await connection.execute(
|
|
464
|
+
text(
|
|
465
|
+
"""
|
|
466
|
+
SELECT sequence, batch_id, platform_task_id, events_json, attempt_count
|
|
467
|
+
FROM ksadk_a2a_task_event_outbox
|
|
468
|
+
ORDER BY sequence
|
|
469
|
+
LIMIT :limit
|
|
470
|
+
"""
|
|
471
|
+
),
|
|
472
|
+
{"limit": limit},
|
|
473
|
+
)
|
|
474
|
+
rows = result.fetchall()
|
|
475
|
+
return [
|
|
476
|
+
A2ATaskEventBatch(
|
|
477
|
+
sequence=int(row[0]),
|
|
478
|
+
batch_id=str(row[1]),
|
|
479
|
+
platform_task_id=str(row[2]),
|
|
480
|
+
events=list(json.loads(str(row[3]))),
|
|
481
|
+
attempt_count=int(row[4]),
|
|
482
|
+
)
|
|
483
|
+
for row in rows
|
|
484
|
+
]
|
|
485
|
+
|
|
486
|
+
async def acknowledge(self, batch_id: str) -> None:
|
|
487
|
+
async with self._engine.begin() as connection:
|
|
488
|
+
await connection.execute(
|
|
489
|
+
text("DELETE FROM ksadk_a2a_task_event_outbox WHERE batch_id = :batch_id"),
|
|
490
|
+
{"batch_id": batch_id},
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
async def record_failure(self, batch_id: str, error: str) -> None:
|
|
494
|
+
async with self._engine.begin() as connection:
|
|
495
|
+
await connection.execute(
|
|
496
|
+
text(
|
|
497
|
+
"""
|
|
498
|
+
UPDATE ksadk_a2a_task_event_outbox
|
|
499
|
+
SET attempt_count = attempt_count + 1, last_error = :error
|
|
500
|
+
WHERE batch_id = :batch_id
|
|
501
|
+
"""
|
|
502
|
+
),
|
|
503
|
+
{"batch_id": batch_id, "error": error[:512]},
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
async def dead_letter(self, batch_id: str, error: str) -> None:
|
|
507
|
+
async with self._engine.begin() as connection:
|
|
508
|
+
await connection.execute(
|
|
509
|
+
text(
|
|
510
|
+
"""
|
|
511
|
+
INSERT INTO ksadk_a2a_task_event_dead_letters(
|
|
512
|
+
sequence, batch_id, platform_task_id, events_json, created_at,
|
|
513
|
+
attempt_count, last_error
|
|
514
|
+
)
|
|
515
|
+
SELECT sequence, batch_id, platform_task_id, events_json, created_at,
|
|
516
|
+
attempt_count, :error
|
|
517
|
+
FROM ksadk_a2a_task_event_outbox
|
|
518
|
+
WHERE batch_id = :batch_id
|
|
519
|
+
ON CONFLICT(batch_id) DO NOTHING
|
|
520
|
+
"""
|
|
521
|
+
),
|
|
522
|
+
{"batch_id": batch_id, "error": error[:512]},
|
|
523
|
+
)
|
|
524
|
+
await connection.execute(
|
|
525
|
+
text(
|
|
526
|
+
"DELETE FROM ksadk_a2a_task_event_outbox "
|
|
527
|
+
"WHERE batch_id = :batch_id"
|
|
528
|
+
),
|
|
529
|
+
{"batch_id": batch_id},
|
|
530
|
+
)
|
|
531
|
+
|
|
532
|
+
|
|
319
533
|
__all__ = [
|
|
320
534
|
"A2ATaskEventBatch",
|
|
321
535
|
"A2ATaskEventOutbox",
|
|
322
536
|
"DEFAULT_A2A_EVENT_OUTBOX_PATH",
|
|
323
537
|
"ENV_A2A_EVENT_OUTBOX_PATH",
|
|
324
538
|
"InMemoryA2ATaskEventOutbox",
|
|
539
|
+
"PostgresA2ATaskEventOutbox",
|
|
325
540
|
"SQLiteA2ATaskEventOutbox",
|
|
326
541
|
]
|