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.py
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Code-first managed ADK child with explicit invocation identity injection."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import inspect
|
|
7
|
+
from contextlib import aclosing, contextmanager
|
|
8
|
+
from contextvars import ContextVar
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Any, Callable
|
|
11
|
+
|
|
12
|
+
from google.adk.agents import BaseAgent
|
|
13
|
+
from google.adk.events import Event
|
|
14
|
+
from google.genai import types
|
|
15
|
+
from pydantic import PrivateAttr
|
|
16
|
+
|
|
17
|
+
from ksadk.a2a.exposure import compile_exposure_plan
|
|
18
|
+
from ksadk.a2a.invocation_types import A2AInvocationRequest, RemoteAgentSpec
|
|
19
|
+
from ksadk.a2a.presentation import ScopeTriggerRef
|
|
20
|
+
from ksadk.events.canonical import InteractionRequested, ItemCompleted, ItemSnapshotReplaced, ItemUpdated
|
|
21
|
+
from ksadk.events.content import TextContent
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True)
|
|
25
|
+
class ManagedA2ABinding:
|
|
26
|
+
"""Run-local dependencies; never place this object in session state.
|
|
27
|
+
|
|
28
|
+
provider(ctx, spec) returns (A2AInvocationRequest, ScopeTriggerRef), optionally
|
|
29
|
+
awaitable. It supplies the actual public root run/session ID, actual parent
|
|
30
|
+
scope and triggering canonical item/call ID, binding/attempt IDs, caller and
|
|
31
|
+
audit identities, stable wire message/idempotency IDs and absolute deadline.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
invocation_service: Any
|
|
35
|
+
invocation_context_provider: Callable
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
_binding: ContextVar[ManagedA2ABinding | None] = ContextVar("managed_a2a_binding", default=None)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@contextmanager
|
|
42
|
+
def bind_managed_a2a(invocation_service, invocation_context_provider):
|
|
43
|
+
"""Bind dependencies to one async execution context, including child tasks."""
|
|
44
|
+
token = _binding.set(ManagedA2ABinding(invocation_service, invocation_context_provider))
|
|
45
|
+
try:
|
|
46
|
+
yield
|
|
47
|
+
finally:
|
|
48
|
+
_binding.reset(token)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ManagedA2AEvent(Event):
|
|
52
|
+
"""Native projection carrying a private reference to the already-stored fact."""
|
|
53
|
+
|
|
54
|
+
_canonical: Any = PrivateAttr(default=None)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def canonical_event_from_adk(event):
|
|
58
|
+
return event._canonical if isinstance(event, ManagedA2AEvent) else None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class A2ARemoteAgent(BaseAgent):
|
|
62
|
+
_remote_spec: RemoteAgentSpec = PrivateAttr()
|
|
63
|
+
_invocation_service: Any = PrivateAttr(default=None)
|
|
64
|
+
_invocation_context_provider: Any = PrivateAttr(default=None)
|
|
65
|
+
|
|
66
|
+
def __init__(self, *, spec, invocation_service=None, invocation_context_provider=None):
|
|
67
|
+
super().__init__(name=spec.local_name, description=spec.description or "")
|
|
68
|
+
self._remote_spec = spec
|
|
69
|
+
self._invocation_service = invocation_service
|
|
70
|
+
self._invocation_context_provider = invocation_context_provider
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def remote_spec(self):
|
|
74
|
+
return self._remote_spec
|
|
75
|
+
|
|
76
|
+
async def _run_async_impl(self, ctx):
|
|
77
|
+
binding = _binding.get()
|
|
78
|
+
service = self._invocation_service or (binding.invocation_service if binding else None)
|
|
79
|
+
provider = self._invocation_context_provider or (
|
|
80
|
+
binding.invocation_context_provider if binding else None
|
|
81
|
+
)
|
|
82
|
+
if provider is None:
|
|
83
|
+
raise RuntimeError("A2A_MANAGED_INVOCATION_CONTEXT_REQUIRED")
|
|
84
|
+
resolved = provider(ctx, self._remote_spec)
|
|
85
|
+
if inspect.isawaitable(resolved):
|
|
86
|
+
resolved = await resolved
|
|
87
|
+
from ksadk.a2a.adk_invocation_context import ManagedADKInvocationContext
|
|
88
|
+
|
|
89
|
+
prefix_events = ()
|
|
90
|
+
if isinstance(resolved, ManagedADKInvocationContext):
|
|
91
|
+
request, trigger, service = resolved.request, resolved.trigger, resolved.service
|
|
92
|
+
prefix_events = resolved.prefix_events
|
|
93
|
+
else:
|
|
94
|
+
request, trigger = resolved
|
|
95
|
+
if service is None:
|
|
96
|
+
raise RuntimeError("A2A_MANAGED_INVOCATION_CONTEXT_REQUIRED")
|
|
97
|
+
if not isinstance(request, A2AInvocationRequest) or not isinstance(
|
|
98
|
+
trigger, ScopeTriggerRef
|
|
99
|
+
):
|
|
100
|
+
raise TypeError("A2A_MANAGED_INVOCATION_CONTEXT_INVALID")
|
|
101
|
+
if request.spec != self._remote_spec:
|
|
102
|
+
raise ValueError("A2A_BINDING_MISMATCH")
|
|
103
|
+
for event in prefix_events:
|
|
104
|
+
if event.run_id != request.handle.run_id or event.scope_id != trigger.scope_id:
|
|
105
|
+
raise ValueError("A2A_TRIGGER_REF_CONFLICT")
|
|
106
|
+
yield _project(event, self.name, ctx)
|
|
107
|
+
try:
|
|
108
|
+
from ksadk.a2a.runtime_input import invoke_with_input
|
|
109
|
+
|
|
110
|
+
async with aclosing(
|
|
111
|
+
invoke_with_input(service, request, trigger_ref=trigger)
|
|
112
|
+
) as events:
|
|
113
|
+
async for canonical in events:
|
|
114
|
+
yield _project(canonical, self.name, ctx)
|
|
115
|
+
except (asyncio.CancelledError, TimeoutError):
|
|
116
|
+
# Persist an honest cancel request; unsupported/unknown is not a
|
|
117
|
+
# cancelled child. The runtime owns durable follow-up scheduling.
|
|
118
|
+
try:
|
|
119
|
+
handle = service.handle(request.scope_id)
|
|
120
|
+
await asyncio.shield(service.cancel(handle))
|
|
121
|
+
finally:
|
|
122
|
+
raise
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _project(canonical, author, ctx):
|
|
126
|
+
# ADK excludes partial deliveries from session history. Interaction events
|
|
127
|
+
# carry live waiters/Futures for the Kernel bridge, not native model content;
|
|
128
|
+
# persisting them makes the next session deepcopy fail. Their durable facts
|
|
129
|
+
# remain in the Kernel interaction log and the original object still reaches
|
|
130
|
+
# the canonical adapter for live approval/input delivery.
|
|
131
|
+
partial = isinstance(canonical, (ItemUpdated, InteractionRequested))
|
|
132
|
+
parts = []
|
|
133
|
+
if isinstance(canonical, ItemUpdated) and isinstance(canonical.update, TextContent):
|
|
134
|
+
parts = [types.Part(text=canonical.update.text)]
|
|
135
|
+
elif isinstance(canonical, (ItemCompleted, ItemSnapshotReplaced)):
|
|
136
|
+
parts = [
|
|
137
|
+
types.Part(text=p.text) for p in canonical.snapshot.parts if isinstance(p, TextContent)
|
|
138
|
+
]
|
|
139
|
+
native = ManagedA2AEvent(
|
|
140
|
+
# ADK persists every delivery, including recovery projections, with
|
|
141
|
+
# a unique native row ID. The stable public fact identity lives in
|
|
142
|
+
# _canonical/custom_metadata; reusing it here breaks native resume.
|
|
143
|
+
invocation_id=ctx.invocation_id,
|
|
144
|
+
author=author,
|
|
145
|
+
branch=ctx.branch,
|
|
146
|
+
partial=partial,
|
|
147
|
+
content=types.Content(role="model", parts=parts) if parts else None,
|
|
148
|
+
custom_metadata={
|
|
149
|
+
"ksadk_a2a_canonical_ref": {
|
|
150
|
+
"event_id": canonical.event_id,
|
|
151
|
+
"run_id": canonical.run_id,
|
|
152
|
+
"scope_id": canonical.scope_id,
|
|
153
|
+
"item_id": getattr(canonical, "item_id", None),
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
)
|
|
157
|
+
native._canonical = canonical
|
|
158
|
+
return native
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def remote_agent(
|
|
162
|
+
spec: RemoteAgentSpec | None = None,
|
|
163
|
+
*,
|
|
164
|
+
invocation_service=None,
|
|
165
|
+
invocation_context_provider=None,
|
|
166
|
+
exposure_plan=None,
|
|
167
|
+
**fields,
|
|
168
|
+
):
|
|
169
|
+
"""Construct an ADK BaseAgent without discovery or AgentCard network I/O."""
|
|
170
|
+
if spec is not None and fields:
|
|
171
|
+
raise ValueError("provide spec or named declaration fields")
|
|
172
|
+
spec = spec or RemoteAgentSpec(**fields)
|
|
173
|
+
plan = exposure_plan or compile_exposure_plan(
|
|
174
|
+
[spec], framework="adk", consumer_id=spec.local_name
|
|
175
|
+
)
|
|
176
|
+
matches = [entry for entry in plan.entries if entry.spec.binding_id == spec.binding_id]
|
|
177
|
+
if (
|
|
178
|
+
plan.framework != "adk"
|
|
179
|
+
or len(matches) != 1
|
|
180
|
+
or matches[0].spec != spec
|
|
181
|
+
or matches[0].exposure != "native"
|
|
182
|
+
):
|
|
183
|
+
raise ValueError("A2A_EXPOSURE_CONFLICT")
|
|
184
|
+
return A2ARemoteAgent(
|
|
185
|
+
spec=spec,
|
|
186
|
+
invocation_service=invocation_service,
|
|
187
|
+
invocation_context_provider=invocation_context_provider,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def handoff_tool(spec: RemoteAgentSpec):
|
|
192
|
+
"""Create a fixed-target ADK tool backed by the shared invocation service."""
|
|
193
|
+
from ksadk.a2a.adk_tools import ManagedA2AHandoffTool
|
|
194
|
+
return ManagedA2AHandoffTool(spec)
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"""Native ADK trigger identities used by the managed invocation provider."""
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
import time
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
from ksadk.a2a.invocation_types import (
|
|
8
|
+
A2AInvocationContext,
|
|
9
|
+
A2AInvocationHandle,
|
|
10
|
+
A2AInvocationMessage,
|
|
11
|
+
A2AInvocationRequest,
|
|
12
|
+
)
|
|
13
|
+
from ksadk.a2a.presentation import ScopeTriggerRef
|
|
14
|
+
from ksadk.events.identity import stable_item_id, stable_scope_id
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ADKWorkflowTrigger:
|
|
18
|
+
"""Persist a trigger for a static native child slot (sequential/parallel).
|
|
19
|
+
|
|
20
|
+
Loops require explicit occurrence injection and are outside this selector.
|
|
21
|
+
Native handoffs use their real function-call event instead.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, authority, *, clock=time.time):
|
|
25
|
+
self._authority, self._clock = authority, clock
|
|
26
|
+
|
|
27
|
+
async def __call__(self, ctx, spec):
|
|
28
|
+
from google.adk.agents import LoopAgent
|
|
29
|
+
|
|
30
|
+
from ksadk.events.canonical import ItemCompleted, ItemStarted, SourceRef
|
|
31
|
+
from ksadk.events.content import ContentSnapshot, ToolCallContent
|
|
32
|
+
from ksadk.events.identity import stable_event_id, stable_part_id
|
|
33
|
+
|
|
34
|
+
authority = self._authority
|
|
35
|
+
authority.require_session(authority.session_id)
|
|
36
|
+
node = ctx.agent
|
|
37
|
+
if getattr(node, "remote_spec", None) != spec or not ctx.invocation_id:
|
|
38
|
+
raise ValueError("A2A_NATIVE_EXECUTION_REQUIRED")
|
|
39
|
+
path, seen = [], set()
|
|
40
|
+
while node is not None:
|
|
41
|
+
if id(node) in seen or len(seen) >= 64:
|
|
42
|
+
raise ValueError("A2A_NATIVE_EXECUTION_PATH_INVALID")
|
|
43
|
+
seen.add(id(node))
|
|
44
|
+
if isinstance(node, LoopAgent):
|
|
45
|
+
raise ValueError("A2A_WORKFLOW_OCCURRENCE_REQUIRED")
|
|
46
|
+
parent = node.parent_agent
|
|
47
|
+
slot = (
|
|
48
|
+
0
|
|
49
|
+
if parent is None
|
|
50
|
+
else next(
|
|
51
|
+
(index for index, child in enumerate(parent.sub_agents) if child is node), -1
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
if slot < 0:
|
|
55
|
+
raise ValueError("A2A_NATIVE_EXECUTION_PATH_INVALID")
|
|
56
|
+
path.append(f"{slot}:{node.name}")
|
|
57
|
+
node = parent
|
|
58
|
+
native_slot = "/".join(reversed(path))
|
|
59
|
+
scope = stable_scope_id("adk", authority.run_id)
|
|
60
|
+
call = stable_item_id(
|
|
61
|
+
"adk", ctx.invocation_id, ctx.branch or "$root", native_slot, "native-child-call"
|
|
62
|
+
)
|
|
63
|
+
item = stable_item_id("adk", scope, call, "tool_call")
|
|
64
|
+
trigger = ScopeTriggerRef(scope_id=scope, item_id=item, call_id=call)
|
|
65
|
+
part = stable_part_id("adk", item, "call")
|
|
66
|
+
snapshot = ContentSnapshot(
|
|
67
|
+
parts=(ToolCallContent(part_id=part, call_id=call, name=spec.local_name, arguments={}),)
|
|
68
|
+
)
|
|
69
|
+
stored = {event.event_id: event for event in await authority.list(authority.session_id)}
|
|
70
|
+
prefix = []
|
|
71
|
+
for event_type in ("item.started", "item.completed"):
|
|
72
|
+
event_id = stable_event_id("adk", scope, item, event_type, part, call, 0)
|
|
73
|
+
existing = stored.get(event_id)
|
|
74
|
+
common = dict(
|
|
75
|
+
schema_version=2,
|
|
76
|
+
seq=0,
|
|
77
|
+
timestamp=(existing.timestamp if existing else self._clock()),
|
|
78
|
+
event_id=event_id,
|
|
79
|
+
run_id=authority.run_id,
|
|
80
|
+
scope_id=scope,
|
|
81
|
+
item_id=item,
|
|
82
|
+
item_kind="tool_call",
|
|
83
|
+
source=SourceRef(
|
|
84
|
+
framework="adk",
|
|
85
|
+
native_run_id=ctx.invocation_id,
|
|
86
|
+
metadata={"execution_kind": "remote_agent"},
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
event = (
|
|
90
|
+
ItemStarted(**common, initial=snapshot, phase="commentary")
|
|
91
|
+
if event_type == "item.started"
|
|
92
|
+
else ItemCompleted(**common, snapshot=snapshot)
|
|
93
|
+
)
|
|
94
|
+
persisted, _ = await authority.persist_one(authority.session_id, event)
|
|
95
|
+
prefix.append(persisted)
|
|
96
|
+
return trigger, tuple(prefix)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@dataclass(frozen=True)
|
|
100
|
+
class ManagedADKInvocationContext:
|
|
101
|
+
request: A2AInvocationRequest
|
|
102
|
+
trigger: ScopeTriggerRef
|
|
103
|
+
service: object
|
|
104
|
+
prefix_events: tuple = ()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class ADKInvocationContextProvider:
|
|
108
|
+
"""Run-local composition of identity, message selection, and durable request.
|
|
109
|
+
|
|
110
|
+
Selectors are runtime-owned functions, not fields read from model input.
|
|
111
|
+
A workflow selector returns an explicit trigger and persisted prefix facts.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
def __init__(
|
|
115
|
+
self,
|
|
116
|
+
*,
|
|
117
|
+
authority,
|
|
118
|
+
service_for_space,
|
|
119
|
+
caller_agent_id,
|
|
120
|
+
message_selector,
|
|
121
|
+
workflow_trigger=None,
|
|
122
|
+
clock=time.time,
|
|
123
|
+
):
|
|
124
|
+
if not caller_agent_id:
|
|
125
|
+
raise ValueError("A2A_CALLER_REQUIRED")
|
|
126
|
+
self._authority, self._services = authority, service_for_space
|
|
127
|
+
self._caller, self._message = caller_agent_id, message_selector
|
|
128
|
+
self._workflow = workflow_trigger or ADKWorkflowTrigger(authority, clock=clock)
|
|
129
|
+
self._clock = clock
|
|
130
|
+
|
|
131
|
+
async def __call__(self, ctx, spec):
|
|
132
|
+
authority = self._authority
|
|
133
|
+
authority.require_session(authority.session_id)
|
|
134
|
+
trigger = native_handoff_trigger(ctx, spec)
|
|
135
|
+
prefix = ()
|
|
136
|
+
if trigger is None:
|
|
137
|
+
if self._workflow is None:
|
|
138
|
+
raise ValueError("A2A_NATIVE_TRIGGER_REQUIRED")
|
|
139
|
+
result = self._workflow(ctx, spec)
|
|
140
|
+
if inspect.isawaitable(result):
|
|
141
|
+
result = await result
|
|
142
|
+
trigger, prefix = result
|
|
143
|
+
if not isinstance(trigger, ScopeTriggerRef):
|
|
144
|
+
raise TypeError("A2A_TRIGGER_REF_REQUIRED")
|
|
145
|
+
handle = A2AInvocationHandle(
|
|
146
|
+
run_id=authority.run_id,
|
|
147
|
+
session_id=authority.session_id,
|
|
148
|
+
parent_scope_id=trigger.scope_id,
|
|
149
|
+
call_id=trigger.call_id,
|
|
150
|
+
binding_id=spec.binding_id,
|
|
151
|
+
target_agent_id=spec.target_agent_id,
|
|
152
|
+
attempt_id=stable_item_id("a2a", trigger.scope_id, trigger.item_id, "attempt-1"),
|
|
153
|
+
)
|
|
154
|
+
service = self._services(spec.space_id)
|
|
155
|
+
if inspect.isawaitable(service):
|
|
156
|
+
service = await service
|
|
157
|
+
original = await service.original_request(handle)
|
|
158
|
+
if original is not None:
|
|
159
|
+
if original.spec != spec or original.context.caller_agent_id != self._caller:
|
|
160
|
+
raise ValueError("A2A_RECOVERED_BINDING_CONFLICT")
|
|
161
|
+
return ManagedADKInvocationContext(original, trigger, service, tuple(prefix))
|
|
162
|
+
parts = self._message(ctx, spec)
|
|
163
|
+
if inspect.isawaitable(parts):
|
|
164
|
+
parts = await parts
|
|
165
|
+
request = A2AInvocationRequest(
|
|
166
|
+
spec=spec,
|
|
167
|
+
handle=handle,
|
|
168
|
+
message=A2AInvocationMessage(
|
|
169
|
+
message_id=stable_item_id("a2a", handle.scope_id, "initial-message"),
|
|
170
|
+
text_parts=parts,
|
|
171
|
+
),
|
|
172
|
+
context=A2AInvocationContext(
|
|
173
|
+
caller_agent_id=self._caller,
|
|
174
|
+
audit_id=stable_item_id("a2a", handle.scope_id, "audit"),
|
|
175
|
+
),
|
|
176
|
+
deadline_unix_seconds=float(self._clock()) + (spec.timeout_seconds or 300.0),
|
|
177
|
+
idempotency_token=stable_item_id("a2a", handle.scope_id, "initial-send"),
|
|
178
|
+
)
|
|
179
|
+
return ManagedADKInvocationContext(request, trigger, service, tuple(prefix))
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _path(event):
|
|
183
|
+
return (
|
|
184
|
+
getattr(getattr(event, "node_info", None), "path", None)
|
|
185
|
+
or getattr(event, "branch", None)
|
|
186
|
+
or "$root"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def native_handoff_trigger(ctx, spec):
|
|
191
|
+
"""Resolve a real transfer response back to its exact canonical call item.
|
|
192
|
+
|
|
193
|
+
No text/argument hash or target-name-derived call ID is used. Non-handoff
|
|
194
|
+
execution returns None so its workflow trigger can be allocated explicitly.
|
|
195
|
+
"""
|
|
196
|
+
events = list(ctx.session.events)
|
|
197
|
+
for index in range(len(events) - 1, -1, -1):
|
|
198
|
+
response = events[index]
|
|
199
|
+
if response.invocation_id != ctx.invocation_id or getattr(
|
|
200
|
+
response, "branch", None
|
|
201
|
+
) != getattr(ctx, "branch", None):
|
|
202
|
+
continue
|
|
203
|
+
if getattr(response.actions, "transfer_to_agent", None) != spec.local_name:
|
|
204
|
+
return None
|
|
205
|
+
calls = [
|
|
206
|
+
part.function_response
|
|
207
|
+
for part in (getattr(response.content, "parts", None) or ())
|
|
208
|
+
if part.function_response is not None
|
|
209
|
+
and part.function_response.name == "transfer_to_agent"
|
|
210
|
+
]
|
|
211
|
+
if len(calls) != 1 or not calls[0].id:
|
|
212
|
+
raise ValueError("A2A_NATIVE_TRIGGER_AMBIGUOUS")
|
|
213
|
+
call_id = calls[0].id
|
|
214
|
+
for event in reversed(events[:index]):
|
|
215
|
+
if (
|
|
216
|
+
event.invocation_id != ctx.invocation_id
|
|
217
|
+
or _path(event) != _path(response)
|
|
218
|
+
or event.author != response.author
|
|
219
|
+
):
|
|
220
|
+
continue
|
|
221
|
+
matches = [
|
|
222
|
+
part.function_call
|
|
223
|
+
for part in (getattr(event.content, "parts", None) or ())
|
|
224
|
+
if part.function_call is not None
|
|
225
|
+
and part.function_call.id == call_id
|
|
226
|
+
and part.function_call.name == "transfer_to_agent"
|
|
227
|
+
]
|
|
228
|
+
if len(matches) > 1:
|
|
229
|
+
raise ValueError("A2A_NATIVE_TRIGGER_AMBIGUOUS")
|
|
230
|
+
if matches:
|
|
231
|
+
if not event.id:
|
|
232
|
+
raise ValueError("A2A_NATIVE_TRIGGER_ID_REQUIRED")
|
|
233
|
+
path = _path(event)
|
|
234
|
+
return ScopeTriggerRef(
|
|
235
|
+
scope_id=stable_scope_id("adk", event.invocation_id, path),
|
|
236
|
+
item_id=stable_item_id(
|
|
237
|
+
"adk", event.invocation_id, path, event.id, call_id, "tool_call"
|
|
238
|
+
),
|
|
239
|
+
call_id=call_id,
|
|
240
|
+
)
|
|
241
|
+
raise ValueError("A2A_NATIVE_TRIGGER_CALL_MISSING")
|
|
242
|
+
return None
|
ksadk/a2a/adk_runtime.py
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""Run-local managed A2A dependencies for the production ADK canonical stream."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
from contextlib import aclosing, suppress
|
|
5
|
+
|
|
6
|
+
from ksadk.a2a.adk import bind_managed_a2a
|
|
7
|
+
from ksadk.a2a.adk_invocation_context import ADKInvocationContextProvider
|
|
8
|
+
from ksadk.events.run_authority import current_run_event_authority
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def managed_message_parts(ctx, _spec):
|
|
12
|
+
"""Forward visible text context, excluding thoughts, tool payloads and state."""
|
|
13
|
+
parts = []
|
|
14
|
+
branch = getattr(ctx, "branch", None) or ""
|
|
15
|
+
for event in ctx.session.events:
|
|
16
|
+
event_branch = getattr(event, "branch", None) or ""
|
|
17
|
+
if event_branch and branch != event_branch and not branch.startswith(event_branch + "."):
|
|
18
|
+
continue
|
|
19
|
+
if getattr(event, "partial", False):
|
|
20
|
+
continue
|
|
21
|
+
text = "".join(
|
|
22
|
+
part.text
|
|
23
|
+
for part in (getattr(event.content, "parts", None) or ())
|
|
24
|
+
if part.text and not getattr(part, "thought", False)
|
|
25
|
+
)
|
|
26
|
+
if text.strip():
|
|
27
|
+
parts.append(f"[{event.author}]\n{text}")
|
|
28
|
+
if not parts:
|
|
29
|
+
parts = [
|
|
30
|
+
part.text
|
|
31
|
+
for part in (getattr(getattr(ctx, "user_content", None), "parts", None) or ())
|
|
32
|
+
if part.text and not getattr(part, "thought", False)
|
|
33
|
+
]
|
|
34
|
+
return tuple(parts)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def managed_native_events(runner, native_events):
|
|
38
|
+
bootstrap = getattr(runner, "_managed_a2a_bootstrap", None)
|
|
39
|
+
authority = current_run_event_authority()
|
|
40
|
+
from ksadk.sessions import bind_session_service, resolve_session_service
|
|
41
|
+
|
|
42
|
+
session_service = resolve_session_service()
|
|
43
|
+
async with aclosing(native_events):
|
|
44
|
+
if bootstrap is None or not bootstrap.outbound_enabled or authority is None:
|
|
45
|
+
while True:
|
|
46
|
+
try:
|
|
47
|
+
# Pull the native generator while the Kernel-owned service
|
|
48
|
+
# is explicitly active. Async-generator resumption may
|
|
49
|
+
# otherwise occur in a context that lost the worker binding.
|
|
50
|
+
with bind_session_service(session_service):
|
|
51
|
+
event = await anext(native_events)
|
|
52
|
+
except StopAsyncIteration:
|
|
53
|
+
break
|
|
54
|
+
yield event
|
|
55
|
+
return
|
|
56
|
+
authority.register_managed_a2a(bootstrap)
|
|
57
|
+
policy = authority.managed_invocation_policy()
|
|
58
|
+
services = {}
|
|
59
|
+
|
|
60
|
+
def service_for_space(space_id):
|
|
61
|
+
if space_id not in services:
|
|
62
|
+
services[space_id] = bootstrap.invocation_service_for_space(
|
|
63
|
+
space_id, event_store=authority, policy=policy
|
|
64
|
+
)
|
|
65
|
+
return services[space_id]
|
|
66
|
+
|
|
67
|
+
provider = ADKInvocationContextProvider(
|
|
68
|
+
authority=authority,
|
|
69
|
+
service_for_space=service_for_space,
|
|
70
|
+
caller_agent_id=bootstrap.runtime_metadata.agent_id,
|
|
71
|
+
message_selector=managed_message_parts,
|
|
72
|
+
)
|
|
73
|
+
from ksadk.a2a.adk_tools import (
|
|
74
|
+
ManagedADKTools,
|
|
75
|
+
bind_managed_adk_tools,
|
|
76
|
+
install_managed_tools,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
queue = asyncio.Queue(maxsize=1)
|
|
80
|
+
# The native ADK iterator is consumed in a child task. Capture the
|
|
81
|
+
# Kernel-bound service before that task is created and bind it explicitly
|
|
82
|
+
# inside the pump; relying on an implicit ContextVar copy is unsafe when
|
|
83
|
+
# async-generator finalization moves across task contexts.
|
|
84
|
+
async def emit(event):
|
|
85
|
+
acknowledged = asyncio.Event()
|
|
86
|
+
await queue.put((event, acknowledged))
|
|
87
|
+
await acknowledged.wait()
|
|
88
|
+
|
|
89
|
+
async def pump():
|
|
90
|
+
with bind_session_service(session_service):
|
|
91
|
+
try:
|
|
92
|
+
async for event in native_events:
|
|
93
|
+
await emit(event)
|
|
94
|
+
except asyncio.CancelledError as exc:
|
|
95
|
+
if asyncio.current_task().cancelling():
|
|
96
|
+
raise
|
|
97
|
+
await queue.put((exc, None))
|
|
98
|
+
except Exception as exc:
|
|
99
|
+
await queue.put((exc, None))
|
|
100
|
+
else:
|
|
101
|
+
await queue.put((None, None))
|
|
102
|
+
|
|
103
|
+
install_managed_tools(runner._agent)
|
|
104
|
+
runtime = ManagedADKTools(
|
|
105
|
+
bootstrap=bootstrap,
|
|
106
|
+
authority=authority,
|
|
107
|
+
services=service_for_space,
|
|
108
|
+
emit=emit,
|
|
109
|
+
)
|
|
110
|
+
with bind_managed_a2a(None, provider), bind_managed_adk_tools(runtime):
|
|
111
|
+
task = asyncio.create_task(pump())
|
|
112
|
+
try:
|
|
113
|
+
while True:
|
|
114
|
+
event, acknowledged = await queue.get()
|
|
115
|
+
if event is None:
|
|
116
|
+
break
|
|
117
|
+
if isinstance(event, BaseException):
|
|
118
|
+
raise event
|
|
119
|
+
try:
|
|
120
|
+
yield event
|
|
121
|
+
finally:
|
|
122
|
+
acknowledged.set()
|
|
123
|
+
finally:
|
|
124
|
+
task.cancel()
|
|
125
|
+
with suppress(asyncio.CancelledError):
|
|
126
|
+
await task
|