agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,638 @@
|
|
|
1
|
+
"""tool_calls phase handler (Native Harness Phase 1, Task 5).
|
|
2
|
+
|
|
3
|
+
Extracted from the ``tool_calls(state)`` closure in
|
|
4
|
+
``ksadk/harness/engine/graph_builder.py``. Dependencies that were
|
|
5
|
+
closure-captured in the graph builder (``spec``/``run``/``engine``/``state``)
|
|
6
|
+
now arrive on the :class:`PhaseContext`; the wrapper in graph_builder keeps the
|
|
7
|
+
graph-only preamble (``revalidate_policy`` / ``_restore_controller`` /
|
|
8
|
+
child-approval decision intake).
|
|
9
|
+
|
|
10
|
+
Suspension: the closure called LangGraph ``interrupt()`` from two places — the
|
|
11
|
+
tool-approval resolver (``_GraphApprovalResolver``) and the child-agent
|
|
12
|
+
approval node. Both are now *explicit results*:
|
|
13
|
+
|
|
14
|
+
* tool approval → ``_SuspensionRequest`` raised by ``_HandlerApprovalResolver``,
|
|
15
|
+
caught at the ``execute_tool_calls`` call site and returned as
|
|
16
|
+
``PhaseResult(interaction=NeedInteraction(kind="tool_approval", ...))``;
|
|
17
|
+
* child approval → the ``ChildApprovalPending`` branch returns
|
|
18
|
+
``PhaseResult(interaction=NeedInteraction(kind="child_approval", ...))``.
|
|
19
|
+
|
|
20
|
+
The caller (graph_builder for LangGraph, a Native engine in Phase 2) is the one
|
|
21
|
+
that translates ``NeedInteraction`` back into its suspension primitive. On
|
|
22
|
+
resume the caller re-enters this handler and the stored decisions are consumed
|
|
23
|
+
here (``tool_approval_decision`` / ``child_approval_decision`` on the graph
|
|
24
|
+
state).
|
|
25
|
+
|
|
26
|
+
This module must NOT import LangGraph; the architecture guard
|
|
27
|
+
(``tests/architecture/test_harness_contract.py``) enforces this from Task 6.
|
|
28
|
+
|
|
29
|
+
Behaviour preservation is the contract: event ordering, payloads, seq
|
|
30
|
+
accounting, progress lifecycle events and the fail-fast/parallel bookkeeping are
|
|
31
|
+
a mechanical copy of the closure. The direct ``run.events``/``run.seq`` writes
|
|
32
|
+
are kept for now (Phase 2 severs them); every event appended during the handler
|
|
33
|
+
is also returned on :class:`PhaseResult`.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
from __future__ import annotations
|
|
37
|
+
|
|
38
|
+
import logging
|
|
39
|
+
from typing import Any
|
|
40
|
+
|
|
41
|
+
from ksadk.harness.engine import budgets
|
|
42
|
+
from ksadk.harness.engine.hooked_reasoner import (
|
|
43
|
+
buffer_hook_degradation,
|
|
44
|
+
flush_hook_degradations,
|
|
45
|
+
)
|
|
46
|
+
from ksadk.harness.engine.mcp_disclosure import MCP_CALL_TOOL_TOOL, McpDisclosureCursors
|
|
47
|
+
from ksadk.harness.engine.phases.context import PhaseContext, PhaseResult
|
|
48
|
+
from ksadk.harness.engine.phases.interaction import NeedInteraction
|
|
49
|
+
from ksadk.harness.engine.subagents import ChildApprovalPending
|
|
50
|
+
from ksadk.harness.engine.tool_dispatch import RunToolResultGovernor
|
|
51
|
+
from ksadk.harness.events import EventType
|
|
52
|
+
from ksadk.harness.hooks import run_hooks
|
|
53
|
+
from ksadk.harness.loop import ToolCallInput, execute_tool_calls
|
|
54
|
+
from ksadk.harness.run_control import ControlAction
|
|
55
|
+
|
|
56
|
+
logger = logging.getLogger(__name__)
|
|
57
|
+
|
|
58
|
+
#: 图状态里"已恢复的工具审批决定"键(包装层在 interrupt() 返回后写入本 handler 消费)。
|
|
59
|
+
TOOL_APPROVAL_DECISION_KEY = "tool_approval_decision"
|
|
60
|
+
|
|
61
|
+
#: run 属性名:调用方(LangGraph 包装层)在节点入口写入"本次节点调用正在重放
|
|
62
|
+
#: 哪个已挂起审批的 call_id",供挂起分支跳过重复补发的失败态进度(属性缺失 =
|
|
63
|
+
#: 首次挂起;Phase 2 Native 引擎以 NeedInteraction 表达挂起,不写该属性)。
|
|
64
|
+
TOOL_APPROVAL_REPLAY_ATTR = "tool_approval_replay_call_id"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class _SuspensionRequest(Exception):
|
|
68
|
+
"""Internal: handler's approval resolver signals a needed interaction."""
|
|
69
|
+
|
|
70
|
+
def __init__(self, interaction: NeedInteraction) -> None:
|
|
71
|
+
self.interaction = interaction
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class _HandlerApprovalResolver:
|
|
75
|
+
"""ApprovalResolver that surfaces a NeedInteraction instead of interrupt().
|
|
76
|
+
|
|
77
|
+
First pass raises ``_SuspensionRequest``; the caller suspends and (after the
|
|
78
|
+
external decision arrives) re-enters the handler with the decision stored on
|
|
79
|
+
the graph state under :data:`TOOL_APPROVAL_DECISION_KEY`, which this resolver
|
|
80
|
+
consumes exactly once.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
def __init__(self, state: dict[str, Any], expected_revision: int = 0) -> None:
|
|
84
|
+
self._state = state
|
|
85
|
+
self._expected_revision = expected_revision
|
|
86
|
+
|
|
87
|
+
def request(self, *, call_id: str, name: str, arguments: dict[str, Any]) -> str:
|
|
88
|
+
resolved = self._state.get(TOOL_APPROVAL_DECISION_KEY) or {}
|
|
89
|
+
if resolved.get("call_id") == call_id:
|
|
90
|
+
self._state.pop(TOOL_APPROVAL_DECISION_KEY, None)
|
|
91
|
+
return str(resolved.get("decision") or "")
|
|
92
|
+
raise _SuspensionRequest(
|
|
93
|
+
NeedInteraction(
|
|
94
|
+
interaction_id=f"ap-{call_id}",
|
|
95
|
+
kind="tool_approval",
|
|
96
|
+
request_payload={
|
|
97
|
+
"call_id": call_id,
|
|
98
|
+
"name": name,
|
|
99
|
+
"args": arguments,
|
|
100
|
+
"risk": "high",
|
|
101
|
+
},
|
|
102
|
+
resume_phase="tools",
|
|
103
|
+
# Phase 1:LangGraph 通道不消费 revision;Phase 2 接 Native snapshot revision。
|
|
104
|
+
expected_revision=self._expected_revision,
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def _make_tool_result_hook(engine: Any, run: Any) -> Any:
|
|
110
|
+
"""tool_calls 节点的 on_tool_result 钩子闭包(G5 §5.2)。
|
|
111
|
+
|
|
112
|
+
内部经 ``run_hooks`` 按注册顺序执行钩子链。降级事件写入引擎级缓冲
|
|
113
|
+
(``engine._pending_hook_degradations``),由 tool_calls 节点末尾统一
|
|
114
|
+
flush——与 reason 节点同一 loop-safe 纪律:**不得**在钩子执行中途调
|
|
115
|
+
``engine._event``,否则 ``run.seq`` 会领先于 loop 以 ``seq_start`` 计的本地
|
|
116
|
+
编号,导致本节点事件被丢弃或 seq 撞号。
|
|
117
|
+
|
|
118
|
+
返回改写后的 result dict(``content`` 变化即视为改写生效,调用侧据此加
|
|
119
|
+
``modified_by_hook`` 留痕);未改写或协议违约时返回 None(不加标记)。
|
|
120
|
+
"""
|
|
121
|
+
hooks = engine._hooks
|
|
122
|
+
|
|
123
|
+
def _degrade(run_ctx: Any, event_type: str, payload: dict[str, Any]) -> None:
|
|
124
|
+
buffer_hook_degradation(engine, run_ctx.run_id, event_type, payload)
|
|
125
|
+
|
|
126
|
+
async def _hook(
|
|
127
|
+
run_ctx: Any, call: dict[str, Any], result: dict[str, Any]
|
|
128
|
+
) -> dict[str, Any] | None:
|
|
129
|
+
original = str(result.get("content") or "")
|
|
130
|
+
rewritten = await run_hooks(
|
|
131
|
+
hooks,
|
|
132
|
+
"on_tool_result",
|
|
133
|
+
run_ctx,
|
|
134
|
+
_degrade,
|
|
135
|
+
payload={"call": dict(call), "result": dict(result)},
|
|
136
|
+
)
|
|
137
|
+
if not isinstance(rewritten, dict):
|
|
138
|
+
# run_hooks 链式守卫下不可达;纵深防御。
|
|
139
|
+
# run_hooks 已对链式违约降级;这里保留末态守卫(与
|
|
140
|
+
# hooked_reasoner._apply_request_hooks 同语义)双保险:末值仍非
|
|
141
|
+
# dict 时丢弃改写、沿用原文,绝不把坏值当结果回填。
|
|
142
|
+
buffer_hook_degradation(
|
|
143
|
+
engine,
|
|
144
|
+
run_ctx.run_id,
|
|
145
|
+
EventType.POLICY_DECISION,
|
|
146
|
+
{
|
|
147
|
+
"action": "hook_failed",
|
|
148
|
+
"reason": (
|
|
149
|
+
"on_tool_result: protocol violation (non-dict); original result kept"
|
|
150
|
+
),
|
|
151
|
+
"outcome": "hook_failed",
|
|
152
|
+
"hook_outcome": "non_blocking_error",
|
|
153
|
+
"hook_type": "prompt",
|
|
154
|
+
"method": "on_tool_result",
|
|
155
|
+
"error": f"on_tool_result 返回 {type(rewritten).__name__},期望 dict",
|
|
156
|
+
},
|
|
157
|
+
)
|
|
158
|
+
return None
|
|
159
|
+
if str(rewritten.get("content") or "") == original:
|
|
160
|
+
return None
|
|
161
|
+
return rewritten
|
|
162
|
+
|
|
163
|
+
return _hook
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
async def tools_phase(ctx: PhaseContext) -> PhaseResult:
|
|
167
|
+
"""tool_calls 一节点执行(GraphBuilder ``tool_calls`` 节点主体)。
|
|
168
|
+
|
|
169
|
+
调用方(graph_builder 的 ``tool_calls`` 包装)已完成 ``revalidate_policy`` /
|
|
170
|
+
``_restore_controller`` / child-approval 决定接收;handler 负责本节点全部
|
|
171
|
+
事件与状态推进。需要审批时返回 ``PhaseResult(interaction=NeedInteraction)``
|
|
172
|
+
——由调用方决定挂起原语(LangGraph:``interrupt()``)。
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
# 依赖注入:闭包捕获 → ctx 读取。以下局部绑定即 ctx.* 的取值;嵌套 helper
|
|
176
|
+
# (_capture_control_event / _HandlerApprovalResolver)闭包引用同一对象,与
|
|
177
|
+
# graph_builder 中的捕获语义等价(值来自 ctx,非 build_graph 闭包)。
|
|
178
|
+
spec = ctx.spec
|
|
179
|
+
run = ctx.run
|
|
180
|
+
engine = ctx.engine
|
|
181
|
+
state = ctx.state
|
|
182
|
+
|
|
183
|
+
# Phase 1 过渡期:本节点仍直接写 run.events/run.seq(Phase 2 切断)。以节点
|
|
184
|
+
# 入口长度切片收集"本节点新增事件",随 PhaseResult 一并交还调用方。
|
|
185
|
+
events_start = len(run.events)
|
|
186
|
+
|
|
187
|
+
def _capture_control_event(event) -> ControlAction: # noqa: ANN001
|
|
188
|
+
# 与 graph_builder 节点内同名 helper 逐字等价(Phase 2 收口去重)。以
|
|
189
|
+
# run.observed_event_ids 去重,故与包装层的事件捕获可安全并存。
|
|
190
|
+
if event.event_id in run.observed_event_ids:
|
|
191
|
+
return ControlAction.CONTINUE
|
|
192
|
+
run.observed_event_ids.add(event.event_id)
|
|
193
|
+
if event.event_type == EventType.USAGE_REPORTED:
|
|
194
|
+
input_tokens = int(event.payload.get("input_tokens") or 0)
|
|
195
|
+
output_tokens = int(event.payload.get("output_tokens") or 0)
|
|
196
|
+
budgets.spend(
|
|
197
|
+
run,
|
|
198
|
+
"tokens",
|
|
199
|
+
int(event.payload.get("total_tokens") or input_tokens + output_tokens),
|
|
200
|
+
)
|
|
201
|
+
budgets.spend(run, "input_tokens", input_tokens)
|
|
202
|
+
budgets.spend(run, "output_tokens", output_tokens)
|
|
203
|
+
if event.event_type == EventType.ARTIFACT_CREATED:
|
|
204
|
+
uri = str(event.payload.get("uri") or "")
|
|
205
|
+
if uri and uri not in run.artifact_refs:
|
|
206
|
+
run.artifact_refs.append(uri)
|
|
207
|
+
if run.controller is None:
|
|
208
|
+
return ControlAction.CONTINUE
|
|
209
|
+
if not any(item.event_id == event.event_id for item in run.control_events):
|
|
210
|
+
run.control_events.append(event)
|
|
211
|
+
decision = run.controller.observe(event)
|
|
212
|
+
return decision.action
|
|
213
|
+
|
|
214
|
+
# 披露游标活在图状态(随 Checkpoint 持久化);节点结束写回。
|
|
215
|
+
cursors = McpDisclosureCursors(
|
|
216
|
+
# Checkpoint 反序列化会把 tuple 变 list(不可哈希),统一还原。
|
|
217
|
+
listed={tuple(item) for item in (state.get("mcp_listed") or ())},
|
|
218
|
+
schema_read={tuple(item) for item in (state.get("mcp_schema_read") or ())},
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
def _mcp_approval_decider(name: str, arguments: dict[str, Any]) -> bool:
|
|
222
|
+
# P0.1:按实际目标 Server 动态决策——只有 mcp_call_tool 指向
|
|
223
|
+
# high/critical 风险 Server 时才要求审批(高低风险混用不误伤)。
|
|
224
|
+
return name == MCP_CALL_TOOL_TOOL and engine._mcp_disclosure.approval_decider(arguments)
|
|
225
|
+
|
|
226
|
+
class _EngineToolExecutor:
|
|
227
|
+
@staticmethod
|
|
228
|
+
def public_display(name, arguments, result):
|
|
229
|
+
from ksadk.harness.tool_display import builtin_tool_display
|
|
230
|
+
|
|
231
|
+
tool = run.tools.get(name)
|
|
232
|
+
if getattr(tool, "source", None) == "sdk-builtin":
|
|
233
|
+
return builtin_tool_display(name, arguments, result)
|
|
234
|
+
return None
|
|
235
|
+
|
|
236
|
+
@staticmethod
|
|
237
|
+
def validate_arguments(name, arguments): # type: ignore[no-untyped-def]
|
|
238
|
+
tool = run.tools.get(name)
|
|
239
|
+
if tool is None:
|
|
240
|
+
return None
|
|
241
|
+
raw_schema = getattr(tool, "parameters", None)
|
|
242
|
+
# Host tests and backward-compatible integrations may still
|
|
243
|
+
# register a plain callable. With no published schema there
|
|
244
|
+
# is nothing to validate here; execution retains its previous
|
|
245
|
+
# behaviour.
|
|
246
|
+
if not isinstance(raw_schema, dict):
|
|
247
|
+
return None
|
|
248
|
+
schema = raw_schema
|
|
249
|
+
required = schema.get("required") or ()
|
|
250
|
+
missing = [
|
|
251
|
+
str(field)
|
|
252
|
+
for field in required
|
|
253
|
+
if str(field) not in arguments or arguments.get(str(field)) is None
|
|
254
|
+
]
|
|
255
|
+
if missing:
|
|
256
|
+
return "missing required fields: " + ", ".join(missing)
|
|
257
|
+
try:
|
|
258
|
+
from jsonschema.validators import validator_for
|
|
259
|
+
|
|
260
|
+
validator = validator_for(schema)(schema)
|
|
261
|
+
error = next(validator.iter_errors(arguments), None)
|
|
262
|
+
except Exception as exc: # malformed host schema is not a model error
|
|
263
|
+
return f"tool schema validation failed: {exc}"
|
|
264
|
+
return f"schema mismatch: {error.message}" if error is not None else None
|
|
265
|
+
|
|
266
|
+
async def execute(self, name, arguments): # type: ignore[no-untyped-def]
|
|
267
|
+
return await engine._invoke_tool(name, arguments, run=run, mcp_cursors=cursors)
|
|
268
|
+
|
|
269
|
+
async def execute_with_context( # type: ignore[no-untyped-def]
|
|
270
|
+
self, name, arguments, context
|
|
271
|
+
):
|
|
272
|
+
return await engine._invoke_tool(
|
|
273
|
+
name,
|
|
274
|
+
arguments,
|
|
275
|
+
run=run,
|
|
276
|
+
mcp_cursors=cursors,
|
|
277
|
+
call_id=context.call_id,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
def reliability(self, name, arguments, *, receipt_enabled): # type: ignore[no-untyped-def]
|
|
281
|
+
if engine._mcp_disclosure.is_tool(name):
|
|
282
|
+
return engine._mcp_disclosure.reliability(
|
|
283
|
+
name,
|
|
284
|
+
arguments,
|
|
285
|
+
receipt_enabled=receipt_enabled,
|
|
286
|
+
)
|
|
287
|
+
if engine._capability_runtime is not None:
|
|
288
|
+
return engine._capability_runtime.reliability(name)
|
|
289
|
+
from ksadk.harness.tool_reliability import classify_tool_reliability
|
|
290
|
+
|
|
291
|
+
return classify_tool_reliability(side_effect="unknown")
|
|
292
|
+
|
|
293
|
+
from ksadk.harness.subagent import order_subagent_tool_calls
|
|
294
|
+
|
|
295
|
+
pending_tool_calls = order_subagent_tool_calls(
|
|
296
|
+
list(state["pending_tool_calls"]), run.sub_agents
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
def _parallel_safe(name, arguments):
|
|
300
|
+
sub = run.sub_agents.get(name)
|
|
301
|
+
if sub is not None:
|
|
302
|
+
return not (
|
|
303
|
+
sub.tools
|
|
304
|
+
or (sub.inherit_skills and run.skill_catalog)
|
|
305
|
+
or (sub.inherit_mcp and run.mcp_catalog)
|
|
306
|
+
)
|
|
307
|
+
return bool(
|
|
308
|
+
engine._delegation_runtime is not None
|
|
309
|
+
and engine._delegation_runtime.is_tool(name)
|
|
310
|
+
and engine._delegation_runtime.parallel_safe(
|
|
311
|
+
arguments,
|
|
312
|
+
parent_run=run,
|
|
313
|
+
)
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
# Commit sequential siblings at separate checkpoint boundaries. Only
|
|
317
|
+
# children proven unable to request approval may share a parallel node.
|
|
318
|
+
parallel = (
|
|
319
|
+
len(pending_tool_calls) > 1
|
|
320
|
+
and all(
|
|
321
|
+
_parallel_safe(p["name"], p["arguments"])
|
|
322
|
+
and p["name"] not in run.approval_required
|
|
323
|
+
and not (run.sub_agents.get(p["name"]) and run.sub_agents[p["name"]].depends_on)
|
|
324
|
+
for p in pending_tool_calls
|
|
325
|
+
)
|
|
326
|
+
and spec.execution_strategy.config.get("subagent_failure_mode", "partial")
|
|
327
|
+
!= "fail_fast"
|
|
328
|
+
)
|
|
329
|
+
remaining_calls = [] if parallel else pending_tool_calls[1:]
|
|
330
|
+
pending_tool_calls = pending_tool_calls if parallel else pending_tool_calls[:1]
|
|
331
|
+
# Chat only needs an aggregate lifecycle signal. Provider selection,
|
|
332
|
+
# child labels and task bodies remain available in the execution trace
|
|
333
|
+
# and tool receipts, but are deliberately not expanded into one visible
|
|
334
|
+
# progress card per child.
|
|
335
|
+
delegation_calls = (
|
|
336
|
+
[
|
|
337
|
+
pending
|
|
338
|
+
for pending in pending_tool_calls
|
|
339
|
+
if engine._delegation_runtime is not None
|
|
340
|
+
and engine._delegation_runtime.is_tool(str(pending.get("name") or ""))
|
|
341
|
+
]
|
|
342
|
+
if engine._delegation_runtime is not None
|
|
343
|
+
else []
|
|
344
|
+
)
|
|
345
|
+
delegation_labels: list[str] = []
|
|
346
|
+
ordinary_calls = [
|
|
347
|
+
pending for pending in pending_tool_calls if pending not in delegation_calls
|
|
348
|
+
]
|
|
349
|
+
|
|
350
|
+
def _emit_tool_progress(status: str) -> None:
|
|
351
|
+
if not ordinary_calls:
|
|
352
|
+
return
|
|
353
|
+
tools = [str(pending.get("name") or "tool") for pending in ordinary_calls]
|
|
354
|
+
lowered = " ".join(tools).lower()
|
|
355
|
+
activity_kind = (
|
|
356
|
+
"write"
|
|
357
|
+
if any(token in lowered for token in ("write", "edit", "save"))
|
|
358
|
+
else "search"
|
|
359
|
+
if "search" in lowered
|
|
360
|
+
else "fetch"
|
|
361
|
+
if "fetch" in lowered
|
|
362
|
+
else "read"
|
|
363
|
+
if any(token in lowered for token in ("read", "list"))
|
|
364
|
+
else "command"
|
|
365
|
+
if any(token in lowered for token in ("command", "shell", "exec"))
|
|
366
|
+
else "tool"
|
|
367
|
+
)
|
|
368
|
+
batch_id = ":".join(
|
|
369
|
+
str(pending.get("call_id") or index)
|
|
370
|
+
for index, pending in enumerate(ordinary_calls, start=1)
|
|
371
|
+
)
|
|
372
|
+
# Repeated search/fetch/read turns are useful trace evidence but
|
|
373
|
+
# become dozens of duplicate chat rows during long research. Keep
|
|
374
|
+
# one public lifecycle per human activity class.
|
|
375
|
+
if status == "running":
|
|
376
|
+
if activity_kind in run.public_tool_activity_kinds:
|
|
377
|
+
return
|
|
378
|
+
run.public_tool_activity_kinds.add(activity_kind)
|
|
379
|
+
run.public_tool_activity_batches.add(batch_id)
|
|
380
|
+
elif batch_id not in run.public_tool_activity_batches:
|
|
381
|
+
return
|
|
382
|
+
progress_event = engine._event(
|
|
383
|
+
run,
|
|
384
|
+
EventType.RUN_PROGRESS,
|
|
385
|
+
{
|
|
386
|
+
"kind": "tool.batch",
|
|
387
|
+
"status": status,
|
|
388
|
+
"count": len(ordinary_calls),
|
|
389
|
+
"batch_id": batch_id,
|
|
390
|
+
"activity_kind": activity_kind,
|
|
391
|
+
# Tool arguments and results stay in Trace/receipts. The
|
|
392
|
+
# chat surface only receives stable capability names and
|
|
393
|
+
# turns them into human activity summaries.
|
|
394
|
+
"tools": tools,
|
|
395
|
+
},
|
|
396
|
+
)
|
|
397
|
+
run.events.append(progress_event)
|
|
398
|
+
_capture_control_event(progress_event)
|
|
399
|
+
|
|
400
|
+
def _emit_delegation_progress(status: str) -> None:
|
|
401
|
+
if not delegation_calls:
|
|
402
|
+
return
|
|
403
|
+
progress_event = engine._event(
|
|
404
|
+
run,
|
|
405
|
+
EventType.RUN_PROGRESS,
|
|
406
|
+
{
|
|
407
|
+
"kind": "delegation.batch",
|
|
408
|
+
"status": status,
|
|
409
|
+
"count": len(delegation_calls),
|
|
410
|
+
"labels": delegation_labels,
|
|
411
|
+
},
|
|
412
|
+
)
|
|
413
|
+
run.events.append(progress_event)
|
|
414
|
+
_capture_control_event(progress_event)
|
|
415
|
+
|
|
416
|
+
if delegation_calls:
|
|
417
|
+
delegation_labels = [
|
|
418
|
+
engine._delegation_runtime.public_label(
|
|
419
|
+
dict(pending.get("arguments") or {}),
|
|
420
|
+
call_id=str(pending.get("call_id") or ""),
|
|
421
|
+
)
|
|
422
|
+
for pending in delegation_calls
|
|
423
|
+
]
|
|
424
|
+
_emit_delegation_progress("running")
|
|
425
|
+
_emit_tool_progress("running")
|
|
426
|
+
has_subagent_dependencies = any(
|
|
427
|
+
run.sub_agents[name].depends_on
|
|
428
|
+
for name in (str(call.get("name") or "") for call in pending_tool_calls)
|
|
429
|
+
if name in run.sub_agents
|
|
430
|
+
)
|
|
431
|
+
subagent_failure_mode = str(
|
|
432
|
+
run.compiled.spec.execution_strategy.config.get("subagent_failure_mode", "partial")
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
def _live_tool_event(event):
|
|
436
|
+
if (
|
|
437
|
+
event.event_type == EventType.TOOL_CALL_BEGIN
|
|
438
|
+
and str(event.payload.get("call_id") or "") in run.budget_tool_calls
|
|
439
|
+
):
|
|
440
|
+
return # The same pending delegate resumes; it does not start twice.
|
|
441
|
+
run.seq += 1
|
|
442
|
+
event.seq_id = run.seq
|
|
443
|
+
run.events.append(event)
|
|
444
|
+
_capture_control_event(event)
|
|
445
|
+
|
|
446
|
+
try:
|
|
447
|
+
out = await execute_tool_calls(
|
|
448
|
+
ToolCallInput(
|
|
449
|
+
pending_tool_calls=pending_tool_calls,
|
|
450
|
+
approval_required=frozenset(run.approval_required),
|
|
451
|
+
approval_decider=_mcp_approval_decider,
|
|
452
|
+
parallel_safe_decider=(
|
|
453
|
+
lambda name, _arguments: (
|
|
454
|
+
(
|
|
455
|
+
name in run.sub_agents
|
|
456
|
+
and _parallel_safe(name, _arguments)
|
|
457
|
+
or (
|
|
458
|
+
engine._delegation_runtime is not None
|
|
459
|
+
and engine._delegation_runtime.is_tool(name)
|
|
460
|
+
)
|
|
461
|
+
)
|
|
462
|
+
and not has_subagent_dependencies
|
|
463
|
+
and subagent_failure_mode != "fail_fast"
|
|
464
|
+
)
|
|
465
|
+
),
|
|
466
|
+
stop_on_error_decider=(
|
|
467
|
+
lambda name, _arguments: (
|
|
468
|
+
subagent_failure_mode == "fail_fast" and name in run.sub_agents
|
|
469
|
+
)
|
|
470
|
+
),
|
|
471
|
+
cancel_pending_decider=lambda name, _arguments: (
|
|
472
|
+
name in run.sub_agents
|
|
473
|
+
or (
|
|
474
|
+
engine._delegation_runtime is not None
|
|
475
|
+
and engine._delegation_runtime.is_tool(name)
|
|
476
|
+
)
|
|
477
|
+
),
|
|
478
|
+
dependencies={
|
|
479
|
+
name: tuple(spec.depends_on)
|
|
480
|
+
for name, spec in run.sub_agents.items()
|
|
481
|
+
if spec.depends_on
|
|
482
|
+
},
|
|
483
|
+
max_parallelism=int(
|
|
484
|
+
run.compiled.spec.execution_strategy.config.get("max_parallel_subagents", 4)
|
|
485
|
+
),
|
|
486
|
+
capability_runtime=engine._capability_runtime,
|
|
487
|
+
tenant_id=engine._tenant_id,
|
|
488
|
+
authorization_agent_id=run.request.metadata.get("authorization_agent_id"),
|
|
489
|
+
succeeded_tools=frozenset(state.get("tool_batch_succeeded") or ()),
|
|
490
|
+
prior_failure=bool(state.get("tool_batch_failed")),
|
|
491
|
+
live_event_sink=_live_tool_event,
|
|
492
|
+
argument_validator=_EngineToolExecutor.validate_arguments,
|
|
493
|
+
approval_resolver=_HandlerApprovalResolver(state),
|
|
494
|
+
tool_executor=_EngineToolExecutor(),
|
|
495
|
+
result_governor=RunToolResultGovernor(engine=engine, run=run),
|
|
496
|
+
# G5 §5.2:on_tool_result 钩子闭包(降级经引擎缓冲,节点末尾
|
|
497
|
+
# flush;无钩子时为 None,execute_tool_calls 行为逐字节不变)。
|
|
498
|
+
tool_result_hook=(
|
|
499
|
+
_make_tool_result_hook(engine, run) if engine._hooks else None
|
|
500
|
+
),
|
|
501
|
+
agent_id=run.state.agent_id,
|
|
502
|
+
user_id=run.state.user_id,
|
|
503
|
+
session_id=run.state.session_id,
|
|
504
|
+
run_id=run.handle.run_id,
|
|
505
|
+
seq_start=run.seq,
|
|
506
|
+
working_context=run.state.working_context,
|
|
507
|
+
)
|
|
508
|
+
)
|
|
509
|
+
except _SuspensionRequest as sus:
|
|
510
|
+
# 审批挂起(旧行为:resolver 直接 interrupt(),异常穿出 execute_tool_calls
|
|
511
|
+
# 落到 except BaseException 分支)。事件面逐字对齐该分支:先补发失败态
|
|
512
|
+
# 进度,再把本节点已发生的 on_tool_result 降级落到事件流,不让降级事实
|
|
513
|
+
# 滞留缓冲跨挂起边界;随后以 NeedInteraction 交还调用方。
|
|
514
|
+
# 重放守卫:resume 后 LangGraph 会整体重放本节点,而重放期间决定尚未到达
|
|
515
|
+
# (要等调用方 interrupt() 返回)会再走一次本分支;旧行为下那一次是
|
|
516
|
+
# interrupt() 内联返回决定、从不进异常分支,故不得重复补发 failed。调用方
|
|
517
|
+
# 在节点入口把"正在重放的审批 call_id"写为 run 属性(引擎挂起时记录、attach
|
|
518
|
+
# 从 Checkpoint 重建,跨进程恢复亦成立);属性缺失/不等 = 首次挂起。
|
|
519
|
+
if str(getattr(run, TOOL_APPROVAL_REPLAY_ATTR, "") or "") != str(
|
|
520
|
+
sus.interaction.request_payload.get("call_id") or ""
|
|
521
|
+
):
|
|
522
|
+
_emit_delegation_progress("failed")
|
|
523
|
+
_emit_tool_progress("failed")
|
|
524
|
+
flush_hook_degradations(engine, run)
|
|
525
|
+
return PhaseResult(
|
|
526
|
+
state=state,
|
|
527
|
+
events=list(run.events[events_start:]),
|
|
528
|
+
interaction=sus.interaction,
|
|
529
|
+
)
|
|
530
|
+
except ChildApprovalPending as exc:
|
|
531
|
+
state["child_approval"] = exc.detail
|
|
532
|
+
state["route"] = "child_approval"
|
|
533
|
+
state["budget"] = budgets.snapshot(run)
|
|
534
|
+
# 审批挂起前把本节点已发生的 on_tool_result 降级落到事件流,
|
|
535
|
+
# 不让降级事实滞留缓冲跨 interrupt 边界。
|
|
536
|
+
flush_hook_degradations(engine, run)
|
|
537
|
+
call_id = str(exc.detail.get("call_id") or "")
|
|
538
|
+
return PhaseResult(
|
|
539
|
+
state=state,
|
|
540
|
+
events=list(run.events[events_start:]),
|
|
541
|
+
route="child_approval",
|
|
542
|
+
interaction=NeedInteraction(
|
|
543
|
+
interaction_id=f"ap-{call_id}",
|
|
544
|
+
kind="child_approval",
|
|
545
|
+
request_payload=dict(exc.detail),
|
|
546
|
+
resume_phase="tools",
|
|
547
|
+
# Phase 1:LangGraph 通道不消费 revision;Phase 2 接 Native snapshot revision。
|
|
548
|
+
expected_revision=0,
|
|
549
|
+
),
|
|
550
|
+
)
|
|
551
|
+
except BaseException:
|
|
552
|
+
_emit_delegation_progress("failed")
|
|
553
|
+
_emit_tool_progress("failed")
|
|
554
|
+
# 异常路径:降级事实同样不能丢(本节点事件已由 live sink 推进
|
|
555
|
+
# run.seq,此刻 flush 保持 seq 单调)。
|
|
556
|
+
flush_hook_degradations(engine, run)
|
|
557
|
+
raise
|
|
558
|
+
for ev in out.events:
|
|
559
|
+
_capture_control_event(ev)
|
|
560
|
+
if ev.event_type == EventType.TOOL_CALL_END:
|
|
561
|
+
if not ev.payload.get("error"):
|
|
562
|
+
state.setdefault("tool_batch_succeeded", []).append(ev.payload["name"])
|
|
563
|
+
elif (
|
|
564
|
+
subagent_failure_mode == "fail_fast"
|
|
565
|
+
and ev.payload.get("name") in run.sub_agents
|
|
566
|
+
):
|
|
567
|
+
state["tool_batch_failed"] = True
|
|
568
|
+
tool_errors = any(
|
|
569
|
+
event.event_type == EventType.TOOL_CALL_END and event.payload.get("error")
|
|
570
|
+
for event in out.events
|
|
571
|
+
if str(event.payload.get("name") or "")
|
|
572
|
+
not in {str(call.get("name") or "") for call in delegation_calls}
|
|
573
|
+
)
|
|
574
|
+
_emit_tool_progress("failed" if tool_errors else "completed")
|
|
575
|
+
# 收口 6:子 Agent 事件统一重排并入(tool.call.begin/end 之后)。
|
|
576
|
+
from ksadk.harness.subagent import resequence_child_events
|
|
577
|
+
|
|
578
|
+
child_events = engine._pending_child_events.pop(run.handle.run_id, [])
|
|
579
|
+
for event in child_events:
|
|
580
|
+
_capture_control_event(event)
|
|
581
|
+
resequence_child_events(run, child_events)
|
|
582
|
+
subagent_events = engine._pending_subagent_events.pop(run.handle.run_id, {})
|
|
583
|
+
for pending in pending_tool_calls:
|
|
584
|
+
pending_events = subagent_events.get(str(pending.get("call_id") or ""), [])
|
|
585
|
+
for event in pending_events:
|
|
586
|
+
_capture_control_event(event)
|
|
587
|
+
resequence_child_events(
|
|
588
|
+
run,
|
|
589
|
+
pending_events,
|
|
590
|
+
)
|
|
591
|
+
if delegation_calls:
|
|
592
|
+
delegated_call_ids = {str(pending.get("call_id") or "") for pending in delegation_calls}
|
|
593
|
+
failed = any(
|
|
594
|
+
event.event_type == EventType.TOOL_CALL_END
|
|
595
|
+
and str(event.payload.get("call_id") or "") in delegated_call_ids
|
|
596
|
+
and bool(event.payload.get("error"))
|
|
597
|
+
for event in out.events
|
|
598
|
+
)
|
|
599
|
+
_emit_delegation_progress("failed" if failed else "completed")
|
|
600
|
+
state["delegation_synthesis_pending"] = True
|
|
601
|
+
state["messages"].extend(out.new_messages)
|
|
602
|
+
if out.working_context is not None:
|
|
603
|
+
run.state.working_context = out.working_context
|
|
604
|
+
state["pending_tool_calls"] = remaining_calls
|
|
605
|
+
state["mcp_listed"] = sorted(cursors.listed)
|
|
606
|
+
state["mcp_schema_read"] = sorted(cursors.schema_read)
|
|
607
|
+
state["route"] = "tool_calls" if remaining_calls else out.route
|
|
608
|
+
# G5 §5.2:on_tool_result 降级事件在节点末尾统一 flush(live sink 已使
|
|
609
|
+
# run.seq 与 loop 本地计数对齐;早于本点 flush 抢占不了任何事件,晚于
|
|
610
|
+
# 本点则把事实留到下个节点)。语义与 reason 节点的 flush 完全一致。
|
|
611
|
+
flush_hook_degradations(engine, run)
|
|
612
|
+
if run.controller is not None:
|
|
613
|
+
if (
|
|
614
|
+
run.controller.replan_reason
|
|
615
|
+
and run.controller.guidance_emitted_revision != run.controller.guidance_revision
|
|
616
|
+
):
|
|
617
|
+
run.events.append(
|
|
618
|
+
engine._event(
|
|
619
|
+
run,
|
|
620
|
+
EventType.RUN_PROGRESS,
|
|
621
|
+
{
|
|
622
|
+
"kind": "run_control",
|
|
623
|
+
"status": "in_progress",
|
|
624
|
+
"action": "replan",
|
|
625
|
+
"reason": run.controller.replan_reason,
|
|
626
|
+
"plan_revision": run.controller.guidance_revision,
|
|
627
|
+
},
|
|
628
|
+
)
|
|
629
|
+
)
|
|
630
|
+
state["run_control"] = run.controller.snapshot()
|
|
631
|
+
return PhaseResult(
|
|
632
|
+
state=state,
|
|
633
|
+
events=list(run.events[events_start:]),
|
|
634
|
+
route=state.get("route"),
|
|
635
|
+
)
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
__all__ = ["tools_phase"]
|