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/adk_tools.py
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
"""Managed ADK tool execution with native call identity and run-owned events."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from contextlib import aclosing, contextmanager
|
|
5
|
+
from contextvars import ContextVar
|
|
6
|
+
|
|
7
|
+
from google.adk.tools.function_tool import FunctionTool
|
|
8
|
+
|
|
9
|
+
from ksadk.a2a.adk import _project
|
|
10
|
+
from ksadk.a2a.adk_invocation_context import ADKInvocationContextProvider, _path
|
|
11
|
+
from ksadk.a2a.exposure import compile_exposure_plan
|
|
12
|
+
from ksadk.a2a.invocation_types import RemoteAgentSpec
|
|
13
|
+
from ksadk.a2a.presentation import ScopeTriggerRef
|
|
14
|
+
from ksadk.events.identity import stable_item_id, stable_scope_id
|
|
15
|
+
|
|
16
|
+
_binding = ContextVar("managed_adk_tools", default=None)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def native_tool_trigger(tool_context, tool_name="call_a2a_agent"):
|
|
20
|
+
ctx = tool_context._invocation_context
|
|
21
|
+
call_id = tool_context.function_call_id
|
|
22
|
+
if not call_id:
|
|
23
|
+
raise ValueError("A2A_NATIVE_TRIGGER_ID_REQUIRED")
|
|
24
|
+
for event in reversed(ctx.session.events):
|
|
25
|
+
if (
|
|
26
|
+
event.invocation_id != ctx.invocation_id
|
|
27
|
+
or event.author != ctx.agent.name
|
|
28
|
+
or event.branch != ctx.branch
|
|
29
|
+
):
|
|
30
|
+
continue
|
|
31
|
+
calls = [
|
|
32
|
+
part.function_call
|
|
33
|
+
for part in (getattr(event.content, "parts", None) or ())
|
|
34
|
+
if part.function_call is not None and part.function_call.id == call_id
|
|
35
|
+
]
|
|
36
|
+
if not calls:
|
|
37
|
+
continue
|
|
38
|
+
if len(calls) != 1 or calls[0].name != tool_name or not event.id:
|
|
39
|
+
raise ValueError("A2A_NATIVE_TRIGGER_AMBIGUOUS")
|
|
40
|
+
path = _path(event)
|
|
41
|
+
return ScopeTriggerRef(
|
|
42
|
+
scope_id=stable_scope_id("adk", event.invocation_id, path),
|
|
43
|
+
item_id=stable_item_id(
|
|
44
|
+
"adk", event.invocation_id, path, event.id, call_id, "tool_call"
|
|
45
|
+
),
|
|
46
|
+
call_id=call_id,
|
|
47
|
+
)
|
|
48
|
+
raise ValueError("A2A_NATIVE_TRIGGER_CALL_MISSING")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ManagedA2ACallTool(FunctionTool):
|
|
52
|
+
def __init__(self):
|
|
53
|
+
from ksadk.toolsets.a2a import call_a2a_agent
|
|
54
|
+
|
|
55
|
+
super().__init__(call_a2a_agent)
|
|
56
|
+
|
|
57
|
+
async def run_async(self, *, args, tool_context):
|
|
58
|
+
runtime = _binding.get()
|
|
59
|
+
if runtime is None:
|
|
60
|
+
return {"ok": False, "error_type": "A2A_MANAGED_INVOCATION_CONTEXT_REQUIRED"}
|
|
61
|
+
try:
|
|
62
|
+
spec = getattr(self, "remote_spec", None)
|
|
63
|
+
if spec is not None:
|
|
64
|
+
return await runtime.call(args, tool_context, fixed_spec=spec)
|
|
65
|
+
return await runtime.call(args, tool_context)
|
|
66
|
+
except Exception as exc:
|
|
67
|
+
code = str(exc)
|
|
68
|
+
if not code.startswith("A2A_") or len(code) >= 128:
|
|
69
|
+
code = "A2A_INVOCATION_FAILED"
|
|
70
|
+
return {
|
|
71
|
+
"ok": False,
|
|
72
|
+
"error_type": code,
|
|
73
|
+
"error_message": "Managed A2A invocation failed",
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class ManagedA2AHandoffTool(ManagedA2ACallTool):
|
|
78
|
+
"""A fixed remote expert; the model supplies only the message."""
|
|
79
|
+
|
|
80
|
+
def __init__(self, spec):
|
|
81
|
+
spec = RemoteAgentSpec.model_validate(spec.model_dump())
|
|
82
|
+
compile_exposure_plan([spec], framework="adk", consumer_id=spec.local_name)
|
|
83
|
+
|
|
84
|
+
async def invoke(message: str):
|
|
85
|
+
raise RuntimeError("A2A_MANAGED_INVOCATION_CONTEXT_REQUIRED")
|
|
86
|
+
|
|
87
|
+
invoke.__name__ = spec.local_name
|
|
88
|
+
invoke.__doc__ = spec.description or "Delegate to this fixed remote expert and receive its result."
|
|
89
|
+
FunctionTool.__init__(self, invoke)
|
|
90
|
+
self.remote_spec = spec
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def adk_exposure_plan(root):
|
|
94
|
+
pending, seen, specs = [root], set(), []
|
|
95
|
+
while pending:
|
|
96
|
+
node = pending.pop()
|
|
97
|
+
if id(node) in seen:
|
|
98
|
+
continue
|
|
99
|
+
seen.add(id(node))
|
|
100
|
+
spec = getattr(node, "remote_spec", None)
|
|
101
|
+
if spec is not None:
|
|
102
|
+
specs.append(spec)
|
|
103
|
+
pending.extend(getattr(node, "sub_agents", ()) or ())
|
|
104
|
+
pending.extend(getattr(node, "tools", ()) or ())
|
|
105
|
+
if len({spec.target_agent_id for spec in specs}) != len(specs):
|
|
106
|
+
raise ValueError("A2A_EXPOSURE_CONFLICT")
|
|
107
|
+
return compile_exposure_plan(specs, framework="adk", consumer_id=root.name)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class ManagedA2ADiscoveryTool(FunctionTool):
|
|
111
|
+
def __init__(self, func):
|
|
112
|
+
super().__init__(func)
|
|
113
|
+
self._detail = func.__name__ == "get_a2a_agent_card"
|
|
114
|
+
|
|
115
|
+
async def run_async(self, *, args, tool_context):
|
|
116
|
+
runtime = _binding.get()
|
|
117
|
+
if runtime is None:
|
|
118
|
+
return {"ok": False, "error_type": "A2A_MANAGED_INVOCATION_CONTEXT_REQUIRED"}
|
|
119
|
+
try:
|
|
120
|
+
if self._detail and (
|
|
121
|
+
not isinstance(args.get("agent"), str) or not args["agent"].strip()
|
|
122
|
+
):
|
|
123
|
+
raise ValueError("A2A_AGENT_REQUIRED")
|
|
124
|
+
return await runtime.discover(args.get("agent") if self._detail else None)
|
|
125
|
+
except Exception as exc:
|
|
126
|
+
code = str(exc)
|
|
127
|
+
if not code.startswith("A2A_") or len(code) >= 128:
|
|
128
|
+
code = "A2A_DISCOVERY_FAILED"
|
|
129
|
+
return {
|
|
130
|
+
"ok": False,
|
|
131
|
+
"error_type": code,
|
|
132
|
+
"error_message": "Managed A2A discovery failed",
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def install_managed_tools(root):
|
|
137
|
+
"""Replace only the SDK function, never an unrelated tool with the same name."""
|
|
138
|
+
from ksadk.toolsets.a2a import call_a2a_agent, get_a2a_agent_card, list_a2a_agents
|
|
139
|
+
|
|
140
|
+
pending, seen = [root], set()
|
|
141
|
+
while pending:
|
|
142
|
+
node = pending.pop()
|
|
143
|
+
if id(node) in seen:
|
|
144
|
+
continue
|
|
145
|
+
seen.add(id(node))
|
|
146
|
+
if hasattr(node, "tools"):
|
|
147
|
+
replaced = []
|
|
148
|
+
for tool in node.tools:
|
|
149
|
+
func = getattr(tool, "func", None) or getattr(tool, "coroutine", None) or tool
|
|
150
|
+
if func is call_a2a_agent:
|
|
151
|
+
tool = ManagedA2ACallTool()
|
|
152
|
+
elif func is list_a2a_agents or func is get_a2a_agent_card:
|
|
153
|
+
tool = ManagedA2ADiscoveryTool(func)
|
|
154
|
+
replaced.append(tool)
|
|
155
|
+
node.tools = replaced
|
|
156
|
+
pending.extend(getattr(node, "sub_agents", ()) or ())
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class ManagedADKTools:
|
|
160
|
+
def __init__(self, *, bootstrap, authority, services, emit):
|
|
161
|
+
self.bootstrap, self.authority = bootstrap, authority
|
|
162
|
+
self.services, self.emit = services, emit
|
|
163
|
+
|
|
164
|
+
async def discover(self, agent_ref=None):
|
|
165
|
+
from ksadk.toolsets.a2a import _a2a_space_id, _normalize_agent_ref
|
|
166
|
+
|
|
167
|
+
self.authority.require_session(self.authority.session_id)
|
|
168
|
+
space = _a2a_space_id()
|
|
169
|
+
if not space:
|
|
170
|
+
raise ValueError("A2A_SPACE_REQUIRED")
|
|
171
|
+
discovered = await self.bootstrap.client_for_space(space).discover()
|
|
172
|
+
# Only public discovery metadata is returned to the model. Connection
|
|
173
|
+
# origins, credentials and prepared routes belong to the runtime client.
|
|
174
|
+
agents = [
|
|
175
|
+
{
|
|
176
|
+
"agent_id": agent.agent_id,
|
|
177
|
+
"name": agent.agent_card.name,
|
|
178
|
+
"description": getattr(agent.agent_card, "description", ""),
|
|
179
|
+
"version_id": agent.version_id,
|
|
180
|
+
"card_sha256": getattr(agent, "card_sha256", ""),
|
|
181
|
+
"source": getattr(agent, "source", "hosted"),
|
|
182
|
+
}
|
|
183
|
+
for agent in discovered
|
|
184
|
+
]
|
|
185
|
+
if agent_ref is None:
|
|
186
|
+
return {"ok": True, "space_id": space, "agents": agents}
|
|
187
|
+
target = _normalize_agent_ref(str(agent_ref))
|
|
188
|
+
matches = [
|
|
189
|
+
agent
|
|
190
|
+
for agent in agents
|
|
191
|
+
if target
|
|
192
|
+
and target
|
|
193
|
+
in {_normalize_agent_ref(agent["agent_id"]), _normalize_agent_ref(agent["name"])}
|
|
194
|
+
]
|
|
195
|
+
if len(matches) != 1:
|
|
196
|
+
raise ValueError("A2A_AGENT_NOT_FOUND" if not matches else "A2A_AGENT_AMBIGUOUS")
|
|
197
|
+
return {"ok": True, "agent": matches[0]}
|
|
198
|
+
|
|
199
|
+
async def call(self, args, tool_context, *, fixed_spec=None):
|
|
200
|
+
from ksadk.a2a.runtime_input import invoke_with_input
|
|
201
|
+
from ksadk.events.content import TextContent, ToolCallContent
|
|
202
|
+
from ksadk.toolsets.a2a import _a2a_space_id, _normalize_agent_ref
|
|
203
|
+
|
|
204
|
+
message = args.get("message")
|
|
205
|
+
if not isinstance(message, str) or not message.strip():
|
|
206
|
+
raise ValueError("A2A_MESSAGE_REQUIRED")
|
|
207
|
+
tool_name = fixed_spec.local_name if fixed_spec is not None else "call_a2a_agent"
|
|
208
|
+
trigger = native_tool_trigger(tool_context, tool_name)
|
|
209
|
+
ctx = tool_context._invocation_context
|
|
210
|
+
self.authority.require_session(self.authority.session_id)
|
|
211
|
+
# Native session IDs may be mapped from the public session. Bind the
|
|
212
|
+
# actual native call to its already-persisted public fact instead of
|
|
213
|
+
# assuming those session strings are equal (or trusting another run's
|
|
214
|
+
# ToolContext merely because its call_id has the same spelling).
|
|
215
|
+
facts = await self.authority.list(self.authority.session_id)
|
|
216
|
+
bound = False
|
|
217
|
+
for event in facts:
|
|
218
|
+
if (
|
|
219
|
+
event.scope_id != trigger.scope_id
|
|
220
|
+
or getattr(event, "item_id", None) != trigger.item_id
|
|
221
|
+
):
|
|
222
|
+
continue
|
|
223
|
+
snapshot = getattr(event, "initial", None) or getattr(event, "snapshot", None)
|
|
224
|
+
if snapshot is not None and any(
|
|
225
|
+
isinstance(part, ToolCallContent)
|
|
226
|
+
and part.call_id == trigger.call_id
|
|
227
|
+
and part.name == tool_name
|
|
228
|
+
for part in snapshot.parts
|
|
229
|
+
):
|
|
230
|
+
bound = True
|
|
231
|
+
break
|
|
232
|
+
if not bound:
|
|
233
|
+
raise ValueError("A2A_NATIVE_TRIGGER_NOT_PERSISTED")
|
|
234
|
+
if fixed_spec is not None:
|
|
235
|
+
spec = RemoteAgentSpec.model_validate(fixed_spec.model_dump())
|
|
236
|
+
if set(args) != {"message"}:
|
|
237
|
+
raise ValueError("A2A_FIXED_TARGET_ARGUMENT_INVALID")
|
|
238
|
+
declarations = [tool.remote_spec for tool in ctx.agent.tools
|
|
239
|
+
if isinstance(tool, ManagedA2AHandoffTool) and tool.name == tool_name]
|
|
240
|
+
if declarations != [spec]:
|
|
241
|
+
raise ValueError("A2A_BINDING_MISMATCH")
|
|
242
|
+
adk_exposure_plan(ctx.agent)
|
|
243
|
+
else:
|
|
244
|
+
space = _a2a_space_id()
|
|
245
|
+
if not space:
|
|
246
|
+
raise ValueError("A2A_SPACE_REQUIRED")
|
|
247
|
+
discovered = await self.bootstrap.client_for_space(space).discover()
|
|
248
|
+
target = _normalize_agent_ref(str(args.get("agent") or ""))
|
|
249
|
+
matches = [
|
|
250
|
+
agent
|
|
251
|
+
for agent in discovered
|
|
252
|
+
if target
|
|
253
|
+
in {_normalize_agent_ref(agent.agent_id), _normalize_agent_ref(agent.agent_card.name)}
|
|
254
|
+
]
|
|
255
|
+
if len(matches) != 1:
|
|
256
|
+
raise ValueError("A2A_AGENT_NOT_FOUND" if not matches else "A2A_AGENT_AMBIGUOUS")
|
|
257
|
+
agent = matches[0]
|
|
258
|
+
plan = adk_exposure_plan(ctx.agent)
|
|
259
|
+
if any(isinstance(tool, ManagedA2AHandoffTool) and tool.remote_spec.target_agent_id == agent.agent_id
|
|
260
|
+
for tool in ctx.agent.tools):
|
|
261
|
+
raise ValueError("A2A_EXPOSURE_CONFLICT")
|
|
262
|
+
plan.assert_generic_target_allowed(agent.agent_id)
|
|
263
|
+
spec = RemoteAgentSpec(
|
|
264
|
+
local_name="call_a2a_agent",
|
|
265
|
+
binding_id=stable_item_id("a2a", space, agent.agent_id),
|
|
266
|
+
space_id=space,
|
|
267
|
+
target_agent_id=agent.agent_id,
|
|
268
|
+
expected_version_id=agent.version_id,
|
|
269
|
+
exposure="tool",
|
|
270
|
+
)
|
|
271
|
+
provider = ADKInvocationContextProvider(
|
|
272
|
+
authority=self.authority,
|
|
273
|
+
service_for_space=self.services,
|
|
274
|
+
caller_agent_id=self.bootstrap.runtime_metadata.agent_id,
|
|
275
|
+
message_selector=lambda *_: (message,),
|
|
276
|
+
workflow_trigger=lambda *_: (trigger, ()),
|
|
277
|
+
)
|
|
278
|
+
resolved = await provider(ctx, spec)
|
|
279
|
+
service, request = resolved.service, resolved.request
|
|
280
|
+
texts = {}
|
|
281
|
+
item_kinds = {}
|
|
282
|
+
try:
|
|
283
|
+
async with aclosing(invoke_with_input(service, request, trigger_ref=trigger)) as events:
|
|
284
|
+
async for event in events:
|
|
285
|
+
if event.event_type == "item.completed" and event.item_kind in {
|
|
286
|
+
"message",
|
|
287
|
+
"artifact",
|
|
288
|
+
}:
|
|
289
|
+
item_kinds[(event.scope_id, event.item_id)] = event.item_kind
|
|
290
|
+
texts[(event.scope_id, event.item_id)] = {
|
|
291
|
+
part.part_id: part.text
|
|
292
|
+
for part in event.snapshot.parts
|
|
293
|
+
if isinstance(part, TextContent)
|
|
294
|
+
}
|
|
295
|
+
await self.emit(_project(event, ctx.agent.name, ctx))
|
|
296
|
+
except (asyncio.CancelledError, TimeoutError):
|
|
297
|
+
try:
|
|
298
|
+
await asyncio.shield(service.cancel(service.handle(request.scope_id)))
|
|
299
|
+
finally:
|
|
300
|
+
raise
|
|
301
|
+
snapshot = service.snapshot(service.handle(request.scope_id))
|
|
302
|
+
from ksadk.a2a.result_text import select_terminal_reply
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
"ok": snapshot.status == "completed",
|
|
306
|
+
"agent": spec.target_agent_id,
|
|
307
|
+
"task_id": snapshot.handle.platform_task_id,
|
|
308
|
+
"state": snapshot.status,
|
|
309
|
+
"reply": select_terminal_reply(snapshot.output_refs, texts, item_kinds),
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@contextmanager
|
|
314
|
+
def bind_managed_adk_tools(runtime):
|
|
315
|
+
token = _binding.set(runtime)
|
|
316
|
+
try:
|
|
317
|
+
yield
|
|
318
|
+
finally:
|
|
319
|
+
_binding.reset(token)
|
ksadk/a2a/bootstrap.py
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import asyncio
|
|
5
6
|
import inspect
|
|
7
|
+
from collections.abc import Awaitable, Callable
|
|
6
8
|
from dataclasses import dataclass
|
|
7
9
|
from typing import Any, Protocol, Sequence
|
|
8
10
|
from urllib.parse import urlsplit
|
|
@@ -26,10 +28,15 @@ from ksadk.a2a.resume_store import A2AResumeStateStore
|
|
|
26
28
|
from ksadk.a2a.routes import A2AConfig, add_a2a_protocol_routes
|
|
27
29
|
from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
|
|
28
30
|
from ksadk.a2a.task_event_dispatcher import A2ATaskEventDispatcher
|
|
31
|
+
from ksadk.a2a.product_kernel_facts import ProductKernelFactSink, ProductKernelReconciler
|
|
29
32
|
from ksadk.a2a.task_event_outbox import A2ATaskEventOutbox
|
|
30
33
|
from ksadk.a2a.task_store import A2AOwnerContextBuilder
|
|
34
|
+
from ksadk.a2a.tool_activity import PublicToolActivityPolicy
|
|
35
|
+
from ksadk.managed_a2a_card import ManagedA2ACardConfig, ManagedA2ACardMount
|
|
31
36
|
from ksadk.runtime.adapter import RuntimeAdapter
|
|
32
37
|
|
|
38
|
+
MANAGED_MODEL_READ_TIMEOUT_SECONDS = 300.0
|
|
39
|
+
|
|
33
40
|
|
|
34
41
|
@dataclass(frozen=True)
|
|
35
42
|
class RuntimeA2AMetadata:
|
|
@@ -44,7 +51,7 @@ class RuntimeA2AMetadata:
|
|
|
44
51
|
skills: Sequence[AgentSkill]
|
|
45
52
|
description: str = ""
|
|
46
53
|
|
|
47
|
-
def validate(self) -> None:
|
|
54
|
+
def validate(self, *, inbound_enabled: bool = True) -> None:
|
|
48
55
|
values = {
|
|
49
56
|
"account_id": self.account_id,
|
|
50
57
|
"agent_id": self.agent_id,
|
|
@@ -54,16 +61,22 @@ class RuntimeA2AMetadata:
|
|
|
54
61
|
"name": self.name,
|
|
55
62
|
"version": self.version,
|
|
56
63
|
}
|
|
57
|
-
|
|
64
|
+
inbound_fields = {"a2a_agent_id", "internal_base_url", "name", "version"}
|
|
65
|
+
missing = [
|
|
66
|
+
name
|
|
67
|
+
for name, value in values.items()
|
|
68
|
+
if not str(value).strip() and (inbound_enabled or name not in inbound_fields)
|
|
69
|
+
]
|
|
58
70
|
if missing:
|
|
59
71
|
raise ValueError(f"RuntimeA2AMetadata is missing required fields: {', '.join(missing)}")
|
|
60
72
|
if not self.agent_id.startswith("ar-"):
|
|
61
73
|
raise ValueError("RuntimeA2AMetadata.agent_id must be an ar-* Agent ID")
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
74
|
+
if inbound_enabled or self.a2a_agent_id:
|
|
75
|
+
require_a2a_resource_id(
|
|
76
|
+
self.a2a_agent_id,
|
|
77
|
+
"a2a-agent-",
|
|
78
|
+
field_name="RuntimeA2AMetadata.a2a_agent_id",
|
|
79
|
+
)
|
|
67
80
|
for field_name, limit in (
|
|
68
81
|
("account_id", 64),
|
|
69
82
|
("tenant_id", 64),
|
|
@@ -82,6 +95,8 @@ class RuntimeA2AMetadata:
|
|
|
82
95
|
raise ValueError(
|
|
83
96
|
"RuntimeA2AMetadata.skills must contain at most 100 AgentSkill objects"
|
|
84
97
|
)
|
|
98
|
+
if not inbound_enabled and not self.internal_base_url:
|
|
99
|
+
return
|
|
85
100
|
parsed = urlsplit(self.internal_base_url)
|
|
86
101
|
try:
|
|
87
102
|
port = parsed.port
|
|
@@ -98,7 +113,8 @@ class RuntimeA2AMetadata:
|
|
|
98
113
|
or parsed.query
|
|
99
114
|
or parsed.fragment
|
|
100
115
|
or parsed.netloc.rsplit("@", 1)[-1].endswith(":")
|
|
101
|
-
or port is not None
|
|
116
|
+
or port is not None
|
|
117
|
+
and not 1 <= port <= 65535
|
|
102
118
|
):
|
|
103
119
|
raise ValueError(
|
|
104
120
|
"RuntimeA2AMetadata.internal_base_url must be an absolute HTTP(S) origin"
|
|
@@ -128,12 +144,15 @@ class AgentEngineA2ABootstrap:
|
|
|
128
144
|
control_plane: Any | None = None,
|
|
129
145
|
hosted_http_client: httpx.AsyncClient | None = None,
|
|
130
146
|
event_outbox: A2ATaskEventOutbox | None = None,
|
|
147
|
+
invocation_checkpoint_store: Any | None = None,
|
|
148
|
+
public_tool_policy: PublicToolActivityPolicy | None = None,
|
|
131
149
|
inbound_enabled: bool = True,
|
|
132
150
|
outbound_enabled: bool = True,
|
|
133
151
|
public_egress_enabled: bool = False,
|
|
134
152
|
outbox_retry_interval_seconds: float = 1.0,
|
|
153
|
+
managed_resource_closers: Sequence[Callable[[], Awaitable[None]]] = (),
|
|
135
154
|
) -> None:
|
|
136
|
-
runtime_metadata.validate()
|
|
155
|
+
runtime_metadata.validate(inbound_enabled=inbound_enabled)
|
|
137
156
|
required: dict[str, Any] = {}
|
|
138
157
|
if outbound_enabled:
|
|
139
158
|
required.update(
|
|
@@ -156,9 +175,7 @@ class AgentEngineA2ABootstrap:
|
|
|
156
175
|
)
|
|
157
176
|
missing = [name for name, value in required.items() if value is None]
|
|
158
177
|
if missing:
|
|
159
|
-
raise ValueError(
|
|
160
|
-
"AgentEngineA2ABootstrap requires: " + ", ".join(missing)
|
|
161
|
-
)
|
|
178
|
+
raise ValueError("AgentEngineA2ABootstrap requires: " + ", ".join(missing))
|
|
162
179
|
if external_transport is not None and not isinstance(
|
|
163
180
|
external_transport, RuntimeLocalA2AExternalTransport
|
|
164
181
|
):
|
|
@@ -174,12 +191,17 @@ class AgentEngineA2ABootstrap:
|
|
|
174
191
|
_require_initializable(checkpoint_store, "checkpoint_store")
|
|
175
192
|
_require_initializable(resume_state_store, "resume_state_store")
|
|
176
193
|
self.runtime_metadata = runtime_metadata
|
|
177
|
-
self.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
194
|
+
self.public_tool_policy = public_tool_policy or PublicToolActivityPolicy()
|
|
195
|
+
self._target_binding = (
|
|
196
|
+
A2AIngressTargetBinding(
|
|
197
|
+
account_id=runtime_metadata.account_id,
|
|
198
|
+
tenant_id=runtime_metadata.tenant_id,
|
|
199
|
+
agent_id=runtime_metadata.agent_id,
|
|
200
|
+
runtime_id=runtime_metadata.runtime_id,
|
|
201
|
+
a2a_agent_id=runtime_metadata.a2a_agent_id,
|
|
202
|
+
)
|
|
203
|
+
if inbound_enabled
|
|
204
|
+
else None
|
|
183
205
|
)
|
|
184
206
|
self.inbound_enabled = inbound_enabled
|
|
185
207
|
self.outbound_enabled = outbound_enabled
|
|
@@ -192,18 +214,21 @@ class AgentEngineA2ABootstrap:
|
|
|
192
214
|
self._gateway_probe_verifier = gateway_probe_verifier
|
|
193
215
|
self._external_transport = external_transport
|
|
194
216
|
self._control_plane = control_plane
|
|
217
|
+
self._invocation_checkpoint_store = invocation_checkpoint_store
|
|
195
218
|
self._hosted_http_client = hosted_http_client
|
|
196
219
|
self._dispatcher = (
|
|
197
220
|
A2ATaskEventDispatcher(
|
|
198
221
|
_require(event_outbox, "event_outbox"),
|
|
199
|
-
_require(control_plane, "control_plane"),
|
|
222
|
+
ProductKernelFactSink(_require(control_plane, "control_plane")),
|
|
200
223
|
retry_interval_seconds=outbox_retry_interval_seconds,
|
|
201
224
|
)
|
|
202
|
-
if outbound_enabled
|
|
225
|
+
if outbound_enabled or (inbound_enabled and event_outbox is not None)
|
|
203
226
|
else None
|
|
204
227
|
)
|
|
228
|
+
self._kernel_reconciler = None
|
|
205
229
|
self._mounted = False
|
|
206
230
|
self._server: Any = None
|
|
231
|
+
self._managed_resource_closers = tuple(managed_resource_closers)
|
|
207
232
|
|
|
208
233
|
@classmethod
|
|
209
234
|
def from_platform(cls, **kwargs: Any) -> "AgentEngineA2ABootstrap":
|
|
@@ -221,6 +246,10 @@ class AgentEngineA2ABootstrap:
|
|
|
221
246
|
def server(self) -> Any:
|
|
222
247
|
return self._server
|
|
223
248
|
|
|
249
|
+
@property
|
|
250
|
+
def invocation_checkpoint_store(self):
|
|
251
|
+
return _require(self._invocation_checkpoint_store, "invocation_checkpoint_store")
|
|
252
|
+
|
|
224
253
|
def client_for_space(self, space_id: str):
|
|
225
254
|
"""Create a Space-scoped client sharing Runtime identity, clients, and outbox."""
|
|
226
255
|
|
|
@@ -237,6 +266,31 @@ class AgentEngineA2ABootstrap:
|
|
|
237
266
|
event_dispatcher=self.event_dispatcher,
|
|
238
267
|
)
|
|
239
268
|
|
|
269
|
+
@property
|
|
270
|
+
def scoped_cancel_available(self):
|
|
271
|
+
return self.outbound_enabled and self._invocation_checkpoint_store is not None
|
|
272
|
+
|
|
273
|
+
def invocation_service_for_space(
|
|
274
|
+
self, space_id: str, *, event_store, policy, recover_checkpoint_leases=False,
|
|
275
|
+
):
|
|
276
|
+
"""Product-owned caller service; policy and canonical ownership stay explicit."""
|
|
277
|
+
from ksadk.a2a.invocation_service import A2AInvocationService, A2AInvocationTimeouts
|
|
278
|
+
|
|
279
|
+
return A2AInvocationService.from_space_client(
|
|
280
|
+
self.client_for_space(space_id),
|
|
281
|
+
event_store=event_store,
|
|
282
|
+
policy=policy,
|
|
283
|
+
checkpoint_store=self.invocation_checkpoint_store,
|
|
284
|
+
recover_checkpoint_leases=recover_checkpoint_leases,
|
|
285
|
+
# A model may be silent between status/tool events. Match the
|
|
286
|
+
# managed data-plane transport ceiling; _timed still caps every
|
|
287
|
+
# wait at the invocation's original absolute deadline.
|
|
288
|
+
timeouts=A2AInvocationTimeouts(
|
|
289
|
+
first_event_seconds=MANAGED_MODEL_READ_TIMEOUT_SECONDS,
|
|
290
|
+
idle_seconds=MANAGED_MODEL_READ_TIMEOUT_SECONDS,
|
|
291
|
+
),
|
|
292
|
+
)
|
|
293
|
+
|
|
240
294
|
def mount(
|
|
241
295
|
self,
|
|
242
296
|
app: FastAPI,
|
|
@@ -251,6 +305,16 @@ class AgentEngineA2ABootstrap:
|
|
|
251
305
|
self._mounted = True
|
|
252
306
|
app.state.a2a_bootstrap = self
|
|
253
307
|
if not self.inbound_enabled:
|
|
308
|
+
ManagedA2ACardMount(
|
|
309
|
+
ManagedA2ACardConfig(
|
|
310
|
+
base_url=self.runtime_metadata.internal_base_url
|
|
311
|
+
or "http://localhost:8080",
|
|
312
|
+
agent_name=self.runtime_metadata.name or self.runtime_metadata.runtime_id,
|
|
313
|
+
description=self.runtime_metadata.description,
|
|
314
|
+
version=self.runtime_metadata.version or "0.1.0",
|
|
315
|
+
skills=self.runtime_metadata.skills,
|
|
316
|
+
)
|
|
317
|
+
).mount(app)
|
|
254
318
|
return None
|
|
255
319
|
app.add_middleware(
|
|
256
320
|
A2AGatewayIdentityMiddleware,
|
|
@@ -266,12 +330,24 @@ class AgentEngineA2ABootstrap:
|
|
|
266
330
|
version=self.runtime_metadata.version,
|
|
267
331
|
skills=self.runtime_metadata.skills,
|
|
268
332
|
create_table=False,
|
|
333
|
+
public_tool_policy=self.public_tool_policy,
|
|
269
334
|
)
|
|
270
|
-
|
|
335
|
+
from ksadk.kernel.ingress import authority_mode, kernel_ingress_enabled
|
|
336
|
+
task_adapter_class = A2ARuntimeTaskAdapter
|
|
337
|
+
task_adapter_options = {}
|
|
338
|
+
if kernel_ingress_enabled() and authority_mode() == "hosted":
|
|
339
|
+
from ksadk.a2a.kernel_task_adapter import ManagedKernelA2ATaskAdapter
|
|
340
|
+
self._kernel_reconciler = ProductKernelReconciler(self._control_plane, _ManagedKernelEvents())
|
|
341
|
+
task_adapter_class = ManagedKernelA2ATaskAdapter
|
|
342
|
+
task_adapter_options = {"control_plane": _require(self._control_plane, "control_plane"),
|
|
343
|
+
"session_events": _ManagedKernelEvents(),
|
|
344
|
+
"event_dispatcher": self._dispatcher}
|
|
345
|
+
task_adapter = task_adapter_class(
|
|
271
346
|
runtime_adapter,
|
|
272
347
|
runtime_type=runtime_type,
|
|
273
348
|
context_store=_require(self._context_store, "context_store"),
|
|
274
349
|
resume_state_store=_require(self._resume_state_store, "resume_state_store"),
|
|
350
|
+
**task_adapter_options,
|
|
275
351
|
)
|
|
276
352
|
self._server = add_a2a_protocol_routes(
|
|
277
353
|
app,
|
|
@@ -285,9 +361,35 @@ class AgentEngineA2ABootstrap:
|
|
|
285
361
|
allow_unverified_identity=False,
|
|
286
362
|
),
|
|
287
363
|
)
|
|
364
|
+
# Probe evidence for the platform's registration reconciler. This is
|
|
365
|
+
# public identity, not an authorization credential; the probe itself
|
|
366
|
+
# still passes through Gateway identity verification.
|
|
367
|
+
from a2a.types import AgentExtension
|
|
368
|
+
from google.protobuf.json_format import ParseDict
|
|
369
|
+
from google.protobuf.struct_pb2 import Struct
|
|
370
|
+
|
|
371
|
+
self._server.agent_card.capabilities.extensions.append(
|
|
372
|
+
AgentExtension(
|
|
373
|
+
uri="urn:ksadk:a2a:managed-runtime:v1",
|
|
374
|
+
required=False,
|
|
375
|
+
params=ParseDict(
|
|
376
|
+
{
|
|
377
|
+
"agent_id": self.runtime_metadata.agent_id,
|
|
378
|
+
"registration_id": self.runtime_metadata.a2a_agent_id,
|
|
379
|
+
"runtime_id": self.runtime_metadata.runtime_id,
|
|
380
|
+
"version": self.runtime_metadata.version,
|
|
381
|
+
},
|
|
382
|
+
Struct(),
|
|
383
|
+
),
|
|
384
|
+
)
|
|
385
|
+
)
|
|
288
386
|
return self._server
|
|
289
387
|
|
|
290
388
|
async def start(self) -> None:
|
|
389
|
+
if self.outbound_enabled and self._invocation_checkpoint_store is not None:
|
|
390
|
+
await _initialize_required(
|
|
391
|
+
self._invocation_checkpoint_store, "invocation_checkpoint_store"
|
|
392
|
+
)
|
|
291
393
|
if self.inbound_enabled:
|
|
292
394
|
await _initialize_required(_require(self._task_store, "task_store"), "task_store")
|
|
293
395
|
await _initialize_required(
|
|
@@ -302,10 +404,34 @@ class AgentEngineA2ABootstrap:
|
|
|
302
404
|
)
|
|
303
405
|
if self._dispatcher is not None:
|
|
304
406
|
await self._dispatcher.start()
|
|
407
|
+
if self._kernel_reconciler is not None:
|
|
408
|
+
await self._kernel_reconciler.start()
|
|
305
409
|
|
|
306
410
|
async def stop(self, *, flush_timeout_seconds: float = 5.0) -> None:
|
|
307
|
-
|
|
308
|
-
|
|
411
|
+
try:
|
|
412
|
+
if self._kernel_reconciler is not None:
|
|
413
|
+
await self._kernel_reconciler.stop()
|
|
414
|
+
if self._dispatcher is not None:
|
|
415
|
+
await self._dispatcher.stop(flush_timeout_seconds=flush_timeout_seconds)
|
|
416
|
+
finally:
|
|
417
|
+
for closer in self._managed_resource_closers:
|
|
418
|
+
await asyncio.wait_for(closer(), timeout=max(0.1, flush_timeout_seconds))
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
class _ManagedKernelEvents:
|
|
422
|
+
"""Resolve the Kernel after app lifespan startup, never fall back to an adapter."""
|
|
423
|
+
|
|
424
|
+
async def subscribe(self, session_id, after_seq):
|
|
425
|
+
from ksadk.kernel.bootstrap import get_agent_kernel_runtime
|
|
426
|
+
from ksadk.a2a.inbound_kernel import ManagedKernelRequestError
|
|
427
|
+
runtime = get_agent_kernel_runtime()
|
|
428
|
+
if runtime is None:
|
|
429
|
+
raise ManagedKernelRequestError("managed A2A Kernel is not ready")
|
|
430
|
+
try:
|
|
431
|
+
async for fact in runtime.session_events.subscribe(session_id, after_seq):
|
|
432
|
+
yield fact
|
|
433
|
+
except (OSError, TimeoutError) as exc:
|
|
434
|
+
raise ManagedKernelRequestError("Kernel event observation was interrupted") from exc
|
|
309
435
|
|
|
310
436
|
|
|
311
437
|
def _require_initializable(value: Any, name: str) -> None:
|