agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""历史消息载荷解析与有序正文块投影。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping, Sequence
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _event_metadata(event: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
10
|
+
metadata = event.get("Metadata")
|
|
11
|
+
return metadata if isinstance(metadata, Mapping) else {}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _event_text(event: Mapping[str, Any]) -> str:
|
|
15
|
+
content = event.get("Content")
|
|
16
|
+
if isinstance(content, str):
|
|
17
|
+
return content
|
|
18
|
+
if not isinstance(content, Mapping):
|
|
19
|
+
return ""
|
|
20
|
+
if content.get("text") is not None:
|
|
21
|
+
return str(content.get("text") or "")
|
|
22
|
+
return "".join(
|
|
23
|
+
str(part.get("text") or "")
|
|
24
|
+
for part in content.get("parts") or []
|
|
25
|
+
if isinstance(part, Mapping)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _project_interleaved_blocks(
|
|
30
|
+
events: Sequence[Mapping[str, Any]],
|
|
31
|
+
*,
|
|
32
|
+
tool_events: Sequence[Mapping[str, Any]],
|
|
33
|
+
expected_text: str | None = None,
|
|
34
|
+
) -> list[dict[str, Any]]:
|
|
35
|
+
"""Reconstruct ordered chat blocks from persisted streaming events.
|
|
36
|
+
|
|
37
|
+
``assistant_stream_snapshot`` carries a cumulative text value. The delta
|
|
38
|
+
relative to the prior snapshot is the text emitted at that point in the
|
|
39
|
+
event sequence. Reasoning events written before that snapshot can
|
|
40
|
+
therefore be replayed as ``thinking → text → thinking → text`` instead of
|
|
41
|
+
being flattened into the legacy ``Reasoning`` and ``Content`` fields.
|
|
42
|
+
|
|
43
|
+
Older transcripts wrote all reasoning only at terminal time. Their first
|
|
44
|
+
reasoning event appears after streamed text, so their original boundaries
|
|
45
|
+
are unknowable. Return no blocks for those transcripts and let clients
|
|
46
|
+
use the existing best-effort compatibility projection.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
blocks: list[dict[str, Any]] = []
|
|
50
|
+
latest_snapshot_text = ""
|
|
51
|
+
saw_stream_text = False
|
|
52
|
+
saw_reasoning_after_stream_text = False
|
|
53
|
+
tools_by_seq_id = {
|
|
54
|
+
int(tool.get("SeqId") or 0): tool for tool in tool_events if int(tool.get("SeqId") or 0) > 0
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
def append_text(text: str, seq_id: Any) -> None:
|
|
58
|
+
if not text:
|
|
59
|
+
return
|
|
60
|
+
if blocks and blocks[-1].get("Type") == "text":
|
|
61
|
+
blocks[-1]["Content"] = f"{blocks[-1].get('Content') or ''}{text}"
|
|
62
|
+
return
|
|
63
|
+
blocks.append({"Type": "text", "Content": text, "SeqId": seq_id})
|
|
64
|
+
|
|
65
|
+
def append_thinking(text: str, seq_id: Any) -> None:
|
|
66
|
+
if not text:
|
|
67
|
+
return
|
|
68
|
+
if blocks and blocks[-1].get("Type") == "thinking":
|
|
69
|
+
blocks[-1]["Content"] = f"{blocks[-1].get('Content') or ''}{text}"
|
|
70
|
+
return
|
|
71
|
+
blocks.append({"Type": "thinking", "Content": text, "SeqId": seq_id})
|
|
72
|
+
|
|
73
|
+
def append_tool(event: Mapping[str, Any]) -> None:
|
|
74
|
+
tool = tools_by_seq_id.get(int(event.get("SeqId") or 0))
|
|
75
|
+
if not tool:
|
|
76
|
+
return
|
|
77
|
+
blocks.append(
|
|
78
|
+
{
|
|
79
|
+
"Type": "tool",
|
|
80
|
+
"SeqId": tool.get("SeqId"),
|
|
81
|
+
"Name": tool.get("Name") or "tool",
|
|
82
|
+
"Args": tool.get("Args"),
|
|
83
|
+
"Result": tool.get("Result"),
|
|
84
|
+
"Status": tool.get("Status") or "completed",
|
|
85
|
+
"ToolCallId": tool.get("ToolCallId"),
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
for event in events:
|
|
90
|
+
event_type = str(event.get("EventType") or "")
|
|
91
|
+
text = _event_text(event)
|
|
92
|
+
seq_id = event.get("SeqId")
|
|
93
|
+
|
|
94
|
+
if event_type == "reasoning":
|
|
95
|
+
metadata = _event_metadata(event)
|
|
96
|
+
if saw_stream_text and metadata.get("stream_boundary") != "before_text":
|
|
97
|
+
saw_reasoning_after_stream_text = True
|
|
98
|
+
append_thinking(text, seq_id)
|
|
99
|
+
continue
|
|
100
|
+
if event_type == "tool_call":
|
|
101
|
+
append_tool(event)
|
|
102
|
+
continue
|
|
103
|
+
if event_type == "assistant_stream_delta":
|
|
104
|
+
append_text(text, seq_id)
|
|
105
|
+
latest_snapshot_text += text
|
|
106
|
+
saw_stream_text = saw_stream_text or bool(text)
|
|
107
|
+
continue
|
|
108
|
+
if event_type == "assistant_stream_snapshot":
|
|
109
|
+
if text.startswith(latest_snapshot_text):
|
|
110
|
+
append_text(text[len(latest_snapshot_text) :], seq_id)
|
|
111
|
+
elif text != latest_snapshot_text:
|
|
112
|
+
# A replacement snapshot has no safe incremental boundary.
|
|
113
|
+
# Keep the latest content as a standalone text block instead
|
|
114
|
+
# of duplicating already-replayed output.
|
|
115
|
+
append_text(text, seq_id)
|
|
116
|
+
latest_snapshot_text = text
|
|
117
|
+
saw_stream_text = saw_stream_text or bool(text)
|
|
118
|
+
continue
|
|
119
|
+
if event_type == "assistant_message":
|
|
120
|
+
if latest_snapshot_text and text.startswith(latest_snapshot_text):
|
|
121
|
+
append_text(text[len(latest_snapshot_text) :], seq_id)
|
|
122
|
+
elif not latest_snapshot_text:
|
|
123
|
+
append_text(text, seq_id)
|
|
124
|
+
|
|
125
|
+
if saw_reasoning_after_stream_text:
|
|
126
|
+
return []
|
|
127
|
+
# A run can contain multiple message items, and a terminal snapshot can
|
|
128
|
+
# replace streamed text. Without reliable boundaries, use the existing
|
|
129
|
+
# Content/Reasoning/ToolEvents projection instead of displaying stale or
|
|
130
|
+
# whole-run text for one message.
|
|
131
|
+
if (
|
|
132
|
+
expected_text is not None
|
|
133
|
+
and "".join(block["Content"] for block in blocks if block["Type"] == "text")
|
|
134
|
+
!= expected_text
|
|
135
|
+
):
|
|
136
|
+
return []
|
|
137
|
+
return blocks
|
|
@@ -132,7 +132,7 @@ def _extract_input_modalities(raw_model: Mapping[str, Any]) -> list[str]:
|
|
|
132
132
|
if not isinstance(architecture, Mapping):
|
|
133
133
|
return []
|
|
134
134
|
modalities = architecture.get("input_modalities")
|
|
135
|
-
if not isinstance(modalities, list):
|
|
135
|
+
if not isinstance(modalities, (list, tuple)):
|
|
136
136
|
return []
|
|
137
137
|
|
|
138
138
|
normalized: list[str] = []
|
|
@@ -144,11 +144,19 @@ def _extract_input_modalities(raw_model: Mapping[str, Any]) -> list[str]:
|
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
def supports_native_image_input(model_metadata: Mapping[str, Any] | None) -> bool:
|
|
147
|
+
"""Resolve the locked declaration once; explicit flags precede modalities.
|
|
148
|
+
|
|
149
|
+
Canonical capabilities take precedence over the legacy Studio spelling.
|
|
150
|
+
Unknown names or truthy non-booleans never grant image input. Frozen Build
|
|
151
|
+
tuples have the same meaning as the discovery payload's JSON arrays.
|
|
152
|
+
"""
|
|
147
153
|
if not isinstance(model_metadata, Mapping):
|
|
148
154
|
return False
|
|
149
155
|
capabilities = model_metadata.get("capabilities")
|
|
150
156
|
if isinstance(capabilities, Mapping) and capabilities.get("multimodal_input_image") is not None:
|
|
151
|
-
return
|
|
157
|
+
return capabilities.get("multimodal_input_image") is True
|
|
158
|
+
if model_metadata.get("supports_image_input") is not None:
|
|
159
|
+
return model_metadata.get("supports_image_input") is True
|
|
152
160
|
return "image" in _extract_input_modalities(model_metadata)
|
|
153
161
|
|
|
154
162
|
|
|
@@ -387,9 +395,9 @@ def normalize_model_metadata(raw_model: Mapping[str, Any] | str | None) -> dict[
|
|
|
387
395
|
**dict(base.get("capabilities") or {}),
|
|
388
396
|
}
|
|
389
397
|
if input_modalities:
|
|
390
|
-
capabilities["multimodal_input_image"] = "image" in input_modalities
|
|
391
398
|
capabilities["multimodal_input_video"] = "video" in input_modalities
|
|
392
399
|
capabilities["multimodal_input_file"] = "file" in input_modalities
|
|
400
|
+
capabilities["multimodal_input_image"] = supports_native_image_input(base)
|
|
393
401
|
limits = {
|
|
394
402
|
**DEFAULT_MODEL_LIMITS,
|
|
395
403
|
**dict(base.get("limits") or {}),
|
ksadk/conversations/projector.py
CHANGED
|
@@ -93,6 +93,12 @@ def project_conversation_item(
|
|
|
93
93
|
schema = "conversation.item.tool-call/v1"
|
|
94
94
|
payload = _tool_payload(event.initial)
|
|
95
95
|
capability_ref = "tool.inspect"
|
|
96
|
+
elif isinstance(event, ItemSnapshotReplaced) and event.item_kind == "tool_call":
|
|
97
|
+
kind = "tool_call"
|
|
98
|
+
operation = "replace"
|
|
99
|
+
schema = "conversation.item.tool-call/v1"
|
|
100
|
+
payload = _tool_payload(event.snapshot)
|
|
101
|
+
capability_ref = "tool.inspect"
|
|
96
102
|
elif isinstance(event, ItemCompleted) and event.item_kind == "tool_call":
|
|
97
103
|
kind = "tool_call"
|
|
98
104
|
operation = "completed"
|
|
@@ -100,6 +106,12 @@ def project_conversation_item(
|
|
|
100
106
|
schema = "conversation.item.tool-call/v1"
|
|
101
107
|
payload = _tool_payload(event.snapshot)
|
|
102
108
|
capability_ref = "tool.inspect"
|
|
109
|
+
elif isinstance(event, (ItemUpdated, ItemSnapshotReplaced)) and event.item_kind == "tool_call":
|
|
110
|
+
kind = "tool_call"
|
|
111
|
+
operation = event.op if isinstance(event, ItemUpdated) else "replace"
|
|
112
|
+
schema = "conversation.item.tool-call/v1"
|
|
113
|
+
payload = _tool_payload(_item_snapshot(event))
|
|
114
|
+
capability_ref = "tool.inspect"
|
|
103
115
|
elif (
|
|
104
116
|
isinstance(event, (ItemStarted, ItemUpdated, ItemSnapshotReplaced, ItemCompleted))
|
|
105
117
|
and event.item_kind == "tool_result"
|
|
@@ -253,6 +265,8 @@ def project_conversation_item(
|
|
|
253
265
|
"status": "failed" if isinstance(event, RunFailed) else "canceled",
|
|
254
266
|
"error": event.error.message if isinstance(event, RunFailed) else event.reason or "",
|
|
255
267
|
}
|
|
268
|
+
if isinstance(event, RunFailed):
|
|
269
|
+
payload["errorCode"] = event.error.code
|
|
256
270
|
elif isinstance(event, (ContinuationCreated, ContinuationResumed)):
|
|
257
271
|
kind = "progress"
|
|
258
272
|
schema = "conversation.item.checkpoint/v1"
|
|
@@ -310,6 +324,16 @@ def project_conversation_item(
|
|
|
310
324
|
"eventType": event.event_type,
|
|
311
325
|
"summary": "This content requires a newer renderer.",
|
|
312
326
|
}
|
|
327
|
+
if isinstance(event, (RunCompleted, RunFailed, RunCanceled, RunInterrupted)):
|
|
328
|
+
payload.update(_run_outcome_payload(event.source.metadata))
|
|
329
|
+
if kind == "tool_call" and event.source.metadata.get("engine_kind") == "native":
|
|
330
|
+
# Native public results contain a sealed execution status, not arbitrary
|
|
331
|
+
# business output. An approval receipt is nonterminal even in old logs
|
|
332
|
+
# which incorrectly wrapped it in ItemCompleted. Never rewrite the log.
|
|
333
|
+
output = payload.get("output")
|
|
334
|
+
if isinstance(output, dict) and output.get("status") == "approval_required":
|
|
335
|
+
operation, lifecycle = "replace", "pending"
|
|
336
|
+
payload["executionStatus"] = "approval_required"
|
|
313
337
|
return ConversationItem(
|
|
314
338
|
item_id=item_id,
|
|
315
339
|
source_event_ids=(event.event_id,),
|
|
@@ -330,6 +354,44 @@ def project_conversation_item(
|
|
|
330
354
|
)
|
|
331
355
|
|
|
332
356
|
|
|
357
|
+
def _run_outcome_payload(metadata: Mapping[str, Any]) -> dict[str, Any]:
|
|
358
|
+
"""Project explicit acceptance facts; completion alone does not prove them.
|
|
359
|
+
|
|
360
|
+
Provider metadata is not a public payload. Only the terminal outcome contract
|
|
361
|
+
is admitted here; arbitrary diagnostics, reasoning and report contents stay
|
|
362
|
+
outside the conversation. Keep legacy terminal events without this contract.
|
|
363
|
+
"""
|
|
364
|
+
outcome = metadata.get("outcome")
|
|
365
|
+
if not isinstance(outcome, str) or outcome not in {
|
|
366
|
+
"verified",
|
|
367
|
+
"unverified",
|
|
368
|
+
"partial",
|
|
369
|
+
"blocked",
|
|
370
|
+
}:
|
|
371
|
+
return {}
|
|
372
|
+
payload: dict[str, Any] = {"outcome": outcome}
|
|
373
|
+
for source, target in (
|
|
374
|
+
("reason", "reason"),
|
|
375
|
+
("contract_revision", "contractRevision"),
|
|
376
|
+
("verification_report_ref", "verificationReportRef"),
|
|
377
|
+
):
|
|
378
|
+
value = metadata.get(source)
|
|
379
|
+
if isinstance(value, str) and value:
|
|
380
|
+
payload[target] = value
|
|
381
|
+
items = metadata.get("verification_items")
|
|
382
|
+
if isinstance(items, list):
|
|
383
|
+
payload["verificationItems"] = [
|
|
384
|
+
{"acceptanceId": row["acceptance_id"], "status": row["status"]}
|
|
385
|
+
for row in items
|
|
386
|
+
if isinstance(row, dict)
|
|
387
|
+
and isinstance(row.get("acceptance_id"), str)
|
|
388
|
+
and row["acceptance_id"]
|
|
389
|
+
and isinstance(row.get("status"), str)
|
|
390
|
+
and row.get("status") in {"passed", "failed", "not_run", "blocked"}
|
|
391
|
+
]
|
|
392
|
+
return payload
|
|
393
|
+
|
|
394
|
+
|
|
333
395
|
def project_interaction_conversation_item(
|
|
334
396
|
envelope: SessionEventEnvelope,
|
|
335
397
|
) -> ConversationItem | None:
|
|
@@ -604,6 +666,7 @@ def _native_ref(event: RuntimeEvent) -> dict[str, Any]:
|
|
|
604
666
|
"protocol": source.protocol,
|
|
605
667
|
"eventId": source.native_event_id,
|
|
606
668
|
"cursor": source.native_cursor,
|
|
669
|
+
"timestamp": event.timestamp,
|
|
607
670
|
"runId": source.native_run_id,
|
|
608
671
|
"itemId": source.native_item_id,
|
|
609
672
|
}.items()
|
|
@@ -231,7 +231,10 @@ async def preview_auto_compaction(
|
|
|
231
231
|
|
|
232
232
|
provider = session_service_provider or resolve_session_service
|
|
233
233
|
service = provider()
|
|
234
|
-
|
|
234
|
+
# Attachment context lives in state; authorization/preview do not need a
|
|
235
|
+
# second complete transcript before the explicit get_events below.
|
|
236
|
+
read_metadata = getattr(service, "get_session_metadata", None) or service.get_session
|
|
237
|
+
existing_session = await read_metadata(session_id)
|
|
235
238
|
if not existing_session:
|
|
236
239
|
return CompactionPlan(
|
|
237
240
|
should_compact=False,
|
|
@@ -378,7 +381,9 @@ async def compact_conversation_history(
|
|
|
378
381
|
provider = session_service_provider or resolve_session_service
|
|
379
382
|
service = provider()
|
|
380
383
|
events = await service.get_events(session_id)
|
|
381
|
-
|
|
384
|
+
header_reader = getattr(service, "get_session_header", None) or getattr(
|
|
385
|
+
service, "get_session_metadata", None) or service.get_session
|
|
386
|
+
session = await header_reader(session_id)
|
|
382
387
|
memory_user_id = str(getattr(session, "user_id", "") or "")
|
|
383
388
|
plan = _plan_compaction(
|
|
384
389
|
events,
|
|
@@ -750,10 +750,22 @@ async def _auto_save_ltm_turn(
|
|
|
750
750
|
) -> None:
|
|
751
751
|
if prepared.resume_input is not None:
|
|
752
752
|
return
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
if not memory_rollout
|
|
753
|
+
from ksadk.memory.resolved_policy import resolve_memory_policy
|
|
754
|
+
|
|
755
|
+
memory_rollout = prepared.memory_write_rollout
|
|
756
|
+
if not str(memory_rollout or "").strip():
|
|
757
|
+
memory_rollout = "enabled" if _ltm_auto_save_enabled() else "off"
|
|
758
|
+
# Old callers have no MemorySpec and retain the SDK auto-save fallback.
|
|
759
|
+
# Explicit Build switches always govern before opening a memory service.
|
|
760
|
+
policy = resolve_memory_policy(
|
|
761
|
+
memory_enabled=True if prepared.memory_enabled is None else prepared.memory_enabled,
|
|
762
|
+
recall_enabled=prepared.memory_recall_enabled,
|
|
763
|
+
write_rollout=memory_rollout,
|
|
764
|
+
write_mode=prepared.memory_write_mode,
|
|
765
|
+
flush_before_compaction=prepared.flush_before_compaction,
|
|
766
|
+
provider_ref=prepared.provider_ref,
|
|
767
|
+
)
|
|
768
|
+
if not policy.should_flush:
|
|
757
769
|
return
|
|
758
770
|
|
|
759
771
|
metadata: dict[str, Any] = {
|
|
@@ -217,6 +217,8 @@ def extract_responses_resume_input(input_payload: Any) -> dict[str, Any] | None:
|
|
|
217
217
|
approval_resume: dict[str, Any] = {"type": "mcp_approval_response"}
|
|
218
218
|
if item.get("id"):
|
|
219
219
|
approval_resume["id"] = str(item.get("id"))
|
|
220
|
+
if item.get("checkpoint_id"):
|
|
221
|
+
approval_resume["checkpoint_id"] = str(item.get("checkpoint_id"))
|
|
220
222
|
approval_request_id = item.get("approval_request_id")
|
|
221
223
|
if approval_request_id:
|
|
222
224
|
approval_resume["approval_request_id"] = str(approval_request_id)
|
|
@@ -243,6 +245,8 @@ def extract_responses_resume_input(input_payload: Any) -> dict[str, Any] | None:
|
|
|
243
245
|
|
|
244
246
|
if item_type in {"ksadk_resume", "ksadk.approval_response"}:
|
|
245
247
|
ksadk_resume: dict[str, Any] = {"type": "ksadk_resume"}
|
|
248
|
+
if item.get("checkpoint_id"):
|
|
249
|
+
ksadk_resume["checkpoint_id"] = str(item.get("checkpoint_id"))
|
|
246
250
|
interrupt_id = (
|
|
247
251
|
item.get("interrupt_id") or item.get("approval_request_id") or item.get("id")
|
|
248
252
|
)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import hashlib
|
|
3
4
|
import time
|
|
4
5
|
import uuid
|
|
5
6
|
from typing import Any, Callable, Mapping, Optional, Sequence, cast
|
|
@@ -21,6 +22,7 @@ from ksadk.conversations.runtime_constants import (
|
|
|
21
22
|
from ksadk.conversations.runtime_observability import _extract_deferred_tool_names
|
|
22
23
|
from ksadk.runtime_context import TRUSTED_IDENTITY_METADATA_KEY, PlatformIdentityContext
|
|
23
24
|
from ksadk.sessions import Session, SessionEvent, resolve_session_service
|
|
25
|
+
from ksadk.sessions.agent_identity import session_agent_ids
|
|
24
26
|
from ksadk.sessions.invocation_identity import (
|
|
25
27
|
bind_or_validate_session_identity,
|
|
26
28
|
identity_native_user_id,
|
|
@@ -100,7 +102,7 @@ async def require_conversation_session(
|
|
|
100
102
|
existing = await service.get_session_metadata(session_id)
|
|
101
103
|
if existing is None:
|
|
102
104
|
raise HTTPException(status_code=404, detail="Session not found")
|
|
103
|
-
if existing.agent_id
|
|
105
|
+
if existing.agent_id not in session_agent_ids(agent_id):
|
|
104
106
|
if not identity.is_empty:
|
|
105
107
|
raise HTTPException(status_code=404, detail="Session not found")
|
|
106
108
|
raise HTTPException(
|
|
@@ -151,6 +153,7 @@ async def append_conversation_event(
|
|
|
151
153
|
metadata: Optional[dict[str, Any]] = None,
|
|
152
154
|
event_type: Optional[str] = None,
|
|
153
155
|
content: Optional[dict[str, Any]] = None,
|
|
156
|
+
event_id: Optional[str] = None,
|
|
154
157
|
session_service_provider: Callable[[], Any] | None = None,
|
|
155
158
|
) -> SessionEvent:
|
|
156
159
|
"""统一的 canonical event 追加入口。
|
|
@@ -164,7 +167,7 @@ async def append_conversation_event(
|
|
|
164
167
|
session_id,
|
|
165
168
|
SessionEvent.from_dict(
|
|
166
169
|
{
|
|
167
|
-
"id": str(uuid.uuid4()),
|
|
170
|
+
"id": str(event_id or uuid.uuid4()),
|
|
168
171
|
"author": author,
|
|
169
172
|
"event_type": event_type or canonical_event_type(None, author=author, role=role),
|
|
170
173
|
"invocationId": invocation_id,
|
|
@@ -427,6 +430,115 @@ async def append_run_checkpoint_event(
|
|
|
427
430
|
)
|
|
428
431
|
|
|
429
432
|
|
|
433
|
+
def _resume_event_id(
|
|
434
|
+
session_id: str, resume_attempt_id: str
|
|
435
|
+
) -> str:
|
|
436
|
+
"""Return the stable physical id for one session-scoped resume attempt."""
|
|
437
|
+
|
|
438
|
+
# The attempt id is the semantic idempotency key. Keep the physical key
|
|
439
|
+
# independent of checkpoint details so a concurrent reuse of an attempt
|
|
440
|
+
# cannot create two rows before the collision validator runs.
|
|
441
|
+
identity = "\x1f".join((session_id, resume_attempt_id))
|
|
442
|
+
return "resume_" + hashlib.sha256(identity.encode("utf-8")).hexdigest()
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def _resume_identity_matches(
|
|
446
|
+
event: SessionEvent,
|
|
447
|
+
*,
|
|
448
|
+
run_id: str,
|
|
449
|
+
checkpoint_id: str,
|
|
450
|
+
resume_attempt_id: str,
|
|
451
|
+
framework: str,
|
|
452
|
+
framework_ref: Mapping[str, Any],
|
|
453
|
+
) -> None:
|
|
454
|
+
identity = _resume_event_identity(event)
|
|
455
|
+
expected = (run_id, checkpoint_id, resume_attempt_id)
|
|
456
|
+
if identity is None or identity[:3] != expected:
|
|
457
|
+
raise ValueError(
|
|
458
|
+
f"resume_attempt_id {resume_attempt_id!r} is already bound to a different checkpoint"
|
|
459
|
+
)
|
|
460
|
+
actual_framework, actual_framework_ref = identity[3:]
|
|
461
|
+
if actual_framework is not None and actual_framework != framework:
|
|
462
|
+
raise ValueError(
|
|
463
|
+
f"resume_attempt_id {resume_attempt_id!r} is already bound to a different framework"
|
|
464
|
+
)
|
|
465
|
+
if actual_framework_ref is not None and actual_framework_ref != dict(framework_ref):
|
|
466
|
+
raise ValueError(
|
|
467
|
+
f"resume_attempt_id {resume_attempt_id!r} is already bound to a different checkpoint"
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
def _resume_event_identity(
|
|
472
|
+
event: SessionEvent,
|
|
473
|
+
) -> tuple[str, str, str, str | None, dict[str, Any] | None] | None:
|
|
474
|
+
"""Extract resume identity from legacy or canonical checkpoint carriers."""
|
|
475
|
+
|
|
476
|
+
if canonical_event_type(event.event_type) == "run_resume":
|
|
477
|
+
metadata = event.metadata or {}
|
|
478
|
+
run_id = str(metadata.get("run_id") or "").strip()
|
|
479
|
+
checkpoint_id = str(metadata.get("checkpoint_id") or "").strip()
|
|
480
|
+
resume_attempt_id = str(metadata.get("resume_attempt_id") or "").strip()
|
|
481
|
+
if not (run_id and checkpoint_id and resume_attempt_id):
|
|
482
|
+
return None
|
|
483
|
+
framework = str(metadata.get("framework") or "").strip() or None
|
|
484
|
+
framework_ref = metadata.get("framework_ref")
|
|
485
|
+
return (
|
|
486
|
+
run_id,
|
|
487
|
+
checkpoint_id,
|
|
488
|
+
resume_attempt_id,
|
|
489
|
+
framework,
|
|
490
|
+
dict(framework_ref) if isinstance(framework_ref, Mapping) else None,
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
if event.event_type != "continuation.resumed":
|
|
494
|
+
return None
|
|
495
|
+
payload = (event.content or {}).get("runtime_event")
|
|
496
|
+
if not isinstance(payload, Mapping):
|
|
497
|
+
envelope = (event.content or {}).get("session_event")
|
|
498
|
+
payload = envelope.get("payload") if isinstance(envelope, Mapping) else None
|
|
499
|
+
if not isinstance(payload, Mapping) or payload.get("continuation_kind") != "graph_checkpoint":
|
|
500
|
+
return None
|
|
501
|
+
run_id = str(payload.get("run_id") or "").strip()
|
|
502
|
+
checkpoint_id = str(payload.get("continuation_id") or "").strip()
|
|
503
|
+
resume_attempt_id = str(payload.get("resume_attempt_id") or "").strip()
|
|
504
|
+
if not (run_id and checkpoint_id and resume_attempt_id):
|
|
505
|
+
return None
|
|
506
|
+
source = payload.get("source")
|
|
507
|
+
framework = str(source.get("framework") or "").strip() if isinstance(source, Mapping) else ""
|
|
508
|
+
return run_id, checkpoint_id, resume_attempt_id, framework or None, None
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
async def find_resume_attempt_event(
|
|
512
|
+
service: Any,
|
|
513
|
+
session_id: str,
|
|
514
|
+
*,
|
|
515
|
+
resume_attempt_id: str,
|
|
516
|
+
run_id: str | None = None,
|
|
517
|
+
checkpoint_id: str | None = None,
|
|
518
|
+
) -> SessionEvent | None:
|
|
519
|
+
"""Find a prior legacy or canonical resume fact for idempotent API retries."""
|
|
520
|
+
|
|
521
|
+
attempt_id = str(resume_attempt_id).strip()
|
|
522
|
+
if not attempt_id:
|
|
523
|
+
return None
|
|
524
|
+
|
|
525
|
+
def predicate(event: SessionEvent) -> bool:
|
|
526
|
+
identity = _resume_event_identity(event)
|
|
527
|
+
if identity is None or identity[2] != attempt_id:
|
|
528
|
+
return False
|
|
529
|
+
if run_id is not None and identity[0] != str(run_id).strip():
|
|
530
|
+
raise ValueError(
|
|
531
|
+
f"resume_attempt_id {attempt_id!r} is already bound to a different run"
|
|
532
|
+
)
|
|
533
|
+
if checkpoint_id is not None and identity[1] != str(checkpoint_id).strip():
|
|
534
|
+
raise ValueError(
|
|
535
|
+
f"resume_attempt_id {attempt_id!r} is already bound to a different checkpoint"
|
|
536
|
+
)
|
|
537
|
+
return True
|
|
538
|
+
|
|
539
|
+
return await _find_latest_session_event(service, session_id, predicate)
|
|
540
|
+
|
|
541
|
+
|
|
430
542
|
async def append_run_resume_event(
|
|
431
543
|
*,
|
|
432
544
|
session_id: str,
|
|
@@ -440,33 +552,89 @@ async def append_run_resume_event(
|
|
|
440
552
|
metadata: Optional[dict[str, Any]] = None,
|
|
441
553
|
session_service_provider: Callable[[], Any] | None = None,
|
|
442
554
|
) -> SessionEvent:
|
|
555
|
+
service = (session_service_provider or resolve_session_service)()
|
|
556
|
+
run_id = str(run_id).strip()
|
|
557
|
+
checkpoint_id = str(checkpoint_id).strip()
|
|
558
|
+
resume_attempt_id = str(resume_attempt_id).strip()
|
|
559
|
+
framework = str(framework).strip()
|
|
560
|
+
if not all((session_id.strip(), run_id, checkpoint_id, resume_attempt_id, framework)):
|
|
561
|
+
raise ValueError(
|
|
562
|
+
"session_id, run_id, checkpoint_id, resume_attempt_id, and framework are required"
|
|
563
|
+
)
|
|
564
|
+
framework_ref_dict = dict(framework_ref)
|
|
565
|
+
|
|
566
|
+
# ``resume_attempt_id`` is the caller's idempotency key. Invocation ids
|
|
567
|
+
# identify a transport execution and may legitimately change on retry.
|
|
568
|
+
existing = await find_resume_attempt_event(
|
|
569
|
+
service,
|
|
570
|
+
session_id,
|
|
571
|
+
resume_attempt_id=resume_attempt_id,
|
|
572
|
+
run_id=run_id,
|
|
573
|
+
checkpoint_id=checkpoint_id,
|
|
574
|
+
)
|
|
575
|
+
if existing is not None:
|
|
576
|
+
_resume_identity_matches(
|
|
577
|
+
existing,
|
|
578
|
+
run_id=run_id,
|
|
579
|
+
checkpoint_id=checkpoint_id,
|
|
580
|
+
resume_attempt_id=resume_attempt_id,
|
|
581
|
+
framework=framework,
|
|
582
|
+
framework_ref=framework_ref_dict,
|
|
583
|
+
)
|
|
584
|
+
return existing
|
|
585
|
+
|
|
443
586
|
event_metadata = dict(metadata or {})
|
|
444
587
|
event_metadata.update(
|
|
445
588
|
{
|
|
446
|
-
"run_id":
|
|
447
|
-
"checkpoint_id":
|
|
448
|
-
"resume_attempt_id":
|
|
449
|
-
"framework":
|
|
450
|
-
"framework_ref":
|
|
589
|
+
"run_id": run_id,
|
|
590
|
+
"checkpoint_id": checkpoint_id,
|
|
591
|
+
"resume_attempt_id": resume_attempt_id,
|
|
592
|
+
"framework": framework,
|
|
593
|
+
"framework_ref": framework_ref_dict,
|
|
451
594
|
}
|
|
452
595
|
)
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
"
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
596
|
+
event_id = _resume_event_id(session_id, resume_attempt_id)
|
|
597
|
+
try:
|
|
598
|
+
return await append_conversation_event(
|
|
599
|
+
session_id=session_id,
|
|
600
|
+
author=author,
|
|
601
|
+
role="model",
|
|
602
|
+
text="checkpoint resume requested",
|
|
603
|
+
invocation_id=invocation_id,
|
|
604
|
+
event_type="run_resume",
|
|
605
|
+
event_id=event_id,
|
|
606
|
+
content={
|
|
607
|
+
"status": "resuming",
|
|
608
|
+
"run_id": run_id,
|
|
609
|
+
"checkpoint_id": checkpoint_id,
|
|
610
|
+
"resume_attempt_id": resume_attempt_id,
|
|
611
|
+
"framework": framework,
|
|
612
|
+
},
|
|
613
|
+
metadata=event_metadata,
|
|
614
|
+
session_service_provider=lambda: service,
|
|
615
|
+
)
|
|
616
|
+
except Exception:
|
|
617
|
+
# A concurrent retry can win the deterministic insert. Re-read the
|
|
618
|
+
# winner and absorb only an identical attempt; unrelated failures stay
|
|
619
|
+
# visible to the caller.
|
|
620
|
+
existing = await find_resume_attempt_event(
|
|
621
|
+
service,
|
|
622
|
+
session_id,
|
|
623
|
+
resume_attempt_id=resume_attempt_id,
|
|
624
|
+
run_id=run_id,
|
|
625
|
+
checkpoint_id=checkpoint_id,
|
|
626
|
+
)
|
|
627
|
+
if existing is None:
|
|
628
|
+
raise
|
|
629
|
+
_resume_identity_matches(
|
|
630
|
+
existing,
|
|
631
|
+
run_id=run_id,
|
|
632
|
+
checkpoint_id=checkpoint_id,
|
|
633
|
+
resume_attempt_id=resume_attempt_id,
|
|
634
|
+
framework=framework,
|
|
635
|
+
framework_ref=framework_ref_dict,
|
|
636
|
+
)
|
|
637
|
+
return existing
|
|
470
638
|
|
|
471
639
|
|
|
472
640
|
async def append_reasoning_event(
|