agentengine-sdk-python 0.8.4__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.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
- agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
- 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/_process.py +83 -0
- ksadk/_str_enum.py +17 -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/a2ui/core.py +3 -3
- ksadk/api/client.py +38 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +121 -118
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +22 -2
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +64 -88
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +69 -17
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -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 -1047
- 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/__init__.py +1 -1
- ksadk/configs/env_registry.py +216 -143
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +134 -0
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +9 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +69 -20
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +51 -155
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +12 -0
- ksadk/conversations/runtime_persistence.py +296 -32
- ksadk/conversations/runtime_preparation.py +98 -13
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- 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/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +46 -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/events/session_event.py +2 -2
- ksadk/harness/__init__.py +18 -0
- ksadk/harness/app.py +11 -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 +230 -0
- 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/capabilities.py +115 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +332 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +153 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +504 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +388 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/context_tuning.py +168 -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/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +57 -0
- ksadk/harness/engine/context_pipeline.py +1351 -0
- ksadk/harness/engine/graph_builder.py +352 -0
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +1049 -0
- ksadk/harness/engine/mcp_disclosure.py +701 -0
- 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 +81 -0
- ksadk/harness/engine/postgres_checkpointer.py +386 -0
- ksadk/harness/engine/run_control_bridge.py +100 -0
- ksadk/harness/engine/run_types.py +98 -0
- ksadk/harness/engine/skill_disclosure.py +275 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +360 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +249 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +498 -0
- ksadk/harness/execution_policy.py +104 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +699 -0
- ksadk/harness/loop/tools.py +907 -0
- ksadk/harness/managed_runtime.py +1044 -0
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +504 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -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 +468 -0
- ksadk/harness/model_provider.py +430 -0
- 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/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +132 -0
- ksadk/harness/public_activity.py +213 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +779 -17
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +773 -0
- ksadk/harness/runtime.py +157 -113
- ksadk/harness/runtime_capabilities.py +228 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +733 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +589 -0
- 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_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +317 -0
- ksadk/harness/spec.py +342 -0
- ksadk/harness/state.py +155 -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/strategies.py +149 -0
- ksadk/harness/subagent.py +263 -0
- 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 +134 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -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/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +9 -2
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +220 -252
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +30 -0
- ksadk/kernel/control.py +180 -29
- ksadk/kernel/execution_grants.py +428 -0
- ksadk/kernel/execution_grants_memory.py +252 -0
- ksadk/kernel/execution_grants_postgres.py +395 -0
- ksadk/kernel/execution_grants_sqlite.py +435 -0
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +139 -226
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +61 -58
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +230 -231
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +166 -16
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +28 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +410 -200
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +104 -5
- 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 +369 -340
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +74 -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/coordinator.py +22 -6
- ksadk/memory/extraction.py +159 -7
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +280 -67
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- 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_policy.py +2 -2
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +14 -9
- ksadk/model_proxy/transform.py +72 -6
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +29 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +417 -185
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +92 -21
- ksadk/plugins/execution_host.py +107 -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-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -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-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +52 -40
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +49 -143
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +413 -52
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +670 -0
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +550 -0
- ksadk/plugins/providers/harness_tools.py +455 -0
- 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/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +540 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- 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/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1480 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +352 -0
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +853 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +519 -0
- ksadk/plugins/teams/task_decisions.py +436 -0
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +96 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- 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 +83 -401
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +220 -350
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +208 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- 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 +134 -129
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +29 -3
- ksadk/runtime/executor.py +105 -7
- ksadk/runtime/factory.py +45 -3
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +160 -21
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +105 -1
- ksadk/sandbox/backends/e2b.py +272 -24
- ksadk/sandbox/backends/local_process.py +73 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +776 -0
- ksadk/sandbox/local_launcher.py +124 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/invocation_identity.py +118 -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/common.py +32 -3
- ksadk/server/routes/control.py +112 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +26 -3
- ksadk/server/routes/misc.py +331 -33
- ksadk/server/routes/models.py +28 -4
- ksadk/server/routes/openai_compat.py +82 -13
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +112 -37
- ksadk/server/routes/sessions.py +493 -358
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +135 -23
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.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-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.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-Bf9D3tzJ.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-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.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-Cp_r9Hb6.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-Dlhc8Wr8.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-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.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-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.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-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.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-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -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/invocation_identity.py +235 -0
- 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/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/loader.py +44 -2
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +400 -56
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/service_client.py +6 -1
- ksadk/skills/tool_defs.py +108 -3
- 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 +784 -419
- 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 +31 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +32 -2
- ksadk/studio/capabilities.py +31 -9
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +113 -387
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +82 -2
- ksadk/studio/codex_agent_service.py +19 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +112 -6
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +260 -202
- ksadk/studio/dsh_application.py +183 -27
- ksadk/studio/dsh_capability_service.py +302 -189
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +53 -5
- ksadk/studio/execution_host.py +598 -0
- ksadk/studio/framework_run.py +50 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +429 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- 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 +1939 -345
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +89 -40
- 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_documents.py +172 -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 +39 -12
- ksadk/studio/plugin_kernel_adapter.py +89 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +832 -99
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +69 -34
- ksadk/studio/resource_catalog.py +14 -12
- ksadk/studio/run_activity.py +848 -0
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +1220 -335
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +73 -11
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +615 -246
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +518 -181
- 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-CkufcPYo.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +166 -0
- ksadk/studio/teams_installation.py +217 -0
- ksadk/studio/teams_node.py +549 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +72 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +496 -0
- ksadk/studio/templates.py +41 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +138 -0
- ksadk/studio/workspace_registry.py +286 -0
- 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 +93 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +344 -326
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_identity.py +15 -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/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +28 -14
- agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
|
@@ -0,0 +1,977 @@
|
|
|
1
|
+
"""Opt-in ExecutionEngine facade projecting the Native ledger.
|
|
2
|
+
|
|
3
|
+
Plain text and explicitly typed user media are supported. Explicit legacy policies are
|
|
4
|
+
rejected; omitted defaults are not applied, with a compile warning. The injected
|
|
5
|
+
RunConfiguration and authenticated host ports own budgets, tools and policy.
|
|
6
|
+
Host ports must enforce authorization/sandboxing, including approval decisions.
|
|
7
|
+
|
|
8
|
+
Streaming delivers committed provisional deltas on opted-in model profiles. Native has
|
|
9
|
+
no wall-clock event timestamps, so projections use timestamp=0 with provenance.
|
|
10
|
+
Approval events are projected from native commits; unimplemented tool begin/end
|
|
11
|
+
events are not fabricated from later snapshots.
|
|
12
|
+
Handles and event cursors can be restored with matching scope/config/spec pins.
|
|
13
|
+
An interrupted external effect without a receipt remains uncertain after attach.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
import warnings
|
|
20
|
+
from collections.abc import Awaitable, Callable
|
|
21
|
+
from typing import AsyncIterator
|
|
22
|
+
from uuid import uuid4
|
|
23
|
+
|
|
24
|
+
from ksadk.harness.engine.base import (
|
|
25
|
+
CompiledHarness,
|
|
26
|
+
EngineCapability,
|
|
27
|
+
EngineCapabilityMatrix,
|
|
28
|
+
ExecutionEngineError,
|
|
29
|
+
ExecutionPlan,
|
|
30
|
+
)
|
|
31
|
+
from ksadk.harness.events import EventType, RuntimeEvent
|
|
32
|
+
from ksadk.harness.native.activation_contract import ActivationResourceRef
|
|
33
|
+
from ksadk.harness.native.child_lifecycle import ChildLifecyclePort
|
|
34
|
+
from ksadk.harness.native.completion import TaskContract
|
|
35
|
+
from ksadk.harness.native.context_contributions import ContextPort
|
|
36
|
+
from ksadk.harness.native.context_runtime import ContextPlanner
|
|
37
|
+
from ksadk.harness.native.engine import NativeKernel
|
|
38
|
+
from ksadk.harness.native.hook_runtime_contract import HookPort
|
|
39
|
+
from ksadk.harness.native.model_takeover import ModelTakeoverCapability
|
|
40
|
+
from ksadk.harness.native.ports import (
|
|
41
|
+
ArtifactPort,
|
|
42
|
+
BrowserRecoveryPort,
|
|
43
|
+
ModelPort,
|
|
44
|
+
RunConfiguration,
|
|
45
|
+
ToolPort,
|
|
46
|
+
VerificationPort,
|
|
47
|
+
WorkspacePort,
|
|
48
|
+
)
|
|
49
|
+
from ksadk.harness.native.restore_contract import SNAPSHOT_READER_VERSION
|
|
50
|
+
from ksadk.harness.native.state import NativeEvent, RunCommand, RunPhase, RunScope, RunSnapshot
|
|
51
|
+
from ksadk.harness.native.user_document_capture import capture_user_documents
|
|
52
|
+
from ksadk.harness.native.user_input import NativeUserInput, native_input_goal
|
|
53
|
+
from ksadk.harness.native_driver_failure import NativeDriverFailure, driver_failure
|
|
54
|
+
from ksadk.harness.spec import HARNESS_VERSION, SCHEMA_VERSION, HarnessSpec
|
|
55
|
+
from ksadk.harness.state import (
|
|
56
|
+
ApprovalRequest,
|
|
57
|
+
CapabilitySnapshot,
|
|
58
|
+
HarnessState,
|
|
59
|
+
Message,
|
|
60
|
+
RunStatus,
|
|
61
|
+
ToolCall,
|
|
62
|
+
WorkingContext,
|
|
63
|
+
)
|
|
64
|
+
from ksadk.harness.stores.native_contract import RestoreAuditStore, RunStore, StoreConflict
|
|
65
|
+
from ksadk.runtime import (
|
|
66
|
+
CancelResult,
|
|
67
|
+
PauseResult,
|
|
68
|
+
ResumePayload,
|
|
69
|
+
ResumeTarget,
|
|
70
|
+
RunHandle,
|
|
71
|
+
StartRequest,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
_LEGACY_POLICIES = {
|
|
75
|
+
"context_policy",
|
|
76
|
+
"memory_policy",
|
|
77
|
+
"capabilities",
|
|
78
|
+
"approval_policy",
|
|
79
|
+
"sandbox_policy",
|
|
80
|
+
"observability_policy",
|
|
81
|
+
}
|
|
82
|
+
_TERMINALS = {
|
|
83
|
+
"run.completed": EventType.RUN_COMPLETED,
|
|
84
|
+
"run.failed": EventType.RUN_FAILED,
|
|
85
|
+
"run.canceled": EventType.RUN_CANCELED,
|
|
86
|
+
"run.interrupted": EventType.RUN_INTERRUPTED,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
_SAME_TURN_MODEL_RESPONSES = frozenset(
|
|
90
|
+
{
|
|
91
|
+
"provider_retryable_error",
|
|
92
|
+
"empty_response",
|
|
93
|
+
"malformed_tool_call",
|
|
94
|
+
"output_limit",
|
|
95
|
+
"context_overflow",
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _logical_turn_count(events: tuple[NativeEvent, ...]) -> int:
|
|
101
|
+
"""Project logical model turns without counting transport retries or summaries.
|
|
102
|
+
|
|
103
|
+
A model attempt belongs to the previous turn while it is recovering from
|
|
104
|
+
an incomplete/failed response or continuing truncated output. An accepted
|
|
105
|
+
tool batch or final answer closes that turn. Legacy ledgers lack
|
|
106
|
+
``model_purpose``; their adjacent compaction event identifies summaries.
|
|
107
|
+
"""
|
|
108
|
+
turns = 0
|
|
109
|
+
continuing = False
|
|
110
|
+
for index, event in enumerate(events):
|
|
111
|
+
if event.kind != "effect.received" or event.payload.get("kind") != "model":
|
|
112
|
+
continue
|
|
113
|
+
if event.payload.get("model_purpose") == "compaction" or (
|
|
114
|
+
"model_purpose" not in event.payload
|
|
115
|
+
and index + 1 < len(events)
|
|
116
|
+
and events[index + 1].kind.startswith("context.compaction_")
|
|
117
|
+
):
|
|
118
|
+
continue
|
|
119
|
+
response_kind = event.payload.get("model_response_kind")
|
|
120
|
+
if not isinstance(response_kind, str):
|
|
121
|
+
# A joined timeout has no sealed result, but still consumed one
|
|
122
|
+
# attempt in the same logical turn as its eventual recovery.
|
|
123
|
+
response_kind = "provider_retryable_error"
|
|
124
|
+
if not continuing:
|
|
125
|
+
turns += 1
|
|
126
|
+
continuing = response_kind in _SAME_TURN_MODEL_RESPONSES
|
|
127
|
+
return min(turns, 1024)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class NativeHarnessEngine:
|
|
131
|
+
"""ExecutionEngine facade for one host-authorized scope/configuration.
|
|
132
|
+
|
|
133
|
+
Spec model references must be ``model-profile://<profile_id>@<version>``;
|
|
134
|
+
inline instructions must exactly match RunConfiguration.instructions.
|
|
135
|
+
Start metadata/config, history, attachments and model overrides are not
|
|
136
|
+
accepted. Use a separate explicitly configured engine for another model.
|
|
137
|
+
``close`` closes a run, not the externally owned shared Store or ports.
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
def __init__(
|
|
141
|
+
self,
|
|
142
|
+
*,
|
|
143
|
+
scope: RunScope,
|
|
144
|
+
configuration: RunConfiguration,
|
|
145
|
+
model: ModelPort,
|
|
146
|
+
store: RunStore,
|
|
147
|
+
tools: ToolPort | None = None,
|
|
148
|
+
verifier: VerificationPort | None = None,
|
|
149
|
+
workspace: WorkspacePort | None = None,
|
|
150
|
+
artifacts: ArtifactPort | None = None,
|
|
151
|
+
context_planner: ContextPlanner | None = None,
|
|
152
|
+
context_port: ContextPort | None = None,
|
|
153
|
+
hook_port: HookPort | None = None,
|
|
154
|
+
child_lifecycle_port: ChildLifecyclePort | None = None,
|
|
155
|
+
workspace_revision: str = "unavailable",
|
|
156
|
+
lease_ttl_seconds: float | None = None,
|
|
157
|
+
browser_recovery: BrowserRecoveryPort | None = None,
|
|
158
|
+
activation_resource: ActivationResourceRef | None = None,
|
|
159
|
+
activation_available: Callable[[], Awaitable[bool]] | None = None,
|
|
160
|
+
model_recovery_capability: ModelTakeoverCapability | None = None,
|
|
161
|
+
) -> None:
|
|
162
|
+
if configuration.tools and tools is None:
|
|
163
|
+
raise ExecutionEngineError("configured native tools require a host ToolPort")
|
|
164
|
+
if activation_resource is not None and activation_available is None:
|
|
165
|
+
raise ExecutionEngineError("activation availability probe required")
|
|
166
|
+
self._kernel = NativeKernel(
|
|
167
|
+
scope=scope,
|
|
168
|
+
configuration=configuration,
|
|
169
|
+
model=model,
|
|
170
|
+
tools=tools,
|
|
171
|
+
verifier=verifier,
|
|
172
|
+
workspace=workspace,
|
|
173
|
+
artifacts=artifacts,
|
|
174
|
+
store=store,
|
|
175
|
+
context_planner=context_planner,
|
|
176
|
+
context_port=context_port,
|
|
177
|
+
hook_port=hook_port,
|
|
178
|
+
child_lifecycle_port=child_lifecycle_port,
|
|
179
|
+
workspace_revision=workspace_revision,
|
|
180
|
+
lease_ttl_seconds=lease_ttl_seconds,
|
|
181
|
+
activation_resource=activation_resource,
|
|
182
|
+
model_recovery_capability=model_recovery_capability,
|
|
183
|
+
)
|
|
184
|
+
self._compiled: dict[int, tuple[CompiledHarness, str]] = {}
|
|
185
|
+
self._browser_recovery = browser_recovery
|
|
186
|
+
self._activation_resource = activation_resource
|
|
187
|
+
self._activation_available = activation_available
|
|
188
|
+
self._handles: dict[str, RunHandle] = {}
|
|
189
|
+
self._drivers: dict[str, asyncio.Task[None]] = {}
|
|
190
|
+
self._ownership: dict[str, tuple[asyncio.Event, asyncio.Task[None]]] = {}
|
|
191
|
+
self._public_output_sinks: dict[str, object] = {}
|
|
192
|
+
self._releases: dict[str, asyncio.Task[None]] = {}
|
|
193
|
+
self._changed: dict[str, asyncio.Event] = {}
|
|
194
|
+
self._cursors: dict[str, int] = {}
|
|
195
|
+
self._streaming: set[str] = set()
|
|
196
|
+
self._closed: set[str] = set()
|
|
197
|
+
self._fork_observers: set[str] = set()
|
|
198
|
+
self._warned = False
|
|
199
|
+
|
|
200
|
+
@property
|
|
201
|
+
def _profile_ref(self) -> str:
|
|
202
|
+
profile = self._kernel.configuration.profile
|
|
203
|
+
return f"model-profile://{profile.profile_id}@{profile.profile_version}"
|
|
204
|
+
|
|
205
|
+
async def compile(self, spec: HarnessSpec) -> CompiledHarness:
|
|
206
|
+
self._validate_spec(spec)
|
|
207
|
+
if not self._warned:
|
|
208
|
+
warnings.warn(
|
|
209
|
+
"Native experimental engine uses the injected RunConfiguration and host policy "
|
|
210
|
+
"ports; legacy defaults are not applied",
|
|
211
|
+
UserWarning,
|
|
212
|
+
stacklevel=2,
|
|
213
|
+
)
|
|
214
|
+
self._warned = True
|
|
215
|
+
plan = ExecutionPlan(
|
|
216
|
+
strategy_kind="single-agent",
|
|
217
|
+
nodes=("prepare_context", "request_model", "execute_tools", "verify", "final"),
|
|
218
|
+
edges=(
|
|
219
|
+
("prepare_context", "request_model"),
|
|
220
|
+
("request_model", "execute_tools"),
|
|
221
|
+
("execute_tools", "prepare_context"),
|
|
222
|
+
("request_model", "verify"),
|
|
223
|
+
("verify", "prepare_context"),
|
|
224
|
+
("verify", "final"),
|
|
225
|
+
),
|
|
226
|
+
)
|
|
227
|
+
result = CompiledHarness(spec=spec.model_copy(deep=True), plan=plan, engine_kind="native")
|
|
228
|
+
self._compiled[id(result)] = (result, result.spec.content_hash())
|
|
229
|
+
return result
|
|
230
|
+
|
|
231
|
+
def _validate_spec(self, spec: HarnessSpec) -> None:
|
|
232
|
+
explicit = _LEGACY_POLICIES.intersection(spec.model_fields_set)
|
|
233
|
+
if explicit:
|
|
234
|
+
raise ExecutionEngineError(
|
|
235
|
+
"unsupported explicit native policies: " + ", ".join(sorted(explicit))
|
|
236
|
+
)
|
|
237
|
+
if spec.schema_version != SCHEMA_VERSION or spec.harness_version != HARNESS_VERSION:
|
|
238
|
+
raise ExecutionEngineError("unsupported HarnessSpec version")
|
|
239
|
+
if spec.execution_strategy.kind != "single-agent" or spec.execution_strategy.config:
|
|
240
|
+
raise ExecutionEngineError(
|
|
241
|
+
"native facade supports only the single-agent strategy without config"
|
|
242
|
+
)
|
|
243
|
+
if spec.sub_agents:
|
|
244
|
+
raise ExecutionEngineError("native sub_agents are unsupported")
|
|
245
|
+
model = spec.model
|
|
246
|
+
if model.profile_ref != self._profile_ref:
|
|
247
|
+
raise ExecutionEngineError(
|
|
248
|
+
"spec model profile must match the injected profile ID and version"
|
|
249
|
+
)
|
|
250
|
+
if model.temperature is not None or model.fallback_profile_refs:
|
|
251
|
+
raise ExecutionEngineError("native temperature and fallback profiles are unsupported")
|
|
252
|
+
if "provider_policy" in model.model_fields_set:
|
|
253
|
+
raise ExecutionEngineError("explicit legacy provider_policy is unsupported")
|
|
254
|
+
if model.max_output_tokens not in {
|
|
255
|
+
None,
|
|
256
|
+
self._kernel.configuration.profile.max_output_tokens,
|
|
257
|
+
}:
|
|
258
|
+
raise ExecutionEngineError(
|
|
259
|
+
"spec max_output_tokens conflicts with the pinned ModelProfile"
|
|
260
|
+
)
|
|
261
|
+
if (
|
|
262
|
+
spec.prompt.instructions_ref
|
|
263
|
+
or spec.prompt.instructions != self._kernel.configuration.instructions
|
|
264
|
+
):
|
|
265
|
+
raise ExecutionEngineError(
|
|
266
|
+
"native spec requires inline instructions matching RunConfiguration"
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
async def start(
|
|
270
|
+
self,
|
|
271
|
+
request: StartRequest,
|
|
272
|
+
compiled: CompiledHarness,
|
|
273
|
+
*,
|
|
274
|
+
task_contract: TaskContract | None = None,
|
|
275
|
+
expected_parent_run_id: str | None = None,
|
|
276
|
+
pin_parent: bool = False,
|
|
277
|
+
) -> RunHandle:
|
|
278
|
+
pinned = self.validate_start_request(request, compiled)
|
|
279
|
+
await self._check_activation_available()
|
|
280
|
+
run_id = None
|
|
281
|
+
user_input = request.input if isinstance(request.input, NativeUserInput) else None
|
|
282
|
+
if user_input is not None and any(
|
|
283
|
+
doc.full_text is not None for doc in user_input.documents
|
|
284
|
+
):
|
|
285
|
+
if not any(tool.read_only and tool.context_role == "artifact_read"
|
|
286
|
+
for tool in self._kernel.configuration.tools):
|
|
287
|
+
raise ExecutionEngineError("native_user_document_reader_unavailable")
|
|
288
|
+
run_id = str(uuid4())
|
|
289
|
+
user_input = await capture_user_documents(
|
|
290
|
+
user_input, artifacts=self._kernel.artifacts,
|
|
291
|
+
scope=self._kernel.scope, run_id=run_id,
|
|
292
|
+
)
|
|
293
|
+
await self._check_activation_available()
|
|
294
|
+
snapshot = self._kernel.start(
|
|
295
|
+
run_id=run_id,
|
|
296
|
+
goal=native_input_goal(request.input),
|
|
297
|
+
session_id=request.session_id,
|
|
298
|
+
origin={
|
|
299
|
+
"spec_digest": pinned[1],
|
|
300
|
+
"agent_revision_ref": compiled.spec.agent_revision_ref,
|
|
301
|
+
},
|
|
302
|
+
task_contract=task_contract,
|
|
303
|
+
expected_parent_run_id=expected_parent_run_id,
|
|
304
|
+
pin_parent=pin_parent,
|
|
305
|
+
user_input=user_input,
|
|
306
|
+
)
|
|
307
|
+
return self._register_started_run(snapshot, compiled, pinned[1])
|
|
308
|
+
|
|
309
|
+
async def fork(
|
|
310
|
+
self,
|
|
311
|
+
request: StartRequest,
|
|
312
|
+
compiled: CompiledHarness,
|
|
313
|
+
*,
|
|
314
|
+
source_run_id: str,
|
|
315
|
+
expected_source_revision: int,
|
|
316
|
+
command_id: str | None = None,
|
|
317
|
+
task_contract: TaskContract | None = None,
|
|
318
|
+
) -> RunHandle:
|
|
319
|
+
"""Explicit Native branch, with the same destination authority as start.
|
|
320
|
+
|
|
321
|
+
This is a Native extension, not a new capability on every ExecutionEngine.
|
|
322
|
+
The host chooses a new session and recompiles its current task contract.
|
|
323
|
+
Neither request metadata nor an old specification grants execution rights.
|
|
324
|
+
A stable command_id deduplicates retries. An existing local handle keeps
|
|
325
|
+
its driver and cursor; a duplicate on another facade is observation only.
|
|
326
|
+
"""
|
|
327
|
+
pinned = self.validate_start_request(request, compiled)
|
|
328
|
+
if not isinstance(request.input, str):
|
|
329
|
+
raise ExecutionEngineError("native fork input requires plain text")
|
|
330
|
+
await self._check_activation_available()
|
|
331
|
+
result = self._kernel.fork(
|
|
332
|
+
source_run_id=source_run_id,
|
|
333
|
+
expected_source_revision=expected_source_revision,
|
|
334
|
+
command_id=command_id,
|
|
335
|
+
goal=request.input,
|
|
336
|
+
session_id=request.session_id,
|
|
337
|
+
origin={
|
|
338
|
+
"spec_digest": pinned[1],
|
|
339
|
+
"agent_revision_ref": compiled.spec.agent_revision_ref,
|
|
340
|
+
},
|
|
341
|
+
task_contract=task_contract,
|
|
342
|
+
)
|
|
343
|
+
snapshot = result.snapshot
|
|
344
|
+
if not result.created:
|
|
345
|
+
existing = self._handles.get(snapshot.run_id)
|
|
346
|
+
if existing is not None:
|
|
347
|
+
return existing.model_copy(deep=True)
|
|
348
|
+
self._fork_observers.add(snapshot.run_id)
|
|
349
|
+
return self._register_started_run(snapshot, compiled, pinned[1], drive=False)
|
|
350
|
+
return self._register_started_run(snapshot, compiled, pinned[1])
|
|
351
|
+
|
|
352
|
+
async def _check_activation_available(self) -> None:
|
|
353
|
+
if self._activation_resource is not None:
|
|
354
|
+
try:
|
|
355
|
+
live = await self._activation_available()
|
|
356
|
+
except Exception:
|
|
357
|
+
raise ExecutionEngineError("activation resource unavailable") from None
|
|
358
|
+
if live is not True:
|
|
359
|
+
raise ExecutionEngineError("activation resource unavailable")
|
|
360
|
+
|
|
361
|
+
def _register_started_run(
|
|
362
|
+
self, snapshot: RunSnapshot, compiled: CompiledHarness, spec_digest: str,
|
|
363
|
+
*, drive: bool = True,
|
|
364
|
+
) -> RunHandle:
|
|
365
|
+
handle = RunHandle(
|
|
366
|
+
run_id=snapshot.run_id,
|
|
367
|
+
session_id=snapshot.session_id,
|
|
368
|
+
runtime_type="managed-native",
|
|
369
|
+
native_ref={
|
|
370
|
+
"configuration_digest": snapshot.configuration_digest,
|
|
371
|
+
"spec_digest": spec_digest,
|
|
372
|
+
"agent_revision_ref": compiled.spec.agent_revision_ref,
|
|
373
|
+
},
|
|
374
|
+
)
|
|
375
|
+
self._handles[handle.run_id] = handle.model_copy(deep=True)
|
|
376
|
+
self._cursors[handle.run_id] = 0
|
|
377
|
+
self._changed[handle.run_id] = asyncio.Event()
|
|
378
|
+
if drive:
|
|
379
|
+
self._ensure_driver(handle.run_id)
|
|
380
|
+
return handle
|
|
381
|
+
|
|
382
|
+
def validate_start_request(
|
|
383
|
+
self, request: StartRequest, compiled: CompiledHarness
|
|
384
|
+
) -> tuple[CompiledHarness, str]:
|
|
385
|
+
"""Check the pinned plan and request before host-owned contract compilation."""
|
|
386
|
+
pinned = self._compiled.get(id(compiled))
|
|
387
|
+
if pinned is None or pinned[0] is not compiled or pinned[1] != compiled.spec.content_hash():
|
|
388
|
+
raise ExecutionEngineError("compiled plan is foreign or changed since compilation")
|
|
389
|
+
scope = self._kernel.scope
|
|
390
|
+
if request.user_id != scope.user_id or request.agent_id not in {None, scope.agent_id}:
|
|
391
|
+
raise ExecutionEngineError("start identity does not match the host-authorized scope")
|
|
392
|
+
if request.metadata or request.config:
|
|
393
|
+
raise ExecutionEngineError(
|
|
394
|
+
"native start metadata/config are unsupported; scope comes from the host"
|
|
395
|
+
)
|
|
396
|
+
if request.model not in {None, self._profile_ref}:
|
|
397
|
+
raise ExecutionEngineError("per-request model switching is unsupported")
|
|
398
|
+
if isinstance(request.input, NativeUserInput):
|
|
399
|
+
try:
|
|
400
|
+
NativeUserInput.model_validate(request.input).check_profile(
|
|
401
|
+
self._kernel.configuration.profile
|
|
402
|
+
)
|
|
403
|
+
except ValueError as exc:
|
|
404
|
+
reason = ("native_user_image_input_unsupported" if str(exc)
|
|
405
|
+
== "native_user_image_input_unsupported" else "native_user_input_invalid")
|
|
406
|
+
raise ExecutionEngineError(reason) from None
|
|
407
|
+
elif (not isinstance(request.input, str) or not request.input.strip()
|
|
408
|
+
or len(request.input) > 1_048_576):
|
|
409
|
+
raise ExecutionEngineError(
|
|
410
|
+
"native input must be nonempty plain text within the message limit"
|
|
411
|
+
)
|
|
412
|
+
if not request.session_id.strip() or len(request.session_id) > 160:
|
|
413
|
+
raise ExecutionEngineError(
|
|
414
|
+
"native session_id must be nonempty and at most 160 characters"
|
|
415
|
+
)
|
|
416
|
+
return pinned
|
|
417
|
+
|
|
418
|
+
async def attach(
|
|
419
|
+
self, run_id: str, compiled: CompiledHarness, *, after_seq: int = 0, drive: bool = True
|
|
420
|
+
) -> RunHandle:
|
|
421
|
+
"""Restore from committed facts; never deserialize a foreign checkpoint.
|
|
422
|
+
|
|
423
|
+
A running effect with no receipt is surfaced as uncertain by the kernel.
|
|
424
|
+
Restoring a handle is not a claim that its external resources survived.
|
|
425
|
+
"""
|
|
426
|
+
pinned = self._compiled.get(id(compiled))
|
|
427
|
+
if pinned is None or pinned[0] is not compiled or pinned[1] != compiled.spec.content_hash():
|
|
428
|
+
raise ExecutionEngineError("compiled plan is foreign or changed since compilation")
|
|
429
|
+
snapshot = self._kernel.snapshot(run_id)
|
|
430
|
+
if snapshot.origin != {
|
|
431
|
+
"spec_digest": pinned[1],
|
|
432
|
+
"agent_revision_ref": compiled.spec.agent_revision_ref,
|
|
433
|
+
}:
|
|
434
|
+
raise ExecutionEngineError("persisted run specification binding mismatch")
|
|
435
|
+
if type(after_seq) is not int or not 0 <= after_seq <= snapshot.event_seq:
|
|
436
|
+
raise ExecutionEngineError("event cursor must address committed history")
|
|
437
|
+
if run_id in self._handles:
|
|
438
|
+
raise ExecutionEngineError("run already attached to this facade")
|
|
439
|
+
handle = RunHandle(
|
|
440
|
+
run_id=run_id,
|
|
441
|
+
session_id=snapshot.session_id,
|
|
442
|
+
runtime_type="managed-native",
|
|
443
|
+
native_ref={"configuration_digest": snapshot.configuration_digest, **snapshot.origin},
|
|
444
|
+
)
|
|
445
|
+
if drive and not snapshot.phase.terminal:
|
|
446
|
+
# Lease admission must happen before caching the facade handle.
|
|
447
|
+
# A busy owner leaves this adapter retryable after expiry.
|
|
448
|
+
self._kernel.attach(run_id)
|
|
449
|
+
try:
|
|
450
|
+
self._audit_restore(snapshot, self._kernel.fencing_token(run_id))
|
|
451
|
+
await self._kernel.recover_activation_resources(
|
|
452
|
+
run_id, self._activation_resource, self._activation_available
|
|
453
|
+
)
|
|
454
|
+
await self._kernel.recover_browser_resources(run_id, self._browser_recovery)
|
|
455
|
+
except BaseException:
|
|
456
|
+
self._kernel.release(run_id)
|
|
457
|
+
raise
|
|
458
|
+
else:
|
|
459
|
+
self._audit_restore(snapshot, None)
|
|
460
|
+
self._handles[run_id] = handle.model_copy(deep=True)
|
|
461
|
+
self._cursors[run_id] = after_seq
|
|
462
|
+
self._changed[run_id] = asyncio.Event()
|
|
463
|
+
if drive and not snapshot.phase.terminal:
|
|
464
|
+
self._ensure_driver(run_id)
|
|
465
|
+
return handle
|
|
466
|
+
|
|
467
|
+
def _audit_restore(self, snapshot: RunSnapshot, fence: int | None) -> None:
|
|
468
|
+
store = self._kernel.store
|
|
469
|
+
if isinstance(store, RestoreAuditStore):
|
|
470
|
+
store.record_restore(
|
|
471
|
+
snapshot.scope,
|
|
472
|
+
snapshot.run_id,
|
|
473
|
+
reader_version=SNAPSHOT_READER_VERSION,
|
|
474
|
+
configuration_digest=snapshot.configuration_digest,
|
|
475
|
+
fencing_token=fence,
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
async def steer(
|
|
479
|
+
self,
|
|
480
|
+
handle: RunHandle,
|
|
481
|
+
*,
|
|
482
|
+
text: str,
|
|
483
|
+
command_id: str,
|
|
484
|
+
expected_goal_revision: int,
|
|
485
|
+
task_contract: TaskContract | None = None,
|
|
486
|
+
):
|
|
487
|
+
self._check_control(handle)
|
|
488
|
+
receipt = self._kernel.steer(
|
|
489
|
+
handle.run_id,
|
|
490
|
+
text=text,
|
|
491
|
+
command_id=command_id,
|
|
492
|
+
expected_goal_revision=expected_goal_revision,
|
|
493
|
+
task_contract=task_contract,
|
|
494
|
+
)
|
|
495
|
+
if receipt.status != "rejected":
|
|
496
|
+
self._ensure_driver(handle.run_id)
|
|
497
|
+
return receipt
|
|
498
|
+
|
|
499
|
+
def reserved_goal_revision(self, handle: RunHandle) -> int:
|
|
500
|
+
self._check(handle)
|
|
501
|
+
return self._kernel.reserved_goal_revision(handle.run_id)
|
|
502
|
+
|
|
503
|
+
async def child_tasks(self, handle: RunHandle) -> tuple[dict, ...]:
|
|
504
|
+
self._check(handle)
|
|
505
|
+
return self._kernel.child_tasks(handle.run_id)
|
|
506
|
+
|
|
507
|
+
async def child_execution_view(self, handle: RunHandle, child_run_id: str) -> dict:
|
|
508
|
+
self._check(handle)
|
|
509
|
+
return self._kernel.child_execution_view(handle.run_id, child_run_id)
|
|
510
|
+
|
|
511
|
+
async def cancel_child(self, handle: RunHandle, *, child_run_id: str, command_id: str):
|
|
512
|
+
self._check_control(handle)
|
|
513
|
+
try:
|
|
514
|
+
receipt = self._kernel.cancel_child(handle.run_id, child_run_id=child_run_id,
|
|
515
|
+
command_id=command_id)
|
|
516
|
+
except StoreConflict as exc:
|
|
517
|
+
raise ValueError("child_cancellation_command_conflict") from exc
|
|
518
|
+
if receipt.status != "rejected":
|
|
519
|
+
self._ensure_driver(handle.run_id)
|
|
520
|
+
return receipt
|
|
521
|
+
|
|
522
|
+
async def promote_child(self, handle: RunHandle, *, child_run_id: str, command_id: str):
|
|
523
|
+
self._check_control(handle)
|
|
524
|
+
receipt = self._kernel.promote_child(handle.run_id, child_run_id=child_run_id,
|
|
525
|
+
command_id=command_id)
|
|
526
|
+
if receipt.status != "rejected":
|
|
527
|
+
self._ensure_driver(handle.run_id)
|
|
528
|
+
return receipt
|
|
529
|
+
|
|
530
|
+
async def send_child_input(self, handle: RunHandle, *, child_run_id: str, text: str,
|
|
531
|
+
command_id: str, expected_goal_revision: int):
|
|
532
|
+
self._check_control(handle)
|
|
533
|
+
try:
|
|
534
|
+
receipt = self._kernel.send_child_input(
|
|
535
|
+
handle.run_id, child_run_id=child_run_id, text=text,
|
|
536
|
+
command_id=command_id, expected_goal_revision=expected_goal_revision,
|
|
537
|
+
)
|
|
538
|
+
except StoreConflict as exc:
|
|
539
|
+
raise ValueError("child_input_command_conflict") from exc
|
|
540
|
+
if receipt.status != "rejected":
|
|
541
|
+
self._ensure_driver(handle.run_id)
|
|
542
|
+
return receipt
|
|
543
|
+
|
|
544
|
+
async def guide(self, handle: RunHandle, *, text: str, command_id: str,
|
|
545
|
+
expected_goal_revision: int):
|
|
546
|
+
self._check_control(handle)
|
|
547
|
+
receipt = self._kernel.guide(handle.run_id, text=text, command_id=command_id,
|
|
548
|
+
expected_goal_revision=expected_goal_revision)
|
|
549
|
+
if receipt.status != "rejected":
|
|
550
|
+
self._ensure_driver(handle.run_id)
|
|
551
|
+
return receipt
|
|
552
|
+
|
|
553
|
+
def _check(self, handle: RunHandle) -> RunSnapshot:
|
|
554
|
+
if self._handles.get(handle.run_id) != handle:
|
|
555
|
+
raise ExecutionEngineError("unknown or altered native handle for this engine instance")
|
|
556
|
+
return self._kernel.snapshot(handle.run_id)
|
|
557
|
+
|
|
558
|
+
def _check_control(self, handle: RunHandle) -> RunSnapshot:
|
|
559
|
+
snapshot = self._check(handle)
|
|
560
|
+
if handle.run_id in self._fork_observers:
|
|
561
|
+
raise ExecutionEngineError(
|
|
562
|
+
"duplicate fork handle permits observation only; "
|
|
563
|
+
"explicitly attach with a new facade to drive"
|
|
564
|
+
)
|
|
565
|
+
if handle.run_id in self._closed:
|
|
566
|
+
raise ExecutionEngineError(
|
|
567
|
+
"closed native handle permits observation only; "
|
|
568
|
+
"explicitly attach with a new facade to drive"
|
|
569
|
+
)
|
|
570
|
+
if handle.run_id in self._releases:
|
|
571
|
+
raise ExecutionEngineError(
|
|
572
|
+
"closing native handle permits observation only; "
|
|
573
|
+
"await its release before attaching with a new facade"
|
|
574
|
+
)
|
|
575
|
+
if (ownership := self._ownership.get(handle.run_id)) and ownership[1].done():
|
|
576
|
+
self._driver_result(ownership[1])
|
|
577
|
+
return snapshot
|
|
578
|
+
|
|
579
|
+
def _ensure_driver(self, run_id: str) -> None:
|
|
580
|
+
ownership = self._ownership.get(run_id)
|
|
581
|
+
if ownership is not None and ownership[1].done():
|
|
582
|
+
self._driver_result(ownership[1])
|
|
583
|
+
self._kernel.attach(run_id)
|
|
584
|
+
previous = self._drivers.get(run_id)
|
|
585
|
+
if previous is None or previous.done():
|
|
586
|
+
if (ownership is None and self._kernel.leased_ownership
|
|
587
|
+
and not self._kernel.snapshot(run_id).phase.terminal):
|
|
588
|
+
released = asyncio.Event()
|
|
589
|
+
keeper = asyncio.create_task(self._retain_ownership(run_id, released))
|
|
590
|
+
keeper.add_done_callback(
|
|
591
|
+
lambda completed: completed.exception() if not completed.cancelled() else None
|
|
592
|
+
)
|
|
593
|
+
self._ownership[run_id] = (released, keeper)
|
|
594
|
+
from ksadk.harness.public_output import current_public_output_sink, public_output_scope
|
|
595
|
+
|
|
596
|
+
sink = current_public_output_sink()
|
|
597
|
+
if sink is not None:
|
|
598
|
+
self._public_output_sinks[run_id] = sink
|
|
599
|
+
with public_output_scope(self._public_output_sinks.get(run_id)):
|
|
600
|
+
task = asyncio.create_task(self._drive(run_id))
|
|
601
|
+
# Retrieve exceptions even if a client disconnects; stream/control
|
|
602
|
+
# still observes task.result(), and native facts are never replaced.
|
|
603
|
+
task.add_done_callback(
|
|
604
|
+
lambda completed: completed.exception() if not completed.cancelled() else None
|
|
605
|
+
)
|
|
606
|
+
self._drivers[run_id] = task
|
|
607
|
+
|
|
608
|
+
async def _retain_ownership(self, run_id: str, released: asyncio.Event) -> None:
|
|
609
|
+
try:
|
|
610
|
+
await self._kernel.retain_ownership(run_id, released)
|
|
611
|
+
except Exception as error:
|
|
612
|
+
raise driver_failure(error, snapshot=self._kernel.snapshot(run_id)) from None
|
|
613
|
+
finally:
|
|
614
|
+
self._changed[run_id].set()
|
|
615
|
+
|
|
616
|
+
async def _drive(self, run_id: str) -> None:
|
|
617
|
+
terminal = False
|
|
618
|
+
try:
|
|
619
|
+
while True:
|
|
620
|
+
before = self._kernel.snapshot(run_id)
|
|
621
|
+
after = await self._kernel.advance(run_id)
|
|
622
|
+
self._changed[run_id].set()
|
|
623
|
+
terminal = after.phase.terminal
|
|
624
|
+
if after.phase.terminal or after.revision == before.revision:
|
|
625
|
+
return
|
|
626
|
+
await asyncio.sleep(0)
|
|
627
|
+
except Exception as error:
|
|
628
|
+
# Observe committed facts only. A lost fence or failed Store write
|
|
629
|
+
# cannot authorize this host driver to manufacture a terminal.
|
|
630
|
+
snapshot, effect_kind = None, None
|
|
631
|
+
try:
|
|
632
|
+
snapshot = self._kernel.snapshot(run_id)
|
|
633
|
+
if snapshot.pending_intent is not None:
|
|
634
|
+
intent = self._kernel.store.get_intent(
|
|
635
|
+
snapshot.scope, run_id, snapshot.pending_intent
|
|
636
|
+
)
|
|
637
|
+
effect_kind = intent.kind if intent is not None else None
|
|
638
|
+
except Exception:
|
|
639
|
+
pass
|
|
640
|
+
if ownership := self._ownership.get(run_id):
|
|
641
|
+
ownership[0].set()
|
|
642
|
+
raise driver_failure(error, snapshot=snapshot, effect_kind=effect_kind) from None
|
|
643
|
+
finally:
|
|
644
|
+
if terminal and (ownership := self._ownership.get(run_id)):
|
|
645
|
+
ownership[0].set()
|
|
646
|
+
self._changed[run_id].set()
|
|
647
|
+
|
|
648
|
+
async def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
|
|
649
|
+
self._check(handle)
|
|
650
|
+
run_id = handle.run_id
|
|
651
|
+
if run_id in self._streaming:
|
|
652
|
+
raise ExecutionEngineError("only one active event consumer is allowed per native run")
|
|
653
|
+
self._streaming.add(run_id)
|
|
654
|
+
try:
|
|
655
|
+
while True:
|
|
656
|
+
changed = self._changed[run_id]
|
|
657
|
+
changed.clear()
|
|
658
|
+
for native in self._kernel.events(run_id, after_seq=self._cursors[run_id]):
|
|
659
|
+
projected = self._project_event(native, handle)
|
|
660
|
+
self._cursors[run_id] = native.seq
|
|
661
|
+
yield projected
|
|
662
|
+
snapshot = self._check(handle)
|
|
663
|
+
if self._cursors[run_id] < snapshot.event_seq:
|
|
664
|
+
continue
|
|
665
|
+
driver = self._drivers.get(run_id)
|
|
666
|
+
if driver is None or driver.done():
|
|
667
|
+
if (ownership := self._ownership.get(run_id)) and ownership[1].done():
|
|
668
|
+
self._driver_result(ownership[1])
|
|
669
|
+
if driver is not None:
|
|
670
|
+
self._driver_result(driver)
|
|
671
|
+
return
|
|
672
|
+
if snapshot.phase.terminal:
|
|
673
|
+
return
|
|
674
|
+
# Deltas may commit while a model effect is still in flight.
|
|
675
|
+
# Refresh committed facts without coupling the kernel to a UI.
|
|
676
|
+
try:
|
|
677
|
+
await asyncio.wait_for(changed.wait(), timeout=0.1)
|
|
678
|
+
except asyncio.TimeoutError:
|
|
679
|
+
pass
|
|
680
|
+
finally:
|
|
681
|
+
self._streaming.discard(run_id)
|
|
682
|
+
|
|
683
|
+
@staticmethod
|
|
684
|
+
def _driver_result(driver: asyncio.Task[None]) -> None:
|
|
685
|
+
try:
|
|
686
|
+
driver.result()
|
|
687
|
+
except NativeDriverFailure as error:
|
|
688
|
+
raise error from None
|
|
689
|
+
except (Exception, asyncio.CancelledError) as error:
|
|
690
|
+
raise driver_failure(error) from None
|
|
691
|
+
|
|
692
|
+
def _project_event(self, native: NativeEvent, handle: RunHandle) -> RuntimeEvent:
|
|
693
|
+
payload = {
|
|
694
|
+
**native.payload,
|
|
695
|
+
"native_event_kind": native.kind,
|
|
696
|
+
"timestamp_source": "unavailable",
|
|
697
|
+
"turn_id": native.turn_id,
|
|
698
|
+
}
|
|
699
|
+
phase = None
|
|
700
|
+
if native.kind == "text.completed":
|
|
701
|
+
kind, phase = EventType.TEXT_COMPLETED, "final_answer"
|
|
702
|
+
elif native.kind == "text.delta":
|
|
703
|
+
kind, phase = EventType.TEXT_DELTA, "commentary"
|
|
704
|
+
payload["provisional"] = True
|
|
705
|
+
elif native.kind in _TERMINALS:
|
|
706
|
+
kind = _TERMINALS[native.kind]
|
|
707
|
+
payload["status"] = native.kind.removeprefix("run.")
|
|
708
|
+
if kind == EventType.RUN_FAILED:
|
|
709
|
+
payload["error"] = payload.get("reason", "native_run_failed")
|
|
710
|
+
elif native.kind == "run.started":
|
|
711
|
+
kind, payload["status"] = EventType.RUN_STARTED, "running"
|
|
712
|
+
elif native.kind == "usage.reported":
|
|
713
|
+
kind = EventType.USAGE_REPORTED
|
|
714
|
+
payload["total_tokens"] = int(payload["input_tokens"]) + int(payload["output_tokens"])
|
|
715
|
+
payload["cached_tokens"] = payload.pop("cached_input_tokens", 0)
|
|
716
|
+
elif native.kind in {EventType.APPROVAL_REQUESTED, EventType.APPROVAL_RESOLVED}:
|
|
717
|
+
kind = native.kind
|
|
718
|
+
else:
|
|
719
|
+
kind, payload["status"] = EventType.RUN_PROGRESS, "running"
|
|
720
|
+
if (
|
|
721
|
+
native.kind == "command.consumed"
|
|
722
|
+
and payload.get("kind") == "pause"
|
|
723
|
+
and payload.get("reason") in {"applied", "already_paused"}
|
|
724
|
+
):
|
|
725
|
+
payload["status"] = "paused"
|
|
726
|
+
scope = self._kernel.scope
|
|
727
|
+
return RuntimeEvent.create(
|
|
728
|
+
kind,
|
|
729
|
+
agent_id=scope.agent_id,
|
|
730
|
+
user_id=scope.user_id,
|
|
731
|
+
session_id=handle.session_id,
|
|
732
|
+
invocation_id=handle.run_id,
|
|
733
|
+
run_id=handle.run_id,
|
|
734
|
+
scope_id=f"agent:{scope.agent_id}",
|
|
735
|
+
seq_id=native.seq,
|
|
736
|
+
event_id=native.event_id,
|
|
737
|
+
timestamp=0,
|
|
738
|
+
phase=phase,
|
|
739
|
+
payload=payload,
|
|
740
|
+
)
|
|
741
|
+
|
|
742
|
+
async def cancel(self, handle: RunHandle) -> CancelResult:
|
|
743
|
+
self._check_control(handle)
|
|
744
|
+
return await self._cancel_run(handle)
|
|
745
|
+
|
|
746
|
+
async def _cancel_run(self, handle: RunHandle) -> CancelResult:
|
|
747
|
+
"""Stop after admission, also used by the facade-owned release task."""
|
|
748
|
+
if self._check(handle).phase.terminal:
|
|
749
|
+
return CancelResult.NOT_RUNNING
|
|
750
|
+
self._kernel.submit(handle.run_id, RunCommand(command_id=str(uuid4()), kind="cancel"))
|
|
751
|
+
self._ensure_driver(handle.run_id)
|
|
752
|
+
await asyncio.wait({self._drivers[handle.run_id]})
|
|
753
|
+
self._driver_result(self._drivers[handle.run_id])
|
|
754
|
+
return (
|
|
755
|
+
CancelResult.INTERRUPTED_ACTIVE_TURN
|
|
756
|
+
if self._check(handle).phase == RunPhase.CANCELED
|
|
757
|
+
else CancelResult.NOT_RUNNING
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
async def pause(self, handle: RunHandle) -> PauseResult:
|
|
761
|
+
if self._check_control(handle).phase.terminal:
|
|
762
|
+
return PauseResult.NOT_RUNNING
|
|
763
|
+
self._kernel.submit(handle.run_id, RunCommand(command_id=str(uuid4()), kind="pause"))
|
|
764
|
+
self._ensure_driver(handle.run_id)
|
|
765
|
+
await asyncio.wait({self._drivers[handle.run_id]})
|
|
766
|
+
self._driver_result(self._drivers[handle.run_id])
|
|
767
|
+
return (
|
|
768
|
+
PauseResult.PAUSED_ACTIVE_TURN
|
|
769
|
+
if self._check(handle).phase == RunPhase.PAUSED
|
|
770
|
+
else PauseResult.NOT_RUNNING
|
|
771
|
+
)
|
|
772
|
+
|
|
773
|
+
async def resume(
|
|
774
|
+
self,
|
|
775
|
+
handle: RunHandle,
|
|
776
|
+
target: ResumeTarget,
|
|
777
|
+
payload: ResumePayload | None,
|
|
778
|
+
) -> RunHandle:
|
|
779
|
+
snapshot = self._check_control(handle)
|
|
780
|
+
if (
|
|
781
|
+
target.kind != "invocation_id"
|
|
782
|
+
or target.id != handle.run_id
|
|
783
|
+
):
|
|
784
|
+
raise ExecutionEngineError(
|
|
785
|
+
"native resume requires the exact open invocation; "
|
|
786
|
+
"checkpoint/thread resume unsupported"
|
|
787
|
+
)
|
|
788
|
+
if snapshot.phase == RunPhase.PAUSED and payload is None:
|
|
789
|
+
command = RunCommand(command_id=str(uuid4()), kind="resume")
|
|
790
|
+
elif snapshot.phase == RunPhase.AWAITING_INTERACTION:
|
|
791
|
+
command = self._approval_command(snapshot, payload)
|
|
792
|
+
else:
|
|
793
|
+
raise ExecutionEngineError(
|
|
794
|
+
"native resume supports only a paused run or its pending approval"
|
|
795
|
+
)
|
|
796
|
+
self._kernel.submit(handle.run_id, command)
|
|
797
|
+
self._ensure_driver(handle.run_id)
|
|
798
|
+
return handle.model_copy(deep=True)
|
|
799
|
+
|
|
800
|
+
@staticmethod
|
|
801
|
+
def _approval_command(snapshot: RunSnapshot, payload: ResumePayload | None) -> RunCommand:
|
|
802
|
+
pending_call_id = (
|
|
803
|
+
snapshot.child_approval.tool_call.call_id if snapshot.child_approval is not None
|
|
804
|
+
else snapshot.pending_tools[0]["call_id"] if snapshot.pending_tools else None
|
|
805
|
+
)
|
|
806
|
+
if (
|
|
807
|
+
payload is None
|
|
808
|
+
or payload.kind != "approval_decision"
|
|
809
|
+
or payload.session_context is not None
|
|
810
|
+
or not isinstance(payload.data, dict)
|
|
811
|
+
or set(payload.data) != {"approval_id", "decision"}
|
|
812
|
+
or payload.data["approval_id"] != snapshot.pending_interaction
|
|
813
|
+
or not isinstance(payload.data["decision"], str)
|
|
814
|
+
or payload.data["decision"] not in {"allow", "deny"}
|
|
815
|
+
or pending_call_id is None
|
|
816
|
+
or payload.call_id != pending_call_id
|
|
817
|
+
):
|
|
818
|
+
raise ExecutionEngineError(
|
|
819
|
+
"approval must match the pending call/approval IDs and an allow/deny decision"
|
|
820
|
+
)
|
|
821
|
+
return RunCommand(
|
|
822
|
+
command_id=str(uuid4()),
|
|
823
|
+
kind="submit_interaction",
|
|
824
|
+
payload={
|
|
825
|
+
"interaction_id": snapshot.pending_interaction,
|
|
826
|
+
"decision": payload.data["decision"],
|
|
827
|
+
},
|
|
828
|
+
)
|
|
829
|
+
|
|
830
|
+
async def snapshot_state(self, handle: RunHandle) -> HarnessState:
|
|
831
|
+
"""Compatibility view only; long display strings are bounded, never persisted."""
|
|
832
|
+
native = self._check(handle)
|
|
833
|
+
events = self._kernel.events(handle.run_id)
|
|
834
|
+
messages = [
|
|
835
|
+
Message(
|
|
836
|
+
role=item["role"],
|
|
837
|
+
content=str(item.get("content") or "")[:1_048_576],
|
|
838
|
+
tool_call_id=item.get("tool_call_id"),
|
|
839
|
+
)
|
|
840
|
+
for item in native.messages
|
|
841
|
+
# The Native transcript also contains host-authored model recovery,
|
|
842
|
+
# compaction and verification prompts. They belong to the model
|
|
843
|
+
# context, not the public HarnessState conversation. Real user
|
|
844
|
+
# messages have no kind; tool receipts remain observable.
|
|
845
|
+
if item.get("role") == "tool" or item.get("kind") is None
|
|
846
|
+
]
|
|
847
|
+
for event in events:
|
|
848
|
+
if event.kind == "text.completed":
|
|
849
|
+
messages.append(
|
|
850
|
+
Message(role="assistant", content=str(event.payload["text"])[:1_048_576])
|
|
851
|
+
)
|
|
852
|
+
pending = [
|
|
853
|
+
ToolCall(
|
|
854
|
+
call_id=str(item["call_id"]), name=str(item["name"]), arguments=item["arguments"]
|
|
855
|
+
)
|
|
856
|
+
for item in native.pending_tools
|
|
857
|
+
]
|
|
858
|
+
if native.pending_interaction and native.child_approval is not None:
|
|
859
|
+
call = native.child_approval.tool_call
|
|
860
|
+
pending = [ToolCall(call_id=call.call_id, name=call.name, arguments=call.arguments),
|
|
861
|
+
*pending]
|
|
862
|
+
approval = None
|
|
863
|
+
if native.pending_interaction and pending:
|
|
864
|
+
approval = ApprovalRequest(
|
|
865
|
+
approval_id=native.pending_interaction,
|
|
866
|
+
call_id=pending[0].call_id,
|
|
867
|
+
reason="Host tool approval is required.",
|
|
868
|
+
requested_at=0,
|
|
869
|
+
)
|
|
870
|
+
return HarnessState(
|
|
871
|
+
tenant_id=native.scope.tenant_id,
|
|
872
|
+
user_id=native.scope.user_id,
|
|
873
|
+
agent_id=native.scope.agent_id,
|
|
874
|
+
session_id=native.session_id,
|
|
875
|
+
run_id=native.run_id,
|
|
876
|
+
messages=messages,
|
|
877
|
+
working_context=WorkingContext(goal=native.goal[:8192]),
|
|
878
|
+
pending_tool_calls=pending,
|
|
879
|
+
pending_approval=approval,
|
|
880
|
+
turn_count=_logical_turn_count(events),
|
|
881
|
+
status=_status(native.phase),
|
|
882
|
+
capability_snapshot=CapabilitySnapshot(entries=("native:committed-event-stream",)),
|
|
883
|
+
)
|
|
884
|
+
|
|
885
|
+
def capabilities(self) -> EngineCapabilityMatrix:
|
|
886
|
+
return EngineCapabilityMatrix(
|
|
887
|
+
cancel=EngineCapability(
|
|
888
|
+
True, "cancels the run and cooperatively cancels active host effects"
|
|
889
|
+
),
|
|
890
|
+
resume=EngineCapability(
|
|
891
|
+
True,
|
|
892
|
+
"pause/approval restore with matching scope/config/spec; uncertain effects stop",
|
|
893
|
+
),
|
|
894
|
+
checkpoint=EngineCapability(False, "checkpoint/time-travel facade is not implemented"),
|
|
895
|
+
interrupt=EngineCapability(False, "explicit terminal interrupt is not implemented"),
|
|
896
|
+
durable_across_process=EngineCapability(
|
|
897
|
+
False, "persisted records do not implement cross-process effect recovery"
|
|
898
|
+
),
|
|
899
|
+
streaming=EngineCapability(
|
|
900
|
+
True, "committed events; provisional token deltas for pinned streaming profiles"
|
|
901
|
+
),
|
|
902
|
+
)
|
|
903
|
+
|
|
904
|
+
async def close(self, handle: RunHandle) -> None:
|
|
905
|
+
await self._release_handle(handle, stop=True)
|
|
906
|
+
|
|
907
|
+
async def detach(self, handle: RunHandle) -> None:
|
|
908
|
+
"""Release an idle durable suspension without changing its ledger phase."""
|
|
909
|
+
await self._release_handle(handle, stop=False)
|
|
910
|
+
|
|
911
|
+
async def _release_handle(self, handle: RunHandle, *, stop: bool) -> None:
|
|
912
|
+
snapshot = self._check(handle)
|
|
913
|
+
if handle.run_id in self._closed:
|
|
914
|
+
return
|
|
915
|
+
if handle.run_id in self._fork_observers:
|
|
916
|
+
self._closed.add(handle.run_id)
|
|
917
|
+
return
|
|
918
|
+
release = self._releases.get(handle.run_id)
|
|
919
|
+
if release is None:
|
|
920
|
+
if not stop and snapshot.phase not in {
|
|
921
|
+
RunPhase.PAUSED,
|
|
922
|
+
RunPhase.AWAITING_INTERACTION,
|
|
923
|
+
RunPhase.COMPLETED,
|
|
924
|
+
RunPhase.FAILED,
|
|
925
|
+
RunPhase.CANCELED,
|
|
926
|
+
RunPhase.INTERRUPTED,
|
|
927
|
+
}:
|
|
928
|
+
raise ExecutionEngineError("only an idle Native run can be detached")
|
|
929
|
+
# Register before yielding: later controls cannot enter the inbox,
|
|
930
|
+
# and another close/detach joins this exact release disposition.
|
|
931
|
+
release = asyncio.create_task(
|
|
932
|
+
self._release_run(handle.model_copy(deep=True), stop=stop)
|
|
933
|
+
)
|
|
934
|
+
release.add_done_callback(
|
|
935
|
+
lambda completed: completed.exception() if not completed.cancelled() else None
|
|
936
|
+
)
|
|
937
|
+
self._releases[handle.run_id] = release
|
|
938
|
+
# An RPC cancellation cannot abandon the accepted stop or revoke its
|
|
939
|
+
# cleanup ownership. A failed release stays observable and fail-closed.
|
|
940
|
+
await asyncio.shield(release)
|
|
941
|
+
|
|
942
|
+
async def _release_run(self, handle: RunHandle, *, stop: bool) -> None:
|
|
943
|
+
try:
|
|
944
|
+
if stop:
|
|
945
|
+
await self._cancel_run(handle)
|
|
946
|
+
else:
|
|
947
|
+
driver = self._drivers.get(handle.run_id)
|
|
948
|
+
if driver is not None:
|
|
949
|
+
await driver
|
|
950
|
+
self._driver_result(driver)
|
|
951
|
+
finally:
|
|
952
|
+
try:
|
|
953
|
+
if stop:
|
|
954
|
+
# Scope owns child execution even when parent cancellation
|
|
955
|
+
# fails or its terminal ledger is already immutable. Preserve
|
|
956
|
+
# the original failure after actual resource cleanup.
|
|
957
|
+
await self._kernel.release_children(handle.run_id)
|
|
958
|
+
finally:
|
|
959
|
+
if ownership := self._ownership.get(handle.run_id):
|
|
960
|
+
ownership[0].set()
|
|
961
|
+
await ownership[1]
|
|
962
|
+
self._kernel.release(handle.run_id)
|
|
963
|
+
self._closed.add(handle.run_id)
|
|
964
|
+
self._public_output_sinks.pop(handle.run_id, None)
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
def _status(phase: RunPhase) -> RunStatus:
|
|
968
|
+
return {
|
|
969
|
+
RunPhase.CREATED: RunStatus.PENDING,
|
|
970
|
+
RunPhase.PAUSED: RunStatus.PAUSED,
|
|
971
|
+
RunPhase.AWAITING_INTERACTION: RunStatus.AWAITING_APPROVAL,
|
|
972
|
+
RunPhase.COMPACTING: RunStatus.COMPACTING,
|
|
973
|
+
RunPhase.COMPLETED: RunStatus.COMPLETED,
|
|
974
|
+
RunPhase.FAILED: RunStatus.FAILED,
|
|
975
|
+
RunPhase.INTERRUPTED: RunStatus.FAILED,
|
|
976
|
+
RunPhase.CANCELED: RunStatus.CANCELED,
|
|
977
|
+
}.get(phase, RunStatus.RUNNING)
|