agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Validate canonical Gateway facts before projecting a Native model turn."""
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
|
|
5
|
+
from ksadk._model_input import ProviderInputObservation
|
|
6
|
+
from ksadk.harness.native.model import ModelUsage
|
|
7
|
+
from ksadk.model_gateway.events import ModelStreamEvent, ModelStreamEventType
|
|
8
|
+
from ksadk.studio.errors import StudioError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _invalid() -> StudioError:
|
|
12
|
+
# Provider text, model identities and raw malformed fields are not public
|
|
13
|
+
# diagnostics. Reuse the existing non-retryable host protocol rejection.
|
|
14
|
+
return StudioError(
|
|
15
|
+
"MODEL_RESPONSE_INVALID", "Canonical model stream contract mismatch", status_code=422
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def validate_gateway_event(event: ModelStreamEvent, *, model: str, sequence: int) -> None:
|
|
20
|
+
"""The consumer must not hide foreign or lost events by renumbering them."""
|
|
21
|
+
if (
|
|
22
|
+
not isinstance(event, ModelStreamEvent)
|
|
23
|
+
or not isinstance(event.type, ModelStreamEventType)
|
|
24
|
+
or type(event.model) is not str
|
|
25
|
+
or event.model != model
|
|
26
|
+
or type(event.sequence) is not int
|
|
27
|
+
or event.sequence != sequence
|
|
28
|
+
or not isinstance(event.metadata, Mapping)
|
|
29
|
+
):
|
|
30
|
+
raise _invalid()
|
|
31
|
+
if event.type in {ModelStreamEventType.TEXT_DELTA, ModelStreamEventType.REASONING_DELTA,
|
|
32
|
+
ModelStreamEventType.PUBLIC_SUMMARY_DELTA}:
|
|
33
|
+
if type(event.text) is not str:
|
|
34
|
+
raise _invalid()
|
|
35
|
+
if (event.type is ModelStreamEventType.INPUT_TRANSFORMATIONS) != (
|
|
36
|
+
event.provider_input is not None
|
|
37
|
+
) or (event.provider_input is not None
|
|
38
|
+
and not isinstance(event.provider_input, ProviderInputObservation)):
|
|
39
|
+
raise _invalid()
|
|
40
|
+
if event.provider_content is not None and (
|
|
41
|
+
event.type is not ModelStreamEventType.TURN_COMPLETED
|
|
42
|
+
or not isinstance(event.provider_content, tuple)
|
|
43
|
+
or any(not isinstance(block, Mapping) for block in event.provider_content)
|
|
44
|
+
):
|
|
45
|
+
raise _invalid()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def gateway_stream_usage(event: ModelStreamEvent) -> ModelUsage:
|
|
49
|
+
"""A reported update requires both primary counters, without coercion.
|
|
50
|
+
|
|
51
|
+
Optional cache/reasoning subdivisions may be absent. No update means
|
|
52
|
+
unknown usage; an explicit pair of integer zeroes means reported zero.
|
|
53
|
+
"""
|
|
54
|
+
value = event.usage
|
|
55
|
+
if (
|
|
56
|
+
not isinstance(value, Mapping)
|
|
57
|
+
or "input_tokens" not in value
|
|
58
|
+
or "output_tokens" not in value
|
|
59
|
+
):
|
|
60
|
+
raise _invalid()
|
|
61
|
+
try:
|
|
62
|
+
return ModelUsage(
|
|
63
|
+
input_tokens=value["input_tokens"],
|
|
64
|
+
output_tokens=value["output_tokens"],
|
|
65
|
+
cached_input_tokens=value.get("cached_tokens", 0),
|
|
66
|
+
reasoning_tokens=value.get("reasoning_tokens", 0),
|
|
67
|
+
)
|
|
68
|
+
except (ValueError, TypeError):
|
|
69
|
+
raise _invalid() from None
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"""Consume locked Harness Hook sources under current Studio Run authority.
|
|
2
|
+
|
|
3
|
+
PluginHost owns source runtimes. This Port owns only callback Tasks; a selected
|
|
4
|
+
source is not an authorization grant and a Hook output is never a verifier.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import inspect
|
|
11
|
+
|
|
12
|
+
from ksadk.harness.native.hook_executor import HookAuthorizer, HookBinding, ScopedHookExecutor
|
|
13
|
+
from ksadk.harness.native.hook_runtime_contract import (
|
|
14
|
+
HookInvocationRequest,
|
|
15
|
+
HookInvocationResult,
|
|
16
|
+
_json_bytes,
|
|
17
|
+
)
|
|
18
|
+
from ksadk.harness.native.state import RunPhase, RunScope
|
|
19
|
+
from ksadk.harness.native.studio_admission import studio_mapping_digest
|
|
20
|
+
from ksadk.harness.stores.native_contract import RunStore
|
|
21
|
+
from ksadk.plugins.contracts import plugin_lock_digest
|
|
22
|
+
from ksadk.plugins.providers.harness import HarnessEngineActivationContext
|
|
23
|
+
from ksadk.plugins.providers.harness_hooks import hook_configuration
|
|
24
|
+
from ksadk.plugins.resolver import composition_profile_digest
|
|
25
|
+
from ksadk.studio.native_hook_registration import validate_hook_authorization_policy
|
|
26
|
+
from ksadk.studio.native_scope import native_scope_from_activation
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class StudioNativeHookPort:
|
|
30
|
+
def __init__(
|
|
31
|
+
self, context: HarnessEngineActivationContext, scope: RunScope, store: RunStore,
|
|
32
|
+
*, authorize: HookAuthorizer | None = None, authorization_version: str | None = None,
|
|
33
|
+
):
|
|
34
|
+
if native_scope_from_activation(context) != scope or scope.agent_id != context.agent_name:
|
|
35
|
+
raise ValueError("native_hook_scope_unbound")
|
|
36
|
+
if not context.activation_generation or context.activation_available is None:
|
|
37
|
+
raise ValueError("native_hook_activation_unbound")
|
|
38
|
+
if (composition_profile_digest(context.bundle.composition.profile),
|
|
39
|
+
plugin_lock_digest(context.bundle.composition.plugin_lock)) != (
|
|
40
|
+
context.profile_digest, context.plugin_lock_digest,
|
|
41
|
+
):
|
|
42
|
+
raise ValueError("native_hook_graph_unbound")
|
|
43
|
+
validate_hook_authorization_policy(authorize, authorization_version)
|
|
44
|
+
self._context, self._scope, self._store = context, scope.model_copy(deep=True), store
|
|
45
|
+
self._manifest = context.bundle.manifest.model_dump_json()
|
|
46
|
+
self._profile = context.bundle.composition.profile.model_dump_json()
|
|
47
|
+
self._lock = context.bundle.composition.plugin_lock.model_dump_json()
|
|
48
|
+
self._closed = False
|
|
49
|
+
self._executors = {}
|
|
50
|
+
self._definitions = []
|
|
51
|
+
stop_limits = set()
|
|
52
|
+
maximum_deadline = 0.0
|
|
53
|
+
|
|
54
|
+
async def admitted(request):
|
|
55
|
+
self._ensure_current(request)
|
|
56
|
+
decision = await authorize(request) # Only constructed when a host policy exists.
|
|
57
|
+
self._ensure_current(request)
|
|
58
|
+
return decision
|
|
59
|
+
|
|
60
|
+
for source in context.hook_sources:
|
|
61
|
+
config = hook_configuration(context.bundle, source)
|
|
62
|
+
ref = f"plugin://{source.plugin_id}@{source.plugin_version}"
|
|
63
|
+
definitions = config.definitions(source_ref=ref, binding_digest=studio_mapping_digest({
|
|
64
|
+
"bundle_digest": context.bundle.bundle_digest,
|
|
65
|
+
"profile_digest": context.profile_digest,
|
|
66
|
+
"plugin_lock_digest": context.plugin_lock_digest,
|
|
67
|
+
"source_ref": ref, "slot": source.slot,
|
|
68
|
+
"policy": "studio.native-locked-hook-callback/v1",
|
|
69
|
+
"authorization_version": authorization_version or "deny-unconfigured/v1",
|
|
70
|
+
"configuration": config.model_dump(mode="json"),
|
|
71
|
+
}))
|
|
72
|
+
if config.stop_continuation_limit is not None:
|
|
73
|
+
stop_limits.add(config.stop_continuation_limit)
|
|
74
|
+
read = source.runtime.harness_hook # Freeze the selected implementation, not its name.
|
|
75
|
+
if not inspect.iscoroutinefunction(read):
|
|
76
|
+
raise ValueError("native_hook_producer_invalid")
|
|
77
|
+
|
|
78
|
+
async def callback(request, read=read):
|
|
79
|
+
self._ensure_current(request)
|
|
80
|
+
output = await read(context.bundle, request)
|
|
81
|
+
self._ensure_current(request)
|
|
82
|
+
return output
|
|
83
|
+
|
|
84
|
+
executor = ScopedHookExecutor(
|
|
85
|
+
scope=self._scope,
|
|
86
|
+
bindings=tuple(
|
|
87
|
+
HookBinding(item, callback, self._available) for item in definitions
|
|
88
|
+
),
|
|
89
|
+
authorize=admitted if authorize is not None else None,
|
|
90
|
+
cleanup_timeout_seconds=config.cleanup_timeout_seconds,
|
|
91
|
+
)
|
|
92
|
+
for item in definitions:
|
|
93
|
+
if item.hook_id in self._executors:
|
|
94
|
+
raise ValueError("native_hook_id_duplicate")
|
|
95
|
+
self._executors[item.hook_id] = executor
|
|
96
|
+
self._definitions.append(item)
|
|
97
|
+
maximum_deadline = max(
|
|
98
|
+
maximum_deadline, item.timeout_seconds + config.cleanup_timeout_seconds,
|
|
99
|
+
)
|
|
100
|
+
if len(stop_limits) > 1:
|
|
101
|
+
raise ValueError("native_hook_stop_policy_conflict")
|
|
102
|
+
self.stop_continuation_limit = next(iter(stop_limits), None)
|
|
103
|
+
self.required_effect_timeout_seconds = maximum_deadline
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def definitions(self):
|
|
107
|
+
return tuple(item.model_copy(deep=True) for item in self._definitions)
|
|
108
|
+
|
|
109
|
+
def _available(self):
|
|
110
|
+
return (
|
|
111
|
+
not self._closed and self._context.activation_available() is True
|
|
112
|
+
and self._context.bundle.manifest.model_dump_json() == self._manifest
|
|
113
|
+
and self._context.bundle.composition.profile.model_dump_json() == self._profile
|
|
114
|
+
and self._context.bundle.composition.plugin_lock.model_dump_json() == self._lock
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def _ensure_current(self, request):
|
|
118
|
+
if request.scope != self._scope or request.session_id != self._context.activation_key:
|
|
119
|
+
raise ValueError("native_hook_request_unbound")
|
|
120
|
+
snapshot = self._store.load(self._scope, request.run_id)
|
|
121
|
+
intent = self._store.get_intent(self._scope, request.run_id, request.operation_key)
|
|
122
|
+
expected_phase = (RunPhase.VERIFYING if request.event == "Stop" else RunPhase.COMPACTING
|
|
123
|
+
if request.event == "PreCompact" else RunPhase.EXECUTING_TOOLS)
|
|
124
|
+
if (
|
|
125
|
+
snapshot.session_id != request.session_id or snapshot.turn_id != request.turn_id
|
|
126
|
+
or snapshot.goal != request.goal or snapshot.goal_revision != request.goal_revision
|
|
127
|
+
or snapshot.tool_calls != request.tool_call_count or snapshot.phase != expected_phase
|
|
128
|
+
or snapshot.pending_intent != request.operation_key
|
|
129
|
+
or intent is None or intent.kind != "hook" or intent.status != "running"
|
|
130
|
+
or _json_bytes(intent.payload.get("request"))
|
|
131
|
+
!= _json_bytes(request.model_dump(mode="json"))
|
|
132
|
+
):
|
|
133
|
+
raise ValueError("native_hook_request_unbound")
|
|
134
|
+
|
|
135
|
+
async def invoke(self, request: HookInvocationRequest) -> HookInvocationResult:
|
|
136
|
+
request = HookInvocationRequest.model_validate_json(request.model_dump_json())
|
|
137
|
+
self._ensure_current(request)
|
|
138
|
+
executor = self._executors.get(request.definition.hook_id)
|
|
139
|
+
if executor is None:
|
|
140
|
+
raise ValueError("native_hook_definition_unbound")
|
|
141
|
+
return await executor.invoke(request)
|
|
142
|
+
|
|
143
|
+
async def aclose(self):
|
|
144
|
+
self._closed = True
|
|
145
|
+
await asyncio.gather(*(item.aclose() for item in set(self._executors.values())))
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Trusted distribution selection of a Python Hook capability for exact Agents.
|
|
2
|
+
|
|
3
|
+
These inputs come from the Studio host, not an Agent draft or a tool response.
|
|
4
|
+
PluginHost still stages the registered factory and checks declared permissions.
|
|
5
|
+
This does not add a plugin installer, Cordis Hook export or management API.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import inspect
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
|
|
13
|
+
from ksadk.harness.native.hook_executor import HookAuthorizer
|
|
14
|
+
from ksadk.plugins.composition import PluginCapabilitySelection
|
|
15
|
+
from ksadk.plugins.contracts import PluginManifest
|
|
16
|
+
from ksadk.plugins.host import PluginFactory
|
|
17
|
+
from ksadk.plugins.providers.harness_hooks import HARNESS_HOOK_DEFINITION, HarnessHookConfiguration
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def validate_hook_authorization_policy(authorize: HookAuthorizer | None, version: str | None):
|
|
21
|
+
if (authorize is None) != (version is None) or (authorize is not None and (
|
|
22
|
+
not (inspect.iscoroutinefunction(authorize)
|
|
23
|
+
or inspect.iscoroutinefunction(getattr(authorize, "__call__", None)))
|
|
24
|
+
or type(version) is not str or not version.strip()
|
|
25
|
+
)):
|
|
26
|
+
raise ValueError("native_hook_authorization_policy_invalid")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True, init=False)
|
|
30
|
+
class StudioNativeHookRegistration:
|
|
31
|
+
_manifest_json: str
|
|
32
|
+
_configuration_json: str
|
|
33
|
+
factory: PluginFactory
|
|
34
|
+
agent_ids: frozenset[str]
|
|
35
|
+
|
|
36
|
+
def __init__(self, *, manifest: PluginManifest, factory: PluginFactory,
|
|
37
|
+
configuration: HarnessHookConfiguration, agent_ids: frozenset[str]):
|
|
38
|
+
manifest = PluginManifest.model_validate_json(manifest.model_dump_json())
|
|
39
|
+
configuration = HarnessHookConfiguration.model_validate_json(
|
|
40
|
+
configuration.model_dump_json(),
|
|
41
|
+
)
|
|
42
|
+
offers = manifest.spec.provides
|
|
43
|
+
if (manifest.spec.runtime != "python" or manifest.spec.isolation != "in-process"
|
|
44
|
+
or len(offers) != 1 or offers[0].definition != HARNESS_HOOK_DEFINITION
|
|
45
|
+
or not isinstance(factory, PluginFactory)):
|
|
46
|
+
raise ValueError("Native Hook requires one registered Python capability factory")
|
|
47
|
+
if not agent_ids or any(type(item) is not str or not item.strip() or item != item.strip()
|
|
48
|
+
or item == "*" for item in agent_ids):
|
|
49
|
+
raise ValueError("Native Hook registration requires exact Agent IDs")
|
|
50
|
+
ref = f"plugin://{manifest.metadata.id}@{manifest.metadata.version}"
|
|
51
|
+
configuration.definitions(source_ref=ref, binding_digest=manifest.spec.provenance.digest)
|
|
52
|
+
object.__setattr__(self, "_manifest_json", manifest.model_dump_json())
|
|
53
|
+
object.__setattr__(self, "_configuration_json", configuration.model_dump_json())
|
|
54
|
+
object.__setattr__(self, "factory", factory)
|
|
55
|
+
object.__setattr__(self, "agent_ids", frozenset(agent_ids))
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def manifest(self):
|
|
59
|
+
return PluginManifest.model_validate_json(self._manifest_json)
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def selection(self):
|
|
63
|
+
manifest = self.manifest
|
|
64
|
+
return PluginCapabilitySelection(
|
|
65
|
+
ref=f"plugin://{manifest.metadata.id}@{manifest.metadata.version}",
|
|
66
|
+
definition=HARNESS_HOOK_DEFINITION, slot=manifest.spec.provides[0].slot,
|
|
67
|
+
config=HarnessHookConfiguration.model_validate_json(
|
|
68
|
+
self._configuration_json,
|
|
69
|
+
).model_dump(mode="json"),
|
|
70
|
+
)
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""Reject missing disclosure of a host-known empty capability inventory.
|
|
2
|
+
|
|
3
|
+
This checks one fact from the locked Build, not arbitrary answer semantics or
|
|
4
|
+
whether a resource exists online. The unchanged Native verification/repair
|
|
5
|
+
protocol handles a missing statement; no extra tools or retries are granted.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import hashlib
|
|
11
|
+
import json
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
|
|
14
|
+
from ksadk.harness.native.completion import (
|
|
15
|
+
AcceptanceItem,
|
|
16
|
+
HostResolvedAnswer,
|
|
17
|
+
TaskContract,
|
|
18
|
+
VerificationItemResult,
|
|
19
|
+
VerificationRepairTarget,
|
|
20
|
+
VerificationReport,
|
|
21
|
+
)
|
|
22
|
+
from ksadk.harness.native.ports import VerificationBundle, VerificationPort, VerificationRequest
|
|
23
|
+
from ksadk.harness.native.state import RunScope
|
|
24
|
+
from ksadk.studio.native_final_shape import EVIDENCE_VERIFIER_REF, EVIDENCE_VERIFIER_VERSION
|
|
25
|
+
|
|
26
|
+
VERIFIER_REF = "studio.locked-empty-inventory-disclosure"
|
|
27
|
+
VERIFIER_VERSION = "1"
|
|
28
|
+
ACCEPTANCE_ID = "locked_inventory_disclosure"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _digest(value: str) -> str:
|
|
32
|
+
return "sha256:" + hashlib.sha256(value.encode()).hexdigest()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _has_plain_statement(text: str, statement: str) -> bool:
|
|
36
|
+
fence = None
|
|
37
|
+
for line in text.splitlines():
|
|
38
|
+
stripped = line.strip()
|
|
39
|
+
marker = next((prefix for prefix in ("```", "~~~") if stripped.startswith(prefix)), None)
|
|
40
|
+
if marker is not None:
|
|
41
|
+
if fence is None:
|
|
42
|
+
fence = marker
|
|
43
|
+
elif fence == marker:
|
|
44
|
+
fence = None
|
|
45
|
+
continue
|
|
46
|
+
if fence is None and not line.startswith((" ", "\t")) and stripped == statement:
|
|
47
|
+
return True
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass(frozen=True)
|
|
52
|
+
class EmptyInventoryDisclosure:
|
|
53
|
+
"""Constructed by the host after resolving the immutable Build bindings."""
|
|
54
|
+
|
|
55
|
+
capability_label: str
|
|
56
|
+
|
|
57
|
+
def __post_init__(self):
|
|
58
|
+
if self.capability_label not in {"Skill", "MCP", "工具"}:
|
|
59
|
+
raise ValueError("unsupported inventory label")
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def statement(self) -> str:
|
|
63
|
+
return f"当前 Agent 没有绑定 {self.capability_label}。"
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def description(self) -> str:
|
|
67
|
+
return json.dumps(
|
|
68
|
+
{"authority": "locked_agent_build", "required_statement": self.statement},
|
|
69
|
+
ensure_ascii=False,
|
|
70
|
+
sort_keys=True,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def extend(self, contract: TaskContract) -> TaskContract:
|
|
74
|
+
item = AcceptanceItem(
|
|
75
|
+
acceptance_id=ACCEPTANCE_ID,
|
|
76
|
+
verifier_ref=VERIFIER_REF,
|
|
77
|
+
verifier_version=VERIFIER_VERSION,
|
|
78
|
+
verification_method="deterministic",
|
|
79
|
+
description=self.description,
|
|
80
|
+
)
|
|
81
|
+
return contract.model_copy(
|
|
82
|
+
update={
|
|
83
|
+
"revision": f"{contract.revision}+inventory-{_digest(self.description)[7:23]}",
|
|
84
|
+
"items": (*contract.items, item),
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def resolve(self, contract: TaskContract, goal: str) -> TaskContract:
|
|
89
|
+
# Custom action/output acceptance belongs to the normal Agent loop.
|
|
90
|
+
# Resolve only the plain informational goal plus this one known fact.
|
|
91
|
+
if (
|
|
92
|
+
contract.allowed_tool_names != ()
|
|
93
|
+
or contract.final_submission_schema is not None
|
|
94
|
+
or {item.acceptance_id for item in contract.items}
|
|
95
|
+
!= {"current_user_goal", ACCEPTANCE_ID}
|
|
96
|
+
):
|
|
97
|
+
return contract
|
|
98
|
+
goal_item = next(i for i in contract.items if i.acceptance_id == "current_user_goal")
|
|
99
|
+
identity = (
|
|
100
|
+
goal_item.verifier_ref, goal_item.verifier_version, goal_item.verification_method
|
|
101
|
+
)
|
|
102
|
+
if identity not in {
|
|
103
|
+
("studio.independent-evidence-unavailable", "1", "human"),
|
|
104
|
+
(EVIDENCE_VERIFIER_REF, EVIDENCE_VERIFIER_VERSION, "deterministic"),
|
|
105
|
+
}:
|
|
106
|
+
# Resolve only the host's unverified baseline. A deterministic
|
|
107
|
+
# semantic extension still needs its own execution and evidence.
|
|
108
|
+
return contract
|
|
109
|
+
return TaskContract.model_validate(
|
|
110
|
+
contract.model_dump(mode="json")
|
|
111
|
+
| {
|
|
112
|
+
"host_resolved_answer": HostResolvedAnswer(
|
|
113
|
+
goal_digest=hashlib.sha256(goal.encode()).hexdigest(),
|
|
114
|
+
goal_revision=0,
|
|
115
|
+
text=self.statement,
|
|
116
|
+
authority="locked_agent_build",
|
|
117
|
+
evidence_ref=_digest(self.description),
|
|
118
|
+
).model_dump(mode="json"),
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class StudioInventoryDisclosureVerifier:
|
|
124
|
+
"""An additive fact gate; all other goals delegate without modification."""
|
|
125
|
+
|
|
126
|
+
def __init__(
|
|
127
|
+
self,
|
|
128
|
+
*,
|
|
129
|
+
scope: RunScope,
|
|
130
|
+
baseline: VerificationPort,
|
|
131
|
+
disclosure: EmptyInventoryDisclosure | None,
|
|
132
|
+
):
|
|
133
|
+
self.scope = scope.model_copy(deep=True)
|
|
134
|
+
self.baseline = baseline
|
|
135
|
+
self.disclosure = disclosure
|
|
136
|
+
|
|
137
|
+
async def verify(self, request: VerificationRequest) -> VerificationBundle:
|
|
138
|
+
item = next(
|
|
139
|
+
(item for item in request.contract.items if item.acceptance_id == ACCEPTANCE_ID),
|
|
140
|
+
None,
|
|
141
|
+
)
|
|
142
|
+
if item is None:
|
|
143
|
+
return await self.baseline.verify(request)
|
|
144
|
+
if request.scope != self.scope:
|
|
145
|
+
raise ValueError("native_inventory_scope_mismatch")
|
|
146
|
+
if (
|
|
147
|
+
self.disclosure is None
|
|
148
|
+
or item.verifier_ref != VERIFIER_REF
|
|
149
|
+
or item.verifier_version != VERIFIER_VERSION
|
|
150
|
+
or item.verification_method != "deterministic"
|
|
151
|
+
or item.description != self.disclosure.description
|
|
152
|
+
):
|
|
153
|
+
raise ValueError("native_inventory_contract_mismatch")
|
|
154
|
+
# The baseline sees its original contract. Its results remain evidence
|
|
155
|
+
# for the original acceptance items; the composition binds both here.
|
|
156
|
+
baseline_contract = request.contract.model_copy(
|
|
157
|
+
update={"items": tuple(i for i in request.contract.items if i != item)}
|
|
158
|
+
)
|
|
159
|
+
bundle = await self.baseline.verify(
|
|
160
|
+
request.model_copy(update={"contract": baseline_contract})
|
|
161
|
+
)
|
|
162
|
+
results = (
|
|
163
|
+
list(bundle.report.items)
|
|
164
|
+
if bundle.report is not None
|
|
165
|
+
else [
|
|
166
|
+
VerificationItemResult(
|
|
167
|
+
acceptance_id=i.acceptance_id,
|
|
168
|
+
status="not_run",
|
|
169
|
+
verifier_id=i.verifier_ref,
|
|
170
|
+
verifier_version=i.verifier_version,
|
|
171
|
+
verification_method=i.verification_method,
|
|
172
|
+
evidence_refs=(),
|
|
173
|
+
safe_summary="No independent semantic verifier is available.",
|
|
174
|
+
)
|
|
175
|
+
for i in baseline_contract.items
|
|
176
|
+
]
|
|
177
|
+
)
|
|
178
|
+
# Require the host-supplied fact as a plain answer statement. A quoted
|
|
179
|
+
# rule, JSON field, inline code, or promise is not this disclosure.
|
|
180
|
+
is_final = request.purpose == "final"
|
|
181
|
+
present = is_final and _has_plain_statement(request.final_text, self.disclosure.statement)
|
|
182
|
+
missing_final = is_final and not present
|
|
183
|
+
result = VerificationItemResult(
|
|
184
|
+
acceptance_id=item.acceptance_id,
|
|
185
|
+
status="passed" if present else "failed" if is_final else "not_run",
|
|
186
|
+
verifier_id=VERIFIER_REF,
|
|
187
|
+
verifier_version=VERIFIER_VERSION,
|
|
188
|
+
verification_method="deterministic",
|
|
189
|
+
evidence_refs=(_digest(self.disclosure.description + "\0" + request.final_text),),
|
|
190
|
+
safe_summary=(
|
|
191
|
+
"The locked Build inventory statement is present. "
|
|
192
|
+
"Broader semantics remain unverified."
|
|
193
|
+
if present
|
|
194
|
+
else "Final inventory disclosure has not been submitted."
|
|
195
|
+
if not is_final
|
|
196
|
+
else "Answer using this known fact from the locked Agent Build on a plain line: "
|
|
197
|
+
+ self.disclosure.statement
|
|
198
|
+
+ " Workspace or network inspection cannot change the binding."
|
|
199
|
+
),
|
|
200
|
+
repairable=missing_final,
|
|
201
|
+
repair_target=VerificationRepairTarget(kind="final_output") if missing_final else None,
|
|
202
|
+
)
|
|
203
|
+
results.append(result)
|
|
204
|
+
candidate = bundle.candidate
|
|
205
|
+
report = VerificationReport(
|
|
206
|
+
candidate_id=candidate.candidate_id,
|
|
207
|
+
contract_revision=request.contract.revision,
|
|
208
|
+
subject_digest=candidate.subject_digest,
|
|
209
|
+
subject_context_digest=candidate.subject_context_digest,
|
|
210
|
+
environment_digest=candidate.environment_digest,
|
|
211
|
+
items=tuple(results),
|
|
212
|
+
repairable=(missing_final or bool(bundle.report and bundle.report.repairable)),
|
|
213
|
+
failure_fingerprint=(
|
|
214
|
+
_digest(f"{VERIFIER_REF}\0{request.contract.revision}\0missing-disclosure")
|
|
215
|
+
if missing_final
|
|
216
|
+
else bundle.report.failure_fingerprint
|
|
217
|
+
if bundle.report
|
|
218
|
+
else ""
|
|
219
|
+
),
|
|
220
|
+
)
|
|
221
|
+
return VerificationBundle(
|
|
222
|
+
candidate=candidate, report=report, post_workspace=bundle.post_workspace
|
|
223
|
+
)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Admit trusted Build Kernel starts without importing projected model history."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from ksadk.kernel.state import TERMINAL_RUN_STATES
|
|
8
|
+
from ksadk.runtime import StartRequest
|
|
9
|
+
from ksadk.studio.contracts import RunStatus
|
|
10
|
+
from ksadk.studio.native_user_input import admit_native_user_input
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def admit_native_kernel_start(
|
|
14
|
+
*, spec: Any, request: StartRequest, native: Any, runtime: Any, run_events: Any,
|
|
15
|
+
) -> StartRequest:
|
|
16
|
+
"""Check immutable Build pins and both trusted host history indexes.
|
|
17
|
+
|
|
18
|
+
Ordinary Studio Runs and Kernel Runs have separate host indexes. Neither
|
|
19
|
+
supplies model context to Native: its scoped ledger remains the history
|
|
20
|
+
owner. A ledger head must be accounted for by a compatible host Run before
|
|
21
|
+
continuing, and a prior Managed Run must never be silently imported.
|
|
22
|
+
"""
|
|
23
|
+
if request.agent_id != spec.agent_id or not isinstance(request.input, str):
|
|
24
|
+
raise ValueError("native_studio_kernel_identity_unavailable")
|
|
25
|
+
native.admit_studio_build(
|
|
26
|
+
build_id=spec.build_id,
|
|
27
|
+
manifest_sha256=spec.manifest_sha256,
|
|
28
|
+
model=request.model,
|
|
29
|
+
request_config=request.config,
|
|
30
|
+
project_dir=spec.launch_context.project_dir,
|
|
31
|
+
launch_config=spec.launch_context.config,
|
|
32
|
+
require_pin=True,
|
|
33
|
+
)
|
|
34
|
+
normalized_input = admit_native_user_input(request.input, request.input)
|
|
35
|
+
known_heads: set[str] = set()
|
|
36
|
+
for previous in run_events.list_runs(session_id=request.session_id):
|
|
37
|
+
if previous.agent_id != spec.agent_id:
|
|
38
|
+
continue
|
|
39
|
+
if previous.status not in {
|
|
40
|
+
RunStatus.COMPLETED, RunStatus.FAILED, RunStatus.CANCELLED,
|
|
41
|
+
RunStatus.INTERRUPTED, RunStatus.TIMED_OUT,
|
|
42
|
+
}:
|
|
43
|
+
continue
|
|
44
|
+
handle = previous.runtime_handle
|
|
45
|
+
if previous.status is not RunStatus.COMPLETED and not handle.get("run_id"):
|
|
46
|
+
continue
|
|
47
|
+
if (
|
|
48
|
+
previous.build_id != spec.build_id
|
|
49
|
+
or previous.manifest_sha256 != spec.manifest_sha256
|
|
50
|
+
or (handle.get("native_ref") or {}).get("engine_kind") != "native"
|
|
51
|
+
):
|
|
52
|
+
raise ValueError("native_studio_cross_runtime_history_unavailable")
|
|
53
|
+
known_heads.add(str(handle.get("run_id") or ""))
|
|
54
|
+
|
|
55
|
+
instance_id = runtime.config.agent_instance_id
|
|
56
|
+
command_id = str(request.metadata.get("command_id") or "")
|
|
57
|
+
if not command_id:
|
|
58
|
+
raise ValueError("native_studio_kernel_command_unavailable")
|
|
59
|
+
messages = await runtime.kernel_store.list_messages(instance_id, request.session_id)
|
|
60
|
+
for message in messages:
|
|
61
|
+
command = message.command
|
|
62
|
+
if command is None or command.command_type != "enqueue":
|
|
63
|
+
continue
|
|
64
|
+
if str(command.command_id) == command_id:
|
|
65
|
+
continue
|
|
66
|
+
previous = await runtime.kernel_store.find_command_run(
|
|
67
|
+
instance_id, request.session_id, str(command.command_id),
|
|
68
|
+
)
|
|
69
|
+
handle = None if previous is None else previous.metadata.get("handle")
|
|
70
|
+
if not handle:
|
|
71
|
+
continue
|
|
72
|
+
if (
|
|
73
|
+
previous.state not in TERMINAL_RUN_STATES
|
|
74
|
+
or (handle.get("native_ref") or {}).get("engine_kind") != "native"
|
|
75
|
+
):
|
|
76
|
+
raise ValueError("native_studio_cross_runtime_history_unavailable")
|
|
77
|
+
known_heads.add(str(handle.get("run_id") or ""))
|
|
78
|
+
|
|
79
|
+
parent = native.session_parent_run_id(request.session_id)
|
|
80
|
+
if (known_heads and parent not in known_heads) or (not known_heads and parent is not None):
|
|
81
|
+
raise ValueError("native_studio_session_parent_mismatch")
|
|
82
|
+
return request.model_copy(update={
|
|
83
|
+
"metadata": {}, "config": {}, "model": None, "input": normalized_input,
|
|
84
|
+
})
|