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,66 @@
|
|
|
1
|
+
"""Host control of a waiting owned child, using the original command ledger.
|
|
2
|
+
|
|
3
|
+
OpenCode fe3f3a41 task.ts races foreground waiting with promotion of the same
|
|
4
|
+
background owner. Promotion changes delivery only; it never launches a Run,
|
|
5
|
+
replays a tool, changes authorization or settles the child's usage.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Protocol
|
|
9
|
+
|
|
10
|
+
from pydantic import Field
|
|
11
|
+
|
|
12
|
+
from .state import Contract, RunSnapshot
|
|
13
|
+
from .transitions import commit_transition
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ChildPromotionInput(Contract):
|
|
17
|
+
child_run_id: str = Field(min_length=1, max_length=256, pattern=r"\S")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ChildPromotionPort(Protocol):
|
|
21
|
+
def child_tasks(self, parent: RunSnapshot) -> tuple[dict, ...]: ...
|
|
22
|
+
|
|
23
|
+
def can_promote(self, parent: RunSnapshot, child_run_id: str) -> bool: ...
|
|
24
|
+
|
|
25
|
+
def release_foreground(self, parent: RunSnapshot, child_run_id: str) -> None: ...
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def consume_promotion(snapshot, command, *, enabled: bool, port: ChildPromotionPort | None, commit):
|
|
29
|
+
"""Persist the delivery fact before waking the same child owner's waiter."""
|
|
30
|
+
reason, child_id = "child_promotion_policy_unavailable", None
|
|
31
|
+
if enabled:
|
|
32
|
+
try:
|
|
33
|
+
child_id = ChildPromotionInput.model_validate(command.payload).child_run_id
|
|
34
|
+
except ValueError:
|
|
35
|
+
reason = "invalid_child_promotion"
|
|
36
|
+
else:
|
|
37
|
+
reason = (
|
|
38
|
+
"applied"
|
|
39
|
+
if port.can_promote(snapshot, child_id)
|
|
40
|
+
else "foreground_child_unavailable"
|
|
41
|
+
)
|
|
42
|
+
updated = commit(
|
|
43
|
+
snapshot,
|
|
44
|
+
commit_transition(
|
|
45
|
+
snapshot,
|
|
46
|
+
snapshot,
|
|
47
|
+
"command.consumed",
|
|
48
|
+
{"command_id": command.command_id, "kind": command.kind, "reason": reason},
|
|
49
|
+
command_id=command.command_id,
|
|
50
|
+
extra_events=(
|
|
51
|
+
(
|
|
52
|
+
"child.promoted",
|
|
53
|
+
{
|
|
54
|
+
"command_id": command.command_id,
|
|
55
|
+
"child_run_id": child_id,
|
|
56
|
+
"operation_key": snapshot.pending_intent,
|
|
57
|
+
},
|
|
58
|
+
),
|
|
59
|
+
)
|
|
60
|
+
if reason == "applied"
|
|
61
|
+
else (),
|
|
62
|
+
),
|
|
63
|
+
)
|
|
64
|
+
if reason == "applied":
|
|
65
|
+
port.release_foreground(updated, child_id)
|
|
66
|
+
return updated
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Resolve a control command against any pending effect before one atomic commit."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from ksadk.harness.stores.native_contract import RunStore
|
|
6
|
+
|
|
7
|
+
from .machine import reduce_command
|
|
8
|
+
from .model_runtime import unavailable_uncertain_usage
|
|
9
|
+
from .ports import RunConfiguration
|
|
10
|
+
from .state import CommitBatch, EffectReceipt, RunCommand, RunPhase, RunScope, RunSnapshot
|
|
11
|
+
from .tool_interruption import record_tool_interruption
|
|
12
|
+
from .transitions import commit_transition, finish, insert_event_before_terminal
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def resolve_command_batch(
|
|
16
|
+
store: RunStore,
|
|
17
|
+
scope: RunScope,
|
|
18
|
+
snapshot: RunSnapshot,
|
|
19
|
+
command: RunCommand,
|
|
20
|
+
*,
|
|
21
|
+
bound_tool_names: frozenset[str] | None = None,
|
|
22
|
+
guidance_enabled: bool = False,
|
|
23
|
+
replay_configuration: RunConfiguration | None = None,
|
|
24
|
+
) -> CommitBatch:
|
|
25
|
+
batch = reduce_command(snapshot, command, bound_tool_names=bound_tool_names,
|
|
26
|
+
guidance_enabled=guidance_enabled,
|
|
27
|
+
replay_configuration=replay_configuration)
|
|
28
|
+
key = snapshot.pending_intent
|
|
29
|
+
if batch.snapshot.pending_intent is not None:
|
|
30
|
+
return batch
|
|
31
|
+
if not key:
|
|
32
|
+
return record_tool_interruption(snapshot, batch)
|
|
33
|
+
intent = store.get_intent(scope, snapshot.run_id, key)
|
|
34
|
+
receipt = store.get_receipt(scope, snapshot.run_id, key)
|
|
35
|
+
if receipt is not None or intent is None:
|
|
36
|
+
return record_tool_interruption(snapshot, batch, intent, receipt)
|
|
37
|
+
if intent.status == "running" and intent.kind != "workspace" and command.kind == "steer":
|
|
38
|
+
batch = commit_transition(
|
|
39
|
+
snapshot,
|
|
40
|
+
finish(snapshot, "unverified", "effect_outcome_unknown"),
|
|
41
|
+
"command.consumed",
|
|
42
|
+
{
|
|
43
|
+
"command_id": command.command_id,
|
|
44
|
+
"kind": "steer",
|
|
45
|
+
"reason": "effect_outcome_unknown",
|
|
46
|
+
},
|
|
47
|
+
command_id=command.command_id,
|
|
48
|
+
)
|
|
49
|
+
receipt = EffectReceipt(
|
|
50
|
+
operation_key=key,
|
|
51
|
+
status=(
|
|
52
|
+
"failed" if intent.status == "prepared" or intent.kind == "workspace" else "uncertain"
|
|
53
|
+
),
|
|
54
|
+
result={
|
|
55
|
+
"reason": (
|
|
56
|
+
"not_dispatched"
|
|
57
|
+
if intent.status == "prepared"
|
|
58
|
+
else (
|
|
59
|
+
"read_only_observation_discarded"
|
|
60
|
+
if intent.kind == "workspace"
|
|
61
|
+
else "effect_outcome_unknown"
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
},
|
|
65
|
+
)
|
|
66
|
+
if receipt.status == "uncertain" and intent.kind == "model":
|
|
67
|
+
batch = insert_event_before_terminal(snapshot, batch, unavailable_uncertain_usage(key))
|
|
68
|
+
updated = batch.snapshot
|
|
69
|
+
if intent.status == "running" and intent.kind in {"model", "tool"}:
|
|
70
|
+
counter = "model_calls" if intent.kind == "model" else "tool_calls"
|
|
71
|
+
updated = updated.model_copy(update={
|
|
72
|
+
counter: getattr(snapshot, counter) + intent.loop_attempts,
|
|
73
|
+
})
|
|
74
|
+
return record_tool_interruption(
|
|
75
|
+
snapshot, batch.model_copy(update={"receipts": (receipt,), "snapshot": updated}),
|
|
76
|
+
intent, receipt,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def stage_child_cancellation(store, scope, snapshot, command, *, bound_tool_names):
|
|
81
|
+
"""Close the parent effect, retaining its command until children settle.
|
|
82
|
+
|
|
83
|
+
Reuse ordinary command accounting and protocol closure. The intermediate
|
|
84
|
+
commit is nonterminal, and neither consumes nor re-enqueues cancellation.
|
|
85
|
+
"""
|
|
86
|
+
batch = resolve_command_batch(
|
|
87
|
+
store, scope, snapshot, command, bound_tool_names=bound_tool_names,
|
|
88
|
+
)
|
|
89
|
+
updated = batch.snapshot.model_copy(update={
|
|
90
|
+
"phase": RunPhase.FINALIZING, "outcome": "unverified",
|
|
91
|
+
"reason": "parent_child_cleanup_pending",
|
|
92
|
+
})
|
|
93
|
+
accounting = tuple((event.kind, event.payload) for event in batch.events
|
|
94
|
+
if event.kind.startswith("usage.") or event.kind == "tools.interrupted")
|
|
95
|
+
return commit_transition(
|
|
96
|
+
snapshot, updated, "child.parent_cancel_pending",
|
|
97
|
+
{"command_id": command.command_id, "kind": command.kind},
|
|
98
|
+
receipts=batch.receipts, extra_events=accounting,
|
|
99
|
+
)
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"""Pure completion reduction from a pinned contract and trusted evidence metadata.
|
|
2
|
+
|
|
3
|
+
The host must execute verifiers and resolve evidence before supplying a report.
|
|
4
|
+
Model text, including a final answer, has no authority to produce ``verified``.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Annotated, Literal
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field, JsonValue, model_validator
|
|
12
|
+
|
|
13
|
+
from .output_contract import validate_submission_schema
|
|
14
|
+
|
|
15
|
+
NonBlank = Annotated[str, Field(min_length=1, pattern=r"\S")]
|
|
16
|
+
VerificationMethod = Literal["deterministic", "human", "model_assisted"]
|
|
17
|
+
VerificationStatus = Literal["passed", "failed", "not_run", "blocked"]
|
|
18
|
+
CompletionOutcome = Literal["verified", "unverified", "partial", "blocked"]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class _ContractModel(BaseModel):
|
|
22
|
+
model_config = ConfigDict(frozen=True, extra="forbid")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class VerificationRepairTarget(_ContractModel):
|
|
26
|
+
"""Host diagnosis of the delivery to repair, never a tool permission grant."""
|
|
27
|
+
|
|
28
|
+
kind: Literal["workspace_file", "final_output"]
|
|
29
|
+
path: Annotated[str, Field(min_length=1, max_length=2048)] | None = None
|
|
30
|
+
|
|
31
|
+
@model_validator(mode="after")
|
|
32
|
+
def relative_workspace_path(self) -> VerificationRepairTarget:
|
|
33
|
+
if self.kind == "final_output":
|
|
34
|
+
if self.path is not None:
|
|
35
|
+
raise ValueError("final output target has no workspace path")
|
|
36
|
+
elif (
|
|
37
|
+
self.path is None
|
|
38
|
+
or not self.path.strip()
|
|
39
|
+
or any(c in self.path for c in ("\\", ":"))
|
|
40
|
+
or any(ord(c) < 32 for c in self.path)
|
|
41
|
+
or any(part in {"", ".", ".."} for part in self.path.split("/"))
|
|
42
|
+
):
|
|
43
|
+
raise ValueError("repair target requires a relative workspace path")
|
|
44
|
+
return self
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class AcceptanceItem(_ContractModel):
|
|
48
|
+
acceptance_id: NonBlank
|
|
49
|
+
required: bool = True
|
|
50
|
+
verifier_ref: NonBlank
|
|
51
|
+
verifier_version: NonBlank
|
|
52
|
+
verification_method: VerificationMethod
|
|
53
|
+
description: NonBlank
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class HostResolvedAnswer(_ContractModel):
|
|
57
|
+
"""A host-owned candidate for one goal; never a verification verdict.
|
|
58
|
+
|
|
59
|
+
The host may resolve a deterministic information query from its locked
|
|
60
|
+
state. The Kernel still commits and verifies the candidate, and never
|
|
61
|
+
fabricates a model request or a usage receipt for it.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
goal_digest: Annotated[str, Field(pattern=r"^[0-9a-f]{64}$")]
|
|
65
|
+
goal_revision: Annotated[int, Field(strict=True, ge=0)]
|
|
66
|
+
text: Annotated[str, Field(min_length=1, max_length=8192, pattern=r"\S")]
|
|
67
|
+
authority: NonBlank
|
|
68
|
+
evidence_ref: NonBlank
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class TaskContract(_ContractModel):
|
|
72
|
+
revision: NonBlank
|
|
73
|
+
items: tuple[AcceptanceItem, ...]
|
|
74
|
+
# Trusted host restriction for this goal. None inherits the Build's full
|
|
75
|
+
# bound surface; an empty tuple permits no executable task tools.
|
|
76
|
+
allowed_tool_names: tuple[NonBlank, ...] | None = None
|
|
77
|
+
# Per-goal delivery protocol, pinned with acceptance and tool authority.
|
|
78
|
+
# None keeps the activation's default delivery; no previous goal is inherited.
|
|
79
|
+
final_submission_schema: dict[str, JsonValue] | None = None
|
|
80
|
+
final_submission_payload_key: NonBlank | None = None
|
|
81
|
+
host_resolved_answer: HostResolvedAnswer | None = None
|
|
82
|
+
|
|
83
|
+
@model_validator(mode="after")
|
|
84
|
+
def unique_acceptance_ids(self) -> TaskContract:
|
|
85
|
+
_check_unique_ids(self.items)
|
|
86
|
+
if self.host_resolved_answer is not None and (
|
|
87
|
+
self.allowed_tool_names != () or self.final_submission_schema is not None
|
|
88
|
+
):
|
|
89
|
+
raise ValueError("host resolved answer requires no task tools or structured submission")
|
|
90
|
+
if self.allowed_tool_names is not None and len(set(self.allowed_tool_names)) != len(
|
|
91
|
+
self.allowed_tool_names
|
|
92
|
+
):
|
|
93
|
+
raise ValueError("duplicate allowed_tool_names")
|
|
94
|
+
if self.final_submission_schema is not None:
|
|
95
|
+
validate_submission_schema(
|
|
96
|
+
self.final_submission_schema, self.final_submission_payload_key
|
|
97
|
+
)
|
|
98
|
+
elif self.final_submission_payload_key is not None:
|
|
99
|
+
raise ValueError("final submission payload requires a schema")
|
|
100
|
+
return self
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class CompletionCandidate(_ContractModel):
|
|
104
|
+
candidate_id: NonBlank
|
|
105
|
+
final_text: str
|
|
106
|
+
subject_digest: NonBlank
|
|
107
|
+
# Older native snapshots remain readable, but cannot qualify as current evidence.
|
|
108
|
+
subject_context_digest: NonBlank | None = None
|
|
109
|
+
environment_digest: NonBlank
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class VerificationItemResult(_ContractModel):
|
|
113
|
+
acceptance_id: NonBlank
|
|
114
|
+
status: VerificationStatus
|
|
115
|
+
verifier_id: NonBlank
|
|
116
|
+
verifier_version: NonBlank
|
|
117
|
+
evidence_refs: tuple[NonBlank, ...]
|
|
118
|
+
verification_method: VerificationMethod
|
|
119
|
+
safe_summary: str = ""
|
|
120
|
+
# Host-signed item-level repair authority. None preserves older reports'
|
|
121
|
+
# report-wide decision; True can keep one actionable item in a mixed report.
|
|
122
|
+
repairable: bool | None = None
|
|
123
|
+
repair_target: VerificationRepairTarget | None = None
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class VerificationReport(_ContractModel):
|
|
127
|
+
candidate_id: NonBlank
|
|
128
|
+
contract_revision: NonBlank
|
|
129
|
+
subject_digest: NonBlank
|
|
130
|
+
subject_context_digest: NonBlank | None = None
|
|
131
|
+
environment_digest: NonBlank
|
|
132
|
+
items: tuple[VerificationItemResult, ...]
|
|
133
|
+
repairable: bool
|
|
134
|
+
failure_fingerprint: str
|
|
135
|
+
# Only the trusted verifier may declare that its evidence has no workspace
|
|
136
|
+
# dependency. Missing metadata remains conservative, including old receipts.
|
|
137
|
+
workspace_dependency: Literal["required", "none"] = Field(
|
|
138
|
+
default="required", exclude_if=lambda value: value == "required"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
@model_validator(mode="after")
|
|
142
|
+
def unique_acceptance_ids(self) -> VerificationReport:
|
|
143
|
+
_check_unique_ids(self.items)
|
|
144
|
+
return self
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class CompletionDecision(_ContractModel):
|
|
148
|
+
action: Literal["finalize", "repair"]
|
|
149
|
+
outcome: CompletionOutcome
|
|
150
|
+
reason: NonBlank
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def _check_unique_ids(
|
|
154
|
+
items: tuple[AcceptanceItem, ...] | tuple[VerificationItemResult, ...],
|
|
155
|
+
) -> None:
|
|
156
|
+
identities = [item.acceptance_id for item in items]
|
|
157
|
+
if len(set(identities)) != len(identities):
|
|
158
|
+
raise ValueError("duplicate acceptance_id")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _finalize(outcome: CompletionOutcome, reason: str) -> CompletionDecision:
|
|
162
|
+
return CompletionDecision(action="finalize", outcome=outcome, reason=reason)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _report_mismatch(
|
|
166
|
+
contract: TaskContract,
|
|
167
|
+
candidate: CompletionCandidate,
|
|
168
|
+
report: VerificationReport,
|
|
169
|
+
) -> str | None:
|
|
170
|
+
expected_items = {item.acceptance_id: item for item in contract.items}
|
|
171
|
+
if any(item.acceptance_id not in expected_items for item in report.items):
|
|
172
|
+
raise ValueError("unknown report acceptance_id")
|
|
173
|
+
if candidate.subject_context_digest is None or report.subject_context_digest is None:
|
|
174
|
+
return "subject_context_digest_missing"
|
|
175
|
+
checks = (
|
|
176
|
+
(report.candidate_id, candidate.candidate_id, "candidate_mismatch"),
|
|
177
|
+
(report.contract_revision, contract.revision, "contract_revision_mismatch"),
|
|
178
|
+
(report.subject_digest, candidate.subject_digest, "subject_digest_mismatch"),
|
|
179
|
+
(
|
|
180
|
+
report.subject_context_digest,
|
|
181
|
+
candidate.subject_context_digest,
|
|
182
|
+
"subject_context_digest_mismatch",
|
|
183
|
+
),
|
|
184
|
+
(
|
|
185
|
+
report.environment_digest,
|
|
186
|
+
candidate.environment_digest,
|
|
187
|
+
"environment_digest_mismatch",
|
|
188
|
+
),
|
|
189
|
+
)
|
|
190
|
+
for actual, expected, reason in checks:
|
|
191
|
+
if actual != expected:
|
|
192
|
+
return reason
|
|
193
|
+
for item in report.items:
|
|
194
|
+
expected = expected_items[item.acceptance_id]
|
|
195
|
+
if item.verifier_id != expected.verifier_ref:
|
|
196
|
+
return "verifier_identity_mismatch"
|
|
197
|
+
if item.verifier_version != expected.verifier_version:
|
|
198
|
+
return "verifier_version_mismatch"
|
|
199
|
+
if item.verification_method != expected.verification_method:
|
|
200
|
+
return "verification_method_mismatch"
|
|
201
|
+
return None
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def reduce_completion(
|
|
205
|
+
contract: TaskContract,
|
|
206
|
+
candidate: CompletionCandidate,
|
|
207
|
+
report: VerificationReport | None,
|
|
208
|
+
repair_attempts: int = 0,
|
|
209
|
+
max_repairs: int = 3,
|
|
210
|
+
) -> CompletionDecision:
|
|
211
|
+
"""Decide completion without I/O or changing the acceptance contract.
|
|
212
|
+
|
|
213
|
+
``repair_attempts`` counts repairs already performed. Fingerprint history,
|
|
214
|
+
policy/budget revocation, evidence resolution, and trusted report provenance
|
|
215
|
+
belong to the host; this reducer enforces metadata pins and a repair cap.
|
|
216
|
+
"""
|
|
217
|
+
for value in (repair_attempts, max_repairs):
|
|
218
|
+
if type(value) is not int or value < 0:
|
|
219
|
+
raise ValueError("repair budgets must be a non-negative integer")
|
|
220
|
+
if report is None:
|
|
221
|
+
return _finalize("unverified", "verification_report_missing")
|
|
222
|
+
if mismatch := _report_mismatch(contract, candidate, report):
|
|
223
|
+
return _finalize("unverified", mismatch)
|
|
224
|
+
required = tuple(item for item in contract.items if item.required)
|
|
225
|
+
if not required:
|
|
226
|
+
return _finalize("unverified", "required_acceptance_empty")
|
|
227
|
+
|
|
228
|
+
results = {item.acceptance_id: item for item in report.items}
|
|
229
|
+
observations = tuple(results.get(item.acceptance_id) for item in required)
|
|
230
|
+
qualified = tuple(
|
|
231
|
+
item
|
|
232
|
+
for item in observations
|
|
233
|
+
if item is not None
|
|
234
|
+
and item.status == "passed"
|
|
235
|
+
and item.evidence_refs
|
|
236
|
+
and item.verification_method != "model_assisted"
|
|
237
|
+
)
|
|
238
|
+
if len(qualified) == len(required):
|
|
239
|
+
return _finalize("verified", "required_acceptance_verified")
|
|
240
|
+
if any(item is not None and item.status == "blocked" for item in observations):
|
|
241
|
+
return _finalize("blocked", "required_acceptance_blocked")
|
|
242
|
+
|
|
243
|
+
outcome: CompletionOutcome = "partial" if qualified else "unverified"
|
|
244
|
+
# An absent required result is an incomplete host report, not an Agent
|
|
245
|
+
# failure. An explicit not_run can be repaired only when the trusted host
|
|
246
|
+
# supplied an actionable explanation, a stable failure identity and an
|
|
247
|
+
# affirmative repairability decision; unknown verifier state cannot retry.
|
|
248
|
+
if any(item is None for item in observations):
|
|
249
|
+
return _finalize(outcome, "required_verification_incomplete")
|
|
250
|
+
has_not_run = any(item.status == "not_run" for item in observations)
|
|
251
|
+
has_failed = any(item.status == "failed" for item in observations)
|
|
252
|
+
item_repairable = any(
|
|
253
|
+
item is not None
|
|
254
|
+
and item.status in {"failed", "not_run"}
|
|
255
|
+
and item.repairable is True
|
|
256
|
+
and item.safe_summary.strip()
|
|
257
|
+
and item.evidence_refs
|
|
258
|
+
for item in observations
|
|
259
|
+
)
|
|
260
|
+
actionable_not_run = (
|
|
261
|
+
has_not_run
|
|
262
|
+
and not has_failed
|
|
263
|
+
and bool(report.failure_fingerprint.strip())
|
|
264
|
+
and (
|
|
265
|
+
item_repairable
|
|
266
|
+
or (
|
|
267
|
+
report.repairable
|
|
268
|
+
and all(
|
|
269
|
+
item.safe_summary.strip() and item.evidence_refs
|
|
270
|
+
for item in observations
|
|
271
|
+
if item is not None and item.status == "not_run"
|
|
272
|
+
)
|
|
273
|
+
)
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
if has_not_run and not has_failed and not actionable_not_run:
|
|
277
|
+
return _finalize(outcome, "required_verification_incomplete")
|
|
278
|
+
if any(
|
|
279
|
+
item is not None
|
|
280
|
+
and item.status == "passed"
|
|
281
|
+
and (not item.evidence_refs or item.verification_method == "model_assisted")
|
|
282
|
+
for item in observations
|
|
283
|
+
):
|
|
284
|
+
return _finalize(outcome, "qualified_evidence_missing")
|
|
285
|
+
if not (report.repairable or item_repairable):
|
|
286
|
+
return _finalize(
|
|
287
|
+
outcome,
|
|
288
|
+
"required_verification_incomplete" if has_not_run else "required_acceptance_failed",
|
|
289
|
+
)
|
|
290
|
+
if repair_attempts >= max_repairs:
|
|
291
|
+
return _finalize(outcome, "repair_budget_exhausted")
|
|
292
|
+
if not report.failure_fingerprint.strip():
|
|
293
|
+
return _finalize(outcome, "failure_fingerprint_missing")
|
|
294
|
+
return CompletionDecision(
|
|
295
|
+
action="repair",
|
|
296
|
+
outcome=outcome,
|
|
297
|
+
reason=(
|
|
298
|
+
"required_verification_incomplete"
|
|
299
|
+
if actionable_not_run
|
|
300
|
+
else "required_acceptance_failed"
|
|
301
|
+
),
|
|
302
|
+
)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Assemble only a contiguous, host-authenticated output continuation chain."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
from typing import TYPE_CHECKING, Literal
|
|
7
|
+
|
|
8
|
+
from pydantic import JsonValue
|
|
9
|
+
|
|
10
|
+
from .model_replay import replay_fields
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from .state import RunSnapshot
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def candidate_model_message(
|
|
17
|
+
snapshot: RunSnapshot,
|
|
18
|
+
*,
|
|
19
|
+
kind: Literal[
|
|
20
|
+
"rejected_final_candidate", "delivery_review_candidate"
|
|
21
|
+
] = "rejected_final_candidate",
|
|
22
|
+
) -> dict[str, JsonValue]:
|
|
23
|
+
"""Keep the actual draft available to same-turn review and repair.
|
|
24
|
+
|
|
25
|
+
This typed message is model input, not a tool observation or an accepted
|
|
26
|
+
final answer. Public state and future Session history exclude it.
|
|
27
|
+
"""
|
|
28
|
+
assert snapshot.candidate is not None
|
|
29
|
+
return {
|
|
30
|
+
"role": "assistant",
|
|
31
|
+
"kind": kind,
|
|
32
|
+
"content": snapshot.candidate["final_text"],
|
|
33
|
+
"candidate_id": snapshot.candidate["candidate_id"],
|
|
34
|
+
"candidate_status": "unverified" if kind == "delivery_review_candidate" else "rejected",
|
|
35
|
+
**replay_fields(snapshot.candidate_replay),
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def fragment_digest(text: str) -> str:
|
|
40
|
+
return hashlib.sha256(text.encode("utf-8")).hexdigest()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def complete_continuation(messages: tuple[dict[str, JsonValue], ...], final_suffix: str) -> str:
|
|
44
|
+
"""Prepend contiguous output-limit fragments to their final suffix.
|
|
45
|
+
|
|
46
|
+
A task-resume frame, user message, tool batch, feedback, or malformed host
|
|
47
|
+
metadata breaks the chain. The model is explicitly asked for a suffix, so
|
|
48
|
+
this function does not guess at fuzzy overlap or rewrite model text.
|
|
49
|
+
"""
|
|
50
|
+
fragments: list[str] = []
|
|
51
|
+
index = len(messages) - 1
|
|
52
|
+
while index >= 1:
|
|
53
|
+
observation = messages[index]
|
|
54
|
+
fragment = messages[index - 1]
|
|
55
|
+
if (
|
|
56
|
+
observation.get("role") != "user"
|
|
57
|
+
or observation.get("kind") != "continuation_observation"
|
|
58
|
+
or observation.get("continuation_mode", "suffix") != "suffix"
|
|
59
|
+
or fragment.get("role") != "assistant"
|
|
60
|
+
or fragment.get("kind") != "continuation_fragment"
|
|
61
|
+
):
|
|
62
|
+
break
|
|
63
|
+
content = fragment.get("content")
|
|
64
|
+
response_id = fragment.get("continuation_response_id")
|
|
65
|
+
if (
|
|
66
|
+
not isinstance(content, str)
|
|
67
|
+
or not isinstance(response_id, str)
|
|
68
|
+
or observation.get("continuation_response_id") != response_id
|
|
69
|
+
or observation.get("continuation_fragment_digest") != fragment_digest(content)
|
|
70
|
+
):
|
|
71
|
+
break
|
|
72
|
+
fragments.append(content)
|
|
73
|
+
index -= 2
|
|
74
|
+
return "".join(reversed(fragments)) + final_suffix
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def abandon_continuation(
|
|
78
|
+
messages: tuple[dict[str, JsonValue], ...], last_fragment: str
|
|
79
|
+
) -> tuple[dict[str, JsonValue], ...]:
|
|
80
|
+
"""Retire one unfinished chain without leaving executable tool JSON in context."""
|
|
81
|
+
prefix = list(messages)
|
|
82
|
+
discarded = [last_fragment]
|
|
83
|
+
while len(prefix) >= 2:
|
|
84
|
+
observation, fragment = prefix[-1], prefix[-2]
|
|
85
|
+
if (
|
|
86
|
+
observation.get("role") != "user"
|
|
87
|
+
or observation.get("kind") != "continuation_observation"
|
|
88
|
+
or fragment.get("role") != "assistant"
|
|
89
|
+
or fragment.get("kind") != "continuation_fragment"
|
|
90
|
+
):
|
|
91
|
+
break
|
|
92
|
+
content = fragment.get("content")
|
|
93
|
+
response_id = fragment.get("continuation_response_id")
|
|
94
|
+
if (
|
|
95
|
+
not isinstance(content, str)
|
|
96
|
+
or not isinstance(response_id, str)
|
|
97
|
+
or observation.get("continuation_response_id") != response_id
|
|
98
|
+
or observation.get("continuation_fragment_digest") != fragment_digest(content)
|
|
99
|
+
):
|
|
100
|
+
break
|
|
101
|
+
discarded.append(content)
|
|
102
|
+
del prefix[-2:]
|
|
103
|
+
fingerprint = fragment_digest("".join(reversed(discarded)))
|
|
104
|
+
return (
|
|
105
|
+
*prefix,
|
|
106
|
+
{
|
|
107
|
+
"role": "user",
|
|
108
|
+
"kind": "output_limit_restart_observation",
|
|
109
|
+
"content": (
|
|
110
|
+
"The previous response exceeded the output limit repeatedly. "
|
|
111
|
+
"Its unfinished tool call was not executed. Use smaller independent "
|
|
112
|
+
"tool calls or files; do not repeat one oversized call. "
|
|
113
|
+
f"Discarded output fingerprint: {fingerprint}."
|
|
114
|
+
),
|
|
115
|
+
},
|
|
116
|
+
)
|