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,700 @@
|
|
|
1
|
+
"""Bind Studio Build sub-agents to isolated Native child Runs.
|
|
2
|
+
|
|
3
|
+
Read roles share observations. Host-admitted SDK file write roles use an
|
|
4
|
+
actual independent directory and controlled parent merge. Child approvals route
|
|
5
|
+
through the original parent/child commands; arbitrary processes need isolation.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
from collections.abc import Callable, Mapping
|
|
14
|
+
from dataclasses import replace
|
|
15
|
+
from typing import Any, Literal
|
|
16
|
+
|
|
17
|
+
from ksadk.harness.artifact_adapters.native_page_budget import ArtifactPagePolicy
|
|
18
|
+
from ksadk.harness.native.completion import (
|
|
19
|
+
AcceptanceItem,
|
|
20
|
+
CompletionCandidate,
|
|
21
|
+
TaskContract,
|
|
22
|
+
VerificationItemResult,
|
|
23
|
+
VerificationReport,
|
|
24
|
+
)
|
|
25
|
+
from ksadk.harness.native.context_runtime import ContextPlanner
|
|
26
|
+
from ksadk.harness.native.model import ModelProfile
|
|
27
|
+
from ksadk.harness.native.output_contract import object_output_schema, validate_submission_schema
|
|
28
|
+
from ksadk.harness.native.ports import (
|
|
29
|
+
ArtifactPort,
|
|
30
|
+
ModelPort,
|
|
31
|
+
RunConfiguration,
|
|
32
|
+
RunLimits,
|
|
33
|
+
ToolDefinition,
|
|
34
|
+
ToolPort,
|
|
35
|
+
ToolRequest,
|
|
36
|
+
ToolResult,
|
|
37
|
+
VerificationBundle,
|
|
38
|
+
VerificationRequest,
|
|
39
|
+
WorkspacePort,
|
|
40
|
+
digest,
|
|
41
|
+
)
|
|
42
|
+
from ksadk.harness.native.state import RunScope
|
|
43
|
+
from ksadk.harness.native.subagents import ChildObservation, ChildRole, ChildRunRequest
|
|
44
|
+
from ksadk.harness.spec import SubAgentBinding
|
|
45
|
+
from ksadk.harness.stores.native_contract import LeasedRunStore, RunStore
|
|
46
|
+
from ksadk.harness.subagent import SubAgentOutputValidationError, validate_subagent_output
|
|
47
|
+
from ksadk.harness.subagent_adapters.native_background_child import NativeBackgroundChildToolPort
|
|
48
|
+
from ksadk.harness.subagent_adapters.native_child import ChildBindings, NativeChildToolPort
|
|
49
|
+
from ksadk.harness.subagent_adapters.native_child_continuation import bind_child_continuation
|
|
50
|
+
from ksadk.harness.subagent_adapters.native_child_result import NativeChildResultPort
|
|
51
|
+
from ksadk.studio.native_child_mcp import StudioChildMcp
|
|
52
|
+
from ksadk.studio.native_child_skills import StudioChildSkills
|
|
53
|
+
from ksadk.studio.native_child_workspace import StudioChildFileWorkspaces
|
|
54
|
+
from ksadk.studio.native_final_shape import (
|
|
55
|
+
final_shape_contract_description,
|
|
56
|
+
json_object_submission_schema,
|
|
57
|
+
requested_final_shape,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
_READ_ONLY_WORKSPACE_TOOLS = frozenset(
|
|
61
|
+
{"workspace_status", "list_workspace_files", "read_workspace_file", "search_workspace_files"}
|
|
62
|
+
)
|
|
63
|
+
_SCHEMA_VERIFIER_REF = "studio.child-output-schema"
|
|
64
|
+
_SCHEMA_VERIFIER_VERSION = "1"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _sha256(value: str) -> str:
|
|
68
|
+
return hashlib.sha256(value.encode("utf-8")).hexdigest()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class _ChildOutputSchemaVerifier:
|
|
72
|
+
"""Verify the child's own final candidate before its parent receives it."""
|
|
73
|
+
|
|
74
|
+
def __init__(self, *, schema: dict[str, Any], child_run_id: str) -> None:
|
|
75
|
+
self._schema = schema
|
|
76
|
+
self._schema_digest = _sha256(json.dumps(schema, sort_keys=True, ensure_ascii=False))
|
|
77
|
+
self._child_run_id = child_run_id
|
|
78
|
+
|
|
79
|
+
async def verify(self, request: VerificationRequest) -> VerificationBundle:
|
|
80
|
+
try:
|
|
81
|
+
validate_subagent_output(request.final_text, self._schema)
|
|
82
|
+
valid = True
|
|
83
|
+
except SubAgentOutputValidationError:
|
|
84
|
+
valid = False
|
|
85
|
+
subject = _sha256(request.final_text)
|
|
86
|
+
environment = _sha256(f"{self._child_run_id}\0{self._schema_digest}")
|
|
87
|
+
evidence_ref = (
|
|
88
|
+
f"studio-child-schema://{self._schema_digest}/{_sha256(self._child_run_id)}/{subject}"
|
|
89
|
+
)
|
|
90
|
+
return VerificationBundle(
|
|
91
|
+
candidate=CompletionCandidate(
|
|
92
|
+
candidate_id=request.candidate_id,
|
|
93
|
+
final_text=request.final_text,
|
|
94
|
+
subject_digest=subject,
|
|
95
|
+
subject_context_digest=request.subject_context_digest,
|
|
96
|
+
environment_digest=environment,
|
|
97
|
+
),
|
|
98
|
+
report=VerificationReport(
|
|
99
|
+
candidate_id=request.candidate_id,
|
|
100
|
+
contract_revision=request.contract.revision,
|
|
101
|
+
subject_digest=subject,
|
|
102
|
+
subject_context_digest=request.subject_context_digest,
|
|
103
|
+
environment_digest=environment,
|
|
104
|
+
items=(
|
|
105
|
+
VerificationItemResult(
|
|
106
|
+
acceptance_id="delegated_output_schema",
|
|
107
|
+
status="passed" if valid else "failed",
|
|
108
|
+
verifier_id=_SCHEMA_VERIFIER_REF,
|
|
109
|
+
verifier_version=_SCHEMA_VERIFIER_VERSION,
|
|
110
|
+
evidence_refs=(evidence_ref,),
|
|
111
|
+
verification_method="deterministic",
|
|
112
|
+
safe_summary=(
|
|
113
|
+
"Child output matches its bound JSON Schema."
|
|
114
|
+
if valid
|
|
115
|
+
else "Return only JSON matching the bound output schema."
|
|
116
|
+
),
|
|
117
|
+
),
|
|
118
|
+
VerificationItemResult(
|
|
119
|
+
acceptance_id="delegated_task",
|
|
120
|
+
status="not_run",
|
|
121
|
+
verifier_id="studio.child-independent-evidence-unavailable",
|
|
122
|
+
verifier_version="1",
|
|
123
|
+
evidence_refs=(),
|
|
124
|
+
verification_method="human",
|
|
125
|
+
safe_summary=(
|
|
126
|
+
"No independent evidence verifies the delegated task's meaning."
|
|
127
|
+
),
|
|
128
|
+
),
|
|
129
|
+
),
|
|
130
|
+
repairable=not valid,
|
|
131
|
+
failure_fingerprint=(
|
|
132
|
+
_sha256(f"invalid-child-schema\0{self._schema_digest}") if not valid else ""
|
|
133
|
+
),
|
|
134
|
+
workspace_dependency="none",
|
|
135
|
+
),
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _thaw_build_value(value: Any) -> Any:
|
|
140
|
+
"""Copy the plugin host's immutable Build view for strict schema validation."""
|
|
141
|
+
if isinstance(value, Mapping):
|
|
142
|
+
return {key: _thaw_build_value(child) for key, child in value.items()}
|
|
143
|
+
if isinstance(value, (list, tuple)):
|
|
144
|
+
return [_thaw_build_value(child) for child in value]
|
|
145
|
+
return value
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _bindings_from_build(resolved_agent_spec: Mapping[str, Any]) -> tuple[SubAgentBinding, ...]:
|
|
149
|
+
raw = resolved_agent_spec.get("subAgents", resolved_agent_spec.get("sub_agents", ()))
|
|
150
|
+
if not isinstance(raw, (list, tuple)):
|
|
151
|
+
raise ValueError("native_studio_subagent_binding_invalid")
|
|
152
|
+
return tuple(SubAgentBinding.model_validate(_thaw_build_value(item)) for item in raw)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def required_subagent_effect_timeout(resolved_agent_spec: Mapping[str, Any]) -> float:
|
|
156
|
+
bindings = _bindings_from_build(resolved_agent_spec)
|
|
157
|
+
if not bindings:
|
|
158
|
+
return 0.0
|
|
159
|
+
maximum = max(item.timeout_seconds for item in bindings)
|
|
160
|
+
if maximum > 3585:
|
|
161
|
+
raise ValueError("native_studio_subagent_timeout_exceeds_effect_lease")
|
|
162
|
+
return maximum + 15.0
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class _ChildToolMux:
|
|
166
|
+
def __init__(self, ports: Mapping[str, ToolPort]) -> None:
|
|
167
|
+
self._ports = dict(ports)
|
|
168
|
+
|
|
169
|
+
async def execute(self, request: ToolRequest) -> ToolResult:
|
|
170
|
+
port = self._ports.get(request.call.name)
|
|
171
|
+
if port is None:
|
|
172
|
+
return ToolResult(status="error", content={"error_code": "child_tool_not_granted"})
|
|
173
|
+
return await port.execute(request)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class _StudioChildPort(NativeChildToolPort):
|
|
177
|
+
"""Pin dual-mode delivery to the host's locked role assembly."""
|
|
178
|
+
|
|
179
|
+
def __init__(self, *, assembly_digest: str, store: RunStore | None = None,
|
|
180
|
+
file_workspace_policy: bool = False, borrowed_mcp_policy: bool = False, **kwargs):
|
|
181
|
+
self._assembly_digest = assembly_digest
|
|
182
|
+
self._continuation_store = store
|
|
183
|
+
self._file_workspace_policy = file_workspace_policy
|
|
184
|
+
self._borrowed_mcp_policy = borrowed_mcp_policy
|
|
185
|
+
super().__init__(**kwargs)
|
|
186
|
+
|
|
187
|
+
def definition(self) -> ToolDefinition:
|
|
188
|
+
raw = super().definition().model_dump(mode="json")
|
|
189
|
+
raw["feedback_profile_digest"] = self._assembly_digest
|
|
190
|
+
raw["child_budget_policy"] = "delegate/v1"
|
|
191
|
+
if self._borrowed_mcp_policy:
|
|
192
|
+
raw["description"] += (
|
|
193
|
+
" Inherited MCP tools use the parent activation's bound resources. "
|
|
194
|
+
"Local file isolation does not isolate or roll back those effects; "
|
|
195
|
+
"each call retains the child's exact authorization and approval."
|
|
196
|
+
)
|
|
197
|
+
raw["parameters"]["properties"]["background"] = {
|
|
198
|
+
"type": "boolean", "default": False,
|
|
199
|
+
"description": (
|
|
200
|
+
"False waits for the findings; true returns the child ID and continues "
|
|
201
|
+
"independent parent work. The host may move the same foreground child "
|
|
202
|
+
"to the background. Collect background findings before final delivery."
|
|
203
|
+
),
|
|
204
|
+
}
|
|
205
|
+
raw["description"] += (
|
|
206
|
+
" Foreground by default. A background startup is not findings; use "
|
|
207
|
+
"native_child_control to send guidance, wait or stop the same child."
|
|
208
|
+
)
|
|
209
|
+
if self._file_workspace_policy:
|
|
210
|
+
raw["description"] += (
|
|
211
|
+
" File-writing roles modify an isolated copy, preserving current dirty "
|
|
212
|
+
"and untracked inputs. Their delivery has not changed the parent files; "
|
|
213
|
+
"use native_child_merge after collecting a completed child's result, "
|
|
214
|
+
"then inspect and verify the parent workspace."
|
|
215
|
+
)
|
|
216
|
+
if self._continuation_store is not None:
|
|
217
|
+
raw["parameters"]["properties"]["continuation_of"] = {
|
|
218
|
+
"type": "string", "minLength": 1, "maxLength": 256,
|
|
219
|
+
"description": (
|
|
220
|
+
"An accounted terminal child's run ID for a follow-up in its existing "
|
|
221
|
+
"Session. Collect background results first. Uses the current role and "
|
|
222
|
+
"a new turn and budget; the original result remains unchanged."
|
|
223
|
+
),
|
|
224
|
+
}
|
|
225
|
+
return ToolDefinition.model_validate(raw)
|
|
226
|
+
|
|
227
|
+
def _request(self, request: ToolRequest) -> ChildRunRequest:
|
|
228
|
+
if self._continuation_store is None or "continuation_of" not in request.call.arguments:
|
|
229
|
+
return super()._request(request)
|
|
230
|
+
arguments = dict(request.call.arguments)
|
|
231
|
+
source_run_id = arguments.pop("continuation_of")
|
|
232
|
+
child = super()._request(request.model_copy(update={
|
|
233
|
+
"call": request.call.model_copy(update={"arguments": arguments}),
|
|
234
|
+
}))
|
|
235
|
+
return bind_child_continuation(
|
|
236
|
+
child, source_run_id, store=self._continuation_store,
|
|
237
|
+
roles=tuple(self.roles.values()),
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
@staticmethod
|
|
241
|
+
def _configuration(child, bindings):
|
|
242
|
+
config = NativeChildToolPort._configuration(child, bindings).model_dump(mode="json")
|
|
243
|
+
if child.delivery_mode is not None:
|
|
244
|
+
config["guidance_policy"] = "boundary-guide/v1"
|
|
245
|
+
return RunConfiguration.model_validate(config)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
class _StudioBackgroundChildPort(NativeBackgroundChildToolPort):
|
|
249
|
+
def __init__(self, *, assembly_digest, **kwargs):
|
|
250
|
+
self._assembly_digest = assembly_digest
|
|
251
|
+
super().__init__(**kwargs)
|
|
252
|
+
|
|
253
|
+
def definitions(self):
|
|
254
|
+
return tuple(item.model_copy(update={"feedback_profile_digest": self._assembly_digest})
|
|
255
|
+
for item in super().definitions())
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class StudioNativeSubagentPort:
|
|
259
|
+
"""Consume child-owned deadlines; legacy unbound ports keep their outer limit."""
|
|
260
|
+
|
|
261
|
+
def __init__(
|
|
262
|
+
self,
|
|
263
|
+
*,
|
|
264
|
+
child_port: NativeChildToolPort,
|
|
265
|
+
bindings: Mapping[str, SubAgentBinding],
|
|
266
|
+
result_port: NativeChildResultPort | None = None,
|
|
267
|
+
background_port: NativeBackgroundChildToolPort | None = None,
|
|
268
|
+
file_merge_surface: tuple[ToolDefinition, ToolPort] | None = None,
|
|
269
|
+
active_execution_budget_bound: bool = False,
|
|
270
|
+
) -> None:
|
|
271
|
+
self._child_port = child_port
|
|
272
|
+
self._bindings = dict(bindings)
|
|
273
|
+
self.result_port = result_port
|
|
274
|
+
self.background_port = background_port
|
|
275
|
+
self.file_merge_surface = file_merge_surface
|
|
276
|
+
self._active_execution_budget_bound = active_execution_budget_bound
|
|
277
|
+
|
|
278
|
+
def definition(self) -> ToolDefinition:
|
|
279
|
+
return self._child_port.definition()
|
|
280
|
+
|
|
281
|
+
async def execute(self, request: ToolRequest) -> ToolResult:
|
|
282
|
+
return await self._invoke(request, action="execute")
|
|
283
|
+
|
|
284
|
+
async def reconcile(self, request: ToolRequest) -> ToolResult:
|
|
285
|
+
return await self._invoke(request, action="reconcile")
|
|
286
|
+
|
|
287
|
+
async def recover_prepared(self, request: ToolRequest) -> ToolResult:
|
|
288
|
+
return await self._invoke(request, action="recover_prepared")
|
|
289
|
+
|
|
290
|
+
async def resume_prepared(self, request: ToolRequest) -> ToolResult:
|
|
291
|
+
return await self._invoke(request, action="resume_prepared")
|
|
292
|
+
|
|
293
|
+
async def resume_checkpoint(self, request: ToolRequest) -> ToolResult:
|
|
294
|
+
return await self._invoke(request, action="resume_checkpoint")
|
|
295
|
+
|
|
296
|
+
async def _invoke(
|
|
297
|
+
self,
|
|
298
|
+
request: ToolRequest,
|
|
299
|
+
*,
|
|
300
|
+
action: Literal[
|
|
301
|
+
"execute", "reconcile", "recover_prepared", "resume_prepared", "resume_checkpoint"
|
|
302
|
+
],
|
|
303
|
+
) -> ToolResult:
|
|
304
|
+
role = request.call.arguments.get("role")
|
|
305
|
+
binding = self._bindings.get(role) if isinstance(role, str) else None
|
|
306
|
+
if binding is None:
|
|
307
|
+
return ToolResult(
|
|
308
|
+
status="error" if action == "execute" else "uncertain",
|
|
309
|
+
content={"error_code": "child_role_not_bound"},
|
|
310
|
+
)
|
|
311
|
+
async def invoke():
|
|
312
|
+
if action == "execute" and self.background_port is not None:
|
|
313
|
+
return await self.background_port.execute_foreground(
|
|
314
|
+
request, delegate=self._child_port
|
|
315
|
+
)
|
|
316
|
+
return await getattr(self._child_port, action)(request)
|
|
317
|
+
|
|
318
|
+
if self._active_execution_budget_bound:
|
|
319
|
+
# The ordinary Native factory pins max_wall_seconds in the child
|
|
320
|
+
# Kernel. A competing outer timer discards its sealed lineage and
|
|
321
|
+
# usage when it cancels the owner just before that clock commits.
|
|
322
|
+
# The parent's effect lease still bounds host assembly/cleanup.
|
|
323
|
+
result = await invoke()
|
|
324
|
+
else:
|
|
325
|
+
try:
|
|
326
|
+
async with asyncio.timeout(binding.timeout_seconds):
|
|
327
|
+
result = await invoke()
|
|
328
|
+
except TimeoutError:
|
|
329
|
+
return ToolResult(
|
|
330
|
+
status="uncertain", content={"error_code": "child_timeout_outcome_unknown"}
|
|
331
|
+
)
|
|
332
|
+
# A successful startup is an allocation receipt, not a final delivery.
|
|
333
|
+
# The child keeps its locked output contract and verifier while owned
|
|
334
|
+
# collection later consumes its actual terminal result.
|
|
335
|
+
if (result.status != "ok" or result.child_budget_reservation is not None
|
|
336
|
+
or binding.output_schema is None):
|
|
337
|
+
return result
|
|
338
|
+
try:
|
|
339
|
+
observation = ChildObservation.model_validate(result.content)
|
|
340
|
+
except ValueError:
|
|
341
|
+
return ToolResult(
|
|
342
|
+
status="error",
|
|
343
|
+
content={"error_code": "child_observation_invalid"},
|
|
344
|
+
resource_usage=result.resource_usage,
|
|
345
|
+
)
|
|
346
|
+
try:
|
|
347
|
+
validate_subagent_output(observation.final_text, binding.output_schema)
|
|
348
|
+
except SubAgentOutputValidationError:
|
|
349
|
+
# Keep the child identity and accounting but do not let the parent
|
|
350
|
+
# consume an invalid result as successful delegated evidence.
|
|
351
|
+
content = observation.model_dump(mode="json")
|
|
352
|
+
content.update(error_code="child_output_validation_failed", final_text="")
|
|
353
|
+
return ToolResult(status="error", content=content, resource_usage=result.resource_usage)
|
|
354
|
+
return result
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def build_studio_native_subagent_port(
|
|
358
|
+
*,
|
|
359
|
+
resolved_agent_spec: Mapping[str, Any],
|
|
360
|
+
scope: RunScope,
|
|
361
|
+
store: RunStore,
|
|
362
|
+
model: ModelPort,
|
|
363
|
+
profile: ModelProfile,
|
|
364
|
+
definitions: tuple[ToolDefinition, ...],
|
|
365
|
+
ports: Mapping[str, ToolPort],
|
|
366
|
+
workspace: WorkspacePort,
|
|
367
|
+
effect_timeout_seconds: float,
|
|
368
|
+
has_bound_skills: bool,
|
|
369
|
+
has_bound_mcp: bool,
|
|
370
|
+
approval_required: frozenset[str],
|
|
371
|
+
context_planner: ContextPlanner | None = None,
|
|
372
|
+
artifacts_factory: Callable[[RunScope], ArtifactPort] | None = None,
|
|
373
|
+
artifact_search: bool = False,
|
|
374
|
+
artifact_page_policy: ArtifactPagePolicy | None = None,
|
|
375
|
+
source_read_policy=None,
|
|
376
|
+
max_tool_result_bytes: int | None = None,
|
|
377
|
+
file_workspaces: StudioChildFileWorkspaces | None = None,
|
|
378
|
+
child_skills: StudioChildSkills | None = None,
|
|
379
|
+
child_mcp: StudioChildMcp | None = None,
|
|
380
|
+
) -> StudioNativeSubagentPort | None:
|
|
381
|
+
bindings = _bindings_from_build(resolved_agent_spec)
|
|
382
|
+
if not bindings:
|
|
383
|
+
return None
|
|
384
|
+
by_name = {item.name: item for item in bindings}
|
|
385
|
+
if len(by_name) != len(bindings):
|
|
386
|
+
raise ValueError("native_studio_subagent_role_duplicate")
|
|
387
|
+
by_tool = {item.name: item for item in definitions}
|
|
388
|
+
writing_roles = set()
|
|
389
|
+
skill_roles = {
|
|
390
|
+
binding.name for binding in bindings if binding.inherit_skills and has_bound_skills
|
|
391
|
+
}
|
|
392
|
+
mcp_roles = {binding.name for binding in bindings if binding.inherit_mcp and has_bound_mcp}
|
|
393
|
+
for binding in bindings:
|
|
394
|
+
if (
|
|
395
|
+
binding.max_total_tokens is not None
|
|
396
|
+
or binding.depends_on
|
|
397
|
+
or binding.failure_policy != "propagate"
|
|
398
|
+
or binding.max_retries
|
|
399
|
+
):
|
|
400
|
+
raise ValueError("native_studio_subagent_policy_unsupported")
|
|
401
|
+
if (binding.name in skill_roles and child_skills is None) or (
|
|
402
|
+
binding.name in mcp_roles and child_mcp is None
|
|
403
|
+
):
|
|
404
|
+
raise ValueError("native_studio_subagent_capability_inheritance_unsupported")
|
|
405
|
+
if (binding.name in mcp_roles and binding.concurrent_safe
|
|
406
|
+
and any(not item.read_only for item in child_mcp.definitions)):
|
|
407
|
+
raise ValueError("child_mcp_concurrent_effects_unsupported")
|
|
408
|
+
if binding.timeout_seconds + 15 > effect_timeout_seconds:
|
|
409
|
+
raise ValueError("native_studio_subagent_timeout_exceeds_effect_lease")
|
|
410
|
+
if any(name in by_tool and not by_tool[name].read_only for name in binding.tools):
|
|
411
|
+
if (
|
|
412
|
+
file_workspaces is None or binding.concurrent_safe
|
|
413
|
+
or any(name not in by_tool or name not in ports
|
|
414
|
+
or name not in file_workspaces.tool_names
|
|
415
|
+
for name in binding.tools)
|
|
416
|
+
):
|
|
417
|
+
raise ValueError("native_studio_subagent_write_role_requires_isolation")
|
|
418
|
+
writing_roles.add(binding.name)
|
|
419
|
+
elif any(
|
|
420
|
+
name not in _READ_ONLY_WORKSPACE_TOOLS
|
|
421
|
+
or name not in by_tool
|
|
422
|
+
or not by_tool[name].read_only
|
|
423
|
+
or name not in ports
|
|
424
|
+
for name in binding.tools
|
|
425
|
+
):
|
|
426
|
+
raise ValueError("native_studio_subagent_write_role_requires_isolation")
|
|
427
|
+
|
|
428
|
+
roles = tuple(ChildRole(
|
|
429
|
+
role_id=item.name, description=item.description or item.name,
|
|
430
|
+
tool_names=(*item.tools, *(child_skills.tool_names if item.name in skill_roles else ()),
|
|
431
|
+
*(child_mcp.tool_names if item.name in mcp_roles else ())),
|
|
432
|
+
concurrent_safe=item.concurrent_safe,
|
|
433
|
+
workspace_access="isolated_write" if item.name in writing_roles else "read_only",
|
|
434
|
+
) for item in bindings)
|
|
435
|
+
|
|
436
|
+
async def factory(child: ChildRunRequest) -> ChildBindings:
|
|
437
|
+
binding = by_name[child.role.role_id]
|
|
438
|
+
parent = store.load(child.parent_scope, child.parent_run_id)
|
|
439
|
+
schema = binding.output_schema
|
|
440
|
+
declared_object = child.output_format == "json_object"
|
|
441
|
+
if child.output_contract == "parent" and not parent.task_contract:
|
|
442
|
+
raise ValueError("child_parent_output_contract_unavailable")
|
|
443
|
+
parent_contract = (
|
|
444
|
+
TaskContract.model_validate_json(json.dumps(parent.task_contract))
|
|
445
|
+
if child.output_contract == "parent"
|
|
446
|
+
else None
|
|
447
|
+
)
|
|
448
|
+
parent_output = (
|
|
449
|
+
object_output_schema(
|
|
450
|
+
parent_contract.final_submission_schema,
|
|
451
|
+
parent_contract.final_submission_payload_key,
|
|
452
|
+
)
|
|
453
|
+
if parent_contract is not None
|
|
454
|
+
else None
|
|
455
|
+
)
|
|
456
|
+
if child.output_contract == "parent" and parent_output is None:
|
|
457
|
+
raise ValueError("child_parent_output_contract_unavailable")
|
|
458
|
+
if declared_object and schema is not None and schema.get("type") != "object":
|
|
459
|
+
raise ValueError("child_output_format_conflicts_with_binding")
|
|
460
|
+
schema_text = (
|
|
461
|
+
json.dumps(schema, sort_keys=True, ensure_ascii=False) if schema is not None else None
|
|
462
|
+
)
|
|
463
|
+
# Explicit Build schemas keep their existing child Verify→Repair path.
|
|
464
|
+
# Otherwise, compile the delegated goal through the same host protocol
|
|
465
|
+
# as an ordinary parent, rather than relying on role prose to enforce it.
|
|
466
|
+
object_submission = (
|
|
467
|
+
parent_output is not None
|
|
468
|
+
or schema is None
|
|
469
|
+
and (declared_object or requested_final_shape(child.task) == "json_object")
|
|
470
|
+
)
|
|
471
|
+
# An explicit caller type survives task rephrasing. A locked object
|
|
472
|
+
# schema stays exact and remains subject to host submission limits.
|
|
473
|
+
submission_schema = (
|
|
474
|
+
schema
|
|
475
|
+
if declared_object and schema is not None
|
|
476
|
+
else json_object_submission_schema(child.task)
|
|
477
|
+
if object_submission
|
|
478
|
+
else None
|
|
479
|
+
)
|
|
480
|
+
if parent_output is not None:
|
|
481
|
+
# The caller selects an existing host constraint, not a schema
|
|
482
|
+
# supplied by model text. Locked role constraints stay conjunctive.
|
|
483
|
+
inner = (
|
|
484
|
+
{"type": "object", "allOf": [schema, parent_output]}
|
|
485
|
+
if schema is not None
|
|
486
|
+
else parent_output
|
|
487
|
+
)
|
|
488
|
+
submission_schema = {
|
|
489
|
+
"type": "object",
|
|
490
|
+
"properties": {"output": inner},
|
|
491
|
+
"required": ["output"],
|
|
492
|
+
"additionalProperties": False,
|
|
493
|
+
}
|
|
494
|
+
validate_submission_schema(submission_schema, "output")
|
|
495
|
+
granted_definitions = tuple(by_tool[name] for name in binding.tools)
|
|
496
|
+
granted_ports = {name: ports[name] for name in binding.tools}
|
|
497
|
+
revision = hashlib.sha256(
|
|
498
|
+
(
|
|
499
|
+
f"{child.child_run_id}\0{child.task}"
|
|
500
|
+
+ ("\0output_format=json_object" if declared_object else "")
|
|
501
|
+
+ ("\0parent_output=" + digest(parent_contract) if parent_contract else "")
|
|
502
|
+
).encode("utf-8")
|
|
503
|
+
).hexdigest()[:24]
|
|
504
|
+
contract_items = [
|
|
505
|
+
AcceptanceItem(
|
|
506
|
+
acceptance_id="delegated_task",
|
|
507
|
+
verifier_ref="studio.child-independent-evidence-unavailable",
|
|
508
|
+
verifier_version="1",
|
|
509
|
+
verification_method="human",
|
|
510
|
+
description=(
|
|
511
|
+
"Declared child delivery: one JSON object. Semantics remain unverified."
|
|
512
|
+
if declared_object
|
|
513
|
+
else final_shape_contract_description(child.task)
|
|
514
|
+
if object_submission
|
|
515
|
+
else child.task[:1024]
|
|
516
|
+
),
|
|
517
|
+
),
|
|
518
|
+
]
|
|
519
|
+
if schema_text is not None:
|
|
520
|
+
contract_items.append(
|
|
521
|
+
AcceptanceItem(
|
|
522
|
+
acceptance_id="delegated_output_schema",
|
|
523
|
+
verifier_ref=_SCHEMA_VERIFIER_REF,
|
|
524
|
+
verifier_version=_SCHEMA_VERIFIER_VERSION,
|
|
525
|
+
verification_method="deterministic",
|
|
526
|
+
description="Child final output matches the bound JSON Schema.",
|
|
527
|
+
)
|
|
528
|
+
)
|
|
529
|
+
contract = TaskContract(
|
|
530
|
+
revision=f"studio-child-{revision}",
|
|
531
|
+
items=tuple(contract_items),
|
|
532
|
+
final_submission_schema=submission_schema,
|
|
533
|
+
final_submission_payload_key="output" if object_submission else None,
|
|
534
|
+
)
|
|
535
|
+
configuration = RunConfiguration(
|
|
536
|
+
profile=profile,
|
|
537
|
+
contract=contract,
|
|
538
|
+
tools=granted_definitions,
|
|
539
|
+
instructions=(
|
|
540
|
+
binding.instructions
|
|
541
|
+
if schema_text is None
|
|
542
|
+
else (
|
|
543
|
+
f"{binding.instructions}\n\n"
|
|
544
|
+
"The locked child output contract requires your final response to be only "
|
|
545
|
+
f"JSON matching this schema: {schema_text}"
|
|
546
|
+
)
|
|
547
|
+
),
|
|
548
|
+
limits=RunLimits(
|
|
549
|
+
**({"max_tool_result_bytes": max_tool_result_bytes}
|
|
550
|
+
if max_tool_result_bytes is not None else {}),
|
|
551
|
+
max_model_calls=binding.max_turns,
|
|
552
|
+
max_repairs=min(2, max(0, binding.max_turns - 1)),
|
|
553
|
+
max_tool_calls=(
|
|
554
|
+
binding.max_tool_calls
|
|
555
|
+
if binding.max_tool_calls is not None
|
|
556
|
+
else binding.max_turns * 4
|
|
557
|
+
if child.role.tool_names
|
|
558
|
+
else 0
|
|
559
|
+
),
|
|
560
|
+
max_subagent_depth=0,
|
|
561
|
+
effect_timeout_seconds=effect_timeout_seconds,
|
|
562
|
+
),
|
|
563
|
+
)
|
|
564
|
+
child_tools = (
|
|
565
|
+
_ChildToolMux(granted_ports) if granted_ports or binding.name in skill_roles else None
|
|
566
|
+
)
|
|
567
|
+
if binding.name in skill_roles:
|
|
568
|
+
configuration, child_tools = child_skills.bind(child, configuration, child_tools)
|
|
569
|
+
if binding.name in mcp_roles:
|
|
570
|
+
configuration, child_tools = child_mcp.bind(child, configuration, child_tools)
|
|
571
|
+
child_workspace, child_revision, isolation_id = workspace, (
|
|
572
|
+
parent.workspace_revision or "studio-workspace-unobserved"
|
|
573
|
+
), None
|
|
574
|
+
if binding.name in writing_roles:
|
|
575
|
+
isolated, child_tools, child_workspace = await file_workspaces.bind(child, child_tools)
|
|
576
|
+
child_revision, isolation_id = isolated.base_revision, isolated.isolation_id
|
|
577
|
+
return ChildBindings(
|
|
578
|
+
store=store,
|
|
579
|
+
configuration=configuration,
|
|
580
|
+
model=model,
|
|
581
|
+
verifier=(
|
|
582
|
+
_ChildOutputSchemaVerifier(schema=schema, child_run_id=child.child_run_id)
|
|
583
|
+
if schema is not None
|
|
584
|
+
else None
|
|
585
|
+
),
|
|
586
|
+
tools=child_tools,
|
|
587
|
+
workspace=child_workspace,
|
|
588
|
+
context_planner=context_planner,
|
|
589
|
+
workspace_revision=child_revision,
|
|
590
|
+
workspace_access=child.role.workspace_access,
|
|
591
|
+
isolation_id=isolation_id,
|
|
592
|
+
workspace_policy_bound=True,
|
|
593
|
+
lease_ttl_seconds=30.0 if isinstance(store, LeasedRunStore) else None,
|
|
594
|
+
parent_contract=parent_contract,
|
|
595
|
+
artifacts=(
|
|
596
|
+
artifacts_factory(child.scope)
|
|
597
|
+
if artifacts_factory is not None and granted_ports else None
|
|
598
|
+
),
|
|
599
|
+
artifact_search=artifact_search,
|
|
600
|
+
artifact_search_policy=(
|
|
601
|
+
source_read_policy.artifact_search_policy(
|
|
602
|
+
store, workspace_revision=(parent.workspace_revision
|
|
603
|
+
or "studio-workspace-unobserved"),
|
|
604
|
+
workspace_tracking=workspace is not None,
|
|
605
|
+
) if source_read_policy is not None and artifact_search else None
|
|
606
|
+
),
|
|
607
|
+
artifact_page_policy=(
|
|
608
|
+
source_read_policy.artifact_policy(
|
|
609
|
+
store, workspace_revision=(parent.workspace_revision
|
|
610
|
+
or "studio-workspace-unobserved"),
|
|
611
|
+
workspace_tracking=workspace is not None,
|
|
612
|
+
) if source_read_policy is not None else artifact_page_policy
|
|
613
|
+
),
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
assembly_digest = "sha256:" + _sha256(
|
|
617
|
+
json.dumps(
|
|
618
|
+
{
|
|
619
|
+
"version": "studio-child-declared-delivery/v8",
|
|
620
|
+
**({"version": "studio-child-declared-delivery/v10",
|
|
621
|
+
"artifact_page_policy": artifact_page_policy.digest,
|
|
622
|
+
"artifact_page_origin_binding": "sealed-child-origin/v1"}
|
|
623
|
+
if artifact_page_policy is not None else {}),
|
|
624
|
+
**({"version": "studio-child-declared-delivery/v11",
|
|
625
|
+
"max_tool_result_bytes": max_tool_result_bytes}
|
|
626
|
+
if max_tool_result_bytes is not None else {}),
|
|
627
|
+
**({"version": "studio-child-declared-delivery/v13",
|
|
628
|
+
"search_capacity_policy": "complete-next-search-request/v1",
|
|
629
|
+
"source_capacity_policy": source_read_policy.digest}
|
|
630
|
+
if source_read_policy is not None else {}),
|
|
631
|
+
**({"artifact_policy": (
|
|
632
|
+
"scoped-child-observations/v2" if artifact_search
|
|
633
|
+
else "scoped-child-observations/v1"
|
|
634
|
+
)}
|
|
635
|
+
if artifacts_factory is not None else {}),
|
|
636
|
+
"bindings": [binding.model_dump(mode="json") for binding in bindings],
|
|
637
|
+
**({"child_skill_policy": "studio-child-skill-knowledge/v1",
|
|
638
|
+
"child_skill_binding": child_skills.binding_digest}
|
|
639
|
+
if skill_roles else {}),
|
|
640
|
+
**({"child_mcp_policy": "studio-child-borrowed-mcp/v1",
|
|
641
|
+
"child_mcp_binding": child_mcp.binding_digest}
|
|
642
|
+
if mcp_roles else {}),
|
|
643
|
+
"background_policy": "studio-owned-background-child/v8",
|
|
644
|
+
"child_input_policy": "owned-child-guide/v1",
|
|
645
|
+
"child_approval_policy": "owned-child-approval/v1",
|
|
646
|
+
"child_time_budget_policy": "active-child-clock/v1",
|
|
647
|
+
"child_notification_policy": "ready-before-model/v1",
|
|
648
|
+
"foreground_owner_policy": "shared-child-task-owner/v1",
|
|
649
|
+
"delegate_delivery_policy": "foreground-or-background/v1",
|
|
650
|
+
"delegate_continuation_policy": "parent-accounted-session-turn/v1",
|
|
651
|
+
**({"child_workspace_policy": "studio-child-files/v2"} if writing_roles else {}),
|
|
652
|
+
"background_guidance_policy": "boundary-guide/v1",
|
|
653
|
+
"background_continuation_policy": "parent-accounted-session-turn/v1",
|
|
654
|
+
"profile": profile.model_dump(mode="json"),
|
|
655
|
+
"tools": [
|
|
656
|
+
by_tool[name].model_dump(mode="json")
|
|
657
|
+
for name in sorted({name for binding in bindings for name in binding.tools})
|
|
658
|
+
],
|
|
659
|
+
},
|
|
660
|
+
sort_keys=True,
|
|
661
|
+
ensure_ascii=False,
|
|
662
|
+
)
|
|
663
|
+
)
|
|
664
|
+
async def background_factory(child):
|
|
665
|
+
# Reuse the exact locked role's model, tool grants, workspace, Context
|
|
666
|
+
# and verifier. Its wall limit belongs to the child Kernel, so returning
|
|
667
|
+
# a startup receipt does not end the deadline or lose timeout accounting.
|
|
668
|
+
bindings = await factory(child)
|
|
669
|
+
config = bindings.configuration
|
|
670
|
+
limits = config.limits.model_copy(update={
|
|
671
|
+
"max_wall_seconds": by_name[child.role.role_id].timeout_seconds,
|
|
672
|
+
})
|
|
673
|
+
config = RunConfiguration.model_validate({**config.model_dump(), "limits": limits})
|
|
674
|
+
return replace(bindings, configuration=config)
|
|
675
|
+
|
|
676
|
+
child_port = _StudioChildPort(
|
|
677
|
+
assembly_digest=assembly_digest,
|
|
678
|
+
store=store,
|
|
679
|
+
scope=scope,
|
|
680
|
+
roles=roles,
|
|
681
|
+
file_workspace_policy=bool(writing_roles),
|
|
682
|
+
borrowed_mcp_policy=bool(mcp_roles),
|
|
683
|
+
factory=background_factory,
|
|
684
|
+
)
|
|
685
|
+
|
|
686
|
+
background = _StudioBackgroundChildPort(
|
|
687
|
+
scope=scope, roles=tuple(child_port.roles.values()), factory=background_factory,
|
|
688
|
+
store=store, assembly_digest=assembly_digest,
|
|
689
|
+
approval_bridge=True,
|
|
690
|
+
)
|
|
691
|
+
return StudioNativeSubagentPort(
|
|
692
|
+
child_port=child_port,
|
|
693
|
+
bindings=by_name,
|
|
694
|
+
file_merge_surface=file_workspaces.merge_surface(roles) if writing_roles else None,
|
|
695
|
+
result_port=NativeChildResultPort(
|
|
696
|
+
scope=scope, store=store, roles=tuple(child_port.roles.values())
|
|
697
|
+
),
|
|
698
|
+
background_port=background,
|
|
699
|
+
active_execution_budget_bound=True,
|
|
700
|
+
)
|