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,241 @@
|
|
|
1
|
+
"""DSH-locked Skill and MCP contributions shared by Harness engine adapters.
|
|
2
|
+
|
|
3
|
+
PluginHost owns their activation and disposal. This module has no dependency
|
|
4
|
+
on LangGraph or the Native Kernel and does not select a runtime engine.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
import re
|
|
13
|
+
from collections.abc import Sequence
|
|
14
|
+
from dataclasses import replace
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from ksadk.harness.capabilities import (
|
|
19
|
+
CapabilityDescriptor,
|
|
20
|
+
CapabilityKind,
|
|
21
|
+
LoadPolicy,
|
|
22
|
+
RiskLevel,
|
|
23
|
+
)
|
|
24
|
+
from ksadk.harness.config import McpToolSpec
|
|
25
|
+
from ksadk.harness.mcp_runtime import McpCapabilityRuntime, McpServerBinding
|
|
26
|
+
from ksadk.harness.skill_runtime import SkillManifest
|
|
27
|
+
from ksadk.harness.spec import CapabilityBinding
|
|
28
|
+
from ksadk.harness.tools import HarnessTool, load_mcp_tools
|
|
29
|
+
from ksadk.plugins.providers.mcp_projection import MCPRuntimeCredential, _finish_owned_task
|
|
30
|
+
from ksadk.skills.loader import _parse_frontmatter
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def resource_id(value: str, *, fallback: str) -> str:
|
|
34
|
+
normalized = re.sub(r"[^A-Za-z0-9._-]+", "-", value).strip("-._")
|
|
35
|
+
return normalized or fallback
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ProviderSkillSource:
|
|
39
|
+
"""Expose only locked DSH Skill contributions through L0–L3 reads."""
|
|
40
|
+
|
|
41
|
+
def __init__(self, contributions: Sequence[Any]) -> None:
|
|
42
|
+
self._skills: dict[str, Any] = {}
|
|
43
|
+
for contribution in contributions:
|
|
44
|
+
name = str(getattr(contribution, "name", "")).strip()
|
|
45
|
+
instructions = str(getattr(contribution, "instructions", "")).strip()
|
|
46
|
+
if not name or not instructions:
|
|
47
|
+
continue
|
|
48
|
+
ref = f"skill://{resource_id(name, fallback='provider-skill')}@1.0.0"
|
|
49
|
+
if ref in self._skills:
|
|
50
|
+
raise ValueError(f"duplicate DSH Skill contribution: {ref}")
|
|
51
|
+
self._skills[ref] = contribution
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def refs(self) -> tuple[str, ...]:
|
|
55
|
+
return tuple(self._skills)
|
|
56
|
+
|
|
57
|
+
def manifest(self, skill_id: str) -> SkillManifest:
|
|
58
|
+
contribution = self._require(skill_id)
|
|
59
|
+
instructions = str(contribution.instructions).strip()
|
|
60
|
+
metadata, body = _parse_frontmatter(instructions)
|
|
61
|
+
summary = str(metadata.get("description") or "").strip()
|
|
62
|
+
if not summary:
|
|
63
|
+
summary = next(
|
|
64
|
+
(
|
|
65
|
+
line.strip().lstrip("#").strip()
|
|
66
|
+
for line in body.splitlines()
|
|
67
|
+
if line.strip() and line.strip() != "---"
|
|
68
|
+
),
|
|
69
|
+
str(contribution.name),
|
|
70
|
+
)
|
|
71
|
+
return SkillManifest(name=str(contribution.name), summary=summary[:512])
|
|
72
|
+
|
|
73
|
+
def full_text(self, skill_id: str) -> str:
|
|
74
|
+
return str(self._require(skill_id).instructions)
|
|
75
|
+
|
|
76
|
+
def resource(self, skill_id: str, resource_ref: str) -> bytes:
|
|
77
|
+
contribution = self._require(skill_id)
|
|
78
|
+
root = getattr(contribution, "resource_root", None)
|
|
79
|
+
if root is None:
|
|
80
|
+
raise FileNotFoundError(
|
|
81
|
+
f"DSH inline Skill {skill_id} has no packaged resource {resource_ref!r}"
|
|
82
|
+
)
|
|
83
|
+
root = Path(root).resolve()
|
|
84
|
+
candidate = (root / resource_ref).resolve()
|
|
85
|
+
if Path(resource_ref).is_absolute() or not candidate.is_relative_to(root):
|
|
86
|
+
raise ValueError("Skill resource path escapes locked Bundle directory")
|
|
87
|
+
if not candidate.is_file():
|
|
88
|
+
raise FileNotFoundError(resource_ref)
|
|
89
|
+
return candidate.read_bytes()
|
|
90
|
+
|
|
91
|
+
def _require(self, skill_id: str) -> Any:
|
|
92
|
+
try:
|
|
93
|
+
return self._skills[skill_id]
|
|
94
|
+
except KeyError:
|
|
95
|
+
raise KeyError(f"DSH Skill {skill_id!r} is not bound") from None
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class McpToolSpecTransport:
|
|
99
|
+
"""Adapt one locked DSH MCP contribution to the Harness MCP transport."""
|
|
100
|
+
|
|
101
|
+
def __init__(
|
|
102
|
+
self,
|
|
103
|
+
spec: McpToolSpec,
|
|
104
|
+
*,
|
|
105
|
+
credential: MCPRuntimeCredential | None = None,
|
|
106
|
+
) -> None:
|
|
107
|
+
self._spec = spec
|
|
108
|
+
self._credential = credential
|
|
109
|
+
self._active_token: str | None = None
|
|
110
|
+
self._schema_digest: str | None = None
|
|
111
|
+
self._lock = asyncio.Lock()
|
|
112
|
+
self._closed = False
|
|
113
|
+
self._toolset: Any | None = None
|
|
114
|
+
self._tools: dict[str, HarnessTool] = {}
|
|
115
|
+
|
|
116
|
+
async def list_tools(self) -> list[dict[str, Any]]:
|
|
117
|
+
async with self._lock:
|
|
118
|
+
await self._ensure_loaded()
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
"name": tool.name,
|
|
122
|
+
"description": tool.description,
|
|
123
|
+
"inputSchema": tool.parameters,
|
|
124
|
+
}
|
|
125
|
+
for tool in self._tools.values()
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
async def call_tool(self, name: str, arguments: dict[str, Any]) -> Any:
|
|
129
|
+
async with self._lock:
|
|
130
|
+
await self._ensure_loaded()
|
|
131
|
+
try:
|
|
132
|
+
tool = self._tools[name]
|
|
133
|
+
except KeyError:
|
|
134
|
+
raise RuntimeError(
|
|
135
|
+
f"MCP tool {name!r} is not exposed by {self._spec.name!r}"
|
|
136
|
+
) from None
|
|
137
|
+
# Auth renewal happens before execution, never by replaying a call.
|
|
138
|
+
return await tool.call(arguments)
|
|
139
|
+
|
|
140
|
+
async def close(self) -> None:
|
|
141
|
+
self._closed = True
|
|
142
|
+
async with self._lock:
|
|
143
|
+
await self._close_current()
|
|
144
|
+
|
|
145
|
+
async def _close_current(self) -> None:
|
|
146
|
+
if self._toolset is not None:
|
|
147
|
+
await _finish_owned_task(asyncio.create_task(self._toolset.close()))
|
|
148
|
+
self._toolset = None
|
|
149
|
+
self._tools.clear()
|
|
150
|
+
|
|
151
|
+
async def _ensure_loaded(self) -> None:
|
|
152
|
+
if self._closed:
|
|
153
|
+
raise RuntimeError("MCP transport is closed")
|
|
154
|
+
token = await self._credential.token() if self._credential else self._spec.api_key
|
|
155
|
+
if self._credential is not None and (not isinstance(token, str) or not token.strip()):
|
|
156
|
+
raise RuntimeError("MCP runtime credential is unavailable")
|
|
157
|
+
if self._closed:
|
|
158
|
+
raise RuntimeError("MCP transport is closed")
|
|
159
|
+
if self._toolset is not None and token == self._active_token:
|
|
160
|
+
return
|
|
161
|
+
await self._close_current()
|
|
162
|
+
selected = replace(self._spec, api_key=token) if self._credential else self._spec
|
|
163
|
+
toolset, tools = await load_mcp_tools(selected)
|
|
164
|
+
try:
|
|
165
|
+
schema_digest = hashlib.sha256(
|
|
166
|
+
json.dumps(
|
|
167
|
+
sorted((tool.name, tool.description, tool.parameters) for tool in tools),
|
|
168
|
+
sort_keys=True,
|
|
169
|
+
ensure_ascii=False,
|
|
170
|
+
allow_nan=False,
|
|
171
|
+
).encode()
|
|
172
|
+
).hexdigest()
|
|
173
|
+
if self._closed or (
|
|
174
|
+
self._schema_digest is not None and schema_digest != self._schema_digest
|
|
175
|
+
):
|
|
176
|
+
raise RuntimeError("MCP transport closed or locked tool schema changed")
|
|
177
|
+
except BaseException:
|
|
178
|
+
await _finish_owned_task(asyncio.create_task(toolset.close()))
|
|
179
|
+
raise
|
|
180
|
+
self._schema_digest = schema_digest
|
|
181
|
+
self._active_token = token
|
|
182
|
+
self._toolset = toolset
|
|
183
|
+
self._tools = {tool.name: tool for tool in tools}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def mcp_runtime(
|
|
187
|
+
specs: Sequence[McpToolSpec],
|
|
188
|
+
*,
|
|
189
|
+
runtime_credentials: Sequence[MCPRuntimeCredential] = (),
|
|
190
|
+
) -> tuple[
|
|
191
|
+
McpCapabilityRuntime | None,
|
|
192
|
+
tuple[McpToolSpecTransport, ...],
|
|
193
|
+
tuple[CapabilityBinding, ...],
|
|
194
|
+
]:
|
|
195
|
+
credentials = {item.name: item for item in runtime_credentials}
|
|
196
|
+
if len(credentials) != len(runtime_credentials) or not set(credentials).issubset(
|
|
197
|
+
{spec.name for spec in specs}
|
|
198
|
+
):
|
|
199
|
+
raise ValueError("invalid MCP runtime credential binding")
|
|
200
|
+
if not specs:
|
|
201
|
+
return None, (), ()
|
|
202
|
+
runtime = McpCapabilityRuntime()
|
|
203
|
+
transports: list[McpToolSpecTransport] = []
|
|
204
|
+
bindings: list[CapabilityBinding] = []
|
|
205
|
+
seen: set[str] = set()
|
|
206
|
+
for spec in specs:
|
|
207
|
+
ref = f"mcp://{resource_id(spec.name, fallback='provider-mcp')}@1.0.0"
|
|
208
|
+
if ref in seen:
|
|
209
|
+
raise ValueError(f"duplicate DSH MCP contribution: {ref}")
|
|
210
|
+
seen.add(ref)
|
|
211
|
+
transport = McpToolSpecTransport(spec, credential=credentials.get(spec.name))
|
|
212
|
+
runtime.bind(
|
|
213
|
+
McpServerBinding(
|
|
214
|
+
descriptor=CapabilityDescriptor(
|
|
215
|
+
id=ref,
|
|
216
|
+
kind=CapabilityKind.MCP,
|
|
217
|
+
name=spec.name,
|
|
218
|
+
description=(spec.description or "").strip()
|
|
219
|
+
or f"DSH-provided MCP server {spec.name}",
|
|
220
|
+
version="1.0.0",
|
|
221
|
+
risk_level=RiskLevel.MEDIUM,
|
|
222
|
+
load_policy=LoadPolicy.ON_DEMAND,
|
|
223
|
+
),
|
|
224
|
+
transport=transport,
|
|
225
|
+
required=True,
|
|
226
|
+
tool_prefix=spec.tool_name_prefix or "",
|
|
227
|
+
static_tool_names=tuple(spec.tool_filter),
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
transports.append(transport)
|
|
231
|
+
bindings.append(
|
|
232
|
+
CapabilityBinding(
|
|
233
|
+
capability_ref=ref,
|
|
234
|
+
required=True,
|
|
235
|
+
load_policy="on_demand",
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
return runtime, tuple(transports), tuple(bindings)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
__all__ = ["ProviderSkillSource", "McpToolSpecTransport", "mcp_runtime", "resource_id"]
|
|
@@ -54,12 +54,34 @@ _NEGATED_CODING_SIGNALS = re.compile(
|
|
|
54
54
|
re.IGNORECASE,
|
|
55
55
|
)
|
|
56
56
|
_DIRECT_FILE_DELIVERY_SIGNALS = re.compile(
|
|
57
|
-
r"(
|
|
58
|
-
r"(?:\.(?:md|txt|json|csv|html?)\b|(?:Markdown|MD|文本|JSON|CSV|HTML)\s
|
|
57
|
+
r"(?:创建|生成|保存|写入|落盘)(?:一个|一份|为)?[^。;\n]{0,80}"
|
|
58
|
+
r"(?:\.(?:md|txt|json|csv|html?)\b|(?:Markdown|MD|文本|JSON|CSV|HTML)\s*文档|文件|产物)|"
|
|
59
59
|
r"\b(?:create|generate|save|write)\b[^.\n]{0,80}"
|
|
60
60
|
r"(?:\.(?:md|txt|json|csv|html?)\b|\b(?:markdown|text|json|csv|html)\s+file\b)",
|
|
61
61
|
re.IGNORECASE,
|
|
62
62
|
)
|
|
63
|
+
_BOUND_CAPABILITY_ACTION = re.compile(
|
|
64
|
+
r"(?:(?:调用|读取|查询|检索|搜索|浏览|使用)[^。;\n]{0,24}"
|
|
65
|
+
r"(?:知识库|技能|Skill|MCP|网页|官方资料)|"
|
|
66
|
+
r"\b(?:call|read|query|search|browse|use)\b[^.\n]{0,40}"
|
|
67
|
+
r"\b(?:knowledge\s*base|skill|mcp|web|official\s+sources?)\b)",
|
|
68
|
+
re.IGNORECASE,
|
|
69
|
+
)
|
|
70
|
+
_DESIGN_ONLY_SIGNALS = re.compile(
|
|
71
|
+
r"(?:设计|方案|草案|接口|状态机|机制|关卡|可访问性|测试策略|"
|
|
72
|
+
r"\b(?:design|proposal|spec(?:ification)?|interface|state\s+machine|"
|
|
73
|
+
r"test\s+strategy)\b)",
|
|
74
|
+
re.IGNORECASE,
|
|
75
|
+
)
|
|
76
|
+
_DELIVERY_LEAD = re.compile(
|
|
77
|
+
r"^\s*(?:请\s*|please\s+)?(?:(?:创建|生成|保存|写入)|"
|
|
78
|
+
r"(?:create|generate|save|write)\b)",
|
|
79
|
+
re.IGNORECASE,
|
|
80
|
+
)
|
|
81
|
+
_READ_ONLY_TOOL_NAME = re.compile(
|
|
82
|
+
r"(?:^|_)(?:read|search|list|status|inspect|lint|fetch|view)(?:_|$)",
|
|
83
|
+
re.IGNORECASE,
|
|
84
|
+
)
|
|
63
85
|
_RESEARCH_SIGNALS = re.compile(
|
|
64
86
|
r"(?:调研|研究|检索|搜索|查找|核对|资料|证据|比较|对比|"
|
|
65
87
|
r"\b(?:research|investigate|search|compare|verify)\b)",
|
|
@@ -73,11 +95,30 @@ _RESEARCH_LEAD = re.compile(
|
|
|
73
95
|
_MUTATING_TASK_SIGNALS = re.compile(
|
|
74
96
|
r"^\s*(?:请\s*|please\s+)?(?:将|把)?[^。;\n]{0,40}"
|
|
75
97
|
r"(?:保存|写入|编辑|修改|上传|发布|删除|"
|
|
76
|
-
r"
|
|
98
|
+
r"实现|开发|编写|构建|编码|落地|落盘|产出|交付|重构|修复|"
|
|
99
|
+
r"\b(?:save|write|edit|modify|upload|publish|delete|"
|
|
100
|
+
r"implement|develop|build|code|refactor|fix)\b)",
|
|
77
101
|
re.IGNORECASE,
|
|
78
102
|
)
|
|
79
103
|
|
|
80
104
|
|
|
105
|
+
def _is_direct_file_delivery(task: str) -> bool:
|
|
106
|
+
"""Distinguish a durable file request from a design that names files.
|
|
107
|
+
|
|
108
|
+
Child design briefs often mention the future ``game-core.mjs`` contract or
|
|
109
|
+
say "生成设计方案". Those are text conclusions for the parent, not a
|
|
110
|
+
request for the child to persist the final artifact.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
if not _DIRECT_FILE_DELIVERY_SIGNALS.search(task):
|
|
114
|
+
return False
|
|
115
|
+
if _NEGATED_CODING_SIGNALS.search(task):
|
|
116
|
+
return False
|
|
117
|
+
if _DESIGN_ONLY_SIGNALS.search(task) and not _DELIVERY_LEAD.search(task):
|
|
118
|
+
return False
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
|
|
81
122
|
@dataclass(frozen=True)
|
|
82
123
|
class DelegationDecision:
|
|
83
124
|
task_kind: Literal["coding", "general"]
|
|
@@ -196,6 +237,18 @@ class AdaptiveDelegationRuntime:
|
|
|
196
237
|
interrupts while allowing independent product research to run in
|
|
197
238
|
parallel. Other general tasks retain the existing sequential,
|
|
198
239
|
approval-capable behaviour.
|
|
240
|
+
|
|
241
|
+
⚠️ 判定的唯一依据必须是"任务本身要不要写",不能只看关键词表够不够全
|
|
242
|
+
(2026-09-18 实测事故):父 Agent 并行委派"实现核心规则/开发界面交互/
|
|
243
|
+
编写自动化测试"三个实现型子任务,而 ``_MUTATING_TASK_SIGNALS`` 当时只认
|
|
244
|
+
「保存/写入/编辑/修改…」,**不认「实现/开发/编写」**,于是把实现型任务误判
|
|
245
|
+
成"并行安全的调研"→ 子 Agent 只拿到只读工具 → 一个文件都写不出来 →
|
|
246
|
+
父 Agent 以 COMPLETED + 0 产物收场。
|
|
247
|
+
|
|
248
|
+
这与 Claude Code 的形态一致:**默认可写,只读是显式声明的例外**
|
|
249
|
+
(``GENERAL_PURPOSE_AGENT.tools = ['*']``;只有 Explore/Plan 用
|
|
250
|
+
``disallowedTools`` 禁写)。所以任何"可能产出交付物"的任务都必须走
|
|
251
|
+
串行、可审批、可写的路径。
|
|
199
252
|
"""
|
|
200
253
|
task = str(arguments.get("task") or "").strip()
|
|
201
254
|
if (
|
|
@@ -204,18 +257,25 @@ class AdaptiveDelegationRuntime:
|
|
|
204
257
|
!= "general"
|
|
205
258
|
):
|
|
206
259
|
return False
|
|
207
|
-
if not _RESEARCH_SIGNALS.search(task):
|
|
208
|
-
return False
|
|
209
260
|
mutating = (
|
|
210
|
-
|
|
261
|
+
_is_direct_file_delivery(task)
|
|
211
262
|
if _RESEARCH_LEAD.search(task)
|
|
212
263
|
else bool(_MUTATING_TASK_SIGNALS.search(task))
|
|
213
264
|
)
|
|
265
|
+
if _DESIGN_ONLY_SIGNALS.search(task) and not _DELIVERY_LEAD.search(task):
|
|
266
|
+
mutating = False
|
|
214
267
|
if mutating:
|
|
215
268
|
return False
|
|
269
|
+
# Bound Skill/MCP catalogs should not serialize every otherwise pure
|
|
270
|
+
# design/analysis child. Only tasks that explicitly need those shared
|
|
271
|
+
# external capabilities stay sequential. Parallel children receive a
|
|
272
|
+
# read-only tool subset and do not inherit the shared runtimes below.
|
|
216
273
|
return not (
|
|
217
|
-
|
|
218
|
-
|
|
274
|
+
_BOUND_CAPABILITY_ACTION.search(task)
|
|
275
|
+
and (
|
|
276
|
+
bool(getattr(parent_run, "skill_catalog", ()))
|
|
277
|
+
or bool(getattr(parent_run, "mcp_catalog", ()))
|
|
278
|
+
)
|
|
219
279
|
)
|
|
220
280
|
|
|
221
281
|
def preview_route(self, arguments: dict[str, Any], *, call_id: str) -> dict[str, Any]:
|
|
@@ -248,7 +308,12 @@ class AdaptiveDelegationRuntime:
|
|
|
248
308
|
# write lets a text-only child claim success without any durable write
|
|
249
309
|
# receipt. Fail before spawning so the next parent turn can call the
|
|
250
310
|
# bound workspace tool itself.
|
|
251
|
-
|
|
311
|
+
# A model may phrase the same forbidden delegation as "落盘产物"
|
|
312
|
+
# without spelling out a filename. Keep this guard intentionally
|
|
313
|
+
# narrower than the general mutation classifier: coding children are
|
|
314
|
+
# allowed to implement patches, while final durable delivery remains
|
|
315
|
+
# parent-owned.
|
|
316
|
+
if _is_direct_file_delivery(task):
|
|
252
317
|
raise SubagentProviderError(
|
|
253
318
|
"delegation_requires_parent_tool",
|
|
254
319
|
"final file delivery must use the parent workspace write tool",
|
|
@@ -430,9 +495,21 @@ class AdaptiveDelegationRuntime:
|
|
|
430
495
|
) -> tuple[Any, list[RuntimeEvent]]:
|
|
431
496
|
child_name = self._child_name("harness", call_id)
|
|
432
497
|
child_tools = tuple(name for name in parent_run.tools if name != self.name)
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
498
|
+
parallel_safe = self.parallel_safe(
|
|
499
|
+
{"task": task, "task_kind": "general"}, parent_run=parent_run
|
|
500
|
+
)
|
|
501
|
+
if parallel_safe:
|
|
502
|
+
# ⚠️ 2026-09-18 实测结论(勿轻易放开):
|
|
503
|
+
#
|
|
504
|
+
# 直接去掉这个只读过滤会让子 Agent 立刻撞上**审批门控**——实测
|
|
505
|
+
# `tests/plugins/test_harness_adaptive_delegation.py` 三个用例同时挂
|
|
506
|
+
# (子 Agent 不再产出 usage),即写工具带来的并发审批会把子 Agent 卡住。
|
|
507
|
+
# 所以"让实现型子 Agent 能写"不能只改这一行,必须先有并发写的处置手段
|
|
508
|
+
# (参照 pi 的 `file-mutation-queue`:同文件串行、不同文件并行)。
|
|
509
|
+
#
|
|
510
|
+
# 现状的代价也要记住:并行委派的子 Agent 在架构上**不可能产出交付物**,
|
|
511
|
+
# 交付必须由父 Agent 落盘(见 run_service 的 EMPTY_DELIVERY 判定)。
|
|
512
|
+
child_tools = tuple(name for name in child_tools if _READ_ONLY_TOOL_NAME.search(name))
|
|
436
513
|
sub = SubAgentSpec(
|
|
437
514
|
name=child_name,
|
|
438
515
|
description=label,
|
|
@@ -448,8 +525,8 @@ class AdaptiveDelegationRuntime:
|
|
|
448
525
|
timeout_seconds=float(self._child_timeout_seconds),
|
|
449
526
|
max_turns=self._child_max_turns,
|
|
450
527
|
max_total_tokens=self._child_max_total_tokens,
|
|
451
|
-
inherit_skills=
|
|
452
|
-
inherit_mcp=
|
|
528
|
+
inherit_skills=not parallel_safe,
|
|
529
|
+
inherit_mcp=not parallel_safe,
|
|
453
530
|
failure_policy="return_error",
|
|
454
531
|
)
|
|
455
532
|
result, _ = await run_subagent(
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Locked PluginHost Hook sources; configuration proposes no execution grant.
|
|
2
|
+
|
|
3
|
+
This is the Python capability boundary for the DSH-backed Harness provider.
|
|
4
|
+
It does not interpret Cordis/MCP exports as Hooks or execute shell/HTTP config.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import inspect
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import Literal, Protocol, runtime_checkable
|
|
12
|
+
|
|
13
|
+
from pydantic import Field, JsonValue
|
|
14
|
+
|
|
15
|
+
from ksadk.harness.native.hook_runtime_contract import (
|
|
16
|
+
HookDefinition,
|
|
17
|
+
HookInvocationRequest,
|
|
18
|
+
HookOutput,
|
|
19
|
+
hook_execution_policy_digest,
|
|
20
|
+
)
|
|
21
|
+
from ksadk.harness.native.state import Contract
|
|
22
|
+
from ksadk.plugins.bundle import ResolvedPluginBundle
|
|
23
|
+
from ksadk.plugins.host import PluginExecutionContext, PluginHostError
|
|
24
|
+
|
|
25
|
+
HARNESS_HOOK_DEFINITION = "harness.hook/v1"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class HarnessHookConfiguration(Contract):
|
|
29
|
+
schema_version: Literal["ksadk.harness-hook-binding/v1"]
|
|
30
|
+
hooks: tuple[dict[str, JsonValue], ...] = Field(min_length=1, max_length=16)
|
|
31
|
+
cleanup_timeout_seconds: float = Field(strict=True, gt=0, allow_inf_nan=False)
|
|
32
|
+
stop_continuation_limit: int | None = Field(default=None, strict=True, ge=0)
|
|
33
|
+
|
|
34
|
+
def definitions(self, *, source_ref: str, binding_digest: str) -> tuple[HookDefinition, ...]:
|
|
35
|
+
policy = hook_execution_policy_digest(
|
|
36
|
+
cleanup_timeout_seconds=self.cleanup_timeout_seconds,
|
|
37
|
+
)
|
|
38
|
+
definitions = []
|
|
39
|
+
for declaration in self.hooks:
|
|
40
|
+
# Resource identity is derived from the locked host graph. Neither
|
|
41
|
+
# editable config nor a callback may replace it.
|
|
42
|
+
if {"source_ref", "binding_digest", "execution_policy_digest"} & declaration.keys():
|
|
43
|
+
raise ValueError("Hook config cannot supply binding authority")
|
|
44
|
+
definitions.append(HookDefinition(
|
|
45
|
+
**declaration, source_ref=source_ref, binding_digest=binding_digest,
|
|
46
|
+
execution_policy_digest=policy,
|
|
47
|
+
))
|
|
48
|
+
if len({item.hook_id for item in definitions}) != len(definitions):
|
|
49
|
+
raise ValueError("duplicate Hook declarations")
|
|
50
|
+
has_stop = any("Stop" in item.events for item in definitions)
|
|
51
|
+
if has_stop != (self.stop_continuation_limit is not None):
|
|
52
|
+
raise ValueError("Stop Hook requires its own explicit continuation policy")
|
|
53
|
+
return tuple(definitions)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@runtime_checkable
|
|
57
|
+
class HarnessHookSource(Protocol):
|
|
58
|
+
async def harness_hook(
|
|
59
|
+
self, bundle: ResolvedPluginBundle, request: HookInvocationRequest,
|
|
60
|
+
) -> HookOutput: ...
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@dataclass(frozen=True)
|
|
64
|
+
class HarnessHookBinding:
|
|
65
|
+
plugin_id: str
|
|
66
|
+
plugin_version: str
|
|
67
|
+
slot: str
|
|
68
|
+
runtime: HarnessHookSource
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def hook_configuration(
|
|
72
|
+
bundle: ResolvedPluginBundle, binding: HarnessHookBinding,
|
|
73
|
+
) -> HarnessHookConfiguration:
|
|
74
|
+
ref = f"plugin://{binding.plugin_id}@{binding.plugin_version}"
|
|
75
|
+
selected = [item for item in bundle.composition.profile.capabilities if item.ref == ref]
|
|
76
|
+
locked = [item for item in bundle.composition.plugin_lock.plugins
|
|
77
|
+
if (item.id, item.version) == (binding.plugin_id, binding.plugin_version)]
|
|
78
|
+
if len(selected) != 1 or len(locked) != 1 or not any(
|
|
79
|
+
(item.definition, item.slot, item.owner)
|
|
80
|
+
== (HARNESS_HOOK_DEFINITION, binding.slot, binding.plugin_id)
|
|
81
|
+
for item in locked[0].provides
|
|
82
|
+
):
|
|
83
|
+
raise ValueError("native_hook_source_unbound")
|
|
84
|
+
config = HarnessHookConfiguration.model_validate_json(
|
|
85
|
+
HarnessHookConfiguration.model_validate(selected[0].config).model_dump_json(),
|
|
86
|
+
)
|
|
87
|
+
config.definitions(source_ref=ref, binding_digest=locked[0].digest)
|
|
88
|
+
return config
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def project_harness_hooks(
|
|
92
|
+
bundle: ResolvedPluginBundle, capabilities: PluginExecutionContext,
|
|
93
|
+
) -> tuple[HarnessHookBinding, ...]:
|
|
94
|
+
selected = capabilities.all(HARNESS_HOOK_DEFINITION)
|
|
95
|
+
if not selected:
|
|
96
|
+
return ()
|
|
97
|
+
if (capabilities.profile_digest, capabilities.plugin_lock_digest) != (
|
|
98
|
+
bundle.composition.profile_digest, bundle.composition.plugin_lock_digest,
|
|
99
|
+
):
|
|
100
|
+
raise PluginHostError("harness_hook_binding_invalid", "Hook graph pins differ from Bundle")
|
|
101
|
+
bindings = []
|
|
102
|
+
owners = set()
|
|
103
|
+
for item in selected:
|
|
104
|
+
if not isinstance(item.runtime, HarnessHookSource) or not inspect.iscoroutinefunction(
|
|
105
|
+
item.runtime.harness_hook,
|
|
106
|
+
):
|
|
107
|
+
raise PluginHostError(
|
|
108
|
+
"harness_hook_incompatible", "Hook source requires an async producer",
|
|
109
|
+
)
|
|
110
|
+
if item.plugin_id in owners:
|
|
111
|
+
raise PluginHostError("harness_hook_binding_invalid", "duplicate Hook owner")
|
|
112
|
+
owners.add(item.plugin_id)
|
|
113
|
+
binding = HarnessHookBinding(item.plugin_id, item.plugin_version, item.slot, item.runtime)
|
|
114
|
+
try:
|
|
115
|
+
hook_configuration(bundle, binding)
|
|
116
|
+
except (ValueError, TypeError) as error:
|
|
117
|
+
raise PluginHostError(
|
|
118
|
+
"harness_hook_binding_invalid", "Hook source or policy is not locked",
|
|
119
|
+
) from error
|
|
120
|
+
bindings.append(binding)
|
|
121
|
+
return tuple(bindings)
|