agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
|
@@ -50,6 +50,7 @@ from ksadk.events.adapters._langgraph_support import (
|
|
|
50
50
|
)
|
|
51
51
|
from ksadk.events.canonical import (
|
|
52
52
|
ApprovalRequest,
|
|
53
|
+
StructuredInputRequest,
|
|
53
54
|
ContinuationCreated,
|
|
54
55
|
ErrorInfo,
|
|
55
56
|
InteractionRequested,
|
|
@@ -446,6 +447,10 @@ class LangGraphEventAdapter:
|
|
|
446
447
|
) -> tuple[RuntimeEvent, ...]:
|
|
447
448
|
payload, metadata = _message_data(params.get("data"))
|
|
448
449
|
node = _required_string(metadata.get("langgraph_node"), "messages metadata.langgraph_node")
|
|
450
|
+
if isinstance(payload, ToolMessage):
|
|
451
|
+
# LangGraph 1.2.0 also echoes tool outcomes on the messages lane.
|
|
452
|
+
# The tools lane owns their canonical result and error identity.
|
|
453
|
+
return ()
|
|
449
454
|
if isinstance(payload, AIMessage):
|
|
450
455
|
return _map_whole_message(
|
|
451
456
|
payload=payload,
|
|
@@ -628,6 +633,9 @@ class LangGraphEventAdapter:
|
|
|
628
633
|
interaction_events = self._interaction_events_from_interrupts(
|
|
629
634
|
context=context, frame=frame, source=source, env=env, interrupts=interrupts
|
|
630
635
|
)
|
|
636
|
+
# Associate the companion pause with the pending interaction so Kernel
|
|
637
|
+
# preserves WAITING instead of publishing a terminal interruption.
|
|
638
|
+
interaction_id = interaction_events[0].interaction_id if interaction_events else None
|
|
631
639
|
if context.checkpoint_ref is None:
|
|
632
640
|
return (
|
|
633
641
|
*interaction_events,
|
|
@@ -642,6 +650,7 @@ class LangGraphEventAdapter:
|
|
|
642
650
|
),
|
|
643
651
|
status="interrupted",
|
|
644
652
|
reason=reason,
|
|
653
|
+
interaction_id=interaction_id,
|
|
645
654
|
),
|
|
646
655
|
)
|
|
647
656
|
|
|
@@ -697,6 +706,7 @@ class LangGraphEventAdapter:
|
|
|
697
706
|
),
|
|
698
707
|
status="interrupted",
|
|
699
708
|
reason=reason,
|
|
709
|
+
interaction_id=interaction_id,
|
|
700
710
|
continuation_id=continuation_id,
|
|
701
711
|
),
|
|
702
712
|
)
|
|
@@ -730,6 +740,10 @@ class LangGraphEventAdapter:
|
|
|
730
740
|
if isinstance(detail_value, (dict, list, str, int, float, bool, type(None)))
|
|
731
741
|
else None
|
|
732
742
|
)
|
|
743
|
+
is_input = isinstance(detail_json, dict) and detail_json.get("kind") == "structured_input"
|
|
744
|
+
request = (StructuredInputRequest(
|
|
745
|
+
prompt=detail_json.get("prompt"), schema=detail_json.get("schema", {}),
|
|
746
|
+
) if is_input else ApprovalRequest(call_id=intr_id or None, kind="tool", detail=detail_json))
|
|
733
747
|
events.append(
|
|
734
748
|
InteractionRequested(
|
|
735
749
|
**env(
|
|
@@ -741,12 +755,8 @@ class LangGraphEventAdapter:
|
|
|
741
755
|
source,
|
|
742
756
|
),
|
|
743
757
|
interaction_id=interaction_id,
|
|
744
|
-
interaction_kind="approval",
|
|
745
|
-
request=
|
|
746
|
-
call_id=intr_id or None,
|
|
747
|
-
kind="tool",
|
|
748
|
-
detail=detail_json,
|
|
749
|
-
),
|
|
758
|
+
interaction_kind="structured_input" if is_input else "approval",
|
|
759
|
+
request=request,
|
|
750
760
|
)
|
|
751
761
|
)
|
|
752
762
|
return tuple(events)
|
ksadk/events/canonical.py
CHANGED
|
@@ -263,6 +263,11 @@ class UsageReported(EventEnvelope):
|
|
|
263
263
|
total_tokens: JsonInteger = Field(ge=0)
|
|
264
264
|
cached_tokens: JsonInteger = Field(default=0, ge=0)
|
|
265
265
|
reasoning_tokens: JsonInteger = Field(default=0, ge=0)
|
|
266
|
+
#: 计量语义(长任务方案 §19.2 usage_mode):``delta`` 单次调用的增量,
|
|
267
|
+
#: 消费者累加;``cumulative`` provider 已给出的累计值,消费者覆盖;
|
|
268
|
+
#: ``snapshot`` 定期快照,消费者覆盖。默认 ``delta`` 使旧事件/消费者
|
|
269
|
+
#: 保持「逐次累加」语义,不回退既有行为。
|
|
270
|
+
mode: Literal["delta", "cumulative", "snapshot"] = Field(default="delta")
|
|
266
271
|
|
|
267
272
|
|
|
268
273
|
RuntimeEvent: TypeAlias = Annotated[
|
ksadk/events/canonical_store.py
CHANGED
|
@@ -10,6 +10,7 @@ enforce the canonical idempotency domain before a session cursor is allocated.
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
12
|
import asyncio
|
|
13
|
+
import contextlib
|
|
13
14
|
import hashlib
|
|
14
15
|
import json
|
|
15
16
|
import uuid
|
|
@@ -20,6 +21,8 @@ from typing import TYPE_CHECKING, Any
|
|
|
20
21
|
from ksadk.events.canonical import RuntimeEvent, dump_runtime_event, parse_runtime_event
|
|
21
22
|
from ksadk.kernel.contracts import ActivationWriteGuard, SessionEventEnvelope
|
|
22
23
|
from ksadk.sessions.base import SessionEvent, SessionEventSeqBinding
|
|
24
|
+
from ksadk.sessions.db_budget import DatabaseOperationDeadline, session_db_budget
|
|
25
|
+
from ksadk.sessions.resilience import is_session_backend_failure
|
|
23
26
|
|
|
24
27
|
if TYPE_CHECKING:
|
|
25
28
|
from ksadk.events.session_event import SessionEventStore
|
|
@@ -112,6 +115,8 @@ def session_event_to_runtime_event(event: SessionEvent) -> RuntimeEvent | None:
|
|
|
112
115
|
raise ValueError("runtime family SessionEvent is missing runtime_event content")
|
|
113
116
|
if payload.get("seq") != event.seq_id:
|
|
114
117
|
raise ValueError("canonical RuntimeEvent seq does not match physical seq")
|
|
118
|
+
if payload.get("event_type") != event.event_type:
|
|
119
|
+
raise ValueError("canonical RuntimeEvent event type does not match envelope")
|
|
115
120
|
return parse_runtime_event(payload)
|
|
116
121
|
if not metadata.get(_CANONICAL_RUNTIME_MARKER):
|
|
117
122
|
return None
|
|
@@ -212,8 +217,32 @@ class RuntimeEventStore:
|
|
|
212
217
|
raise ValueError("typed append requires a session_id bound at construction")
|
|
213
218
|
if not isinstance(guard, ActivationWriteGuard):
|
|
214
219
|
raise TypeError("RuntimeEventStore only accepts ActivationWriteGuard")
|
|
220
|
+
deadline = DatabaseOperationDeadline(session_db_budget())
|
|
215
221
|
envelope = runtime_event_envelope(self._typed_session_id, event)
|
|
216
|
-
|
|
222
|
+
try:
|
|
223
|
+
persisted = await self._event_store.append(envelope, guard=guard)
|
|
224
|
+
except Exception as error:
|
|
225
|
+
# A lost commit acknowledgement is resolved by the stable event
|
|
226
|
+
# identity. Never re-append: that would repeat a guarded write
|
|
227
|
+
# after a possible fence change. Domain/fence errors remain errors.
|
|
228
|
+
if not is_session_backend_failure(error):
|
|
229
|
+
raise
|
|
230
|
+
lookup = getattr(self._event_store, "get_by_id", None)
|
|
231
|
+
if not callable(lookup):
|
|
232
|
+
raise
|
|
233
|
+
try:
|
|
234
|
+
persisted = await deadline.run(
|
|
235
|
+
lookup(self._typed_session_id, envelope.event_id)
|
|
236
|
+
)
|
|
237
|
+
except Exception:
|
|
238
|
+
raise error
|
|
239
|
+
if persisted is None:
|
|
240
|
+
raise error
|
|
241
|
+
if persisted.session_id != envelope.session_id or persisted.family != "runtime":
|
|
242
|
+
raise ValueError("committed runtime event identity mismatch")
|
|
243
|
+
confirmed = parse_runtime_event(dict(persisted.payload) | {"seq": persisted.seq})
|
|
244
|
+
self._assert_same_fact(confirmed, event)
|
|
245
|
+
return confirmed
|
|
217
246
|
return parse_runtime_event(dict(persisted.payload) | {"seq": persisted.seq})
|
|
218
247
|
|
|
219
248
|
async def append_one(self, session_id: str, event: RuntimeEvent) -> RuntimeEvent:
|
|
@@ -223,12 +252,26 @@ class RuntimeEventStore:
|
|
|
223
252
|
async def persist_one(self, session_id: str, event: RuntimeEvent) -> tuple[RuntimeEvent, bool]:
|
|
224
253
|
"""Persist before publication and return whether this call created the fact."""
|
|
225
254
|
|
|
255
|
+
budget = getattr(self._service, "db_budget", None) or session_db_budget()
|
|
256
|
+
deadline = DatabaseOperationDeadline(budget)
|
|
257
|
+
return await deadline.run(self._persist_one(session_id, event))
|
|
258
|
+
|
|
259
|
+
async def _event_by_id_for_write(self, session_id: str, event_id: str) -> RuntimeEvent | None:
|
|
260
|
+
lookup = getattr(self._service, "get_event_by_id_for_write", None)
|
|
261
|
+
if self._event_store is None and callable(lookup):
|
|
262
|
+
self._require_storage_capabilities()
|
|
263
|
+
stored = await lookup(session_id, canonical_storage_id(session_id, event_id))
|
|
264
|
+
return session_event_to_runtime_event(stored) if stored is not None else None
|
|
265
|
+
return await self.event_by_id(session_id, event_id)
|
|
266
|
+
|
|
267
|
+
async def _persist_one(self, session_id: str, event: RuntimeEvent) -> tuple[RuntimeEvent, bool]:
|
|
268
|
+
|
|
226
269
|
if getattr(event, "schema_version", None) != 2:
|
|
227
270
|
raise ValueError("canonical RuntimeEventStore accepts schema_version=2 only")
|
|
228
271
|
if not session_id.strip():
|
|
229
272
|
raise ValueError("session_id must be nonempty")
|
|
230
273
|
self._require_storage_capabilities()
|
|
231
|
-
existing = await self.
|
|
274
|
+
existing = await self._event_by_id_for_write(session_id, event.event_id)
|
|
232
275
|
if existing is not None:
|
|
233
276
|
self._assert_same_fact(existing, event)
|
|
234
277
|
return existing, False
|
|
@@ -239,7 +282,7 @@ class RuntimeEventStore:
|
|
|
239
282
|
# The deterministic physical id turns concurrent appends into an
|
|
240
283
|
# insert-winner/insert-loser race on durable backends. Re-read the
|
|
241
284
|
# winner and only absorb the error when it is the same fact.
|
|
242
|
-
existing = await self.
|
|
285
|
+
existing = await self._event_by_id_for_write(session_id, event.event_id)
|
|
243
286
|
if existing is None:
|
|
244
287
|
raise
|
|
245
288
|
self._assert_same_fact(existing, event)
|
|
@@ -325,11 +368,27 @@ class RuntimeEventStore:
|
|
|
325
368
|
return events[:limit]
|
|
326
369
|
|
|
327
370
|
async def event_by_id(self, session_id: str, event_id: str) -> RuntimeEvent | None:
|
|
328
|
-
|
|
371
|
+
# Typed envelopes use a UUID event identity before the physical row
|
|
372
|
+
# key is allocated. The legacy carrier key cannot find those rows,
|
|
373
|
+
# even when the typed store happens to expose its session service.
|
|
374
|
+
if self._event_store is None and self._service is not None:
|
|
329
375
|
self._require_storage_capabilities()
|
|
330
376
|
storage_id = canonical_storage_id(session_id, event_id)
|
|
331
377
|
stored = await self._service.get_event_by_id(session_id, storage_id)
|
|
332
378
|
return session_event_to_runtime_event(stored) if stored is not None else None
|
|
379
|
+
lookup = getattr(self._event_store, "get_by_id", None)
|
|
380
|
+
if callable(lookup):
|
|
381
|
+
envelope = await lookup(session_id, runtime_event_envelope_id(session_id, event_id))
|
|
382
|
+
if envelope is None:
|
|
383
|
+
return None
|
|
384
|
+
if envelope.session_id != session_id:
|
|
385
|
+
raise ValueError("canonical event lookup returned another session")
|
|
386
|
+
if envelope.family != "runtime" or envelope.family_version != 2:
|
|
387
|
+
raise ValueError("canonical event lookup returned another event family")
|
|
388
|
+
event = parse_runtime_event(dict(envelope.payload) | {"seq": envelope.seq})
|
|
389
|
+
if event.event_id != event_id:
|
|
390
|
+
raise ValueError("canonical event lookup returned another event identity")
|
|
391
|
+
return event
|
|
333
392
|
for event in await self.list(session_id):
|
|
334
393
|
if event.event_id == event_id:
|
|
335
394
|
return event
|
|
@@ -380,6 +439,21 @@ class RuntimeEventStore:
|
|
|
380
439
|
events = events[-limit:]
|
|
381
440
|
return events
|
|
382
441
|
|
|
442
|
+
async def latest_seq_by_sessions(self, session_ids: list[str]) -> dict[str, int]:
|
|
443
|
+
"""Read canonical watermarks in one backend query when available."""
|
|
444
|
+
|
|
445
|
+
if not session_ids:
|
|
446
|
+
return {}
|
|
447
|
+
bulk_reader = getattr(self._service, "latest_event_seq_by_sessions", None)
|
|
448
|
+
if callable(bulk_reader):
|
|
449
|
+
return await bulk_reader(list(session_ids))
|
|
450
|
+
result: dict[str, int] = {}
|
|
451
|
+
for session_id in session_ids:
|
|
452
|
+
latest = await self.list(session_id, limit=1)
|
|
453
|
+
if latest:
|
|
454
|
+
result[session_id] = latest[-1].seq
|
|
455
|
+
return result
|
|
456
|
+
|
|
383
457
|
async def list_run_ids(self, session_id: str) -> list[str]:
|
|
384
458
|
"""Distinct run ids in session order of first appearance."""
|
|
385
459
|
|
|
@@ -396,6 +470,22 @@ class RuntimeEventStore:
|
|
|
396
470
|
poll_interval: float = 0.25,
|
|
397
471
|
timeout: float = 5 * 60,
|
|
398
472
|
) -> AsyncIterator[RuntimeEvent]:
|
|
473
|
+
if self._event_store is not None and self._service is None:
|
|
474
|
+
# The typed view may be backed by a fenced SessionEventStore rather
|
|
475
|
+
# than a BaseSessionService. In that mode ``_service`` is
|
|
476
|
+
# intentionally None, so consume the store's envelope subscription
|
|
477
|
+
# instead of reaching for the legacy ``get_events`` API.
|
|
478
|
+
async with contextlib.aclosing(
|
|
479
|
+
self._subscribe_typed(
|
|
480
|
+
session_id,
|
|
481
|
+
after_seq=after_seq,
|
|
482
|
+
poll_interval=poll_interval,
|
|
483
|
+
timeout=timeout,
|
|
484
|
+
)
|
|
485
|
+
) as stream:
|
|
486
|
+
async for event in stream:
|
|
487
|
+
yield event
|
|
488
|
+
return
|
|
399
489
|
cursor = int(after_seq or 0)
|
|
400
490
|
deadline = asyncio.get_running_loop().time() + timeout
|
|
401
491
|
while True:
|
|
@@ -419,6 +509,22 @@ class RuntimeEventStore:
|
|
|
419
509
|
poll_interval: float = 0.25,
|
|
420
510
|
timeout: float = 5 * 60,
|
|
421
511
|
) -> AsyncIterator[RuntimeEvent]:
|
|
512
|
+
if self._event_store is not None and self._service is None:
|
|
513
|
+
async with contextlib.aclosing(
|
|
514
|
+
self._subscribe_typed(
|
|
515
|
+
session_id,
|
|
516
|
+
after_seq=after_seq,
|
|
517
|
+
poll_interval=poll_interval,
|
|
518
|
+
timeout=timeout,
|
|
519
|
+
)
|
|
520
|
+
) as stream:
|
|
521
|
+
async for event in stream:
|
|
522
|
+
if event.run_id != run_id:
|
|
523
|
+
continue
|
|
524
|
+
yield event
|
|
525
|
+
if event.event_type in _TERMINAL_EVENT_TYPES:
|
|
526
|
+
return
|
|
527
|
+
return
|
|
422
528
|
cursor = int(after_seq or 0)
|
|
423
529
|
deadline = asyncio.get_running_loop().time() + timeout
|
|
424
530
|
while True:
|
|
@@ -435,6 +541,96 @@ class RuntimeEventStore:
|
|
|
435
541
|
return
|
|
436
542
|
await asyncio.sleep(poll_interval)
|
|
437
543
|
|
|
544
|
+
async def _subscribe_typed(
|
|
545
|
+
self,
|
|
546
|
+
session_id: str,
|
|
547
|
+
*,
|
|
548
|
+
after_seq: int,
|
|
549
|
+
poll_interval: float,
|
|
550
|
+
timeout: float,
|
|
551
|
+
) -> AsyncIterator[RuntimeEvent]:
|
|
552
|
+
"""Bridge a generic envelope subscription into canonical RuntimeEvents.
|
|
553
|
+
|
|
554
|
+
The typed backend owns replay-to-live ordering; this bridge reads the
|
|
555
|
+
committed prefix first and then continues from its last physical
|
|
556
|
+
cursor. ``poll_interval`` remains part of the public API for parity
|
|
557
|
+
with the service-backed path; the typed backend controls its cadence.
|
|
558
|
+
"""
|
|
559
|
+
|
|
560
|
+
if self._event_store is None: # pragma: no cover - guarded by callers
|
|
561
|
+
return
|
|
562
|
+
from ksadk.events.session_event import envelope_to_session_event
|
|
563
|
+
|
|
564
|
+
cursor = int(after_seq)
|
|
565
|
+
deadline = asyncio.get_running_loop().time() + timeout
|
|
566
|
+
|
|
567
|
+
def runtime_event_from_envelope(envelope: Any) -> RuntimeEvent | None:
|
|
568
|
+
row = envelope_to_session_event(envelope)
|
|
569
|
+
# ``envelope_to_session_event`` prepares a write carrier and
|
|
570
|
+
# therefore leaves its transient binding at seq=0. The
|
|
571
|
+
# envelope stream is post-commit, so copy its physical cursor
|
|
572
|
+
# before validating the runtime payload.
|
|
573
|
+
row.seq_id = int(envelope.seq)
|
|
574
|
+
row.seq_binding = None
|
|
575
|
+
return session_event_to_runtime_event(row)
|
|
576
|
+
|
|
577
|
+
# A timeout bounds waiting for live events, while already-committed
|
|
578
|
+
# replay rows remain observable even when timeout=0. Read pages before
|
|
579
|
+
# opening the live iterator, then resume from the last physical cursor
|
|
580
|
+
# so rows committed during the handoff are not duplicated or dropped.
|
|
581
|
+
while True:
|
|
582
|
+
envelopes = await self._event_store.read(session_id, cursor, 1000)
|
|
583
|
+
if not envelopes:
|
|
584
|
+
break
|
|
585
|
+
previous_cursor = cursor
|
|
586
|
+
envelopes.sort(key=lambda envelope: int(envelope.seq))
|
|
587
|
+
for envelope in envelopes:
|
|
588
|
+
sequence = int(envelope.seq)
|
|
589
|
+
if sequence <= cursor:
|
|
590
|
+
continue
|
|
591
|
+
cursor = sequence
|
|
592
|
+
runtime_event = runtime_event_from_envelope(envelope)
|
|
593
|
+
if runtime_event is not None:
|
|
594
|
+
yield runtime_event
|
|
595
|
+
if len(envelopes) < 1000:
|
|
596
|
+
break
|
|
597
|
+
if cursor == previous_cursor:
|
|
598
|
+
# A broken backend must not make the bridge spin forever on a
|
|
599
|
+
# page that contains only duplicate/out-of-order rows.
|
|
600
|
+
break
|
|
601
|
+
|
|
602
|
+
if timeout <= 0:
|
|
603
|
+
return
|
|
604
|
+
|
|
605
|
+
iterator = self._event_store.subscribe(session_id, cursor).__aiter__()
|
|
606
|
+
try:
|
|
607
|
+
while True:
|
|
608
|
+
remaining = deadline - asyncio.get_running_loop().time()
|
|
609
|
+
if remaining <= 0:
|
|
610
|
+
return
|
|
611
|
+
try:
|
|
612
|
+
envelope = await asyncio.wait_for(iterator.__anext__(), remaining)
|
|
613
|
+
except StopAsyncIteration:
|
|
614
|
+
return
|
|
615
|
+
except asyncio.TimeoutError:
|
|
616
|
+
return
|
|
617
|
+
|
|
618
|
+
# Advance the cursor for non-runtime families too. The typed
|
|
619
|
+
# SessionEventStore shares one physical session log, and
|
|
620
|
+
# failing to consume control/workflow rows would replay them on
|
|
621
|
+
# every poll of a runtime-only view.
|
|
622
|
+
sequence = int(envelope.seq)
|
|
623
|
+
if sequence <= cursor:
|
|
624
|
+
continue
|
|
625
|
+
cursor = sequence
|
|
626
|
+
runtime_event = runtime_event_from_envelope(envelope)
|
|
627
|
+
if runtime_event is not None:
|
|
628
|
+
yield runtime_event
|
|
629
|
+
finally:
|
|
630
|
+
close = getattr(iterator, "aclose", None)
|
|
631
|
+
if close is not None:
|
|
632
|
+
await close()
|
|
633
|
+
|
|
438
634
|
@staticmethod
|
|
439
635
|
def _assert_same_fact(existing: RuntimeEvent, candidate: RuntimeEvent) -> None:
|
|
440
636
|
existing_payload = dump_runtime_event(existing)
|
ksadk/events/reducer.py
CHANGED
|
@@ -189,6 +189,8 @@ class StreamReducer:
|
|
|
189
189
|
|
|
190
190
|
def __init__(self) -> None:
|
|
191
191
|
self._run_id: str | None = None
|
|
192
|
+
self._root_scope_id: str | None = None
|
|
193
|
+
self._managed_scopes: set[str] = set()
|
|
192
194
|
self._status: RunStatus | None = None
|
|
193
195
|
self._last_seq: int | None = None
|
|
194
196
|
self._items: OrderedDict[tuple[str, str], ItemProjection] = OrderedDict()
|
|
@@ -219,13 +221,93 @@ class StreamReducer:
|
|
|
219
221
|
return self._noop_patch(event)
|
|
220
222
|
|
|
221
223
|
self._validate_run(event)
|
|
224
|
+
managed_descriptor = self._validate_managed_scope(event)
|
|
222
225
|
patch = self._apply_event(event)
|
|
226
|
+
if managed_descriptor:
|
|
227
|
+
self._managed_scopes.add(event.scope_id)
|
|
228
|
+
if event.event_type in _RUN_LIFECYCLE_EVENT_TYPES and self._root_scope_id is None:
|
|
229
|
+
self._root_scope_id = event.scope_id
|
|
223
230
|
if self._run_id is None:
|
|
224
231
|
self._run_id = event.run_id
|
|
225
232
|
self._last_seq = event.seq
|
|
226
233
|
self._record_recent(event, fingerprint)
|
|
227
234
|
return patch
|
|
228
235
|
|
|
236
|
+
def _validate_managed_scope(self, event: RuntimeEvent) -> bool:
|
|
237
|
+
if event.event_type in _RUN_LIFECYCLE_EVENT_TYPES:
|
|
238
|
+
# Older graph adapters use child run.progress as a nonterminal
|
|
239
|
+
# observation. Preserve that lane until a managed descriptor opts
|
|
240
|
+
# the run into the root-only contract; child terminals never pass.
|
|
241
|
+
if (
|
|
242
|
+
(
|
|
243
|
+
event.parent_scope_id is not None
|
|
244
|
+
and (not isinstance(event, RunProgress) or self._managed_scopes)
|
|
245
|
+
)
|
|
246
|
+
or event.scope_id in self._managed_scopes
|
|
247
|
+
or (
|
|
248
|
+
self._managed_scopes
|
|
249
|
+
and self._root_scope_id is not None
|
|
250
|
+
and event.scope_id != self._root_scope_id
|
|
251
|
+
)
|
|
252
|
+
):
|
|
253
|
+
raise self._error(
|
|
254
|
+
event, "child_run_lifecycle", "run lifecycle belongs to root scope"
|
|
255
|
+
)
|
|
256
|
+
if not isinstance(event, (ItemStarted, ItemUpdated, ItemSnapshotReplaced, ItemCompleted)):
|
|
257
|
+
return False
|
|
258
|
+
if isinstance(event, ItemUpdated):
|
|
259
|
+
parts = (event.update,)
|
|
260
|
+
else:
|
|
261
|
+
snapshot = event.initial if isinstance(event, ItemStarted) else event.snapshot
|
|
262
|
+
parts = snapshot.parts if snapshot else ()
|
|
263
|
+
descriptors = [
|
|
264
|
+
part.data
|
|
265
|
+
for part in parts
|
|
266
|
+
if isinstance(part, DataContent)
|
|
267
|
+
and isinstance(part.data, dict)
|
|
268
|
+
and part.data.get("schema") == "execution.scope/v1"
|
|
269
|
+
]
|
|
270
|
+
if not descriptors:
|
|
271
|
+
return False
|
|
272
|
+
from ksadk.a2a.presentation import ExecutionScopeDescriptor, validate_scope_transition
|
|
273
|
+
|
|
274
|
+
try:
|
|
275
|
+
if len(descriptors) != 1 or event.item_kind != "status":
|
|
276
|
+
raise ValueError("scope descriptor requires one status item")
|
|
277
|
+
current = ExecutionScopeDescriptor.model_validate(descriptors[0])
|
|
278
|
+
if (
|
|
279
|
+
current.scope_id != event.scope_id
|
|
280
|
+
or current.parent_scope_id != event.parent_scope_id
|
|
281
|
+
):
|
|
282
|
+
raise ValueError("scope descriptor does not match event scope")
|
|
283
|
+
previous = self._items.get((event.scope_id, event.item_id))
|
|
284
|
+
if previous:
|
|
285
|
+
for part in previous.parts:
|
|
286
|
+
if (
|
|
287
|
+
isinstance(part, DataContent)
|
|
288
|
+
and isinstance(part.data, dict)
|
|
289
|
+
and part.data.get("schema") == "execution.scope/v1"
|
|
290
|
+
):
|
|
291
|
+
validate_scope_transition(
|
|
292
|
+
ExecutionScopeDescriptor.model_validate(part.data), current
|
|
293
|
+
)
|
|
294
|
+
for ref in current.output_refs:
|
|
295
|
+
item = self._items.get((ref.scope_id, ref.item_id))
|
|
296
|
+
if (
|
|
297
|
+
item is None
|
|
298
|
+
or item.status != "completed"
|
|
299
|
+
or (
|
|
300
|
+
ref.part_id is not None
|
|
301
|
+
and not any(p.part_id == ref.part_id for p in item.parts)
|
|
302
|
+
)
|
|
303
|
+
):
|
|
304
|
+
raise ValueError("scope output reference is not completed")
|
|
305
|
+
except ValueError as exc:
|
|
306
|
+
raise self._error(
|
|
307
|
+
event, "invalid_execution_scope", "invalid execution scope descriptor"
|
|
308
|
+
) from exc
|
|
309
|
+
return True
|
|
310
|
+
|
|
229
311
|
def snapshot(self) -> RunProjection:
|
|
230
312
|
"""Return a detached projection suitable for live output or replay."""
|
|
231
313
|
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"""Run-scoped access to the Kernel-owned, fenced canonical event store."""
|
|
2
|
+
|
|
3
|
+
from contextlib import contextmanager
|
|
4
|
+
from contextvars import ContextVar
|
|
5
|
+
|
|
6
|
+
from ksadk.events.canonical_store import RuntimeEventStore
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RunEventAuthority:
|
|
10
|
+
"""An ephemeral capability, never serialized into request/session state."""
|
|
11
|
+
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
event_store,
|
|
15
|
+
*,
|
|
16
|
+
session_id,
|
|
17
|
+
run_id,
|
|
18
|
+
guard,
|
|
19
|
+
interaction_ledger=None,
|
|
20
|
+
tenant_id=None,
|
|
21
|
+
agent_instance_id=None,
|
|
22
|
+
managed_a2a_bootstraps=None,
|
|
23
|
+
):
|
|
24
|
+
self.session_id, self.run_id = session_id, run_id
|
|
25
|
+
self._store = RuntimeEventStore(event_store, session_id=session_id)
|
|
26
|
+
self._guard = guard
|
|
27
|
+
self._active = False
|
|
28
|
+
self._used = False
|
|
29
|
+
self._events = event_store
|
|
30
|
+
self._ledger = interaction_ledger
|
|
31
|
+
self._tenant, self._agent = tenant_id, agent_instance_id
|
|
32
|
+
self._managed_a2a_bootstraps = (
|
|
33
|
+
managed_a2a_bootstraps if managed_a2a_bootstraps is not None else {}
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def _require(self, session_id, run_id):
|
|
37
|
+
if not self._active:
|
|
38
|
+
raise RuntimeError("canonical run authority is no longer active")
|
|
39
|
+
if session_id != self.session_id or run_id != self.run_id:
|
|
40
|
+
raise ValueError("canonical run authority identity mismatch")
|
|
41
|
+
|
|
42
|
+
def require_session(self, session_id):
|
|
43
|
+
self._require(session_id, self.run_id)
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def publication_epoch(self):
|
|
47
|
+
"""Identify the actual Kernel owner, not a fabricated framework run."""
|
|
48
|
+
from ksadk.events.identity import stable_item_id
|
|
49
|
+
|
|
50
|
+
self.require_session(self.session_id)
|
|
51
|
+
return stable_item_id(
|
|
52
|
+
"kernel", self._guard.activation_id, str(self._guard.fencing_token)
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
def managed_invocation_policy(self):
|
|
56
|
+
"""Compose approval and audited authorization within this run's fence."""
|
|
57
|
+
from datetime import datetime, timezone
|
|
58
|
+
from uuid import uuid4
|
|
59
|
+
|
|
60
|
+
from ksadk.a2a.invocation_policy import runtime_a2a_invocation_policy
|
|
61
|
+
from ksadk.a2a.runtime_approval import KernelA2AApprovalResolver, approval_target
|
|
62
|
+
from ksadk.kernel.contracts import SessionEventEnvelope
|
|
63
|
+
|
|
64
|
+
self.require_session(self.session_id)
|
|
65
|
+
if self._ledger is None or not self._tenant or not self._agent:
|
|
66
|
+
raise RuntimeError("A2A_KERNEL_POLICY_DEPENDENCIES_REQUIRED")
|
|
67
|
+
|
|
68
|
+
async def audit(request, decision, route):
|
|
69
|
+
self._require(request.handle.session_id, request.handle.run_id)
|
|
70
|
+
await self._events.append(
|
|
71
|
+
SessionEventEnvelope(
|
|
72
|
+
event_id=uuid4(),
|
|
73
|
+
session_id=self.session_id,
|
|
74
|
+
seq=0,
|
|
75
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
76
|
+
family="control",
|
|
77
|
+
family_version=1,
|
|
78
|
+
event_type="control.a2a_policy_evaluated",
|
|
79
|
+
run_id=self.run_id,
|
|
80
|
+
actor_ref="agent-kernel",
|
|
81
|
+
payload={
|
|
82
|
+
"schema": "a2a.policy-audit/v1",
|
|
83
|
+
"invocation_sha256": approval_target(request)["invocation_sha256"],
|
|
84
|
+
"action": decision.action,
|
|
85
|
+
"reason_code": decision.reason_code,
|
|
86
|
+
"route_kind": route,
|
|
87
|
+
},
|
|
88
|
+
),
|
|
89
|
+
guard=self._guard,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
return runtime_a2a_invocation_policy(
|
|
93
|
+
audit=audit,
|
|
94
|
+
approval_resolver=KernelA2AApprovalResolver(
|
|
95
|
+
self._ledger, self._events, tenant_id=self._tenant, agent_instance_id=self._agent
|
|
96
|
+
),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
def register_managed_a2a(self, bootstrap):
|
|
100
|
+
self._require(self.session_id, self.run_id)
|
|
101
|
+
if getattr(bootstrap, "scoped_cancel_available", False):
|
|
102
|
+
self._managed_a2a_bootstraps[bootstrap.runtime_metadata.runtime_id] = bootstrap
|
|
103
|
+
|
|
104
|
+
async def cancel_a2a_scope(self, scope_id):
|
|
105
|
+
"""Resolve a caller-owned child, then reuse the durable cancel protocol."""
|
|
106
|
+
self._require(self.session_id, self.run_id)
|
|
107
|
+
for bootstrap in tuple(self._managed_a2a_bootstraps.values()):
|
|
108
|
+
saved = await bootstrap.invocation_checkpoint_store.read(scope_id)
|
|
109
|
+
if saved is None:
|
|
110
|
+
continue
|
|
111
|
+
if (saved.handle.session_id != self.session_id
|
|
112
|
+
or saved.handle.run_id != self.run_id
|
|
113
|
+
or saved.request.context.caller_agent_id
|
|
114
|
+
!= bootstrap.runtime_metadata.agent_id):
|
|
115
|
+
raise ValueError("A2A_SCOPE_OWNER_CONFLICT")
|
|
116
|
+
service = bootstrap.invocation_service_for_space(
|
|
117
|
+
saved.request.spec.space_id, event_store=self,
|
|
118
|
+
policy=self.managed_invocation_policy(),
|
|
119
|
+
)
|
|
120
|
+
# cancel() re-reads under a lease, or atomically records intent when
|
|
121
|
+
# the active invocation owns it; this unlocked read grants no write.
|
|
122
|
+
return await service.cancel(saved.handle)
|
|
123
|
+
raise KeyError("A2A_INVOCATION_NOT_FOUND")
|
|
124
|
+
|
|
125
|
+
async def persist_one(self, session_id, event):
|
|
126
|
+
self._require(session_id, event.run_id)
|
|
127
|
+
existing = await self._store.resolve_existing(session_id, event)
|
|
128
|
+
# Always use the guarded append, even on a duplicate. An expired owner
|
|
129
|
+
# must not regain publication authority merely because a fact exists.
|
|
130
|
+
persisted = await self._store.append_typed(event, guard=self._guard)
|
|
131
|
+
return persisted, existing is None
|
|
132
|
+
|
|
133
|
+
async def save_runtime_checkpoint(self, checkpoint):
|
|
134
|
+
"""Persist private adapter state under this exact live Kernel owner.
|
|
135
|
+
|
|
136
|
+
Checkpoint contents may include native conversation records; they must
|
|
137
|
+
never be published as SessionEvents or returned as control receipts.
|
|
138
|
+
"""
|
|
139
|
+
self._require(self.session_id, self.run_id)
|
|
140
|
+
save = getattr(self._ledger, "save_runtime_checkpoint", None)
|
|
141
|
+
if not callable(save) or not self._agent:
|
|
142
|
+
raise RuntimeError("runtime checkpoint store is unavailable")
|
|
143
|
+
await save(self.run_id, checkpoint, agent_instance_id=self._agent,
|
|
144
|
+
session_id=self.session_id, guard=self._guard)
|
|
145
|
+
|
|
146
|
+
def runtime_checkpoint_identity(self):
|
|
147
|
+
self._require(self.session_id, self.run_id)
|
|
148
|
+
if not self._agent or not self._tenant:
|
|
149
|
+
raise RuntimeError("runtime checkpoint identity is unavailable")
|
|
150
|
+
return {"agent_instance_id": self._agent, "tenant_id": self._tenant}
|
|
151
|
+
|
|
152
|
+
async def list(self, session_id, *, run_id=None, **kwargs):
|
|
153
|
+
run_id = self.run_id if run_id is None else run_id
|
|
154
|
+
self._require(session_id, run_id)
|
|
155
|
+
return await self._store.list(session_id, run_id=run_id, **kwargs)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
_current: ContextVar[RunEventAuthority | None] = ContextVar("canonical_run_authority", default=None)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def current_run_event_authority():
|
|
162
|
+
return _current.get()
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@contextmanager
|
|
166
|
+
def bind_run_event_authority(authority):
|
|
167
|
+
if authority._used:
|
|
168
|
+
raise RuntimeError("canonical run authority cannot be rebound")
|
|
169
|
+
authority._used = True
|
|
170
|
+
authority._active = True
|
|
171
|
+
token = _current.set(authority)
|
|
172
|
+
try:
|
|
173
|
+
yield authority
|
|
174
|
+
finally:
|
|
175
|
+
authority._active = False
|
|
176
|
+
_current.reset(token)
|
ksadk/harness/__init__.py
CHANGED
|
@@ -22,6 +22,10 @@ _EXPORTS = {
|
|
|
22
22
|
"HarnessReasoningTurn": ("ksadk.harness.reasoner", "HarnessReasoningTurn"),
|
|
23
23
|
"HarnessToolCall": ("ksadk.harness.reasoner", "HarnessToolCall"),
|
|
24
24
|
"LiteLLMHarnessReasoner": ("ksadk.harness.reasoner", "LiteLLMHarnessReasoner"),
|
|
25
|
+
"ModelGatewayHarnessReasoner": (
|
|
26
|
+
"ksadk.harness.reasoner",
|
|
27
|
+
"ModelGatewayHarnessReasoner",
|
|
28
|
+
),
|
|
25
29
|
"AcceptanceCheck": ("ksadk.harness.run_control", "AcceptanceCheck"),
|
|
26
30
|
"MilestoneSpec": ("ksadk.harness.run_control", "MilestoneSpec"),
|
|
27
31
|
"RunControlSpec": ("ksadk.harness.run_control", "RunControlSpec"),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Host adapters for Native ArtifactPort implementations."""
|