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
|
@@ -14,8 +14,13 @@ from collections.abc import Mapping
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any
|
|
16
16
|
|
|
17
|
+
from ksadk.harness.tool_output import publish_tool_output
|
|
17
18
|
from ksadk.harness.tools import HarnessTool
|
|
18
19
|
|
|
20
|
+
LOCKED_PYTHON_EXECUTION_POLICY_DIGEST = (
|
|
21
|
+
"sha256:" + hashlib.sha256(b"ksadk.python-source-bytes/v1").hexdigest()
|
|
22
|
+
)
|
|
23
|
+
|
|
19
24
|
|
|
20
25
|
def python_tool_bundle_path(digest: str) -> Path:
|
|
21
26
|
if not re.fullmatch(r"sha256:[0-9a-f]{64}", digest):
|
|
@@ -24,45 +29,99 @@ def python_tool_bundle_path(digest: str) -> Path:
|
|
|
24
29
|
|
|
25
30
|
|
|
26
31
|
_EXECUTE = """
|
|
27
|
-
import asyncio, contextlib, importlib.util, inspect, json, sys
|
|
28
|
-
|
|
32
|
+
import asyncio, contextlib, hashlib, importlib.util, inspect, json, sys
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
path, name, expected_digest = sys.argv[1:]
|
|
29
35
|
with contextlib.redirect_stdout(sys.stderr):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
arguments = json.load(sys.stdin)
|
|
37
|
+
source = None
|
|
38
|
+
try:
|
|
39
|
+
pinned_path = Path(path)
|
|
40
|
+
if pinned_path.resolve(strict=True) == pinned_path:
|
|
41
|
+
source = pinned_path.read_bytes()
|
|
42
|
+
except (OSError, ValueError):
|
|
43
|
+
pass
|
|
44
|
+
if source is None or 'sha256:' + hashlib.sha256(source).hexdigest() != expected_digest:
|
|
45
|
+
result = {'version': 'ksadk.python-source-bytes/v1', 'status': 'source_rejected'}
|
|
46
|
+
else:
|
|
47
|
+
spec = importlib.util.spec_from_file_location('locked_tool', path)
|
|
48
|
+
module = importlib.util.module_from_spec(spec)
|
|
49
|
+
# Compile exactly the verified bytes. SourceFileLoader may read a .pyc
|
|
50
|
+
# even with -B, or reopen a changed path after the digest check.
|
|
51
|
+
exec(compile(source, path, 'exec'), module.__dict__)
|
|
52
|
+
value = getattr(module, name)(**arguments)
|
|
53
|
+
if inspect.isawaitable(value):
|
|
54
|
+
value = asyncio.run(value)
|
|
55
|
+
result = {'version': 'ksadk.python-source-bytes/v1', 'status': 'ok', 'value': value}
|
|
56
|
+
print(json.dumps(result, ensure_ascii=False))
|
|
37
57
|
"""
|
|
38
58
|
|
|
39
59
|
_EXECUTE_BUILTIN = """
|
|
40
|
-
import contextlib, json, sqlite3, sys
|
|
60
|
+
import contextlib, json, sqlite3, sys, threading
|
|
41
61
|
from dataclasses import asdict
|
|
62
|
+
wire_stdout = sys.stdout
|
|
63
|
+
output_bytes = 0
|
|
64
|
+
output_lock = threading.Lock()
|
|
42
65
|
sys.path.insert(0, sys.argv[1])
|
|
43
66
|
with contextlib.redirect_stdout(sys.stderr):
|
|
44
67
|
from pathlib import Path
|
|
45
68
|
from ksadk.toolsets import get_agentengine_tools
|
|
69
|
+
import ksadk.toolsets.platform as platform
|
|
70
|
+
import ksadk.toolsets.sandbox as sandbox
|
|
46
71
|
import ksadk.toolsets.workspace as workspace
|
|
47
72
|
import ksadk.toolsets.workspace_state as state
|
|
48
|
-
|
|
73
|
+
from ksadk.toolsets.workspace_read_budget import SourceReadBudget, source_read_budget_scope
|
|
74
|
+
from ksadk.harness.tool_output import tool_output_scope
|
|
75
|
+
resolved_workspace_root = lambda: Path(sys.argv[2])
|
|
76
|
+
# Builtin modules import workspace_root by value. Patch every consumer so
|
|
77
|
+
# file tools, status tools, and command execution share the exact policy
|
|
78
|
+
# root passed by the managed provider.
|
|
79
|
+
workspace.workspace_root = resolved_workspace_root
|
|
80
|
+
platform.workspace_root = resolved_workspace_root
|
|
81
|
+
sandbox.workspace_root = resolved_workspace_root
|
|
49
82
|
tool = get_agentengine_tools(include=[sys.argv[3]], mode='direct')[0]
|
|
50
83
|
arguments = json.load(sys.stdin)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
for
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
84
|
+
source_budget = SourceReadBudget.from_transport(json.loads(sys.argv[6]))
|
|
85
|
+
|
|
86
|
+
def public_output(channel, text):
|
|
87
|
+
global output_bytes
|
|
88
|
+
if sys.argv[3] != 'run_command' or channel not in {'stdout', 'stderr'}:
|
|
89
|
+
return
|
|
90
|
+
with output_lock:
|
|
91
|
+
text = str(text)[:max(0, 32768 - output_bytes)]
|
|
92
|
+
output_bytes += len(text)
|
|
93
|
+
for offset in range(0, len(text), 4096):
|
|
94
|
+
print('KSADK_PUBLIC_OUTPUT:' + json.dumps(
|
|
95
|
+
{'channel': channel, 'text': text[offset:offset + 4096]},
|
|
96
|
+
ensure_ascii=False), file=wire_stdout, flush=True)
|
|
97
|
+
|
|
98
|
+
def invoke_builtin():
|
|
99
|
+
with source_read_budget_scope(source_budget), tool_output_scope(public_output):
|
|
100
|
+
return tool.invoke(arguments) if hasattr(tool, 'invoke') else tool(**arguments)
|
|
101
|
+
|
|
102
|
+
# File observations and mutations share the persistent revision guard.
|
|
103
|
+
# Commands, searches, listings and unrelated tools do not consume it and
|
|
104
|
+
# must not hold its write transaction throughout their execution.
|
|
105
|
+
stateful = sys.argv[3] in {
|
|
106
|
+
'read_workspace_file', 'write_workspace_file', 'write_workspace_files',
|
|
107
|
+
'edit_workspace_file', 'multi_edit_workspace_file', 'delete_workspace_file',
|
|
108
|
+
}
|
|
109
|
+
if stateful:
|
|
110
|
+
db_path = Path(sys.argv[4])
|
|
111
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
112
|
+
with sqlite3.connect(db_path, timeout=10) as db:
|
|
113
|
+
db.execute('CREATE TABLE IF NOT EXISTS reads (session TEXT PRIMARY KEY, data TEXT)')
|
|
114
|
+
db.execute('BEGIN IMMEDIATE')
|
|
115
|
+
row = db.execute('SELECT data FROM reads WHERE session=?', (sys.argv[5],)).fetchone()
|
|
116
|
+
if row:
|
|
117
|
+
for item in json.loads(row[0]):
|
|
118
|
+
state.record_read_state(state.WorkspaceReadState(**item))
|
|
119
|
+
value = invoke_builtin()
|
|
120
|
+
snapshot = [asdict(item) for item in state._READ_STATE.values()]
|
|
121
|
+
db.execute('INSERT OR REPLACE INTO reads VALUES (?, ?)',
|
|
122
|
+
(sys.argv[5], json.dumps(snapshot)))
|
|
123
|
+
else:
|
|
124
|
+
value = invoke_builtin()
|
|
66
125
|
print(json.dumps(value, ensure_ascii=False))
|
|
67
126
|
"""
|
|
68
127
|
|
|
@@ -125,6 +184,22 @@ def _plain(value: Any) -> Any:
|
|
|
125
184
|
return value
|
|
126
185
|
|
|
127
186
|
|
|
187
|
+
def _resolved_agent_id(resolved: Mapping[str, Any]) -> str:
|
|
188
|
+
"""Read the canonical Agent id from a compiled resolved spec.
|
|
189
|
+
|
|
190
|
+
Current bundles store it as the top-level ``agentId``. Keep the legacy
|
|
191
|
+
metadata fallback for older hand-authored fixtures and bundles, but never
|
|
192
|
+
assume that a source-draft metadata object survives compilation.
|
|
193
|
+
"""
|
|
194
|
+
direct = str(resolved.get("agentId") or "").strip()
|
|
195
|
+
if direct:
|
|
196
|
+
return direct
|
|
197
|
+
metadata = resolved.get("metadata")
|
|
198
|
+
if isinstance(metadata, Mapping):
|
|
199
|
+
return str(metadata.get("id") or "").strip()
|
|
200
|
+
return ""
|
|
201
|
+
|
|
202
|
+
|
|
128
203
|
def _reserve_tool_call(
|
|
129
204
|
*,
|
|
130
205
|
database: Path,
|
|
@@ -230,10 +305,15 @@ def assemble_python_tools(
|
|
|
230
305
|
policy = current_execution_policy()
|
|
231
306
|
policy_root = policy.workspace_root if policy is not None else None
|
|
232
307
|
writable_root = policy_root or workspace_root or root
|
|
308
|
+
state_root = (
|
|
309
|
+
policy.tool_state_root
|
|
310
|
+
if policy is not None and policy.tool_state_root is not None
|
|
311
|
+
else writable_root
|
|
312
|
+
)
|
|
233
313
|
max_calls = contract.get("maxCallsPerRun")
|
|
234
314
|
if max_calls is not None:
|
|
235
315
|
_reserve_tool_call(
|
|
236
|
-
database=
|
|
316
|
+
database=state_root
|
|
237
317
|
/ ".harness-tools"
|
|
238
318
|
/ "state"
|
|
239
319
|
/ "tool-call-quotas.sqlite",
|
|
@@ -242,7 +322,7 @@ def assemble_python_tools(
|
|
|
242
322
|
limit=int(max_calls),
|
|
243
323
|
)
|
|
244
324
|
if descriptor is None:
|
|
245
|
-
command = [_EXECUTE, str(path), contract["callableName"]]
|
|
325
|
+
command = [_EXECUTE, str(path), contract["callableName"], contract["sourceSha256"]]
|
|
246
326
|
else:
|
|
247
327
|
from ksadk.toolsets.workspace_identity import identity_workspace_root
|
|
248
328
|
|
|
@@ -253,23 +333,31 @@ def assemble_python_tools(
|
|
|
253
333
|
env = dict(
|
|
254
334
|
os.environ, KSADK_TOOL_APPROVAL_MODE="full",
|
|
255
335
|
KSADK_PROJECT_DIR=str(execution_root),
|
|
256
|
-
|
|
336
|
+
KSADK_STUDIO_AGENT_ID=_resolved_agent_id(resolved),
|
|
337
|
+
AGENTENGINE_UI_DIR=str(state_root / ".harness-tools" / "ui"),
|
|
257
338
|
)
|
|
258
339
|
scoped_root = policy_root or identity_workspace_root(
|
|
259
340
|
(workspace_root or root) / ".harness-tools" / "workspace"
|
|
260
341
|
).resolve()
|
|
342
|
+
from ksadk.toolsets.workspace_read_budget import current_source_read_budget
|
|
343
|
+
|
|
344
|
+
source_budget = (
|
|
345
|
+
current_source_read_budget()
|
|
346
|
+
if contract["name"] == "read_workspace_file" else None
|
|
347
|
+
)
|
|
261
348
|
command = [
|
|
262
349
|
_EXECUTE_BUILTIN,
|
|
263
350
|
str(Path(__file__).resolve().parents[3]),
|
|
264
351
|
str(scoped_root),
|
|
265
352
|
contract["name"],
|
|
266
353
|
str(
|
|
267
|
-
|
|
354
|
+
state_root
|
|
268
355
|
/ ".harness-tools"
|
|
269
356
|
/ "state"
|
|
270
357
|
/ (hashlib.sha256(str(scoped_root).encode()).hexdigest() + ".sqlite")
|
|
271
358
|
),
|
|
272
359
|
tool_context.session_id or "default",
|
|
360
|
+
json.dumps(source_budget.transport() if source_budget is not None else None),
|
|
273
361
|
]
|
|
274
362
|
process = await asyncio.create_subprocess_exec(
|
|
275
363
|
sys.executable,
|
|
@@ -290,23 +378,64 @@ def assemble_python_tools(
|
|
|
290
378
|
await process.stdin.drain()
|
|
291
379
|
process.stdin.close()
|
|
292
380
|
output = bytearray()
|
|
381
|
+
pending = bytearray()
|
|
382
|
+
allow_progress = descriptor is not None and contract["name"] == "run_command"
|
|
383
|
+
prefix = b'KSADK_PUBLIC_OUTPUT:'
|
|
293
384
|
while chunk := await process.stdout.read(65536):
|
|
294
|
-
|
|
295
|
-
|
|
385
|
+
pending.extend(chunk)
|
|
386
|
+
while b'\n' in pending:
|
|
387
|
+
line, _, tail = pending.partition(b'\n')
|
|
388
|
+
pending = bytearray(tail)
|
|
389
|
+
if allow_progress and line.startswith(prefix):
|
|
390
|
+
progress = json.loads(line[len(prefix):])
|
|
391
|
+
publish_tool_output(progress.get('channel'), progress.get('text'))
|
|
392
|
+
else:
|
|
393
|
+
output.extend(line + b'\n')
|
|
394
|
+
if len(output) + len(pending) > 1_048_576:
|
|
296
395
|
raise ValueError("Tool 输出超过 1 MiB 限制")
|
|
396
|
+
output.extend(pending)
|
|
297
397
|
await process.wait()
|
|
298
398
|
if process.returncode:
|
|
299
399
|
raise RuntimeError(
|
|
300
400
|
f"Tool {contract['name']} 执行失败,请检查参数与运行环境"
|
|
301
401
|
)
|
|
302
|
-
|
|
402
|
+
value = json.loads(output)
|
|
403
|
+
if descriptor is None:
|
|
404
|
+
if (
|
|
405
|
+
not isinstance(value, dict)
|
|
406
|
+
or value.get("version") != "ksadk.python-source-bytes/v1"
|
|
407
|
+
):
|
|
408
|
+
raise RuntimeError("Locked Python worker returned an invalid protocol")
|
|
409
|
+
if value.get("status") == "source_rejected":
|
|
410
|
+
return {
|
|
411
|
+
"ok": False,
|
|
412
|
+
"error_type": "tool_source_integrity",
|
|
413
|
+
"error_message": (
|
|
414
|
+
"Locked Python Tool source is unavailable or changed"
|
|
415
|
+
),
|
|
416
|
+
}
|
|
417
|
+
if value.get("status") != "ok" or "value" not in value:
|
|
418
|
+
raise RuntimeError("Locked Python worker returned an invalid protocol")
|
|
419
|
+
return value["value"]
|
|
420
|
+
return value
|
|
421
|
+
completed = False
|
|
303
422
|
try:
|
|
304
|
-
|
|
423
|
+
result = await asyncio.wait_for(
|
|
305
424
|
consume_output(), timeout=contract.get("timeoutSeconds", 20)
|
|
306
425
|
)
|
|
426
|
+
completed = True
|
|
427
|
+
return result
|
|
307
428
|
finally:
|
|
308
|
-
|
|
309
|
-
|
|
429
|
+
# An exited group leader can leave descendants holding stdout
|
|
430
|
+
# and performing writes. A failed/cancelled foreground call
|
|
431
|
+
# retains cleanup ownership until its group has been stopped.
|
|
432
|
+
if not completed or process.returncode is None:
|
|
433
|
+
try:
|
|
434
|
+
os.killpg(process.pid, signal.SIGKILL)
|
|
435
|
+
except ProcessLookupError:
|
|
436
|
+
# Natural exit must not replace the original error or
|
|
437
|
+
# cancellation with an unrelated cleanup exception.
|
|
438
|
+
pass
|
|
310
439
|
await process.wait()
|
|
311
440
|
|
|
312
441
|
tools[name] = HarnessTool(
|
|
@@ -46,7 +46,7 @@ def _provider_manifest(
|
|
|
46
46
|
"compatibility": {
|
|
47
47
|
"kernelApi": ">=1,<2",
|
|
48
48
|
"runtimeProtocols": ["agentkit.runtime/v1"],
|
|
49
|
-
"python": ">=3.
|
|
49
|
+
"python": ">=3.12,<3.15" if runtime == "python" else None,
|
|
50
50
|
},
|
|
51
51
|
"healthContract": "plugin.health/v1",
|
|
52
52
|
"provenance": {
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
|
-
from collections.abc import Awaitable, Sequence
|
|
6
|
+
from collections.abc import Awaitable, Callable, Sequence
|
|
7
7
|
from contextlib import AsyncExitStack
|
|
8
|
-
from dataclasses import dataclass
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
9
|
from typing import Protocol, runtime_checkable
|
|
10
10
|
|
|
11
11
|
from ksadk.harness.config import McpToolSpec
|
|
@@ -46,6 +46,22 @@ class ReleasableStaticMCPSource(Protocol):
|
|
|
46
46
|
async def release_harness_mcp_specs(self, specs: Sequence[McpToolSpec]) -> None: ...
|
|
47
47
|
|
|
48
48
|
|
|
49
|
+
@dataclass(frozen=True)
|
|
50
|
+
class MCPResourcePin:
|
|
51
|
+
name: str
|
|
52
|
+
generation: str
|
|
53
|
+
descriptor_digest: str
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass(frozen=True)
|
|
57
|
+
class MCPRuntimeCredential:
|
|
58
|
+
"""Ephemeral host callbacks; never part of a spec, lock or Run snapshot."""
|
|
59
|
+
|
|
60
|
+
name: str
|
|
61
|
+
token: Callable[[], Awaitable[str]] = field(repr=False)
|
|
62
|
+
available: Callable[[], Awaitable[bool]] = field(repr=False)
|
|
63
|
+
|
|
64
|
+
|
|
49
65
|
@dataclass
|
|
50
66
|
class MCPProjectionLease:
|
|
51
67
|
"""Projected connector specs and their activation-owned cleanup."""
|
|
@@ -53,7 +69,35 @@ class MCPProjectionLease:
|
|
|
53
69
|
specs: tuple[McpToolSpec, ...]
|
|
54
70
|
owners: tuple[str, ...]
|
|
55
71
|
_cleanup: AsyncExitStack
|
|
72
|
+
_checks: tuple[Callable[[], Awaitable[bool]], ...] = ()
|
|
73
|
+
_activation_available: Callable[[], bool] | None = None
|
|
74
|
+
resource_pins: tuple[MCPResourcePin, ...] = ()
|
|
56
75
|
_close_task: asyncio.Task[None] | None = None
|
|
76
|
+
runtime_credentials: tuple[MCPRuntimeCredential, ...] = ()
|
|
77
|
+
_runtime_checks: tuple[Callable[[], Awaitable[bool]], ...] = ()
|
|
78
|
+
|
|
79
|
+
async def available(self) -> bool:
|
|
80
|
+
"""Check original owners; never replace specs with a newer lease."""
|
|
81
|
+
return await self._available(self._checks)
|
|
82
|
+
|
|
83
|
+
async def runtime_available(self) -> bool:
|
|
84
|
+
"""Admit only clients explicitly consuming owned runtime credentials."""
|
|
85
|
+
return await self._available(self._runtime_checks or self._checks)
|
|
86
|
+
|
|
87
|
+
async def _available(self, checks: tuple[Callable[[], Awaitable[bool]], ...]) -> bool:
|
|
88
|
+
if self._close_task is not None:
|
|
89
|
+
return False
|
|
90
|
+
try:
|
|
91
|
+
if self._activation_available is not None and not self._activation_available():
|
|
92
|
+
return False
|
|
93
|
+
for check in checks:
|
|
94
|
+
if await check() is not True:
|
|
95
|
+
return False
|
|
96
|
+
return self._close_task is None and (
|
|
97
|
+
self._activation_available is None or self._activation_available() is True
|
|
98
|
+
)
|
|
99
|
+
except Exception:
|
|
100
|
+
return False
|
|
57
101
|
|
|
58
102
|
async def aclose(self) -> None:
|
|
59
103
|
if self._close_task is None:
|
|
@@ -86,6 +130,10 @@ async def project_mcp_capabilities(
|
|
|
86
130
|
cleanup = AsyncExitStack()
|
|
87
131
|
specs: list[McpToolSpec] = []
|
|
88
132
|
owners: list[str] = []
|
|
133
|
+
checks: list[Callable[[], Awaitable[bool]]] = []
|
|
134
|
+
runtime_checks: list[Callable[[], Awaitable[bool]]] = []
|
|
135
|
+
runtime_credentials: list[MCPRuntimeCredential] = []
|
|
136
|
+
resource_pins: list[MCPResourcePin] = []
|
|
89
137
|
names: set[str] = set()
|
|
90
138
|
try:
|
|
91
139
|
for binding in capabilities.all("mcp.connector/v1"):
|
|
@@ -120,6 +168,46 @@ async def project_mcp_capabilities(
|
|
|
120
168
|
"mcp_capability_incompatible",
|
|
121
169
|
f"plugin {binding.plugin_id} cannot project MCP connector config",
|
|
122
170
|
)
|
|
171
|
+
lease_check = getattr(runtime, "activation_mcp_specs_available", None)
|
|
172
|
+
if callable(lease_check):
|
|
173
|
+
|
|
174
|
+
async def check(source=runtime, selected=projected_specs):
|
|
175
|
+
return await source.activation_mcp_specs_available(selected)
|
|
176
|
+
|
|
177
|
+
checks.append(check)
|
|
178
|
+
else:
|
|
179
|
+
checks.append(runtime.health)
|
|
180
|
+
credentials = getattr(runtime, "activation_mcp_runtime_credentials", None)
|
|
181
|
+
selected_credentials = (
|
|
182
|
+
tuple(credentials(projected_specs)) if callable(credentials) else ()
|
|
183
|
+
)
|
|
184
|
+
if any(
|
|
185
|
+
not isinstance(item, MCPRuntimeCredential)
|
|
186
|
+
or item.name not in {spec.name for spec in projected_specs}
|
|
187
|
+
for item in selected_credentials
|
|
188
|
+
) or len({item.name for item in selected_credentials}) != len(selected_credentials):
|
|
189
|
+
raise PluginHostError("mcp_credential_invalid", "invalid MCP runtime credential")
|
|
190
|
+
if selected_credentials and {item.name for item in selected_credentials} != {
|
|
191
|
+
spec.name for spec in projected_specs
|
|
192
|
+
}:
|
|
193
|
+
raise PluginHostError(
|
|
194
|
+
"mcp_credential_invalid", "partial MCP runtime credential ownership"
|
|
195
|
+
)
|
|
196
|
+
runtime_credentials.extend(selected_credentials)
|
|
197
|
+
runtime_checks.extend(item.available for item in selected_credentials)
|
|
198
|
+
# A connector with no rotating credential keeps its original probe.
|
|
199
|
+
if not selected_credentials:
|
|
200
|
+
runtime_checks.append(checks[-1])
|
|
201
|
+
resource_refs = getattr(runtime, "activation_mcp_resource_pins", None)
|
|
202
|
+
if callable(resource_refs):
|
|
203
|
+
selected_pins = tuple(resource_refs(projected_specs))
|
|
204
|
+
if any(
|
|
205
|
+
not isinstance(pin, MCPResourcePin)
|
|
206
|
+
or pin.name not in {spec.name for spec in projected_specs}
|
|
207
|
+
for pin in selected_pins
|
|
208
|
+
):
|
|
209
|
+
raise PluginHostError("mcp_resource_pin_invalid", "invalid MCP resource pin")
|
|
210
|
+
resource_pins.extend(selected_pins)
|
|
123
211
|
for spec in projected_specs:
|
|
124
212
|
if not isinstance(spec, McpToolSpec) or not spec.name.strip():
|
|
125
213
|
raise PluginHostError(
|
|
@@ -138,7 +226,16 @@ async def project_mcp_capabilities(
|
|
|
138
226
|
close = asyncio.create_task(cleanup.aclose())
|
|
139
227
|
await _finish_owned_task(close)
|
|
140
228
|
raise
|
|
141
|
-
return MCPProjectionLease(
|
|
229
|
+
return MCPProjectionLease(
|
|
230
|
+
tuple(specs),
|
|
231
|
+
tuple(owners),
|
|
232
|
+
cleanup,
|
|
233
|
+
tuple(checks),
|
|
234
|
+
capabilities.activation_available,
|
|
235
|
+
tuple(resource_pins),
|
|
236
|
+
runtime_credentials=tuple(runtime_credentials),
|
|
237
|
+
_runtime_checks=tuple(runtime_checks),
|
|
238
|
+
)
|
|
142
239
|
|
|
143
240
|
|
|
144
241
|
__all__ = [
|
|
@@ -99,7 +99,7 @@ def platform_resource_mcp_manifest() -> PluginManifest:
|
|
|
99
99
|
"compatibility": {
|
|
100
100
|
"kernelApi": ">=1,<2",
|
|
101
101
|
"runtimeProtocols": ["agentkit.runtime/v1", "2025-06-18"],
|
|
102
|
-
"python": ">=3.
|
|
102
|
+
"python": ">=3.12,<3.15",
|
|
103
103
|
},
|
|
104
104
|
"healthContract": "plugin.health/v1",
|
|
105
105
|
"provenance": {
|
|
@@ -126,8 +126,9 @@ def _activation_operations(
|
|
|
126
126
|
) -> tuple[str, ...]:
|
|
127
127
|
"""Narrow an admitted maximum to the immutable Agent memory policy."""
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
write_operations = {"save_memory", "update_memory", "delete_memory"}
|
|
130
|
+
read_operations = tuple(operation for operation in allowed if operation not in write_operations)
|
|
131
|
+
if not write_operations.intersection(allowed) or write_authorizer is None:
|
|
131
132
|
return tuple(operation for operation in read_operations if operation != "memory_status")
|
|
132
133
|
resolved = bundle.resolved_agent_spec
|
|
133
134
|
memory = resolved.get("memory") if isinstance(resolved, Mapping) else None
|
|
@@ -144,9 +145,18 @@ def _activation_operations(
|
|
|
144
145
|
or str(rollout.get("memoryWrite") or "off") != "enabled"
|
|
145
146
|
):
|
|
146
147
|
return tuple(operation for operation in read_operations if operation != "memory_status")
|
|
147
|
-
return tuple(
|
|
148
|
-
|
|
149
|
-
|
|
148
|
+
return tuple(
|
|
149
|
+
operation
|
|
150
|
+
for operation in allowed
|
|
151
|
+
if operation
|
|
152
|
+
in {
|
|
153
|
+
"load_memory",
|
|
154
|
+
"save_memory",
|
|
155
|
+
"update_memory",
|
|
156
|
+
"delete_memory",
|
|
157
|
+
"memory_status",
|
|
158
|
+
}
|
|
159
|
+
)
|
|
150
160
|
|
|
151
161
|
|
|
152
162
|
def _profile_config(profile: CompositionProfile) -> Mapping[str, Any]:
|
|
@@ -17,14 +17,15 @@ from ksadk.conversations.contracts import ConversationItem
|
|
|
17
17
|
from ksadk.conversations.reducer import ConversationItemReducer
|
|
18
18
|
from ksadk.plugins.execution_host import PluginExecutionScope
|
|
19
19
|
|
|
20
|
-
from .contracts import TERMINAL, Actor
|
|
20
|
+
from .contracts import TERMINAL, Actor
|
|
21
21
|
from .domain import public
|
|
22
22
|
from .errors import TeamsError
|
|
23
23
|
from .runtime import TEAMS_PLUGIN_ID, TeamsRuntime
|
|
24
24
|
from .store import new_id, now
|
|
25
|
+
from .tool_service import TeamsToolMethods
|
|
25
26
|
|
|
26
27
|
|
|
27
|
-
class TeamsApplication:
|
|
28
|
+
class TeamsApplication(TeamsToolMethods):
|
|
28
29
|
def __init__(
|
|
29
30
|
self,
|
|
30
31
|
*,
|
|
@@ -338,147 +339,6 @@ class TeamsApplication:
|
|
|
338
339
|
},
|
|
339
340
|
)
|
|
340
341
|
|
|
341
|
-
@staticmethod
|
|
342
|
-
def tool_definitions():
|
|
343
|
-
def schema(properties, required=()):
|
|
344
|
-
return {
|
|
345
|
-
"type": "object",
|
|
346
|
-
"properties": properties,
|
|
347
|
-
"required": list(required),
|
|
348
|
-
"additionalProperties": False,
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
text = {"type": "string"}
|
|
352
|
-
return [
|
|
353
|
-
("team_context", "读取当前团队消息、成员和任务状态。", schema({})),
|
|
354
|
-
(
|
|
355
|
-
"team_message",
|
|
356
|
-
"发布进度,或明确请求某成员执行;wake=false仅留言,不触发执行。",
|
|
357
|
-
schema(
|
|
358
|
-
{"content": text, "targetMemberId": text, "wake": {"type": "boolean"}},
|
|
359
|
-
["content"],
|
|
360
|
-
),
|
|
361
|
-
),
|
|
362
|
-
(
|
|
363
|
-
"team_create_task",
|
|
364
|
-
"仅Leader:创建有验收标准的任务;指定负责人即自动派发,不要再额外wake。依赖用本轮已有taskId。",
|
|
365
|
-
TaskCreateInput.model_json_schema(),
|
|
366
|
-
),
|
|
367
|
-
(
|
|
368
|
-
"team_wait",
|
|
369
|
-
"仅Leader:持久等待一组任务验收/失败,不阻塞;调用后结束当前回复。",
|
|
370
|
-
schema(
|
|
371
|
-
{"taskIds": {"type": "array", "items": text, "minItems": 1, "maxItems": 64}},
|
|
372
|
-
["taskIds"],
|
|
373
|
-
),
|
|
374
|
-
),
|
|
375
|
-
(
|
|
376
|
-
"team_task_action",
|
|
377
|
-
"按最新 revision 领取任务;Leader 分配/重试,并仅在leader策略下审核任务结果。",
|
|
378
|
-
schema(
|
|
379
|
-
{
|
|
380
|
-
"taskId": text,
|
|
381
|
-
"action": {"enum": ["assign", "claim", "retry", "accept", "reject"]},
|
|
382
|
-
"expectedRevision": {"type": "integer", "minimum": 1},
|
|
383
|
-
"ownerMemberId": text,
|
|
384
|
-
"reason": {"type": "string", "maxLength": 2000},
|
|
385
|
-
},
|
|
386
|
-
["taskId", "action", "expectedRevision"],
|
|
387
|
-
),
|
|
388
|
-
),
|
|
389
|
-
(
|
|
390
|
-
"team_submit_result",
|
|
391
|
-
"提交自己当前任务的可核验结果。成功Run结束及验收后才算成功。",
|
|
392
|
-
schema(
|
|
393
|
-
{"result": text, "artifactIds": {"type": "array", "items": text}}, ["result"]
|
|
394
|
-
),
|
|
395
|
-
),
|
|
396
|
-
(
|
|
397
|
-
"team_finish",
|
|
398
|
-
"仅Leader:所有任务通过验收后提交最终成果,等待群主验收。",
|
|
399
|
-
schema({"result": text}, ["result"]),
|
|
400
|
-
),
|
|
401
|
-
(
|
|
402
|
-
"team_publish_artifact",
|
|
403
|
-
"登记当前独立工作区的实际交付文件,返回有来源和哈希的产物引用。",
|
|
404
|
-
schema({"path": text, "name": text}, ["path"]),
|
|
405
|
-
),
|
|
406
|
-
(
|
|
407
|
-
"team_read_artifact",
|
|
408
|
-
"读取本群已显式共享的不可变交付物,复制到自己工作区并返回来源与摘要。",
|
|
409
|
-
schema({"artifactId": text}, ["artifactId"]),
|
|
410
|
-
),
|
|
411
|
-
]
|
|
412
|
-
|
|
413
|
-
async def invoke(self, principal, operation, arguments, call_id):
|
|
414
|
-
# principal is an in-process/opaque-handle Host value, never JSON Actor.
|
|
415
|
-
actor = principal.get("actor") if isinstance(principal, dict) else None
|
|
416
|
-
if not isinstance(actor, Actor) or actor.kind != "member":
|
|
417
|
-
raise TeamsError("invocation_required", "缺少宿主授予的成员调用上下文", status=403)
|
|
418
|
-
from jsonschema import Draft202012Validator
|
|
419
|
-
from jsonschema.exceptions import ValidationError
|
|
420
|
-
|
|
421
|
-
definition = next((item for item in self.tool_definitions() if item[0] == operation), None)
|
|
422
|
-
if definition is None:
|
|
423
|
-
raise TeamsError("tool_unavailable", "当前团队不提供此工具", status=404)
|
|
424
|
-
try:
|
|
425
|
-
Draft202012Validator(definition[2]).validate(arguments)
|
|
426
|
-
except ValidationError as error:
|
|
427
|
-
raise TeamsError(
|
|
428
|
-
"invalid_tool_arguments", "协作工具参数不符合声明的结构", status=422
|
|
429
|
-
) from error
|
|
430
|
-
if not isinstance(call_id, str) or not call_id or len(call_id) > 512:
|
|
431
|
-
raise TeamsError("call_identity_required", "缺少稳定工具调用标识", status=403)
|
|
432
|
-
with self.domain.store.transaction() as tx:
|
|
433
|
-
self.domain.authorize(tx, actor, actor.group_id)
|
|
434
|
-
key = f"tool:{actor.run_id}:{call_id}"
|
|
435
|
-
if operation == "team_context":
|
|
436
|
-
from .context import execution_context
|
|
437
|
-
|
|
438
|
-
return execution_context(self.domain, actor, principal.get("taskId"))
|
|
439
|
-
if operation == "team_message":
|
|
440
|
-
return self.domain.member_message(
|
|
441
|
-
actor,
|
|
442
|
-
content=arguments["content"],
|
|
443
|
-
target_member_id=arguments.get("targetMemberId"),
|
|
444
|
-
wake=arguments.get("wake", False),
|
|
445
|
-
source_delivery_id=principal["deliveryId"],
|
|
446
|
-
key=key,
|
|
447
|
-
)
|
|
448
|
-
if operation == "team_create_task":
|
|
449
|
-
return self.domain.create_task(
|
|
450
|
-
actor,
|
|
451
|
-
actor.group_id,
|
|
452
|
-
actor.team_run_id,
|
|
453
|
-
TaskCreateInput.model_validate(arguments),
|
|
454
|
-
key,
|
|
455
|
-
)
|
|
456
|
-
if operation == "team_wait":
|
|
457
|
-
return self.domain.wait_for_tasks(actor, arguments["taskIds"], key)
|
|
458
|
-
if operation == "team_task_action":
|
|
459
|
-
return self.domain.task_action(
|
|
460
|
-
actor,
|
|
461
|
-
actor.group_id,
|
|
462
|
-
arguments["taskId"],
|
|
463
|
-
arguments["action"],
|
|
464
|
-
arguments["expectedRevision"],
|
|
465
|
-
key,
|
|
466
|
-
owner_member_id=arguments.get("ownerMemberId"),
|
|
467
|
-
reason=arguments.get("reason"),
|
|
468
|
-
)
|
|
469
|
-
if operation == "team_submit_result":
|
|
470
|
-
artifacts = self._artifacts(actor, arguments.get("artifactIds", []))
|
|
471
|
-
return self.domain.result_candidate(
|
|
472
|
-
actor, principal["taskId"], arguments["result"], key, artifacts=artifacts
|
|
473
|
-
)
|
|
474
|
-
if operation == "team_finish":
|
|
475
|
-
return self.domain.finish_candidate(actor, arguments["result"], key)
|
|
476
|
-
if operation == "team_publish_artifact":
|
|
477
|
-
return self.publish_artifact(actor, arguments["path"], arguments.get("name"), key)
|
|
478
|
-
if operation == "team_read_artifact":
|
|
479
|
-
return self.read_artifact(actor, arguments["artifactId"])
|
|
480
|
-
raise TeamsError("tool_unavailable", "当前团队不提供此工具", status=404)
|
|
481
|
-
|
|
482
342
|
def read_artifact(self, actor, artifact_id):
|
|
483
343
|
from .artifacts import read_workspace_artifact
|
|
484
344
|
|