agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
- agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +38 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +121 -118
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +22 -2
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +64 -88
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +69 -17
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1047
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +216 -143
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +134 -0
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +9 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +69 -20
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +51 -155
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +12 -0
- ksadk/conversations/runtime_persistence.py +296 -32
- ksadk/conversations/runtime_preparation.py +98 -13
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +46 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +18 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +230 -0
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +332 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +153 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +504 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +388 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/context_tuning.py +168 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +57 -0
- ksadk/harness/engine/context_pipeline.py +1351 -0
- ksadk/harness/engine/graph_builder.py +352 -0
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +1049 -0
- ksadk/harness/engine/mcp_disclosure.py +701 -0
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +81 -0
- ksadk/harness/engine/postgres_checkpointer.py +386 -0
- ksadk/harness/engine/run_control_bridge.py +100 -0
- ksadk/harness/engine/run_types.py +98 -0
- ksadk/harness/engine/skill_disclosure.py +275 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +360 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +249 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +498 -0
- ksadk/harness/execution_policy.py +104 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +699 -0
- ksadk/harness/loop/tools.py +907 -0
- ksadk/harness/managed_runtime.py +1044 -0
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +504 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +468 -0
- ksadk/harness/model_provider.py +430 -0
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +132 -0
- ksadk/harness/public_activity.py +213 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +779 -17
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +773 -0
- ksadk/harness/runtime.py +157 -113
- ksadk/harness/runtime_capabilities.py +228 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +733 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +589 -0
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +317 -0
- ksadk/harness/spec.py +342 -0
- ksadk/harness/state.py +155 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +263 -0
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +134 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +9 -2
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +220 -252
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +30 -0
- ksadk/kernel/control.py +180 -29
- ksadk/kernel/execution_grants.py +428 -0
- ksadk/kernel/execution_grants_memory.py +252 -0
- ksadk/kernel/execution_grants_postgres.py +395 -0
- ksadk/kernel/execution_grants_sqlite.py +435 -0
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +139 -226
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +61 -58
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +230 -231
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +166 -16
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +28 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +410 -200
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +104 -5
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +369 -340
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +74 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +159 -7
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +280 -67
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +14 -9
- ksadk/model_proxy/transform.py +72 -6
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +29 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +417 -185
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +92 -21
- ksadk/plugins/execution_host.py +107 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +52 -40
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +49 -143
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +413 -52
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +670 -0
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +550 -0
- ksadk/plugins/providers/harness_tools.py +455 -0
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +540 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1480 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +352 -0
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +853 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +519 -0
- ksadk/plugins/teams/task_decisions.py +436 -0
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +96 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +83 -401
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +220 -350
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +208 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +134 -129
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +29 -3
- ksadk/runtime/executor.py +105 -7
- ksadk/runtime/factory.py +45 -3
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +160 -21
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +105 -1
- ksadk/sandbox/backends/e2b.py +272 -24
- ksadk/sandbox/backends/local_process.py +73 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +776 -0
- ksadk/sandbox/local_launcher.py +124 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +112 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +26 -3
- ksadk/server/routes/misc.py +331 -33
- ksadk/server/routes/models.py +28 -4
- ksadk/server/routes/openai_compat.py +82 -13
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +112 -37
- ksadk/server/routes/sessions.py +493 -358
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +135 -23
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/loader.py +44 -2
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +400 -56
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/service_client.py +6 -1
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +784 -419
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +31 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +32 -2
- ksadk/studio/capabilities.py +31 -9
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +113 -387
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +82 -2
- ksadk/studio/codex_agent_service.py +19 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +112 -6
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +260 -202
- ksadk/studio/dsh_application.py +183 -27
- ksadk/studio/dsh_capability_service.py +302 -189
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +53 -5
- ksadk/studio/execution_host.py +598 -0
- ksadk/studio/framework_run.py +50 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +429 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1939 -345
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +89 -40
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +39 -12
- ksadk/studio/plugin_kernel_adapter.py +89 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +832 -99
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +69 -34
- ksadk/studio/resource_catalog.py +14 -12
- ksadk/studio/run_activity.py +848 -0
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +1220 -335
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +73 -11
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +615 -246
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +518 -181
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-CkufcPYo.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +166 -0
- ksadk/studio/teams_installation.py +217 -0
- ksadk/studio/teams_node.py +549 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +72 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +496 -0
- ksadk/studio/templates.py +41 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +138 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +93 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +344 -326
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +28 -14
- agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
|
@@ -0,0 +1,749 @@
|
|
|
1
|
+
"""Host-owned, scoped effect ports. Ports never receive a writable RunStore."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
from collections.abc import AsyncIterator
|
|
8
|
+
from pathlib import PurePosixPath
|
|
9
|
+
from typing import Literal, Protocol, get_args
|
|
10
|
+
|
|
11
|
+
from pydantic import Field, JsonValue, model_serializer, model_validator
|
|
12
|
+
|
|
13
|
+
from .artifact_contract import ArtifactRef as ArtifactRef
|
|
14
|
+
from .browser_contract import BrowserRecovery, BrowserSessionRef
|
|
15
|
+
from .completion import CompletionCandidate, TaskContract, VerificationReport
|
|
16
|
+
from .context_contributions import ContextPort as ContextPort
|
|
17
|
+
from .context_contributions import ContextSourceDefinition
|
|
18
|
+
from .delivery_review_contract import DeliveryReviewPolicy
|
|
19
|
+
from .hook_runtime_contract import HookDefinition
|
|
20
|
+
from .model import (
|
|
21
|
+
ModelImageContent,
|
|
22
|
+
ModelProfile,
|
|
23
|
+
ModelStreamEvent,
|
|
24
|
+
ModelTextContent,
|
|
25
|
+
ModelToolCall,
|
|
26
|
+
ModelTurnResult,
|
|
27
|
+
)
|
|
28
|
+
from .output_contract import submission_output_format, validate_submission_schema
|
|
29
|
+
from .state import ChildApproval, ChildBudgetReservation, Contract, RunScope
|
|
30
|
+
from .tool_schema import model_tool_parameters
|
|
31
|
+
from .turn_control import ModelTurnControl
|
|
32
|
+
|
|
33
|
+
ChildRecoveryPolicy = Literal[
|
|
34
|
+
"sealed_local_child/v1",
|
|
35
|
+
"prepared_local_child/v1",
|
|
36
|
+
"resume_prepared_local_child/v1",
|
|
37
|
+
"resume_local_child_checkpoint/v1",
|
|
38
|
+
]
|
|
39
|
+
CHILD_RECOVERY_POLICIES = frozenset(get_args(ChildRecoveryPolicy))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def digest(value: Contract) -> str:
|
|
43
|
+
payload = value.model_dump(mode="json")
|
|
44
|
+
if isinstance(value, RunConfiguration):
|
|
45
|
+
if payload.get("final_submission_payload_key") is None:
|
|
46
|
+
payload.pop("final_submission_payload_key", None)
|
|
47
|
+
if payload.get("workspace_observation_policy") is None:
|
|
48
|
+
payload.pop("workspace_observation_policy", None)
|
|
49
|
+
for tool in payload.get("tools", []):
|
|
50
|
+
if tool.get("progress_observation") is False:
|
|
51
|
+
tool.pop("progress_observation", None)
|
|
52
|
+
if tool.get("context_role") == "none":
|
|
53
|
+
tool.pop("context_role", None)
|
|
54
|
+
elif isinstance(value, ToolDefinition) and payload.get("context_role") == "none":
|
|
55
|
+
payload.pop("context_role", None)
|
|
56
|
+
if isinstance(value, ToolDefinition) and payload.get("progress_observation") is False:
|
|
57
|
+
payload.pop("progress_observation", None)
|
|
58
|
+
# This optional restriction was added after the first durable Native
|
|
59
|
+
# snapshots. Omission and None retain their original identity; a pinned
|
|
60
|
+
# allowlist changes the digest and remains immutable for the active goal.
|
|
61
|
+
contract = payload.get("contract") if isinstance(value, RunConfiguration) else payload
|
|
62
|
+
if isinstance(contract, dict) and contract.get("allowed_tool_names") is None:
|
|
63
|
+
contract.pop("allowed_tool_names", None)
|
|
64
|
+
if isinstance(contract, dict) and contract.get("final_submission_schema") is None:
|
|
65
|
+
contract.pop("final_submission_schema", None)
|
|
66
|
+
if isinstance(contract, dict) and contract.get("final_submission_payload_key") is None:
|
|
67
|
+
contract.pop("final_submission_payload_key", None)
|
|
68
|
+
if isinstance(contract, dict) and contract.get("host_resolved_answer") is None:
|
|
69
|
+
contract.pop("host_resolved_answer", None)
|
|
70
|
+
return hashlib.sha256(
|
|
71
|
+
json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
|
|
72
|
+
).hexdigest()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def validate_task_tool_scope(contract: TaskContract, tools: tuple[ToolDefinition, ...]) -> None:
|
|
76
|
+
allowed = contract.allowed_tool_names
|
|
77
|
+
if allowed is not None and not set(allowed).issubset(tool.name for tool in tools):
|
|
78
|
+
raise ValueError("task contract references an unbound tool")
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class ToolDefinition(Contract):
|
|
82
|
+
name: str = Field(min_length=1)
|
|
83
|
+
description: str
|
|
84
|
+
parameters: dict[str, JsonValue]
|
|
85
|
+
# Host-only role. A failed interactive observation survives compaction
|
|
86
|
+
# until an actual interactive recheck succeeds.
|
|
87
|
+
observation_role: Literal["none", "browser"] = "none"
|
|
88
|
+
# Host-owned scheduling authority, never projected into the model schema.
|
|
89
|
+
# Only independent read-only calls may share one durable effect batch.
|
|
90
|
+
read_only: bool = False
|
|
91
|
+
# Admit a non-reader's result as a new observation (e.g. MCP or a command).
|
|
92
|
+
# This grants no read-only/concurrency, acceptance or replay authority.
|
|
93
|
+
progress_observation: bool = False
|
|
94
|
+
# Host-pinned context semantics. A reader alias can retain source receipts
|
|
95
|
+
# without the Kernel recognizing its name. Never exposed to the model.
|
|
96
|
+
context_role: Literal[
|
|
97
|
+
"none", "workspace_read", "workspace_search", "artifact_read", "task_planning"
|
|
98
|
+
] = "none"
|
|
99
|
+
concurrent_safe: bool = False
|
|
100
|
+
# Host-only grant for a read-only delegated child. Unlike ordinary reads,
|
|
101
|
+
# its sealed receipt may include descendant model/tool usage and child IDs.
|
|
102
|
+
delegated_read_only: bool = False
|
|
103
|
+
# Optional host observation profile. A change cannot silently add feedback
|
|
104
|
+
# to a previously locked tool or an existing Run configuration.
|
|
105
|
+
feedback_profile_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
|
|
106
|
+
# Host action policy is part of the locked definition. A stricter execution
|
|
107
|
+
# boundary must not silently replace the policy of an existing Run.
|
|
108
|
+
execution_policy_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
|
|
109
|
+
# Host-only preservation policy, locked before execution. A bounded
|
|
110
|
+
# callback model view cannot discard the original observation remainder.
|
|
111
|
+
result_archive_policy: Literal[
|
|
112
|
+
"archived-model-view/v1", "archived-model-view/v2", "archived-model-view/v3",
|
|
113
|
+
"archived-model-view/v4", "archived-model-view/v5",
|
|
114
|
+
] | None = None
|
|
115
|
+
# Explicit host policy for status-preserving typed model observations.
|
|
116
|
+
# Remote JSON cannot grant this policy or rewrite the executed receipt.
|
|
117
|
+
result_model_policy: Literal["typed-tool-observation/v1"] | None = None
|
|
118
|
+
# Runtime-owned MCP privacy/offload policy; tool-returned JSON cannot grant it.
|
|
119
|
+
result_disclosure_policy: Literal["mcp-default/v1"] | None = Field(
|
|
120
|
+
default=None, exclude_if=lambda value: value is None,
|
|
121
|
+
)
|
|
122
|
+
# Host-pinned context retention, never inferred from a result's text.
|
|
123
|
+
# Progressive Skill instructions remain available during local pruning.
|
|
124
|
+
context_retention: Literal["normal", "persistent"] = "normal"
|
|
125
|
+
child_budget_policy: Literal["start/v1", "settle/v1", "delegate/v1"] | None = Field(
|
|
126
|
+
default=None, exclude_if=lambda value: value is None
|
|
127
|
+
)
|
|
128
|
+
child_approval_policy: Literal["owned-child-approval/v1"] | None = Field(
|
|
129
|
+
default=None, exclude_if=lambda value: value is None
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
@model_serializer(mode="wrap")
|
|
133
|
+
def omit_unconfigured_feedback(self, serialize):
|
|
134
|
+
payload = serialize(self)
|
|
135
|
+
if self.feedback_profile_digest is None:
|
|
136
|
+
payload.pop("feedback_profile_digest", None)
|
|
137
|
+
if self.execution_policy_digest is None:
|
|
138
|
+
payload.pop("execution_policy_digest", None)
|
|
139
|
+
if self.result_archive_policy is None:
|
|
140
|
+
payload.pop("result_archive_policy", None)
|
|
141
|
+
if self.result_model_policy is None:
|
|
142
|
+
payload.pop("result_model_policy", None)
|
|
143
|
+
if self.context_retention == "normal":
|
|
144
|
+
payload.pop("context_retention", None)
|
|
145
|
+
return payload
|
|
146
|
+
|
|
147
|
+
@model_validator(mode="after")
|
|
148
|
+
def valid_concurrency(self) -> ToolDefinition:
|
|
149
|
+
# Dual-mode delegates have per-member allocation accounting. Other
|
|
150
|
+
# lifecycle actions still require serialized ledger admission.
|
|
151
|
+
if self.child_budget_policy in {"start/v1", "settle/v1"} and self.concurrent_safe:
|
|
152
|
+
raise ValueError("child budget lifecycle requires serialized admission")
|
|
153
|
+
if (self.child_budget_policy == "delegate/v1" and self.concurrent_safe
|
|
154
|
+
and not self.delegated_read_only):
|
|
155
|
+
raise ValueError("parallel dual-mode delegates require delegated_read_only")
|
|
156
|
+
if self.context_role == "workspace_read" and not self.read_only:
|
|
157
|
+
raise ValueError("workspace_read context role requires read_only")
|
|
158
|
+
if self.result_archive_policy is not None and not self.read_only:
|
|
159
|
+
raise ValueError("archived model views require a read_only tool")
|
|
160
|
+
if (self.result_disclosure_policy is not None
|
|
161
|
+
and self.result_model_policy != "typed-tool-observation/v1"):
|
|
162
|
+
raise ValueError("MCP disclosure requires typed model observations")
|
|
163
|
+
if self.result_model_policy is not None and self.result_archive_policy is not None:
|
|
164
|
+
raise ValueError("a tool must select one model observation policy")
|
|
165
|
+
if (
|
|
166
|
+
self.result_archive_policy == "archived-model-view/v5"
|
|
167
|
+
and self.context_role != "workspace_read"
|
|
168
|
+
):
|
|
169
|
+
raise ValueError("captured source archives require workspace_read")
|
|
170
|
+
if self.context_role == "workspace_search" and not self.read_only:
|
|
171
|
+
raise ValueError("workspace_search context role requires read_only")
|
|
172
|
+
if self.context_role == "artifact_read" and not self.read_only:
|
|
173
|
+
raise ValueError("artifact_read context role requires read_only")
|
|
174
|
+
if self.context_role == "task_planning" and self.read_only:
|
|
175
|
+
raise ValueError("task planning updates mutate host state")
|
|
176
|
+
if self.concurrent_safe and (not self.read_only or self.observation_role != "none"):
|
|
177
|
+
raise ValueError("concurrent_safe tools must be read_only without observation state")
|
|
178
|
+
if self.delegated_read_only and not self.concurrent_safe:
|
|
179
|
+
raise ValueError("delegated_read_only requires concurrent_safe")
|
|
180
|
+
return self
|
|
181
|
+
|
|
182
|
+
def function_schema(self) -> dict[str, JsonValue]:
|
|
183
|
+
"""Project only model-visible fields; host progress metadata stays local."""
|
|
184
|
+
return {
|
|
185
|
+
"name": self.name,
|
|
186
|
+
"description": self.description,
|
|
187
|
+
"parameters": model_tool_parameters(self.parameters),
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class RunLimits(Contract):
|
|
192
|
+
# Active execution time, excluding a committed pause or approval wait.
|
|
193
|
+
# Omitted SDK budgets keep their original configuration identity.
|
|
194
|
+
max_wall_seconds: float | None = Field(default=None, gt=0, le=86400, allow_inf_nan=False)
|
|
195
|
+
max_model_calls: int = Field(default=32, ge=1)
|
|
196
|
+
max_tool_calls: int = Field(default=64, ge=0)
|
|
197
|
+
max_parallel_tools: int = Field(default=4, ge=1, le=16)
|
|
198
|
+
max_repairs: int = Field(default=3, ge=0)
|
|
199
|
+
# Optional host-owned evidence checkpoint before the model budget is spent.
|
|
200
|
+
verification_reserve_model_calls: int = Field(default=0, ge=0)
|
|
201
|
+
verification_idle_tool_calls: int = Field(default=0, ge=0)
|
|
202
|
+
# Host-owned maximum tool-call gap between browser attempts while web
|
|
203
|
+
# changes remain unobserved; zero leaves only the late reserve gate.
|
|
204
|
+
browser_observation_interval_tool_calls: int = Field(default=0, ge=0)
|
|
205
|
+
# Once this many model calls remain, expose a no-tool finalization turn.
|
|
206
|
+
# A finite SDK run reserves its final submission by default. Explicit zero
|
|
207
|
+
# opts out (including replay of already locked, serialized configurations).
|
|
208
|
+
# Hosts with model-backed tools reserve their maximum per-tool model cost
|
|
209
|
+
# plus one final call; the Kernel never silently raises the hard budget.
|
|
210
|
+
finalization_reserve_model_calls: int = Field(default=1, ge=0)
|
|
211
|
+
max_output_restarts: int = Field(default=0, ge=0)
|
|
212
|
+
max_subagent_depth: int = Field(default=3, ge=0, le=16)
|
|
213
|
+
effect_timeout_seconds: float = Field(default=120, gt=0, le=3600)
|
|
214
|
+
max_tool_result_bytes: int = Field(default=65536, ge=1024, le=4 * 1024 * 1024)
|
|
215
|
+
max_tool_image_bytes: int = Field(default=8 * 1024 * 1024, ge=0, le=64 * 1024 * 1024)
|
|
216
|
+
|
|
217
|
+
@model_serializer(mode="wrap")
|
|
218
|
+
def omit_unconfigured_wall_budget(self, serialize):
|
|
219
|
+
# Preserve legacy serialized configurations as well as their digest.
|
|
220
|
+
payload = serialize(self)
|
|
221
|
+
if self.max_wall_seconds is None:
|
|
222
|
+
payload.pop("max_wall_seconds", None)
|
|
223
|
+
return payload
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class WorkspaceObservationPolicy(Contract):
|
|
227
|
+
"""Optional task policy; the generic Kernel has no builtin file types."""
|
|
228
|
+
|
|
229
|
+
role: Literal["browser"] = "browser"
|
|
230
|
+
path_suffixes: tuple[str, ...] = Field(min_length=1, max_length=64)
|
|
231
|
+
|
|
232
|
+
@model_validator(mode="after")
|
|
233
|
+
def valid_suffixes(self) -> WorkspaceObservationPolicy:
|
|
234
|
+
if any(not s.startswith(".") or s != s.lower() or "/" in s for s in self.path_suffixes):
|
|
235
|
+
raise ValueError("observation suffixes must be lowercase file suffixes")
|
|
236
|
+
return self
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class RunConfiguration(Contract):
|
|
240
|
+
profile: ModelProfile
|
|
241
|
+
contract: TaskContract
|
|
242
|
+
tools: tuple[ToolDefinition, ...] = ()
|
|
243
|
+
limits: RunLimits = Field(default_factory=RunLimits)
|
|
244
|
+
instructions: str = ""
|
|
245
|
+
context_sources: tuple[ContextSourceDefinition, ...] = Field(default=(), max_length=16)
|
|
246
|
+
hooks: tuple[HookDefinition, ...] = ()
|
|
247
|
+
hook_stop_continuation_limit: int | None = Field(default=None, strict=True, ge=0)
|
|
248
|
+
# Host authorization/activation identity, separate from model instructions.
|
|
249
|
+
host_binding_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
|
|
250
|
+
# Distinct host grants: sealed query, verify-only takeover, or continuation
|
|
251
|
+
# from an undispatched child effect. No policy replays a running effect.
|
|
252
|
+
tool_recovery_policy: ChildRecoveryPolicy | None = None
|
|
253
|
+
child_lifecycle_policy: Literal["owned-background/v1", "owned-background/v2"] | None = None
|
|
254
|
+
child_promotion_policy: Literal["owned-child-promotion/v1"] | None = None
|
|
255
|
+
child_input_policy: Literal["owned-child-guide/v1"] | None = Field(
|
|
256
|
+
default=None, exclude_if=lambda value: value is None
|
|
257
|
+
)
|
|
258
|
+
child_release_policy: Literal["owned-run-release/v1"] | None = None
|
|
259
|
+
child_notification_policy: Literal["ready-before-model/v1"] | None = None
|
|
260
|
+
child_approval_policy: Literal["owned-child-approval/v1"] | None = Field(
|
|
261
|
+
default=None, exclude_if=lambda value: value is None
|
|
262
|
+
)
|
|
263
|
+
guidance_policy: Literal["boundary-guide/v1"] | None = None
|
|
264
|
+
model_recovery_policy: Literal["pure-inference-takeover/v1"] | None = None
|
|
265
|
+
# Host-pinned distinction between resuming work and completing a text suffix.
|
|
266
|
+
# None preserves the legacy contract/configuration digest for old activations.
|
|
267
|
+
output_recovery_policy: Literal["task-or-delivery/v1"] | None = None
|
|
268
|
+
workspace_observation_policy: WorkspaceObservationPolicy | None = None
|
|
269
|
+
delivery_review_policy: DeliveryReviewPolicy | None = None
|
|
270
|
+
# Host-pinned delivery contract; prose and code fences stay untouched by default.
|
|
271
|
+
final_output_format: Literal["text", "json_object", "json_value"] = "text"
|
|
272
|
+
# Optional host-pinned final submission protocol. This is a model-visible
|
|
273
|
+
# function schema, not an executable user tool or verifier replacement.
|
|
274
|
+
final_submission_schema: dict[str, JsonValue] | None = None
|
|
275
|
+
final_submission_payload_key: str | None = Field(default=None, min_length=1)
|
|
276
|
+
delegation_depth: int = Field(default=0, ge=0, le=16)
|
|
277
|
+
|
|
278
|
+
@model_serializer(mode="wrap")
|
|
279
|
+
def omit_unconfigured_review(self, serialize):
|
|
280
|
+
payload = serialize(self)
|
|
281
|
+
if self.delivery_review_policy is None:
|
|
282
|
+
payload.pop("delivery_review_policy", None)
|
|
283
|
+
if self.host_binding_digest is None:
|
|
284
|
+
payload.pop("host_binding_digest", None)
|
|
285
|
+
if self.tool_recovery_policy is None:
|
|
286
|
+
payload.pop("tool_recovery_policy", None)
|
|
287
|
+
if self.child_lifecycle_policy is None:
|
|
288
|
+
payload.pop("child_lifecycle_policy", None)
|
|
289
|
+
if self.child_promotion_policy is None:
|
|
290
|
+
payload.pop("child_promotion_policy", None)
|
|
291
|
+
if self.child_release_policy is None:
|
|
292
|
+
payload.pop("child_release_policy", None)
|
|
293
|
+
if self.child_notification_policy is None:
|
|
294
|
+
payload.pop("child_notification_policy", None)
|
|
295
|
+
if self.guidance_policy is None:
|
|
296
|
+
payload.pop("guidance_policy", None)
|
|
297
|
+
if not self.context_sources:
|
|
298
|
+
payload.pop("context_sources", None)
|
|
299
|
+
if not self.hooks:
|
|
300
|
+
payload.pop("hooks", None)
|
|
301
|
+
if self.hook_stop_continuation_limit is None:
|
|
302
|
+
payload.pop("hook_stop_continuation_limit", None)
|
|
303
|
+
if self.model_recovery_policy is None:
|
|
304
|
+
payload.pop("model_recovery_policy", None)
|
|
305
|
+
if self.output_recovery_policy is None:
|
|
306
|
+
payload.pop("output_recovery_policy", None)
|
|
307
|
+
return payload
|
|
308
|
+
|
|
309
|
+
@model_validator(mode="after")
|
|
310
|
+
def unique_tools(self) -> RunConfiguration:
|
|
311
|
+
if self.model_recovery_policy is not None and self.host_binding_digest is None:
|
|
312
|
+
raise ValueError("model takeover requires a pinned host binding")
|
|
313
|
+
if self.child_input_policy is not None and self.child_lifecycle_policy is None:
|
|
314
|
+
raise ValueError("child input requires owned child lifecycle")
|
|
315
|
+
if self.child_approval_policy is not None and self.child_lifecycle_policy is None:
|
|
316
|
+
raise ValueError("child approval requires owned child lifecycle")
|
|
317
|
+
if self.child_promotion_policy is not None and self.child_lifecycle_policy is None:
|
|
318
|
+
raise ValueError("child promotion requires owned child lifecycle")
|
|
319
|
+
if self.child_release_policy is not None and self.child_lifecycle_policy is None:
|
|
320
|
+
raise ValueError("child release requires owned child lifecycle")
|
|
321
|
+
if self.child_notification_policy is not None and self.child_lifecycle_policy is None:
|
|
322
|
+
raise ValueError("child notifications require owned child lifecycle")
|
|
323
|
+
if len({hook.hook_id for hook in self.hooks}) != len(self.hooks):
|
|
324
|
+
raise ValueError("duplicate Hook definitions")
|
|
325
|
+
if any("Stop" in hook.events for hook in self.hooks):
|
|
326
|
+
if self.hook_stop_continuation_limit is None:
|
|
327
|
+
raise ValueError("Stop Hooks require an explicit continuation limit")
|
|
328
|
+
elif self.hook_stop_continuation_limit is not None:
|
|
329
|
+
raise ValueError("Stop continuation limit requires a Stop Hook")
|
|
330
|
+
if any(hook.timeout_seconds >= self.limits.effect_timeout_seconds for hook in self.hooks):
|
|
331
|
+
raise ValueError("Hook deadline must precede the effect deadline")
|
|
332
|
+
if len({source.source_id for source in self.context_sources}) != len(self.context_sources):
|
|
333
|
+
raise ValueError("duplicate Context source definitions")
|
|
334
|
+
if any(source.contributor_policy is not None for source in self.context_sources) and (
|
|
335
|
+
sum(source.timeout_seconds for source in self.context_sources)
|
|
336
|
+
>= self.limits.effect_timeout_seconds
|
|
337
|
+
):
|
|
338
|
+
raise ValueError("Context collection deadlines must precede the effect deadline")
|
|
339
|
+
if len({tool.name for tool in self.tools}) != len(self.tools):
|
|
340
|
+
raise ValueError("duplicate tool definitions")
|
|
341
|
+
if self.delivery_review_policy is not None:
|
|
342
|
+
from .delivery_review import REVIEW_SUBMISSION_TOOL
|
|
343
|
+
|
|
344
|
+
if any(tool.name == REVIEW_SUBMISSION_TOOL for tool in self.tools):
|
|
345
|
+
raise ValueError("delivery review submission tool name is reserved")
|
|
346
|
+
validate_task_tool_scope(self.contract, self.tools)
|
|
347
|
+
if self.final_submission_schema is not None:
|
|
348
|
+
from .final_submission import FINAL_SUBMISSION_TOOL
|
|
349
|
+
|
|
350
|
+
if any(tool.name == FINAL_SUBMISSION_TOOL for tool in self.tools):
|
|
351
|
+
raise ValueError("final submission tool name is reserved")
|
|
352
|
+
validate_submission_schema(
|
|
353
|
+
self.final_submission_schema, self.final_submission_payload_key
|
|
354
|
+
)
|
|
355
|
+
expected = submission_output_format(
|
|
356
|
+
self.final_submission_schema, self.final_submission_payload_key
|
|
357
|
+
)
|
|
358
|
+
if self.final_output_format != expected:
|
|
359
|
+
raise ValueError(f"final submission requires {expected} output")
|
|
360
|
+
elif self.final_submission_payload_key is not None:
|
|
361
|
+
raise ValueError("final submission payload requires a schema")
|
|
362
|
+
# Give the ModelPort time to return a classified transport error before
|
|
363
|
+
# the outer effect deadline turns the whole attempt into an uncertain
|
|
364
|
+
# receipt. The latter cannot safely enter the bounded model retry path.
|
|
365
|
+
request_timeout = self.profile.request_timeout_seconds
|
|
366
|
+
if request_timeout is not None and request_timeout >= self.limits.effect_timeout_seconds:
|
|
367
|
+
raise ValueError("model request timeout must precede effect timeout")
|
|
368
|
+
return self
|
|
369
|
+
|
|
370
|
+
@property
|
|
371
|
+
def digest(self) -> str:
|
|
372
|
+
return digest(self)
|
|
373
|
+
|
|
374
|
+
def with_task_contract(self, contract: TaskContract) -> RunConfiguration:
|
|
375
|
+
"""Compile an active contract from this locked base configuration."""
|
|
376
|
+
validate_task_tool_scope(contract, self.tools)
|
|
377
|
+
values = {**self.model_dump(), "contract": contract}
|
|
378
|
+
if contract.final_submission_schema is not None:
|
|
379
|
+
values.update(
|
|
380
|
+
final_output_format=submission_output_format(
|
|
381
|
+
contract.final_submission_schema, contract.final_submission_payload_key,
|
|
382
|
+
),
|
|
383
|
+
final_submission_schema=contract.final_submission_schema,
|
|
384
|
+
final_submission_payload_key=contract.final_submission_payload_key,
|
|
385
|
+
)
|
|
386
|
+
return RunConfiguration.model_validate(values)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
class ModelRequest(Contract):
|
|
390
|
+
scope: RunScope
|
|
391
|
+
run_id: str
|
|
392
|
+
request_id: str
|
|
393
|
+
attempt_id: str
|
|
394
|
+
profile: ModelProfile
|
|
395
|
+
# Host admission, not inferred from an empty tool list or prompt wording.
|
|
396
|
+
purpose: Literal["task", "compaction", "delivery_review"] = "task"
|
|
397
|
+
max_output_tokens: int | None = Field(default=None, strict=True, ge=1)
|
|
398
|
+
instructions: str
|
|
399
|
+
messages: tuple[dict[str, JsonValue], ...]
|
|
400
|
+
tools: tuple[ToolDefinition, ...]
|
|
401
|
+
turn_control: ModelTurnControl | None = None
|
|
402
|
+
|
|
403
|
+
@model_validator(mode="after")
|
|
404
|
+
def output_limit_within_profile(self) -> ModelRequest:
|
|
405
|
+
if self.purpose == "compaction" and (self.tools or self.turn_control is not None):
|
|
406
|
+
raise ValueError("compaction cannot admit task tools or final-turn control")
|
|
407
|
+
if self.turn_control is not None:
|
|
408
|
+
self.turn_control.validate_tools(
|
|
409
|
+
tuple(tool.name for tool in self.tools),
|
|
410
|
+
stable_catalog=self.profile.tool_catalog_policy == "stable-task/v1",
|
|
411
|
+
)
|
|
412
|
+
if (
|
|
413
|
+
self.max_output_tokens is not None
|
|
414
|
+
and self.max_output_tokens > self.profile.max_output_tokens
|
|
415
|
+
):
|
|
416
|
+
raise ValueError("model request output limit exceeds pinned profile")
|
|
417
|
+
return self
|
|
418
|
+
|
|
419
|
+
@property
|
|
420
|
+
def effective_max_output_tokens(self) -> int:
|
|
421
|
+
return self.max_output_tokens or self.profile.max_output_tokens
|
|
422
|
+
|
|
423
|
+
@property
|
|
424
|
+
def effective_tool_choice(self) -> str | dict[str, JsonValue]:
|
|
425
|
+
control = self.turn_control
|
|
426
|
+
if self.profile.tool_catalog_policy == "stable-task/v1" and control is not None:
|
|
427
|
+
if control.finalization_only:
|
|
428
|
+
return ({"type": "function", "function": {"name": "submit_final_output"}}
|
|
429
|
+
if control.final_submission_required else "none")
|
|
430
|
+
return control.tool_choice if control is not None else "auto"
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
class ToolBudget(Contract):
|
|
434
|
+
max_model_calls_remaining: int = Field(default=0, strict=True, ge=0)
|
|
435
|
+
# This allowance already excludes the parent's final submission. Legacy
|
|
436
|
+
# standalone adapters may still receive a gross allowance (default False).
|
|
437
|
+
parent_finalization_reserved: bool = Field(default=False, strict=True)
|
|
438
|
+
max_tool_calls_remaining: int = Field(default=0, strict=True, ge=0)
|
|
439
|
+
depth: int = Field(default=0, strict=True, ge=0)
|
|
440
|
+
max_depth: int = Field(default=0, strict=True, ge=0)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
class ToolResourceUsage(Contract):
|
|
444
|
+
model_calls: int = Field(default=0, strict=True, ge=0)
|
|
445
|
+
tool_calls: int = Field(default=0, strict=True, ge=0)
|
|
446
|
+
input_tokens: int | None = Field(default=None, strict=True, ge=0)
|
|
447
|
+
output_tokens: int | None = Field(default=None, strict=True, ge=0)
|
|
448
|
+
cached_input_tokens: int | None = Field(default=None, strict=True, ge=0)
|
|
449
|
+
reasoning_tokens: int | None = Field(default=None, strict=True, ge=0)
|
|
450
|
+
child_run_ids: tuple[str, ...] = ()
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
class ChildBudgetSettlement(Contract):
|
|
454
|
+
"""A trusted child owner binds actual ToolResult usage to its terminal state."""
|
|
455
|
+
|
|
456
|
+
child_run_id: str = Field(min_length=1)
|
|
457
|
+
parent_operation_key: str = Field(min_length=1)
|
|
458
|
+
child_request_digest: str = Field(pattern=r"^[0-9a-f]{64}$")
|
|
459
|
+
terminal_snapshot_digest: str = Field(pattern=r"^[0-9a-f]{64}$")
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
class ToolRequest(Contract):
|
|
463
|
+
scope: RunScope
|
|
464
|
+
run_id: str
|
|
465
|
+
operation_key: str
|
|
466
|
+
call: ModelToolCall
|
|
467
|
+
definition: ToolDefinition
|
|
468
|
+
# Host-only projection: the exact wrapper call in the Run ledger when
|
|
469
|
+
# policy is evaluated for its concrete remote target. Model arguments
|
|
470
|
+
# cannot fill this field or change the operation/approval identity.
|
|
471
|
+
admission_call: ModelToolCall | None = Field(
|
|
472
|
+
default=None, exclude_if=lambda value: value is None,
|
|
473
|
+
)
|
|
474
|
+
# An opaque decision returned by the authenticated control plane. Executors
|
|
475
|
+
# must validate current policy, scope, call arguments and grant on every call.
|
|
476
|
+
interaction: dict[str, JsonValue] | None = None
|
|
477
|
+
child_approval: ChildApproval | None = Field(
|
|
478
|
+
default=None, exclude_if=lambda value: value is None
|
|
479
|
+
)
|
|
480
|
+
budget: ToolBudget = Field(default_factory=ToolBudget)
|
|
481
|
+
# Native owns final result governance. Direct executor callers retain the
|
|
482
|
+
# bounded legacy behavior unless they explicitly use this mode.
|
|
483
|
+
result_delivery: Literal["executor_managed", "runtime_managed"] = "executor_managed"
|
|
484
|
+
available_artifacts: tuple[ArtifactRef, ...] = ()
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
class ToolModelObservation(Contract):
|
|
488
|
+
"""Host-derived model data; it cannot change execution or acceptance facts."""
|
|
489
|
+
|
|
490
|
+
version: Literal["typed-tool-observation/v1"] = "typed-tool-observation/v1"
|
|
491
|
+
status: Literal["ok", "error"]
|
|
492
|
+
content: JsonValue = None
|
|
493
|
+
content_blocks: tuple[ModelTextContent | ModelImageContent, ...] = ()
|
|
494
|
+
|
|
495
|
+
def message_content(self) -> str | list[dict]:
|
|
496
|
+
envelope = json.dumps({"status": self.status, "content": self.content}, ensure_ascii=False)
|
|
497
|
+
return (
|
|
498
|
+
[{"type": "text", "text": envelope},
|
|
499
|
+
*(block.model_dump(mode="json") for block in self.content_blocks)]
|
|
500
|
+
if self.content_blocks else envelope
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
class ToolResult(Contract):
|
|
505
|
+
status: Literal["ok", "error", "approval_required", "uncertain"]
|
|
506
|
+
content: JsonValue = None
|
|
507
|
+
# Host-owned public view; never populated by promoting a key from content.
|
|
508
|
+
public_display: dict[str, JsonValue] | None = Field(
|
|
509
|
+
default=None, exclude_if=lambda value: value is None,
|
|
510
|
+
)
|
|
511
|
+
# A host Port can identify the actual observation independently of its
|
|
512
|
+
# transport envelope. Only a host-declared observing tool earns novelty;
|
|
513
|
+
# this digest cannot authorize an action or establish task acceptance.
|
|
514
|
+
progress_observation_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
|
|
515
|
+
# Optional host-owned model view. Keep the original content in the effect
|
|
516
|
+
# receipt; only successful, bounded plain-text projections may bypass the
|
|
517
|
+
# generic status/content envelope in the model transcript.
|
|
518
|
+
model_content: str | None = Field(default=None, min_length=1, max_length=65536)
|
|
519
|
+
model_observation: ToolModelObservation | None = Field(
|
|
520
|
+
default=None, exclude_if=lambda value: value is None
|
|
521
|
+
)
|
|
522
|
+
content_blocks: tuple[ModelTextContent | ModelImageContent, ...] = ()
|
|
523
|
+
# Host-observed write paths; never inferred from model text or tool content.
|
|
524
|
+
workspace_changed_paths: tuple[str, ...] = ()
|
|
525
|
+
artifact_refs: tuple[ArtifactRef, ...] = ()
|
|
526
|
+
resource_usage: ToolResourceUsage = Field(default_factory=ToolResourceUsage)
|
|
527
|
+
child_budget_reservation: ChildBudgetReservation | None = Field(
|
|
528
|
+
default=None, exclude_if=lambda value: value is None
|
|
529
|
+
)
|
|
530
|
+
child_budget_settlement: ChildBudgetSettlement | None = Field(
|
|
531
|
+
default=None, exclude_if=lambda value: value is None
|
|
532
|
+
)
|
|
533
|
+
# Typed host reference, never promoted from page text or tool JSON content.
|
|
534
|
+
browser_session_ref: BrowserSessionRef | None = None
|
|
535
|
+
# Confirmed owner closure, independent of bounded model-view delivery.
|
|
536
|
+
browser_session_closed: bool = Field(
|
|
537
|
+
default=False, strict=True, exclude_if=lambda value: value is False
|
|
538
|
+
)
|
|
539
|
+
interaction_id: str | None = None
|
|
540
|
+
child_approval: ChildApproval | None = Field(
|
|
541
|
+
default=None, exclude_if=lambda value: value is None
|
|
542
|
+
)
|
|
543
|
+
|
|
544
|
+
@model_validator(mode="after")
|
|
545
|
+
def valid_interaction(self) -> ToolResult:
|
|
546
|
+
if self.child_approval is not None and self.status != "approval_required":
|
|
547
|
+
raise ValueError("child approval requires an approval receipt")
|
|
548
|
+
if self.child_budget_reservation is not None:
|
|
549
|
+
if self.child_budget_settlement is not None or self.status != "ok":
|
|
550
|
+
raise ValueError("child_budget startup must be a separate successful receipt")
|
|
551
|
+
if self.child_budget_reservation.settled_usage_digest is not None:
|
|
552
|
+
raise ValueError("child_budget startup cannot pre-settle usage")
|
|
553
|
+
if self.resource_usage != ToolResourceUsage():
|
|
554
|
+
raise ValueError("child_budget startup cannot fabricate actual usage")
|
|
555
|
+
if self.child_budget_settlement is not None and self.status == "approval_required":
|
|
556
|
+
raise ValueError("child_budget settlement cannot request approval")
|
|
557
|
+
if self.browser_session_closed and self.browser_session_ref is None:
|
|
558
|
+
raise ValueError("browser closure needs a typed host reference")
|
|
559
|
+
if self.model_content is not None and self.status != "ok":
|
|
560
|
+
raise ValueError("only successful tool results can override model content")
|
|
561
|
+
if self.model_observation is not None:
|
|
562
|
+
if self.model_observation.status != self.status:
|
|
563
|
+
raise ValueError("model observation must preserve execution status")
|
|
564
|
+
if self.model_content is not None or self.content_blocks:
|
|
565
|
+
raise ValueError("typed observations cannot coexist with another model view")
|
|
566
|
+
if self.status == "approval_required" and not self.interaction_id:
|
|
567
|
+
raise ValueError("approval_required needs an interaction_id")
|
|
568
|
+
if self.status != "approval_required" and self.interaction_id is not None:
|
|
569
|
+
raise ValueError("only approval_required can expose an interaction_id")
|
|
570
|
+
if len(set(self.workspace_changed_paths)) != len(self.workspace_changed_paths):
|
|
571
|
+
raise ValueError("workspace changed paths must be unique")
|
|
572
|
+
for path in self.workspace_changed_paths:
|
|
573
|
+
normalized = PurePosixPath(path)
|
|
574
|
+
if (
|
|
575
|
+
not path
|
|
576
|
+
or "\\" in path
|
|
577
|
+
or normalized.is_absolute()
|
|
578
|
+
or ".." in normalized.parts
|
|
579
|
+
or normalized.as_posix() != path
|
|
580
|
+
):
|
|
581
|
+
raise ValueError("workspace changed paths must be normalized relative paths")
|
|
582
|
+
return self
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
class BrowserRecoveryPort(Protocol):
|
|
586
|
+
async def recover_sessions(
|
|
587
|
+
self, refs: tuple[BrowserSessionRef, ...]
|
|
588
|
+
) -> tuple[BrowserRecovery, ...]: ...
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
class ArtifactWriteRequest(Contract):
|
|
592
|
+
scope: RunScope
|
|
593
|
+
run_id: str = Field(min_length=1)
|
|
594
|
+
operation_key: str = Field(min_length=1)
|
|
595
|
+
tool_call_id: str = Field(min_length=1)
|
|
596
|
+
tool_name: str = Field(min_length=1)
|
|
597
|
+
content: str
|
|
598
|
+
mime_type: str = Field(min_length=1, max_length=160, pattern=r"^[^\r\n]+$")
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
class ArtifactReadRequest(Contract):
|
|
602
|
+
scope: RunScope
|
|
603
|
+
run_id: str = Field(min_length=1)
|
|
604
|
+
ref: ArtifactRef
|
|
605
|
+
offset_chars: int = Field(default=0, strict=True, ge=0)
|
|
606
|
+
limit_chars: int = Field(default=16000, strict=True, ge=1, le=32000)
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
class ArtifactReadResult(Contract):
|
|
610
|
+
ref: ArtifactRef
|
|
611
|
+
content: str
|
|
612
|
+
offset_chars: int = Field(strict=True, ge=0)
|
|
613
|
+
next_offset_chars: int = Field(strict=True, ge=0)
|
|
614
|
+
complete: bool
|
|
615
|
+
|
|
616
|
+
@model_validator(mode="after")
|
|
617
|
+
def valid_page(self) -> ArtifactReadResult:
|
|
618
|
+
if self.next_offset_chars < self.offset_chars:
|
|
619
|
+
raise ValueError("artifact page cursor moved backwards")
|
|
620
|
+
if self.next_offset_chars != self.offset_chars + len(self.content):
|
|
621
|
+
raise ValueError("artifact page cursor must equal returned character count")
|
|
622
|
+
if bool(self.content) != (self.next_offset_chars > self.offset_chars):
|
|
623
|
+
raise ValueError("artifact page content and cursor disagree")
|
|
624
|
+
return self
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
class WorkspaceRequest(Contract):
|
|
628
|
+
scope: RunScope
|
|
629
|
+
run_id: str = Field(min_length=1)
|
|
630
|
+
operation_key: str = Field(min_length=1)
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
class WorkspaceObservation(Contract):
|
|
634
|
+
"""Host-captured workspace identity; provider/tool text cannot create one."""
|
|
635
|
+
|
|
636
|
+
operation_key: str = Field(min_length=1)
|
|
637
|
+
status: Literal["captured", "unavailable"]
|
|
638
|
+
revision: str | None = Field(default=None, min_length=1)
|
|
639
|
+
changed_paths: tuple[str, ...] = Field(default=(), max_length=2048)
|
|
640
|
+
reason: str | None = Field(default=None, max_length=80, pattern=r"^[a-z0-9_]+$")
|
|
641
|
+
|
|
642
|
+
@model_validator(mode="after")
|
|
643
|
+
def valid_capture(self) -> WorkspaceObservation:
|
|
644
|
+
if self.status == "captured":
|
|
645
|
+
if self.revision is None or self.reason is not None:
|
|
646
|
+
raise ValueError("captured workspace needs revision without failure reason")
|
|
647
|
+
elif self.revision is not None or self.changed_paths or self.reason is None:
|
|
648
|
+
raise ValueError("unavailable workspace needs only a safe reason")
|
|
649
|
+
if len(set(self.changed_paths)) != len(self.changed_paths):
|
|
650
|
+
raise ValueError("workspace changed paths must be unique")
|
|
651
|
+
for path in self.changed_paths:
|
|
652
|
+
normalized = PurePosixPath(path)
|
|
653
|
+
if (
|
|
654
|
+
not path
|
|
655
|
+
or "\\" in path
|
|
656
|
+
or normalized.is_absolute()
|
|
657
|
+
or ".." in normalized.parts
|
|
658
|
+
or normalized.as_posix() != path
|
|
659
|
+
):
|
|
660
|
+
raise ValueError("workspace changed paths must be normalized relative paths")
|
|
661
|
+
return self
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
class VerificationRequest(Contract):
|
|
665
|
+
scope: RunScope
|
|
666
|
+
run_id: str
|
|
667
|
+
candidate_id: str
|
|
668
|
+
final_text: str
|
|
669
|
+
purpose: Literal["final", "checkpoint"] = "final"
|
|
670
|
+
contract: TaskContract
|
|
671
|
+
subject_context_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
class VerificationBundle(Contract):
|
|
675
|
+
candidate: CompletionCandidate
|
|
676
|
+
report: VerificationReport | None
|
|
677
|
+
post_workspace: WorkspaceObservation | None = None
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
class ModelPort(Protocol):
|
|
681
|
+
async def complete(self, request: ModelRequest) -> ModelTurnResult: ...
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
class StreamingModelPort(ModelPort, Protocol):
|
|
685
|
+
def stream(self, request: ModelRequest) -> AsyncIterator[ModelStreamEvent]:
|
|
686
|
+
"""Produce ordered provisional observations and exactly one sealed result.
|
|
687
|
+
|
|
688
|
+
The Port owns its resources and must cooperate with cancellation.
|
|
689
|
+
The consumer joins an optional aclose operation; an AsyncIterator is
|
|
690
|
+
not required to implement async-generator extensions. Cleanup failure
|
|
691
|
+
is an operational warning, never a new provider reply or retry grant.
|
|
692
|
+
"""
|
|
693
|
+
...
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
class ToolPort(Protocol):
|
|
697
|
+
async def execute(self, request: ToolRequest) -> ToolResult:
|
|
698
|
+
"""Validate schema/policy before dispatch; never return ok on denial."""
|
|
699
|
+
...
|
|
700
|
+
|
|
701
|
+
|
|
702
|
+
class ToolReconciliationPort(Protocol):
|
|
703
|
+
async def reconcile(self, request: ToolRequest) -> ToolResult:
|
|
704
|
+
"""Read an authenticated sealed result; never execute missing/active work."""
|
|
705
|
+
...
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
class ToolPreparedRecoveryPort(Protocol):
|
|
709
|
+
async def recover_prepared(self, request: ToolRequest) -> ToolResult:
|
|
710
|
+
"""Recover a matching leased, undispatched child verifier; never replay tools/models."""
|
|
711
|
+
...
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
class ToolPreparedContinuationPort(Protocol):
|
|
715
|
+
async def resume_prepared(self, request: ToolRequest) -> ToolResult:
|
|
716
|
+
"""Continue a matching leased child from an undispatched effect after owner expiry."""
|
|
717
|
+
...
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
class ToolCheckpointContinuationPort(Protocol):
|
|
721
|
+
async def resume_checkpoint(self, request: ToolRequest) -> ToolResult:
|
|
722
|
+
"""Continue a matching leased child from a known committed checkpoint."""
|
|
723
|
+
...
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
class WorkspacePort(Protocol):
|
|
727
|
+
async def capture(self, request: WorkspaceRequest) -> WorkspaceObservation:
|
|
728
|
+
"""Return a scoped host observation without mutating the workspace."""
|
|
729
|
+
...
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
class ArtifactPort(Protocol):
|
|
733
|
+
async def write(self, request: ArtifactWriteRequest) -> ArtifactRef:
|
|
734
|
+
"""Persist exact text idempotently for the supplied operation identity."""
|
|
735
|
+
...
|
|
736
|
+
|
|
737
|
+
async def read(self, request: ArtifactReadRequest) -> ArtifactReadResult:
|
|
738
|
+
"""Read a bounded page after enforcing the authenticated scope."""
|
|
739
|
+
...
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
class VerificationPort(Protocol):
|
|
743
|
+
async def verify(self, request: VerificationRequest) -> VerificationBundle:
|
|
744
|
+
"""Seal artifact/environment digests and resolve trusted evidence refs.
|
|
745
|
+
|
|
746
|
+
Verifier code and expected values must be outside the agent's writable
|
|
747
|
+
workspace. Changed artifacts during verification invalidate the report.
|
|
748
|
+
"""
|
|
749
|
+
...
|