agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
ksadk/harness/managed_runtime.py
CHANGED
|
@@ -34,14 +34,20 @@ from ksadk.events.content import ContentSnapshot, TextContent
|
|
|
34
34
|
from ksadk.events.identity import stable_event_id, stable_item_id, stable_scope_id
|
|
35
35
|
from ksadk.harness.context_engine import HarnessContextEngine
|
|
36
36
|
from ksadk.harness.engine.langgraph import ManagedLangGraphEngine, memory_checkpointer
|
|
37
|
+
from ksadk.harness.engine.steering import SteerReceipt
|
|
37
38
|
from ksadk.harness.events import EventType
|
|
38
39
|
from ksadk.harness.events import RuntimeEvent as HarnessEvent
|
|
39
40
|
from ksadk.harness.execution_policy import ExecutionPolicy, ExecutionPolicyResolver
|
|
40
41
|
from ksadk.harness.public_activity import tool_public_action
|
|
41
42
|
from ksadk.harness.reasoner import HarnessReasoner
|
|
43
|
+
from ksadk.harness.runtime_capabilities import (
|
|
44
|
+
managed_harness_capabilities,
|
|
45
|
+
managed_harness_native_capabilities,
|
|
46
|
+
)
|
|
42
47
|
from ksadk.harness.skill_composition import compose_engine
|
|
43
48
|
from ksadk.harness.spec import HarnessSpec
|
|
44
|
-
from ksadk.
|
|
49
|
+
from ksadk.harness.tool_display import safe_tool_display, tool_display_start
|
|
50
|
+
from ksadk.kernel.contracts import RuntimeCapabilityMatrix, SteerPayload
|
|
45
51
|
from ksadk.kernel.errors import UnsupportedControlError
|
|
46
52
|
from ksadk.runtime import (
|
|
47
53
|
BaseRuntime,
|
|
@@ -63,16 +69,7 @@ class ManagedHarnessRuntime(BaseRuntime):
|
|
|
63
69
|
self._durable = durable
|
|
64
70
|
|
|
65
71
|
def native_capabilities(self) -> dict[str, Any]:
|
|
66
|
-
return
|
|
67
|
-
"cancel": {"supported": True},
|
|
68
|
-
"resume": {"supported": True},
|
|
69
|
-
"checkpoint": {"supported": True, "granularity": "snapshot"},
|
|
70
|
-
"session_continuity": {
|
|
71
|
-
"durable": self._durable,
|
|
72
|
-
"scope": "workspace" if self._durable else "process",
|
|
73
|
-
},
|
|
74
|
-
"progressive_disclosure": {"skill": True, "mcp": True},
|
|
75
|
-
}
|
|
72
|
+
return managed_harness_native_capabilities(durable=self._durable)
|
|
76
73
|
|
|
77
74
|
|
|
78
75
|
class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
|
|
@@ -88,6 +85,7 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
88
85
|
durable: bool = False,
|
|
89
86
|
shared_across_pods: bool = False,
|
|
90
87
|
execution_policy_resolver: ExecutionPolicyResolver | None = None,
|
|
88
|
+
hooks: tuple | None = None,
|
|
91
89
|
) -> None:
|
|
92
90
|
super().__init__(ManagedHarnessRuntime(durable=durable))
|
|
93
91
|
self._spec = spec
|
|
@@ -100,6 +98,7 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
100
98
|
reasoner=reasoner,
|
|
101
99
|
checkpointer=memory_checkpointer(),
|
|
102
100
|
context_engine=HarnessContextEngine(),
|
|
101
|
+
**({"hooks": tuple(hooks)} if hooks else {}),
|
|
103
102
|
)
|
|
104
103
|
self._compiled: Any | None = None
|
|
105
104
|
self._external_handles: dict[str, RunHandle] = {}
|
|
@@ -240,25 +239,67 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
240
239
|
|
|
241
240
|
async def _stream(self, handle: RunHandle) -> AsyncIterator[Any]:
|
|
242
241
|
internal = self._internal_handle(handle)
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
handle
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
242
|
+
while True:
|
|
243
|
+
run_completed = False
|
|
244
|
+
async for event in self._engine.stream(internal):
|
|
245
|
+
rich = event.to_v2()
|
|
246
|
+
if not rich.parent_run_id:
|
|
247
|
+
terminal_status = {
|
|
248
|
+
EventType.RUN_COMPLETED: "completed",
|
|
249
|
+
EventType.RUN_FAILED: "failed",
|
|
250
|
+
EventType.RUN_CANCELED: "canceled",
|
|
251
|
+
}.get(rich.event_type)
|
|
252
|
+
if terminal_status is not None:
|
|
253
|
+
# A terminal checkpoint must not remain eligible for cold
|
|
254
|
+
# attach. Persist before yielding so a consumer that stops
|
|
255
|
+
# at the terminal event cannot leave a stale live handle.
|
|
256
|
+
self._persist_durable_handle(
|
|
257
|
+
handle,
|
|
258
|
+
terminal_status,
|
|
259
|
+
terminal=True,
|
|
260
|
+
)
|
|
261
|
+
if rich.event_type == EventType.RUN_COMPLETED and not rich.parent_run_id:
|
|
262
|
+
run_completed = True
|
|
263
|
+
for projected in _project_event(event):
|
|
264
|
+
yield projected
|
|
265
|
+
if not run_completed:
|
|
266
|
+
return
|
|
267
|
+
# follow_up 语义:本次 Run 自然完成后,若旧 Run 排了尾随指令,
|
|
268
|
+
# 就在同一条 stream 上自动起下一个 Run(新 run_id),宿主无感知。
|
|
269
|
+
follow_text = self._engine.pop_follow_up(internal.run_id)
|
|
270
|
+
if follow_text is None:
|
|
271
|
+
return
|
|
272
|
+
external_current = handle
|
|
273
|
+
follow_request = StartRequest(
|
|
274
|
+
input=follow_text,
|
|
275
|
+
user_id=external_current.native_ref.get("user_id") or "unknown",
|
|
276
|
+
session_id=external_current.session_id,
|
|
277
|
+
agent_id=external_current.native_ref.get("agent_id"),
|
|
278
|
+
runtime_type="harness",
|
|
279
|
+
metadata={
|
|
280
|
+
"origin": "follow_up",
|
|
281
|
+
"follow_up_of": external_current.run_id,
|
|
282
|
+
},
|
|
283
|
+
)
|
|
284
|
+
external_current = await self.start(follow_request)
|
|
285
|
+
handle = external_current
|
|
286
|
+
internal = self._internal_handle(external_current)
|
|
287
|
+
|
|
288
|
+
async def steer(self, handle: RunHandle, text: Any) -> SteerReceipt:
|
|
289
|
+
"""流式中投递纠偏指令(返回 engine 的 :class:`SteerReceipt`)。
|
|
290
|
+
|
|
291
|
+
同时接受纯文本(adapter 直调)与 Kernel 的 SteerPayload 线格式
|
|
292
|
+
(worker 会把契约载荷原样交给 adapter)。
|
|
293
|
+
"""
|
|
294
|
+
return self._engine.steer(
|
|
295
|
+
self._internal_handle(handle),
|
|
296
|
+
_steer_text(text),
|
|
297
|
+
allow_follow_up=not isinstance(text, SteerPayload),
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
async def follow_up(self, handle: RunHandle, text: Any) -> SteerReceipt:
|
|
301
|
+
"""排队尾随指令:本次 Run 自然完成后自动续跑下一个 Run。"""
|
|
302
|
+
return self._engine.follow_up(self._internal_handle(handle), _steer_text(text))
|
|
262
303
|
|
|
263
304
|
async def cancel(self, handle: RunHandle) -> CancelResult:
|
|
264
305
|
result = await self._engine.cancel(self._internal_handle(handle))
|
|
@@ -282,6 +323,11 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
282
323
|
# string. Unknown/missing decisions never become an approval.
|
|
283
324
|
normalized = {
|
|
284
325
|
"approve": "approved",
|
|
326
|
+
# Preserve the wider scope. Collapsing this to ``approved``
|
|
327
|
+
# only released the current tool call, so every subsequent
|
|
328
|
+
# write prompted again despite the Studio action saying
|
|
329
|
+
# "本次会话允许".
|
|
330
|
+
"approve_session": "approved_session",
|
|
285
331
|
"approved": "approved",
|
|
286
332
|
"reject": "denied",
|
|
287
333
|
"rejected": "denied",
|
|
@@ -341,6 +387,21 @@ class ManagedHarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
341
387
|
raise KeyError(f"unknown managed Harness run: {handle.run_id}") from None
|
|
342
388
|
|
|
343
389
|
|
|
390
|
+
def _final_item_id(run_id: str, rich: Any) -> str:
|
|
391
|
+
"""Derive the final-answer message item id, turn-scoped when turn_id is present.
|
|
392
|
+
|
|
393
|
+
会话串轮修复(交接记录 2026-09-22 §7):final item_id 之前只按 ``run_id``
|
|
394
|
+
派生,同一 run 内多轮 final 撞到同一 item_id,历史/重放 final 遮蔽当前轮
|
|
395
|
+
正确 final。引擎在 final-answer 的 TEXT_COMPLETED 与 RUN_COMPLETED payload
|
|
396
|
+
里带上当前 ``turn_id`` 后,这里据此派生 turn 级身份;未带 turn_id 时回退到
|
|
397
|
+
旧 run 级身份,保持不发 TURN_STARTED 的引擎/路径行为不回退。
|
|
398
|
+
"""
|
|
399
|
+
turn_id = str(rich.payload.get("turn_id") or "").strip()
|
|
400
|
+
if turn_id:
|
|
401
|
+
return stable_item_id("ksadk", run_id, "turn", turn_id, "message", "final")
|
|
402
|
+
return stable_item_id("ksadk", run_id, "message", "final")
|
|
403
|
+
|
|
404
|
+
|
|
344
405
|
def _project_event(event: HarnessEvent) -> list[Any]:
|
|
345
406
|
"""Project one rich Harness event to one or more canonical v2 events."""
|
|
346
407
|
|
|
@@ -348,17 +409,32 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
348
409
|
native_run_id = str(rich.run_id or rich.invocation_id)
|
|
349
410
|
run_id = str(rich.invocation_id if rich.parent_run_id else native_run_id)
|
|
350
411
|
scope_id = stable_scope_id("ksadk", native_run_id, str(rich.scope_id or rich.agent_id))
|
|
412
|
+
source_metadata: dict[str, Any] = {
|
|
413
|
+
"native_event_type": rich.event_type,
|
|
414
|
+
"agent_id": rich.agent_id,
|
|
415
|
+
"session_id": rich.session_id,
|
|
416
|
+
**({"phase": rich.phase} if rich.phase else {}),
|
|
417
|
+
**({"parent_run_id": rich.parent_run_id} if rich.parent_run_id else {}),
|
|
418
|
+
}
|
|
419
|
+
# Keep comparison-grade lifecycle facts on the canonical envelope. These
|
|
420
|
+
# are identifiers/state, never model reasoning or tool input/output, so
|
|
421
|
+
# evaluation can count retries and subagents without parsing item content.
|
|
422
|
+
if rich.event_type == EventType.RUN_PROGRESS:
|
|
423
|
+
activity_kind = str(rich.payload.get("kind") or "").strip()
|
|
424
|
+
activity_call_id = str(rich.payload.get("call_id") or "").strip()
|
|
425
|
+
if activity_kind:
|
|
426
|
+
source_metadata["activity_kind"] = activity_kind
|
|
427
|
+
if activity_call_id:
|
|
428
|
+
source_metadata["activity_call_id"] = activity_call_id
|
|
429
|
+
elif rich.event_type == EventType.MODEL_CALL_FAILED:
|
|
430
|
+
failure_action = str(rich.payload.get("action") or "").strip()
|
|
431
|
+
if failure_action:
|
|
432
|
+
source_metadata["failure_action"] = failure_action
|
|
351
433
|
source = SourceRef(
|
|
352
434
|
framework="ksadk",
|
|
353
435
|
native_event_id=rich.event_id,
|
|
354
436
|
native_run_id=native_run_id,
|
|
355
|
-
metadata=
|
|
356
|
-
"native_event_type": rich.event_type,
|
|
357
|
-
"agent_id": rich.agent_id,
|
|
358
|
-
"session_id": rich.session_id,
|
|
359
|
-
**({"phase": rich.phase} if rich.phase else {}),
|
|
360
|
-
**({"parent_run_id": rich.parent_run_id} if rich.parent_run_id else {}),
|
|
361
|
-
},
|
|
437
|
+
metadata=source_metadata,
|
|
362
438
|
)
|
|
363
439
|
|
|
364
440
|
def envelope(event_type: str, item_id: str, part_id: str, ordinal: int = 0) -> dict[str, Any]:
|
|
@@ -399,6 +475,20 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
399
475
|
)
|
|
400
476
|
]
|
|
401
477
|
|
|
478
|
+
if str(rich.payload.get("purpose") or "") == "compaction" and rich.event_type in {
|
|
479
|
+
EventType.TEXT_DELTA,
|
|
480
|
+
EventType.TEXT_COMPLETED,
|
|
481
|
+
EventType.REASONING_DELTA,
|
|
482
|
+
EventType.REASONING_COMPLETED,
|
|
483
|
+
}:
|
|
484
|
+
# Context summaries use the normal reasoner so model lifecycle and
|
|
485
|
+
# usage remain auditable. Their text is internal working state: exposing
|
|
486
|
+
# it as a final answer lets an old turn overwrite the current turn in
|
|
487
|
+
# Studio, and can disclose content that was only meant for compaction.
|
|
488
|
+
return status_projection(
|
|
489
|
+
{"purpose": "compaction", "event_type": rich.event_type}
|
|
490
|
+
)
|
|
491
|
+
|
|
402
492
|
run_item = stable_item_id("ksadk", run_id, "$run")
|
|
403
493
|
payload = rich.payload
|
|
404
494
|
if rich.parent_run_id and rich.event_type in {
|
|
@@ -411,7 +501,20 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
411
501
|
if rich.event_type == EventType.RUN_STARTED:
|
|
412
502
|
return [RunStarted(**envelope("run.started", run_item, "run"), status="running")]
|
|
413
503
|
if rich.event_type == EventType.RUN_COMPLETED:
|
|
414
|
-
message_id =
|
|
504
|
+
message_id = _final_item_id(run_id, rich)
|
|
505
|
+
control_reason = str(payload.get("control_reason") or "").strip()
|
|
506
|
+
if control_reason:
|
|
507
|
+
# A controller stop may preserve a useful partial answer, but it
|
|
508
|
+
# is not successful task completion. Surface it as interrupted
|
|
509
|
+
# so Studio cannot show "已完成" next to an answer that explicitly
|
|
510
|
+
# reports remaining failed tests.
|
|
511
|
+
return [
|
|
512
|
+
RunInterrupted(
|
|
513
|
+
**envelope("run.interrupted", run_item, "run"),
|
|
514
|
+
status="interrupted",
|
|
515
|
+
reason=control_reason,
|
|
516
|
+
)
|
|
517
|
+
]
|
|
415
518
|
return [
|
|
416
519
|
RunCompleted(
|
|
417
520
|
**envelope("run.completed", run_item, "run"),
|
|
@@ -420,13 +523,25 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
420
523
|
)
|
|
421
524
|
]
|
|
422
525
|
if rich.event_type == EventType.RUN_FAILED:
|
|
526
|
+
category = str(payload.get("error_category") or "").strip()
|
|
527
|
+
error_code = str(payload.get("error_code") or "").strip()
|
|
528
|
+
status_code = payload.get("status_code")
|
|
529
|
+
try:
|
|
530
|
+
status_code = int(status_code) if status_code is not None else None
|
|
531
|
+
except (TypeError, ValueError):
|
|
532
|
+
status_code = None
|
|
533
|
+
if not error_code and category == "rate_limit":
|
|
534
|
+
error_code = "MODEL_RATE_LIMITED"
|
|
535
|
+
message = str(payload.get("error") or "Managed Harness run failed")
|
|
536
|
+
if status_code is not None and f"HTTP {status_code}" not in message:
|
|
537
|
+
message = f"HTTP {status_code} {message}"
|
|
423
538
|
return [
|
|
424
539
|
RunFailed(
|
|
425
540
|
**envelope("run.failed", run_item, "run"),
|
|
426
541
|
status="failed",
|
|
427
542
|
error=ErrorInfo(
|
|
428
|
-
code="HARNESS_EXECUTION_FAILED",
|
|
429
|
-
message=
|
|
543
|
+
code=error_code or "HARNESS_EXECUTION_FAILED",
|
|
544
|
+
message=message,
|
|
430
545
|
source="ksadk.harness.managed",
|
|
431
546
|
scope_id=scope_id,
|
|
432
547
|
),
|
|
@@ -453,6 +568,22 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
453
568
|
),
|
|
454
569
|
)
|
|
455
570
|
]
|
|
571
|
+
if rich.event_type in {EventType.PUBLIC_SUMMARY_DELTA, EventType.PUBLIC_SUMMARY_COMPLETED}:
|
|
572
|
+
from ksadk.harness.tool_display import display_text
|
|
573
|
+
|
|
574
|
+
item_id = stable_item_id("ksadk", run_id, "public-summary", str(payload["summary_id"]))
|
|
575
|
+
text = display_text(payload.get("text"))
|
|
576
|
+
if rich.event_type == EventType.PUBLIC_SUMMARY_COMPLETED:
|
|
577
|
+
return [ItemCompleted(**envelope("item.completed", item_id, "summary"),
|
|
578
|
+
item_id=item_id, item_kind="reasoning",
|
|
579
|
+
snapshot=ContentSnapshot(parts=(TextContent(part_id="summary", text=text),)))]
|
|
580
|
+
if payload.get("summary_start") is True:
|
|
581
|
+
return [ItemStarted(**envelope("item.started", item_id, "summary"),
|
|
582
|
+
item_id=item_id, item_kind="reasoning", phase="commentary",
|
|
583
|
+
initial=ContentSnapshot(parts=(TextContent(part_id="summary", text=text),)))]
|
|
584
|
+
return [ItemUpdated(**envelope("item.updated", item_id, "summary"),
|
|
585
|
+
item_id=item_id, item_kind="reasoning", op="append",
|
|
586
|
+
update=TextContent(part_id="summary", text=text))]
|
|
456
587
|
# Provider reasoning is retained as trace evidence but is not a stable or
|
|
457
588
|
# user-oriented progress contract. Exposing every model turn creates noisy
|
|
458
589
|
# "thought" cards and may reveal private reasoning. Chat progress comes
|
|
@@ -492,6 +623,11 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
492
623
|
if payload.get("kind") in {"delegation.route", "subagent.event"}:
|
|
493
624
|
return status_projection()
|
|
494
625
|
kind = str(payload.get("kind") or "")
|
|
626
|
+
# Run-control guidance is an internal controller fact. A literal
|
|
627
|
+
# "执行进度:guidance" row is neither useful to a user nor natural
|
|
628
|
+
# language; retain it in the canonical trace only.
|
|
629
|
+
if kind == "run_control":
|
|
630
|
+
return status_projection()
|
|
495
631
|
if kind == "provider.retry":
|
|
496
632
|
return _public_activity_items(
|
|
497
633
|
rich=rich,
|
|
@@ -563,6 +699,7 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
563
699
|
total_tokens=input_tokens + output_tokens,
|
|
564
700
|
cached_tokens=max(0, int(payload.get("cached_tokens") or 0)),
|
|
565
701
|
reasoning_tokens=max(0, int(payload.get("reasoning_tokens") or 0)),
|
|
702
|
+
mode=str(payload.get("mode") or "delta"),
|
|
566
703
|
)
|
|
567
704
|
]
|
|
568
705
|
if rich.event_type == EventType.APPROVAL_REQUESTED:
|
|
@@ -583,7 +720,7 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
583
720
|
kind = "message" if rich.event_type == EventType.TEXT_COMPLETED else "reasoning"
|
|
584
721
|
phase = str(rich.phase or ("final_answer" if kind == "message" else "commentary"))
|
|
585
722
|
item_id = (
|
|
586
|
-
|
|
723
|
+
_final_item_id(run_id, rich)
|
|
587
724
|
if kind == "message" and phase == "final_answer"
|
|
588
725
|
else stable_item_id("ksadk", run_id, kind, rich.event_id)
|
|
589
726
|
)
|
|
@@ -618,7 +755,7 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
618
755
|
kind = "message" if rich.event_type == EventType.TEXT_DELTA else "reasoning"
|
|
619
756
|
phase = str(rich.phase or ("final_answer" if kind == "message" else "commentary"))
|
|
620
757
|
item_id = (
|
|
621
|
-
|
|
758
|
+
_final_item_id(native_run_id, rich)
|
|
622
759
|
if kind == "message" and phase == "final_answer"
|
|
623
760
|
else stable_item_id("ksadk", run_id, kind, "stream")
|
|
624
761
|
)
|
|
@@ -644,21 +781,29 @@ def _project_event(event: HarnessEvent) -> list[Any]:
|
|
|
644
781
|
update=update,
|
|
645
782
|
)
|
|
646
783
|
]
|
|
647
|
-
if rich.event_type in {
|
|
784
|
+
if rich.event_type in {
|
|
785
|
+
EventType.TOOL_CALL_BEGIN, EventType.TOOL_CALL_END, EventType.TOOL_OUTPUT_UPDATED,
|
|
786
|
+
}:
|
|
648
787
|
# Arguments, results and receipts remain in the canonical Trace. The
|
|
649
788
|
# conversation receives the corresponding human-readable tool.batch
|
|
650
789
|
# progress item, avoiding duplicate technical cards and configuration-
|
|
651
790
|
# shaped payloads in the user-facing activity stream.
|
|
652
791
|
action = tool_public_action(payload)
|
|
792
|
+
display = (safe_tool_display(payload.get("public_display"))
|
|
793
|
+
or tool_display_start(str(payload.get("name") or "tool"), payload.get("args")))
|
|
653
794
|
return status_projection(
|
|
654
795
|
{
|
|
655
796
|
"name": str(payload.get("name") or "tool"),
|
|
656
797
|
"call_id": str(payload.get("call_id") or rich.event_id),
|
|
657
798
|
**({"public_action": action} if action else {}),
|
|
799
|
+
"tool_display": display,
|
|
658
800
|
"status": (
|
|
659
801
|
"started"
|
|
660
|
-
if rich.event_type
|
|
661
|
-
else "failed" if payload.get("error")
|
|
802
|
+
if rich.event_type in {EventType.TOOL_CALL_BEGIN, EventType.TOOL_OUTPUT_UPDATED}
|
|
803
|
+
else "failed" if payload.get("error") or (
|
|
804
|
+
isinstance(payload.get("result"), dict)
|
|
805
|
+
and payload["result"].get("ok") is False
|
|
806
|
+
) else "completed"
|
|
662
807
|
),
|
|
663
808
|
}
|
|
664
809
|
)
|
|
@@ -681,21 +826,38 @@ def _public_activity_items(
|
|
|
681
826
|
item_kind: str = "message",
|
|
682
827
|
existing: bool = False,
|
|
683
828
|
) -> list[Any]:
|
|
684
|
-
"""Build one identity-stable
|
|
829
|
+
"""Build one identity-stable public activity lifecycle transition.
|
|
830
|
+
|
|
831
|
+
Each Harness event must project to exactly one renderer mutation. Emitting
|
|
832
|
+
``started`` + identical ``updated`` + identical ``completed`` for a single
|
|
833
|
+
retry made clients that preserve canonical lifecycle events render the same
|
|
834
|
+
sentence twice. Running activities start once, subsequent progress replaces
|
|
835
|
+
once, and completion supplies the authoritative final snapshot once.
|
|
836
|
+
"""
|
|
685
837
|
del rich, scope_id, source
|
|
686
838
|
item_id = stable_item_id("ksadk", run_id, item_kind, f"activity-{key}")
|
|
687
839
|
part_id = "text-0"
|
|
688
840
|
snapshot = ContentSnapshot(parts=(TextContent(part_id=part_id, text=summary),))
|
|
689
|
-
|
|
841
|
+
if completed:
|
|
842
|
+
return [
|
|
843
|
+
ItemCompleted(
|
|
844
|
+
**envelope("item.completed", item_id, part_id, 2),
|
|
845
|
+
item_id=item_id,
|
|
846
|
+
item_kind=item_kind,
|
|
847
|
+
snapshot=snapshot,
|
|
848
|
+
)
|
|
849
|
+
]
|
|
690
850
|
if not existing:
|
|
691
|
-
|
|
851
|
+
return [
|
|
852
|
+
ItemStarted(
|
|
692
853
|
**envelope("item.started", item_id, part_id, 0),
|
|
693
854
|
item_id=item_id,
|
|
694
855
|
item_kind=item_kind,
|
|
695
856
|
phase="commentary",
|
|
696
857
|
initial=snapshot,
|
|
697
|
-
|
|
698
|
-
|
|
858
|
+
)
|
|
859
|
+
]
|
|
860
|
+
return [
|
|
699
861
|
ItemUpdated(
|
|
700
862
|
**envelope("item.updated", item_id, part_id, 1),
|
|
701
863
|
item_id=item_id,
|
|
@@ -703,17 +865,7 @@ def _public_activity_items(
|
|
|
703
865
|
op="replace",
|
|
704
866
|
update=TextContent(part_id=part_id, text=summary),
|
|
705
867
|
)
|
|
706
|
-
|
|
707
|
-
if completed:
|
|
708
|
-
events.append(
|
|
709
|
-
ItemCompleted(
|
|
710
|
-
**envelope("item.completed", item_id, part_id, 2),
|
|
711
|
-
item_id=item_id,
|
|
712
|
-
item_kind=item_kind,
|
|
713
|
-
snapshot=snapshot,
|
|
714
|
-
)
|
|
715
|
-
)
|
|
716
|
-
return events
|
|
868
|
+
]
|
|
717
869
|
|
|
718
870
|
|
|
719
871
|
def _progress_text(payload: dict[str, Any]) -> str:
|
|
@@ -778,12 +930,41 @@ def _provider_retry_text(payload: dict[str, Any]) -> str:
|
|
|
778
930
|
attempt = max(2, int(payload["next_attempt"]))
|
|
779
931
|
else:
|
|
780
932
|
attempt = max(2, int(payload.get("model_attempt") or 1) + 1)
|
|
781
|
-
maximum = max(attempt, int(payload.get("max_attempts") or
|
|
933
|
+
maximum = max(attempt, int(payload.get("max_attempts") or 3))
|
|
782
934
|
delay_ms = max(0, int(payload.get("delay_ms") or payload.get("retry_delay_ms") or 0))
|
|
783
935
|
wait = f",{delay_ms / 1000:g} 秒后" if delay_ms else ""
|
|
784
936
|
label = str(payload.get("label") or "").strip()
|
|
785
937
|
scope = f"({label})" if label else ""
|
|
786
|
-
|
|
938
|
+
# 叙述必须区分"上游繁忙/限流"与"其它失败":把被我们拒绝的响应说成
|
|
939
|
+
# "模型服务繁忙"会掩盖 bug(2026-09-18 实测事故)。
|
|
940
|
+
#
|
|
941
|
+
# 并且**类别本身也必须显示出来**:`transient` 里包含 `timeout`,而超时可能
|
|
942
|
+
# 是我们自己触发的(例如空闲进度超时)。统一写成"模型服务繁忙"会让用户
|
|
943
|
+
# 无法判断是网关的问题还是我们的问题——2026-09-18 用户直接质疑"服务器没
|
|
944
|
+
# 那么容易繁忙吧",而我们当时确实拿不出证据。这里保留可读措辞并附上原始
|
|
945
|
+
# 类别,让重试原因可辨。
|
|
946
|
+
category = str(payload.get("failure_category") or "").strip().lower()
|
|
947
|
+
transient = {"rate_limit", "timeout", "unavailable", "transport"}
|
|
948
|
+
# 类别未知时保持原措辞(不改变既有语义);只有确实拿到类别才改口径并附上。
|
|
949
|
+
headline = (
|
|
950
|
+
"模型调用未成功"
|
|
951
|
+
if category and category not in transient
|
|
952
|
+
else "模型服务繁忙"
|
|
953
|
+
)
|
|
954
|
+
if category:
|
|
955
|
+
headline = f"{headline}({category})"
|
|
956
|
+
# 附带上游 HTTP 状态码(纯数字,不含正文,无泄密风险)。2026-09-18 实测:
|
|
957
|
+
# 重试全是 `unavailable`,但它既可能是网关 503,也可能是**我们自己**把
|
|
958
|
+
# "网关 400(例如拒绝请求体某字段)"包装成 MODEL_REQUEST_FAILED(502)。
|
|
959
|
+
# 不显示状态码就无法区分"上游真的不可用"和"我们的请求把上游惹了"。
|
|
960
|
+
status_code = payload.get("status_code")
|
|
961
|
+
if status_code:
|
|
962
|
+
headline = f"{headline}[{status_code}]"
|
|
963
|
+
# 带上内部错误码(是我们自判失败还是上游失败,一眼可辨;不含任何正文/凭证)。
|
|
964
|
+
error_code = str(payload.get("error_code") or "").strip()
|
|
965
|
+
if error_code:
|
|
966
|
+
headline = f"{headline}<{error_code}>"
|
|
967
|
+
return f"{headline}{scope}{wait}自动重试(第 {attempt}/{maximum} 次)"
|
|
787
968
|
|
|
788
969
|
|
|
789
970
|
def _public_approval_detail(value: Any) -> dict[str, Any]:
|
|
@@ -838,6 +1019,16 @@ def _compact_responsibilities(labels: list[str], *, max_items: int = 4) -> str:
|
|
|
838
1019
|
return "\n" + "\n".join(lines)
|
|
839
1020
|
|
|
840
1021
|
|
|
1022
|
+
def _steer_text(value: Any) -> str:
|
|
1023
|
+
"""Normalize both plain text and the Kernel wire payload to steering text."""
|
|
1024
|
+
if isinstance(value, str):
|
|
1025
|
+
return value
|
|
1026
|
+
content = getattr(value, "content", None)
|
|
1027
|
+
if content is None and isinstance(value, dict):
|
|
1028
|
+
content = value.get("content")
|
|
1029
|
+
return str(content) if content is not None else str(value)
|
|
1030
|
+
|
|
1031
|
+
|
|
841
1032
|
def _positive_int(value: Any) -> int | None:
|
|
842
1033
|
try:
|
|
843
1034
|
parsed = int(value)
|
|
@@ -846,37 +1037,6 @@ def _positive_int(value: Any) -> int | None:
|
|
|
846
1037
|
return parsed if parsed > 0 else None
|
|
847
1038
|
|
|
848
1039
|
|
|
849
|
-
def managed_harness_capabilities(
|
|
850
|
-
*, durable: bool, execution_policy: bool = False
|
|
851
|
-
) -> RuntimeCapabilityMatrix:
|
|
852
|
-
"""Return the canonical control matrix for one concrete assembly tier."""
|
|
853
|
-
|
|
854
|
-
def available() -> RuntimeCapability:
|
|
855
|
-
return RuntimeCapability(supported=True, mode="native")
|
|
856
|
-
|
|
857
|
-
def unavailable(reason: str) -> RuntimeCapability:
|
|
858
|
-
return RuntimeCapability(supported=False, mode="unavailable", reason=reason)
|
|
859
|
-
|
|
860
|
-
durable_capability = (
|
|
861
|
-
available() if durable else unavailable("managed_harness_checkpoint_is_process_local")
|
|
862
|
-
)
|
|
863
|
-
return RuntimeCapabilityMatrix(
|
|
864
|
-
cancel=available(),
|
|
865
|
-
pause=unavailable("managed_harness_pause_not_implemented"),
|
|
866
|
-
resume=available(),
|
|
867
|
-
submit_interaction=durable_capability,
|
|
868
|
-
attach=durable_capability,
|
|
869
|
-
steer=unavailable("runtime_no_native_steer"),
|
|
870
|
-
inject=unavailable("runtime_no_native_inject"),
|
|
871
|
-
checkpoint=available(),
|
|
872
|
-
durable_restore=durable_capability,
|
|
873
|
-
interaction_mode="durable_resume" if durable else "unavailable",
|
|
874
|
-
execution_policy=(
|
|
875
|
-
available() if execution_policy else unavailable("managed_harness_no_host_resolver")
|
|
876
|
-
),
|
|
877
|
-
)
|
|
878
|
-
|
|
879
|
-
|
|
880
1040
|
__all__ = [
|
|
881
1041
|
"ManagedHarnessRuntime",
|
|
882
1042
|
"ManagedHarnessRuntimeAdapter",
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""Framework-free L0-L3 MCP tool contract shared by runtime implementations."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
MCP_LIST_TOOLS_TOOL = "mcp_list_tools"
|
|
9
|
+
MCP_READ_SCHEMA_TOOL = "mcp_read_tool_schema"
|
|
10
|
+
MCP_CALL_TOOL_TOOL = "mcp_call_tool"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class McpDisclosureToolSpec:
|
|
15
|
+
"""暴露给模型的受控 MCP 披露工具描述。"""
|
|
16
|
+
|
|
17
|
+
name: str
|
|
18
|
+
description: str
|
|
19
|
+
parameters: dict[str, Any]
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def openai_schema(self) -> dict[str, Any]:
|
|
23
|
+
return {
|
|
24
|
+
"type": "function",
|
|
25
|
+
"function": {
|
|
26
|
+
"name": self.name,
|
|
27
|
+
"description": self.description,
|
|
28
|
+
"parameters": self.parameters,
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def disclosure_tools() -> list[McpDisclosureToolSpec]:
|
|
34
|
+
server_id = {"type": "string", "description": "Revision 已绑定的 MCP Server 引用。"}
|
|
35
|
+
tool_name = {"type": "string", "description": "该 Server 上的 Tool 名。"}
|
|
36
|
+
return [
|
|
37
|
+
McpDisclosureToolSpec(
|
|
38
|
+
name=MCP_LIST_TOOLS_TOOL,
|
|
39
|
+
description=(
|
|
40
|
+
"列出指定 MCP Server 的可用 Tool(名称与一句话描述,不含参数 Schema)。"
|
|
41
|
+
"使用该 Server 的任何 Tool 前必须先调用此工具。refresh=true 时刷新缓存。"
|
|
42
|
+
),
|
|
43
|
+
parameters={
|
|
44
|
+
"type": "object",
|
|
45
|
+
"properties": {
|
|
46
|
+
"server_id": server_id,
|
|
47
|
+
"refresh": {"type": "boolean", "description": "失效并重新拉取工具列表"},
|
|
48
|
+
},
|
|
49
|
+
"required": ["server_id"],
|
|
50
|
+
"additionalProperties": False,
|
|
51
|
+
},
|
|
52
|
+
),
|
|
53
|
+
McpDisclosureToolSpec(
|
|
54
|
+
name=MCP_READ_SCHEMA_TOOL,
|
|
55
|
+
description=(
|
|
56
|
+
"读取指定 Tool 的完整输入参数 Schema。必须先 mcp_list_tools 该 Server,"
|
|
57
|
+
"且调用任何 Tool 前必须先读其 Schema。"
|
|
58
|
+
),
|
|
59
|
+
parameters={
|
|
60
|
+
"type": "object",
|
|
61
|
+
"properties": {"server_id": server_id, "tool_name": tool_name},
|
|
62
|
+
"required": ["server_id", "tool_name"],
|
|
63
|
+
"additionalProperties": False,
|
|
64
|
+
},
|
|
65
|
+
),
|
|
66
|
+
McpDisclosureToolSpec(
|
|
67
|
+
name=MCP_CALL_TOOL_TOOL,
|
|
68
|
+
description=(
|
|
69
|
+
"调用指定 MCP Tool。必须先用 mcp_read_tool_schema 读取该 Tool 的 Schema。"
|
|
70
|
+
),
|
|
71
|
+
parameters={
|
|
72
|
+
"type": "object",
|
|
73
|
+
"properties": {
|
|
74
|
+
"server_id": server_id,
|
|
75
|
+
"tool_name": tool_name,
|
|
76
|
+
"arguments": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"description": "按 Schema 组装的工具参数。",
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
"required": ["server_id", "tool_name", "arguments"],
|
|
82
|
+
"additionalProperties": False,
|
|
83
|
+
},
|
|
84
|
+
),
|
|
85
|
+
]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Framework-free MCP result disclosure policy shared by managed runtimes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
#: 平台托管 Runtime 的基础敏感数据默认规则(组织可覆盖或接 DLP):
|
|
9
|
+
#: 中国大陆身份证号 / 16-19 位银行卡号 / 1[3-9] 开头手机号。
|
|
10
|
+
_DEFAULT_SENSITIVE_PATTERNS = (
|
|
11
|
+
# A long fractional component (for example a vector-search score such as
|
|
12
|
+
# ``0.9619389772415161``) is not an identity or payment-card number. The
|
|
13
|
+
# previous word-boundary patterns started matching immediately after the
|
|
14
|
+
# decimal point and offloaded otherwise harmless MCP results with an empty
|
|
15
|
+
# summary, leaving the model unable to read knowledge-base results.
|
|
16
|
+
r"(?<![\d.])\d{17}[\dXx](?![\d.])",
|
|
17
|
+
r"(?<![\d.])\d{16,19}(?![\d.])",
|
|
18
|
+
r"(?<![\d.])1[3-9]\d{9}(?![\d.])",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class McpOffloadPolicy:
|
|
24
|
+
"""P1 大结果 Offload 策略。
|
|
25
|
+
|
|
26
|
+
- ``single_result_threshold_bytes``:单次工具结果超过该字节数 → 外置;
|
|
27
|
+
- ``sensitive_patterns``:命中任一正则 → 无论大小强制外置,且摘要置空
|
|
28
|
+
(敏感明文不留在 Context)。默认开启平台基础规则(身份证/银行卡/
|
|
29
|
+
手机号),组织可通过自定义 policy 覆盖或接入 DLP/分类服务;
|
|
30
|
+
- ``run_total_quota_bytes``:Run 累计外置字节配额,超出后新的超大结果
|
|
31
|
+
明确报错降级(不回填 Context)。
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
enabled: bool = True
|
|
35
|
+
single_result_threshold_bytes: int = 4096
|
|
36
|
+
run_total_quota_bytes: int = 10 * 1024 * 1024
|
|
37
|
+
summary_chars: int = 500
|
|
38
|
+
sensitive_patterns: tuple[str, ...] = _DEFAULT_SENSITIVE_PATTERNS
|
|
39
|
+
|
|
40
|
+
def sensitive_match(self, content: str) -> str | None:
|
|
41
|
+
for pattern in self.sensitive_patterns:
|
|
42
|
+
if re.search(pattern, content):
|
|
43
|
+
return pattern
|
|
44
|
+
return None
|