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
|
@@ -28,6 +28,7 @@ _MANIFEST_KEYS = (
|
|
|
28
28
|
"skills",
|
|
29
29
|
"mcp_servers",
|
|
30
30
|
"plugins",
|
|
31
|
+
"remote_agents",
|
|
31
32
|
"sandbox",
|
|
32
33
|
"approval_mode",
|
|
33
34
|
"context",
|
|
@@ -163,6 +164,17 @@ class ManagedRuntimeBuilder(BaseBuilder):
|
|
|
163
164
|
runtime_name = str(runtime.get("name") or "").strip().lower()
|
|
164
165
|
if runtime_name != "codex":
|
|
165
166
|
return "当前 ManagedRuntime v1 仅支持 runtime.name: codex"
|
|
167
|
+
if "remoteAgents" in config:
|
|
168
|
+
return "ManagedRuntime YAML 请使用 remote_agents 字段,不能静默忽略 remoteAgents"
|
|
169
|
+
if "remote_agents" in config:
|
|
170
|
+
from ksadk.plugins.host import PluginHostError
|
|
171
|
+
from ksadk.plugins.providers.codex import _bundle_a2a_experts
|
|
172
|
+
try:
|
|
173
|
+
_bundle_a2a_experts(config)
|
|
174
|
+
except (ValueError, PluginHostError):
|
|
175
|
+
# Validation errors can include authored input. Keep the CLI
|
|
176
|
+
# failure deterministic without echoing manifest data.
|
|
177
|
+
return "A2A_EXPERT_BINDING_INVALID: 请检查固定绑定、调用方式和执行策略"
|
|
166
178
|
return None
|
|
167
179
|
|
|
168
180
|
@staticmethod
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""Collect immutable source and installed-package provenance."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib.metadata as importlib_metadata
|
|
6
|
+
import json
|
|
7
|
+
import subprocess
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Optional
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _git_provenance(start: Path) -> Optional[dict]:
|
|
13
|
+
"""返回 start 所在 git 仓库的提交信息;非 git 目录返回 None。"""
|
|
14
|
+
|
|
15
|
+
def _git(*args: str) -> Optional[str]:
|
|
16
|
+
try:
|
|
17
|
+
proc = subprocess.run(
|
|
18
|
+
["git", "-C", str(start), *args],
|
|
19
|
+
capture_output=True,
|
|
20
|
+
text=True,
|
|
21
|
+
timeout=10,
|
|
22
|
+
)
|
|
23
|
+
except Exception:
|
|
24
|
+
return None
|
|
25
|
+
if proc.returncode != 0:
|
|
26
|
+
return None
|
|
27
|
+
return proc.stdout.strip()
|
|
28
|
+
|
|
29
|
+
toplevel = _git("rev-parse", "--show-toplevel")
|
|
30
|
+
if not toplevel:
|
|
31
|
+
return None
|
|
32
|
+
commit = _git("rev-parse", "HEAD")
|
|
33
|
+
branch = _git("rev-parse", "--abbrev-ref", "HEAD")
|
|
34
|
+
status = _git("status", "--porcelain")
|
|
35
|
+
return {
|
|
36
|
+
"repo_root": toplevel,
|
|
37
|
+
"commit": commit,
|
|
38
|
+
"branch": branch or None,
|
|
39
|
+
"dirty": bool(status),
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _package_provenance(package_name: str, package_root: Path, *, git_reader: Any) -> dict:
|
|
44
|
+
"""采集被 vendored 包的安装来源:dist 元信息 / 本地路径 / git 提交。"""
|
|
45
|
+
|
|
46
|
+
info: dict[str, Any] = {
|
|
47
|
+
"source_dir": str(package_root),
|
|
48
|
+
"dist_version": None,
|
|
49
|
+
"installer": None,
|
|
50
|
+
"direct_url": None,
|
|
51
|
+
"source_type": "unknown",
|
|
52
|
+
"git": None,
|
|
53
|
+
}
|
|
54
|
+
try:
|
|
55
|
+
dist = importlib_metadata.distribution(package_name)
|
|
56
|
+
except Exception:
|
|
57
|
+
dist = None
|
|
58
|
+
if dist is not None:
|
|
59
|
+
info["dist_version"] = dist.version
|
|
60
|
+
installer = (dist.read_text("INSTALLER") or "").strip()
|
|
61
|
+
info["installer"] = installer or None
|
|
62
|
+
raw_direct_url = dist.read_text("direct_url.json")
|
|
63
|
+
if raw_direct_url:
|
|
64
|
+
try:
|
|
65
|
+
direct_url = json.loads(raw_direct_url)
|
|
66
|
+
except ValueError:
|
|
67
|
+
direct_url = None
|
|
68
|
+
if isinstance(direct_url, dict):
|
|
69
|
+
info["direct_url"] = direct_url.get("url")
|
|
70
|
+
url = str(direct_url.get("url") or "")
|
|
71
|
+
dir_info = direct_url.get("dir_info") or {}
|
|
72
|
+
archive_info = direct_url.get("archive_info") or {}
|
|
73
|
+
if url.startswith("file://"):
|
|
74
|
+
if dir_info.get("editable"):
|
|
75
|
+
info["source_type"] = "editable-install"
|
|
76
|
+
elif url.endswith(".whl"):
|
|
77
|
+
info["source_type"] = "local-wheel"
|
|
78
|
+
else:
|
|
79
|
+
info["source_type"] = "local-path"
|
|
80
|
+
elif archive_info:
|
|
81
|
+
info["source_type"] = "remote-dist"
|
|
82
|
+
if info["direct_url"] is None and info["dist_version"] is not None:
|
|
83
|
+
# pip 从 index 安装的常规 dist 通常不写 direct_url.json
|
|
84
|
+
info["source_type"] = "installed-dist"
|
|
85
|
+
if info["source_type"] in {"editable-install", "local-path", "unknown"}:
|
|
86
|
+
info["git"] = git_reader(package_root)
|
|
87
|
+
return info
|
ksadk/cli/cmd_a2a.py
CHANGED
|
@@ -199,6 +199,49 @@ def register(agent_path: Path, url: str, name: str | None, description: str, ski
|
|
|
199
199
|
click.echo(MessageToJson(card_obj, indent=2))
|
|
200
200
|
|
|
201
201
|
|
|
202
|
+
@a2a.command("register-hosted", context_settings=_HELP)
|
|
203
|
+
@click.option("--agent-id", required=True, help="已通过 deploy 创建的托管运行时 ID")
|
|
204
|
+
@click.option("--space-id", "space_ids", multiple=True, required=True, help="加入的 A2A Space;可重复")
|
|
205
|
+
@click.option("--region", required=True, help="显式选择环境/区域,例如 pre-online")
|
|
206
|
+
def register_hosted(agent_id: str, space_ids: Sequence[str], region: str):
|
|
207
|
+
"""将已部署的 hosted Agent 注册为可被 Space 内其他 Agent 调用的服务。"""
|
|
208
|
+
from ksadk.api.client import AgentEngineClient
|
|
209
|
+
|
|
210
|
+
agent_id, region = agent_id.strip(), region.strip()
|
|
211
|
+
spaces = list(dict.fromkeys(space.strip() for space in space_ids))
|
|
212
|
+
if not agent_id or not region or any(not space for space in spaces):
|
|
213
|
+
raise click.UsageError("agent-id、space-id 和 region 不得为空")
|
|
214
|
+
|
|
215
|
+
async def run():
|
|
216
|
+
client = AgentEngineClient(region=region)
|
|
217
|
+
try:
|
|
218
|
+
preview = await client._action_async(
|
|
219
|
+
"GetAToARuntimeConfig", {"AgentId": agent_id}, preserve_case=True,
|
|
220
|
+
)
|
|
221
|
+
card = preview.get("AgentCard")
|
|
222
|
+
if not isinstance(card, dict) or not card:
|
|
223
|
+
raise ValueError("Runtime AgentCard unavailable")
|
|
224
|
+
result = await client._action_async("CreateAToAAgent", {
|
|
225
|
+
"Source": "hosted", "AgentId": agent_id, "A2ASpaceIds": spaces,
|
|
226
|
+
"AgentCard": card,
|
|
227
|
+
})
|
|
228
|
+
except Exception as exc:
|
|
229
|
+
# An ambiguous response is not automatically retried: registration
|
|
230
|
+
# may already exist. Never print private upstream bodies or routes.
|
|
231
|
+
code = getattr(exc, "code", None)
|
|
232
|
+
raise click.ClickException(
|
|
233
|
+
f"Hosted A2A 注册失败(code={code or 'unavailable'});请查询注册状态后再重试"
|
|
234
|
+
) from None
|
|
235
|
+
finally:
|
|
236
|
+
await client.close()
|
|
237
|
+
click.echo(json.dumps({
|
|
238
|
+
"a2a_agent_id": result.get("a2_a_agent_id", result.get("A2AAgentId")),
|
|
239
|
+
"status": result.get("status", result.get("Status")),
|
|
240
|
+
}, ensure_ascii=False))
|
|
241
|
+
|
|
242
|
+
asyncio.run(run())
|
|
243
|
+
|
|
244
|
+
|
|
202
245
|
# ---------------------------------------------------------------------------
|
|
203
246
|
# discover / call / status / cancel(Space 内动态发现与调用,经 A2ASpaceClient)
|
|
204
247
|
# ---------------------------------------------------------------------------
|
ksadk/cli/cmd_build.py
CHANGED
|
@@ -285,6 +285,15 @@ async def _build_code(
|
|
|
285
285
|
if not result.success:
|
|
286
286
|
raise validation_error(result.error_message or "构建失败")
|
|
287
287
|
|
|
288
|
+
if result.artifact_path is not None:
|
|
289
|
+
from ksadk.builders.code_builder import _sha256_file, read_code_deployment_contract
|
|
290
|
+
|
|
291
|
+
result.metadata["code_checksum"] = _sha256_file(result.artifact_path)
|
|
292
|
+
contract = read_code_deployment_contract(result.artifact_path)
|
|
293
|
+
if contract and contract.get("schema") == "ksadk-code-deployment/v1":
|
|
294
|
+
result.metadata["code_command"] = contract.get("command")
|
|
295
|
+
result.metadata["code_kernel_contract_digest"] = contract.get("agentKernelContractDigest")
|
|
296
|
+
|
|
288
297
|
agent_name = result.metadata.get("agent_name", agent_path.name)
|
|
289
298
|
|
|
290
299
|
# 上传到 KS3
|
ksadk/cli/cmd_deploy.py
CHANGED
|
@@ -104,6 +104,8 @@ console = get_console()
|
|
|
104
104
|
default=None,
|
|
105
105
|
help="Serverless 部署模式;默认从 agentengine.yaml 推断",
|
|
106
106
|
)
|
|
107
|
+
@click.option("--a2a-space-id", help="绑定 A2A Space(Serverless);省略时保留已有绑定")
|
|
108
|
+
@click.option("--a2a-runtime-profile", type=click.Choice(["managed-a2a", "managed-a2a-basic", "managed-a2a-memory"]), help="A2A 能力配置;需同时指定 --a2a-space-id")
|
|
107
109
|
@click.option("--namespace", default="default", help="K8s 命名空间")
|
|
108
110
|
@click.option("--port", "-p", default=8000, help="服务端口 (default: 8000)")
|
|
109
111
|
@click.option("--registry", help="镜像仓库地址 (k8s/serverless Container 模式)")
|
|
@@ -148,6 +150,8 @@ def deploy(
|
|
|
148
150
|
region: str,
|
|
149
151
|
account_id: str,
|
|
150
152
|
artifact_type: str,
|
|
153
|
+
a2a_space_id: str | None,
|
|
154
|
+
a2a_runtime_profile: str | None,
|
|
151
155
|
namespace: str,
|
|
152
156
|
port: int,
|
|
153
157
|
registry: str,
|
|
@@ -250,6 +254,8 @@ def deploy(
|
|
|
250
254
|
repackage=repackage,
|
|
251
255
|
dry_run_context=dry_run_context,
|
|
252
256
|
agent_id=agent_id,
|
|
257
|
+
a2a_space_id=a2a_space_id,
|
|
258
|
+
a2a_runtime_profile=a2a_runtime_profile,
|
|
253
259
|
),
|
|
254
260
|
dry_run=dry_run,
|
|
255
261
|
on_dry_run=render_deploy_dry_run,
|
|
@@ -326,11 +332,20 @@ async def _deploy_async(
|
|
|
326
332
|
*,
|
|
327
333
|
repackage: bool = False,
|
|
328
334
|
agent_id: str | None = None,
|
|
335
|
+
a2a_space_id: str | None = None,
|
|
336
|
+
a2a_runtime_profile: str | None = None,
|
|
329
337
|
):
|
|
330
338
|
"""异步部署流程"""
|
|
331
339
|
from ksadk.deployment import DeploymentManager, DeployStatus, DeployTarget
|
|
332
340
|
from ksadk.detection import FrameworkDetector
|
|
333
341
|
|
|
342
|
+
if a2a_runtime_profile and not a2a_space_id:
|
|
343
|
+
raise validation_error("--a2a-runtime-profile requires --a2a-space-id")
|
|
344
|
+
if a2a_space_id is not None:
|
|
345
|
+
a2a_space_id = a2a_space_id.strip()
|
|
346
|
+
if target != "serverless" or not a2a_space_id:
|
|
347
|
+
raise validation_error("--a2a-space-id 需要非空 Space ID,且仅支持 Serverless 部署")
|
|
348
|
+
|
|
334
349
|
agent_path = Path(agent_dir).resolve()
|
|
335
350
|
config = _load_config(agent_path)
|
|
336
351
|
try:
|
|
@@ -385,6 +400,11 @@ async def _deploy_async(
|
|
|
385
400
|
|
|
386
401
|
resolved_runtime = None
|
|
387
402
|
if effective_artifact_type == "ManagedRuntime":
|
|
403
|
+
if image:
|
|
404
|
+
raise validation_error(
|
|
405
|
+
"ManagedRuntime 不支持 --image;镜像由服务端 Runtime catalog 选择。"
|
|
406
|
+
"请通过 runtime.version 指定已登记的运行时版本。"
|
|
407
|
+
)
|
|
388
408
|
if detection_result.type.value != "codex":
|
|
389
409
|
raise validation_error("ManagedRuntime v1 目前仅支持 framework: codex")
|
|
390
410
|
if ks3_path:
|
|
@@ -443,6 +463,8 @@ async def _deploy_async(
|
|
|
443
463
|
"runtime_name": resolved_runtime.name if resolved_runtime else "",
|
|
444
464
|
"runtime_version": resolved_runtime.version if resolved_runtime else "",
|
|
445
465
|
"agent_id": agent_id,
|
|
466
|
+
"a2a_space_id": a2a_space_id,
|
|
467
|
+
"a2a_runtime_profile": a2a_runtime_profile,
|
|
446
468
|
},
|
|
447
469
|
)
|
|
448
470
|
|
|
@@ -611,7 +633,9 @@ async def _deploy_async(
|
|
|
611
633
|
# CreateAgent callback may still be pending, so presenting it as a
|
|
612
634
|
# completed deployment is misleading (and hides a broken
|
|
613
635
|
# callback/data-plane handoff).
|
|
614
|
-
if result.
|
|
636
|
+
if result.metadata.get("update_accepted"):
|
|
637
|
+
print_info("Agent 更新请求已提交,服务端将在后台执行,请稍后查看 Agent 状态")
|
|
638
|
+
elif result.status == DeployStatus.RUNNING:
|
|
615
639
|
print_success("部署成功")
|
|
616
640
|
else:
|
|
617
641
|
print_info("部署请求已提交,等待实例就绪")
|
|
@@ -631,7 +655,8 @@ async def _deploy_async(
|
|
|
631
655
|
print_kv("信息", result.message)
|
|
632
656
|
|
|
633
657
|
# 9. 自动创建版本快照 (仅热更新时,首次部署平台自动创建 v1)
|
|
634
|
-
is_update = result.
|
|
658
|
+
is_update = (not result.metadata.get("update_accepted")
|
|
659
|
+
and result.message and "已更新" in result.message)
|
|
635
660
|
if result.agent_id and is_update and not no_version and not dry_run:
|
|
636
661
|
from ksadk.cli.deploy_utils import auto_release_version
|
|
637
662
|
|
ksadk/cli/cmd_invoke.py
CHANGED
|
@@ -36,6 +36,8 @@ from ksadk.hermes_terminal import run_hermes_terminal_session
|
|
|
36
36
|
from ksadk.terminal_client import run_terminal_session
|
|
37
37
|
from ksadk_runtime_common.workspace_files.constants import DEFAULT_WORKSPACE_MAX_UPLOAD_BYTES
|
|
38
38
|
|
|
39
|
+
from ksadk.cli.invoke_content import _extract_content, _extract_response_content
|
|
40
|
+
|
|
39
41
|
console: Any = None
|
|
40
42
|
Markdown: Any = None
|
|
41
43
|
Live: Any = None
|
|
@@ -583,6 +585,14 @@ def run_invoke_command(
|
|
|
583
585
|
|
|
584
586
|
if message:
|
|
585
587
|
# 单次调用模式
|
|
588
|
+
if not local and not _is_openclaw_target(next_state, latest_access) and not _is_hermes_target(next_state, latest_access):
|
|
589
|
+
from ksadk.cli.hosted_invoke import try_invoke_hosted_once
|
|
590
|
+
|
|
591
|
+
if try_invoke_hosted_once(
|
|
592
|
+
endpoint=endpoint, api_key=api_key, session_id=session_id,
|
|
593
|
+
message=message, model=model, insecure=insecure,
|
|
594
|
+
):
|
|
595
|
+
return
|
|
586
596
|
api_format_resolved = asyncio.run(
|
|
587
597
|
_resolve_remote_api_format(
|
|
588
598
|
endpoint=endpoint,
|
|
@@ -1375,7 +1385,7 @@ async def _invoke_once(
|
|
|
1375
1385
|
else:
|
|
1376
1386
|
click.echo(content)
|
|
1377
1387
|
except Exception as e:
|
|
1378
|
-
click.
|
|
1388
|
+
raise click.ClickException(f"调用失败: {e}") from e
|
|
1379
1389
|
|
|
1380
1390
|
|
|
1381
1391
|
async def _chat(
|
|
@@ -1485,94 +1495,37 @@ async def _stream_chat(
|
|
|
1485
1495
|
async with httpx.AsyncClient(**client_kwargs) as client:
|
|
1486
1496
|
async with client.stream("POST", url, json=payload, headers=headers) as response:
|
|
1487
1497
|
response.raise_for_status()
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
def _extract_content(chunk: dict) -> tuple[str, str]:
|
|
1525
|
-
"""从 OpenAI 流式响应中提取内容 (包含 reasoning_content)"""
|
|
1526
|
-
event_name = str(chunk.get("_event") or "")
|
|
1527
|
-
if event_name == "response.output_text.delta":
|
|
1528
|
-
return str(chunk.get("delta") or ""), ""
|
|
1529
|
-
# reasoning delta 有 4 个变体名(与 remote_runner / 前端 chatProtocol 对齐),
|
|
1530
|
-
# 主 runtime 发 reasoning.delta,Studio shared_web 发 reasoning_summary_text.delta。
|
|
1531
|
-
if event_name in {
|
|
1532
|
-
"response.reasoning.delta",
|
|
1533
|
-
"response.reasoning_text.delta",
|
|
1534
|
-
"response.reasoning_summary.delta",
|
|
1535
|
-
"response.reasoning_summary_text.delta",
|
|
1536
|
-
}:
|
|
1537
|
-
return "", str(chunk.get("delta") or chunk.get("text") or "")
|
|
1538
|
-
if event_name == "response.completed":
|
|
1539
|
-
return "", ""
|
|
1540
|
-
|
|
1541
|
-
# OpenAI 格式: {"choices": [{"delta": {"content": "xxx", "reasoning_content": "thought"}}]}
|
|
1542
|
-
try:
|
|
1543
|
-
choices = chunk.get("choices", [])
|
|
1544
|
-
if choices:
|
|
1545
|
-
delta = choices[0].get("delta", {})
|
|
1546
|
-
return delta.get("content", "") or "", delta.get("reasoning_content", "") or ""
|
|
1547
|
-
except (KeyError, IndexError):
|
|
1548
|
-
pass
|
|
1549
|
-
|
|
1550
|
-
if isinstance(chunk.get("output_text"), str):
|
|
1551
|
-
return chunk["output_text"], ""
|
|
1552
|
-
if isinstance(chunk.get("delta"), str):
|
|
1553
|
-
return chunk["delta"], ""
|
|
1554
|
-
return "", ""
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
def _extract_response_content(response: dict) -> str:
|
|
1558
|
-
"""从 OpenAI 非流式响应中提取内容"""
|
|
1559
|
-
output_text = response.get("output_text")
|
|
1560
|
-
if output_text:
|
|
1561
|
-
return str(output_text)
|
|
1562
|
-
output = response.get("output") or []
|
|
1563
|
-
for item in output:
|
|
1564
|
-
if not isinstance(item, dict):
|
|
1565
|
-
continue
|
|
1566
|
-
for content in item.get("content") or []:
|
|
1567
|
-
if isinstance(content, dict) and content.get("text"):
|
|
1568
|
-
return str(content["text"])
|
|
1569
|
-
|
|
1570
|
-
# OpenAI 格式: {"choices": [{"message": {"content": "xxx"}}]}
|
|
1571
|
-
try:
|
|
1572
|
-
choices = response.get("choices", [])
|
|
1573
|
-
if choices:
|
|
1574
|
-
message = choices[0].get("message", {})
|
|
1575
|
-
return str(message.get("content") or "")
|
|
1576
|
-
except (KeyError, IndexError):
|
|
1577
|
-
pass
|
|
1578
|
-
return str(response)
|
|
1498
|
+
current_event = ""
|
|
1499
|
+
# Use aiter_lines() for robust UTF-8 decoding and line splitting
|
|
1500
|
+
async for line in response.aiter_lines():
|
|
1501
|
+
if not line:
|
|
1502
|
+
continue
|
|
1503
|
+
|
|
1504
|
+
if line.startswith("event: "):
|
|
1505
|
+
current_event = line[7:].strip()
|
|
1506
|
+
continue
|
|
1507
|
+
|
|
1508
|
+
if line.startswith("data: "):
|
|
1509
|
+
data_str = line[6:].strip()
|
|
1510
|
+
if data_str == "[DONE]":
|
|
1511
|
+
break
|
|
1512
|
+
|
|
1513
|
+
try:
|
|
1514
|
+
data = json.loads(data_str)
|
|
1515
|
+
if not isinstance(data, dict):
|
|
1516
|
+
continue
|
|
1517
|
+
if current_event and isinstance(data, dict):
|
|
1518
|
+
data = {**data, "_event": current_event}
|
|
1519
|
+
event_type = current_event or data.get("type")
|
|
1520
|
+
response_payload = data.get("response")
|
|
1521
|
+
nested_error = (
|
|
1522
|
+
response_payload.get("error")
|
|
1523
|
+
if isinstance(response_payload, dict) else None
|
|
1524
|
+
)
|
|
1525
|
+
error = data.get("error") or nested_error
|
|
1526
|
+
if error or event_type in {"error", "response.failed"}:
|
|
1527
|
+
raise RuntimeError(str(error or data.get("message") or event_type))
|
|
1528
|
+
yield data
|
|
1529
|
+
|
|
1530
|
+
except json.JSONDecodeError:
|
|
1531
|
+
pass
|
ksadk/cli/cmd_studio.py
CHANGED
|
@@ -211,7 +211,11 @@ def studio(
|
|
|
211
211
|
security_enabled=os.environ.get("KSADK_STUDIO_NO_SECURITY") != "1",
|
|
212
212
|
)
|
|
213
213
|
base_url = f"http://127.0.0.1:{port}/"
|
|
214
|
-
|
|
214
|
+
# The Core UI is the normal Studio host when profile plugins are
|
|
215
|
+
# enabled. Do not rely on a fragment surviving the root 307 redirect:
|
|
216
|
+
# browser implementations may drop it, leaving the page unauthenticated
|
|
217
|
+
# after every local server restart.
|
|
218
|
+
launch_url = f"{base_url}studio-core/#session={session_token}"
|
|
215
219
|
|
|
216
220
|
print_title("启动 AgentKit Local Studio")
|
|
217
221
|
print_kv("工作区", str(root))
|
ksadk/cli/cmd_web.py
CHANGED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"""Invoke platform hosted Agents through their admitted Action surface."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import time
|
|
7
|
+
|
|
8
|
+
import click
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
from ksadk.conversations.message_projection import project_session_messages
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def try_invoke_hosted_once(*, endpoint, api_key, session_id, message, model, insecure):
|
|
15
|
+
"""Return False for ordinary OpenAI servers; never bypass hosted admission."""
|
|
16
|
+
with requests.Session() as transport:
|
|
17
|
+
transport.verify = not insecure
|
|
18
|
+
if api_key:
|
|
19
|
+
transport.headers["Authorization"] = "Bearer " + api_key
|
|
20
|
+
|
|
21
|
+
def action(name, body, *, missing_ok=False, request_timeout=45):
|
|
22
|
+
response = transport.post(
|
|
23
|
+
endpoint.rstrip("/") + "/agentengine/api/v1/" + name,
|
|
24
|
+
json=body, timeout=request_timeout, allow_redirects=False,
|
|
25
|
+
)
|
|
26
|
+
if response.is_redirect:
|
|
27
|
+
raise click.ClickException("Hosted Action redirected; request was not replayed")
|
|
28
|
+
if missing_ok and response.status_code == 404:
|
|
29
|
+
return None
|
|
30
|
+
response.raise_for_status()
|
|
31
|
+
envelope = response.json()
|
|
32
|
+
if missing_ok and envelope.get("Code") == 404:
|
|
33
|
+
return None
|
|
34
|
+
if envelope.get("Code") not in (None, 0):
|
|
35
|
+
raise click.ClickException(str(envelope.get("Message") or "Hosted Action failed"))
|
|
36
|
+
data = envelope.get("Data", envelope)
|
|
37
|
+
if not isinstance(data, dict):
|
|
38
|
+
raise click.ClickException("Hosted Action returned no result")
|
|
39
|
+
return data
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
bootstrap = action("GetAgentUiBootstrap", {}, missing_ok=True)
|
|
43
|
+
except requests.HTTPError as exc:
|
|
44
|
+
if exc.response.status_code in (404, 405):
|
|
45
|
+
return False
|
|
46
|
+
raise click.ClickException("Hosted bootstrap authentication or transport failed") from exc
|
|
47
|
+
if bootstrap is None:
|
|
48
|
+
return False
|
|
49
|
+
agent_id = (bootstrap.get("Agent") or {}).get("AgentId")
|
|
50
|
+
if (not agent_id or not isinstance(bootstrap.get("HostedRuntime"), dict)
|
|
51
|
+
or (bootstrap.get("Capabilities") or {}).get("KernelSessionEvents") is not True):
|
|
52
|
+
return False
|
|
53
|
+
|
|
54
|
+
session_body = {"AgentId": agent_id, "SessionId": session_id}
|
|
55
|
+
session = action("GetSession", session_body, missing_ok=True)
|
|
56
|
+
if session is None:
|
|
57
|
+
session = action("CreateSession", session_body)
|
|
58
|
+
session = session.get("Session", session)
|
|
59
|
+
session_id = session.get("SessionId") or session.get("Id")
|
|
60
|
+
if not session_id:
|
|
61
|
+
raise click.ClickException("CreateSession returned no session identity")
|
|
62
|
+
body = {
|
|
63
|
+
"AgentId": agent_id, "SessionId": session_id,
|
|
64
|
+
"Messages": [{"role": "user", "content": message}],
|
|
65
|
+
"ApiFormat": "chat_completions", "Stream": False, "Background": True,
|
|
66
|
+
}
|
|
67
|
+
if model:
|
|
68
|
+
body["Model"] = model
|
|
69
|
+
receipt = action("RunAgent", body)
|
|
70
|
+
run_id = receipt.get("RunId") or receipt.get("InvocationId")
|
|
71
|
+
command_id, message_id = receipt.get("CommandId"), receipt.get("MessageId")
|
|
72
|
+
if not run_id and not (command_id and message_id):
|
|
73
|
+
raise click.ClickException("Hosted run returned no observable command identity")
|
|
74
|
+
click.echo(f"Session: {session_id}\nCommand: {command_id or run_id}")
|
|
75
|
+
cursor = 0
|
|
76
|
+
cursor_source = None
|
|
77
|
+
history_epoch = None
|
|
78
|
+
claimed_message = None
|
|
79
|
+
events = {}
|
|
80
|
+
submitted = set()
|
|
81
|
+
resolved = set()
|
|
82
|
+
pending = {}
|
|
83
|
+
terminal = None
|
|
84
|
+
deadline = time.monotonic() + 900
|
|
85
|
+
read_interrupted = False
|
|
86
|
+
while (remaining := deadline - time.monotonic()) > 0:
|
|
87
|
+
query = {
|
|
88
|
+
"AgentId": agent_id, "SessionId": session_id,
|
|
89
|
+
"AfterSeqId": cursor, "Limit": 200, "EventOrder": "session_seq",
|
|
90
|
+
}
|
|
91
|
+
if cursor_source:
|
|
92
|
+
query["CursorSource"] = cursor_source
|
|
93
|
+
if history_epoch:
|
|
94
|
+
query["HistoryEpoch"] = history_epoch
|
|
95
|
+
try:
|
|
96
|
+
page = action("ListSessionEvents", query, request_timeout=min(45, remaining))
|
|
97
|
+
except requests.exceptions.SSLError:
|
|
98
|
+
raise
|
|
99
|
+
except (requests.ConnectionError, requests.Timeout):
|
|
100
|
+
# This is an idempotent observation of an already admitted run.
|
|
101
|
+
# Preserve its cursor and original deadline; never replay a run
|
|
102
|
+
# or an interaction whose receipt may have been lost.
|
|
103
|
+
remaining = deadline - time.monotonic()
|
|
104
|
+
if remaining <= 0:
|
|
105
|
+
break
|
|
106
|
+
if not read_interrupted:
|
|
107
|
+
click.echo("Event read interrupted; retrying within the original wait deadline", err=True)
|
|
108
|
+
read_interrupted = True
|
|
109
|
+
time.sleep(min(1, remaining))
|
|
110
|
+
continue
|
|
111
|
+
source = page.get("CursorSource")
|
|
112
|
+
if (page.get("EventOrder") != "session_seq" or source not in ("runtime", "control")
|
|
113
|
+
or type(page.get("HasMore")) is not bool):
|
|
114
|
+
raise click.ClickException(
|
|
115
|
+
"Hosted Runtime does not support forward session event reads; upgrade Runtime. "
|
|
116
|
+
f"Run continues. Session: {session_id}, Command: {command_id}, Run: {run_id}"
|
|
117
|
+
)
|
|
118
|
+
if cursor_source and source != cursor_source:
|
|
119
|
+
raise click.ClickException("Hosted event cursor source changed; inspect the session above")
|
|
120
|
+
page_epoch = page.get("HistoryEpoch")
|
|
121
|
+
if page_epoch is not None and (not isinstance(page_epoch, str) or not page_epoch):
|
|
122
|
+
raise click.ClickException("Hosted Runtime returned an invalid history epoch")
|
|
123
|
+
if cursor_source and page_epoch != history_epoch:
|
|
124
|
+
raise click.ClickException("Hosted history epoch changed; inspect the session above")
|
|
125
|
+
history_epoch = page_epoch
|
|
126
|
+
cursor_source = source
|
|
127
|
+
rows = page.get("Events")
|
|
128
|
+
next_cursor = page.get("NextCursor")
|
|
129
|
+
if (not isinstance(rows, list) or type(next_cursor) is not int
|
|
130
|
+
or any(not isinstance(e, dict) or type(e.get("SeqId")) is not int for e in rows)):
|
|
131
|
+
raise click.ClickException("Hosted Runtime returned an invalid forward event page")
|
|
132
|
+
rows = sorted(rows, key=lambda e: e["SeqId"])
|
|
133
|
+
seqs = [e["SeqId"] for e in rows]
|
|
134
|
+
if (any(seq <= cursor for seq in seqs) or len(set(seqs)) != len(seqs)
|
|
135
|
+
or next_cursor != (seqs[-1] if seqs else cursor)
|
|
136
|
+
or (page["HasMore"] and not rows)):
|
|
137
|
+
raise click.ClickException("Hosted Runtime returned a non-progressing forward event page")
|
|
138
|
+
cursor = next_cursor
|
|
139
|
+
for event in rows:
|
|
140
|
+
content = event.get("Content") or {}
|
|
141
|
+
fact = content.get("runtime_event") or (content.get("session_event") or {}).get("payload") or {}
|
|
142
|
+
kind = event.get("EventType")
|
|
143
|
+
if not run_id:
|
|
144
|
+
if kind == "control.command_rejected" and fact.get("command_id") == command_id:
|
|
145
|
+
raise click.ClickException("Admitted command was rejected by the worker")
|
|
146
|
+
if kind == "control.message_claimed":
|
|
147
|
+
claimed_message = fact.get("message_id")
|
|
148
|
+
# Session worker serializes claim -> pending transition.
|
|
149
|
+
# An accepted enqueue has no RunId until its own message is claimed.
|
|
150
|
+
if (kind == "control.run_transition" and fact.get("state") == "pending"
|
|
151
|
+
and claimed_message == message_id and fact.get("run_id")):
|
|
152
|
+
run_id = fact["run_id"]
|
|
153
|
+
click.echo(f"Run: {run_id}")
|
|
154
|
+
else:
|
|
155
|
+
continue
|
|
156
|
+
if fact.get("run_id", event.get("InvocationId")) != run_id:
|
|
157
|
+
continue
|
|
158
|
+
if not fact.get("parent_scope_id"):
|
|
159
|
+
events[event.get("EventId") or str(event["SeqId"])] = event
|
|
160
|
+
if kind == "interaction.requested":
|
|
161
|
+
pending[(fact.get("interaction_id"), fact.get("revision"))] = fact
|
|
162
|
+
if kind in ("interaction.resolved", "interaction.expired"):
|
|
163
|
+
resolved.add(fact.get("interaction_id"))
|
|
164
|
+
if kind in ("run.completed", "run.failed", "run.canceled") and not fact.get("parent_scope_id"):
|
|
165
|
+
terminal = kind
|
|
166
|
+
# Decisions require the whole available forward window: resolution
|
|
167
|
+
# or the root terminal may be on a later page than the request.
|
|
168
|
+
if page["HasMore"]:
|
|
169
|
+
continue
|
|
170
|
+
for key, fact in pending.items():
|
|
171
|
+
interaction_id = fact.get("interaction_id")
|
|
172
|
+
revision = fact.get("revision")
|
|
173
|
+
if terminal or key in submitted or interaction_id in resolved:
|
|
174
|
+
continue
|
|
175
|
+
request = fact.get("request") or {}
|
|
176
|
+
presentation = request.get("presentation") or {}
|
|
177
|
+
click.echo(presentation.get("title") or "Interaction required")
|
|
178
|
+
click.echo(presentation.get("description") or "")
|
|
179
|
+
if request.get("kind") != "approval" or not interaction_id or not revision:
|
|
180
|
+
raise click.ClickException("Run requires input; continue in Dashboard using the session above")
|
|
181
|
+
try:
|
|
182
|
+
approved = click.confirm("批准并继续?", default=False)
|
|
183
|
+
except click.Abort:
|
|
184
|
+
raise click.ClickException("Run is waiting for approval; continue in Dashboard using the session above") from None
|
|
185
|
+
if time.monotonic() >= deadline:
|
|
186
|
+
break
|
|
187
|
+
decision = "approve" if approved else "reject"
|
|
188
|
+
token = hashlib.sha256(f"{run_id}:{interaction_id}:{revision}:{decision}".encode()).hexdigest()
|
|
189
|
+
action("SubmitInteraction", {
|
|
190
|
+
"AgentId": agent_id, "SessionId": session_id, "RunId": run_id,
|
|
191
|
+
"InteractionId": interaction_id, "ExpectedRevision": revision,
|
|
192
|
+
"InteractionAction": decision, "Response": {"decision": decision},
|
|
193
|
+
"IdempotencyKey": "cli-" + token,
|
|
194
|
+
})
|
|
195
|
+
submitted.add(key)
|
|
196
|
+
if terminal:
|
|
197
|
+
if terminal != "run.completed":
|
|
198
|
+
raise click.ClickException(f"Hosted run ended with {terminal}; Session: {session_id}, Run: {run_id}")
|
|
199
|
+
projected = project_session_messages(list(events.values()))
|
|
200
|
+
answers = [m for m in projected if m.get("Role") == "assistant" and (m.get("Content") or {}).get("text")]
|
|
201
|
+
if not answers:
|
|
202
|
+
raise click.ClickException("Completed run has no text result; inspect the session above")
|
|
203
|
+
click.echo((answers[-1]["Content"] or {})["text"])
|
|
204
|
+
return True
|
|
205
|
+
time.sleep(1)
|
|
206
|
+
raise click.ClickException(f"Waiting timed out; run continues. Session: {session_id}, Command: {command_id}, Run: {run_id}")
|