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
ksadk/studio/static/index.html
CHANGED
|
@@ -5,15 +5,15 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="icon" type="image/x-icon" href="/static/assets/kingsoft-cloud-BOcLiQ3e.ico" />
|
|
7
7
|
<title>AgentKit Studio</title>
|
|
8
|
-
<script type="module" crossorigin src="/static/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/static/assets/index-Cy68gTlH.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/static/assets/rolldown-runtime-hePW80VL.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/static/assets/react-vendor-BNmTiJ-I.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/static/assets/preload-helper-CO68xz6u.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/static/assets/clsx-DB0hHKMi.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/static/assets/createLucideIcon-DR0LGTP5.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/static/assets/index.dom-BQenBtFm.js">
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/static/assets/MessageMarkdown-CwMTvgFj-
|
|
16
|
-
<link rel="stylesheet" crossorigin href="/static/assets/index-
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js">
|
|
16
|
+
<link rel="stylesheet" crossorigin href="/static/assets/index-C7DNDik2.css">
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
19
|
<div id="root"></div>
|
ksadk/studio/teams_catalog.py
CHANGED
|
@@ -90,6 +90,39 @@ class StudioTeamsCatalog:
|
|
|
90
90
|
)
|
|
91
91
|
return items
|
|
92
92
|
|
|
93
|
+
def node_advertisements(
|
|
94
|
+
self, host_descriptors: dict[str, dict[str, Any]]
|
|
95
|
+
) -> list[dict[str, Any]]:
|
|
96
|
+
"""Advertise only fixed builds with explicit trusted Host descriptors.
|
|
97
|
+
|
|
98
|
+
A provider name (including Harness) is not proof that this process has
|
|
99
|
+
mounted grant expiry, policy enforcement or canonical event storage.
|
|
100
|
+
Bootstrap/probe supplies descriptors; reading the directory starts no runtime.
|
|
101
|
+
"""
|
|
102
|
+
from ksadk.studio.teams_node_v1 import normalized_node_bindings
|
|
103
|
+
|
|
104
|
+
items = []
|
|
105
|
+
for binding in self._local():
|
|
106
|
+
descriptor = host_descriptors.get(binding["bindingRef"])
|
|
107
|
+
if not descriptor or binding.get("buildId") is None:
|
|
108
|
+
continue
|
|
109
|
+
if descriptor.get("bundleDigest") != binding.get("buildDigest"):
|
|
110
|
+
continue
|
|
111
|
+
items.append(
|
|
112
|
+
{
|
|
113
|
+
"localBindingRef": binding["bindingRef"],
|
|
114
|
+
"agentId": binding["agentId"],
|
|
115
|
+
"buildId": binding["buildId"],
|
|
116
|
+
"providerRef": binding["providerRef"],
|
|
117
|
+
"name": binding["name"],
|
|
118
|
+
"bundleDigest": descriptor["bundleDigest"],
|
|
119
|
+
"contractDigest": descriptor["contractDigest"],
|
|
120
|
+
"capabilitiesDigest": descriptor["capabilitiesDigest"],
|
|
121
|
+
"capabilities": descriptor.get("capabilities", {}),
|
|
122
|
+
}
|
|
123
|
+
)
|
|
124
|
+
return normalized_node_bindings(items)
|
|
125
|
+
|
|
93
126
|
async def list_bindings(self) -> list[dict[str, Any]]:
|
|
94
127
|
items = self._local()
|
|
95
128
|
gateway = getattr(getattr(self.studio, "cloud", None), "gateway", None)
|
|
@@ -29,9 +29,12 @@ def create_teams_installation(studio: Any):
|
|
|
29
29
|
"""Choose the explicitly configured authority before registering routes."""
|
|
30
30
|
server_url = studio.configuration.environment().get("KSADK_TEAMS_SERVER_URL", "").strip()
|
|
31
31
|
if server_url:
|
|
32
|
+
from ksadk.studio.teams_node_factory import create_studio_teams_node
|
|
32
33
|
from ksadk.studio.teams_remote import RemoteStudioTeamsInstallation
|
|
33
34
|
|
|
34
|
-
return RemoteStudioTeamsInstallation(
|
|
35
|
+
return RemoteStudioTeamsInstallation(
|
|
36
|
+
studio, server_url, node_v1_factory=create_studio_teams_node
|
|
37
|
+
)
|
|
35
38
|
return StudioTeamsInstallation(studio)
|
|
36
39
|
|
|
37
40
|
|
ksadk/studio/teams_node.py
CHANGED
|
@@ -543,3 +543,7 @@ class TeamsExecutionNode:
|
|
|
543
543
|
self._dispose = None
|
|
544
544
|
self.db.close()
|
|
545
545
|
self._node_lock.close()
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
# Explicit versioned entry; the legacy class remains for existing local integrations.
|
|
549
|
+
from ksadk.studio.teams_node_v1 import TeamsNodeV1 as TeamsNodeV1 # noqa: E402
|
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
"""Production outbound Node composition over fixed Studio Build Kernels.
|
|
2
|
+
|
|
3
|
+
Credentials, preparations and public verification keys come from the configured
|
|
4
|
+
Server. This module contains no issuer/private key and never reconstructs a
|
|
5
|
+
missing original execution. The old Studio policy resolver remains available
|
|
6
|
+
for ordinary local runs; Teams runs always use their persisted Host context.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import time
|
|
12
|
+
from contextvars import ContextVar
|
|
13
|
+
from dataclasses import replace
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
|
|
18
|
+
|
|
19
|
+
from ksadk.harness.execution_policy import ExecutionPolicy
|
|
20
|
+
from ksadk.kernel.authorization import AgentControlPermitVerifier, b64url_decode
|
|
21
|
+
from ksadk.kernel.execution_host_ingress import (
|
|
22
|
+
HostBinding,
|
|
23
|
+
KernelTeamsExecutionHost,
|
|
24
|
+
TrustedGrantWindow,
|
|
25
|
+
TrustedPreparation,
|
|
26
|
+
)
|
|
27
|
+
from ksadk.kernel.teams_execution_context import (
|
|
28
|
+
ContextConflict,
|
|
29
|
+
PreparedTeamsContext,
|
|
30
|
+
SQLiteTeamsExecutionContextRegistry,
|
|
31
|
+
StoreIdentityMismatch,
|
|
32
|
+
)
|
|
33
|
+
from ksadk.plugins.teams.cloud_contracts import NodeProbeCommand
|
|
34
|
+
from ksadk.plugins.teams.cloud_permits import TeamsPermitVerifier
|
|
35
|
+
from ksadk.studio.kernel_registry import StudioBuildKernelRegistry
|
|
36
|
+
from ksadk.studio.teams_catalog import StudioTeamsCatalog
|
|
37
|
+
from ksadk.studio.teams_node_v1 import KernelTeamsNodeExecutor, TeamsNodeV1
|
|
38
|
+
|
|
39
|
+
_CURRENT_COMMAND = ContextVar("teams_node_claim", default=None)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _clock(value):
|
|
43
|
+
value = datetime.fromisoformat(value.replace("Z", "+00:00"))
|
|
44
|
+
if value.tzinfo is None:
|
|
45
|
+
raise ContextConflict("trusted Server time requires a timezone")
|
|
46
|
+
return value
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ServerVerificationKeys:
|
|
50
|
+
"""Only the authenticated, configured Server URL can supply verifier keys."""
|
|
51
|
+
|
|
52
|
+
def __init__(self, node, *, issuer):
|
|
53
|
+
self.node, self.issuer = node, issuer
|
|
54
|
+
self.keys = {}
|
|
55
|
+
|
|
56
|
+
async def refresh(self):
|
|
57
|
+
data = await self.node._request("GET", "/jwks")
|
|
58
|
+
values = {}
|
|
59
|
+
for key in data.get("keys", []):
|
|
60
|
+
if (
|
|
61
|
+
key.get("kty") != "OKP"
|
|
62
|
+
or key.get("crv") != "Ed25519"
|
|
63
|
+
or not isinstance(key.get("kid"), str)
|
|
64
|
+
or not key.get("x")
|
|
65
|
+
):
|
|
66
|
+
raise ContextConflict("invalid Server verification key")
|
|
67
|
+
if key["kid"] in values:
|
|
68
|
+
raise ContextConflict("duplicate Server verification key")
|
|
69
|
+
Ed25519PublicKey.from_public_bytes(b64url_decode(key["x"]))
|
|
70
|
+
values[key["kid"]] = key["x"]
|
|
71
|
+
if not values:
|
|
72
|
+
raise ContextConflict("Server verification keys unavailable")
|
|
73
|
+
self.keys = values
|
|
74
|
+
|
|
75
|
+
async def fetch_verification_keys(self):
|
|
76
|
+
await self.refresh()
|
|
77
|
+
return dict(self.keys)
|
|
78
|
+
|
|
79
|
+
def teams_verifier(self):
|
|
80
|
+
return TeamsPermitVerifier(
|
|
81
|
+
{
|
|
82
|
+
kid: Ed25519PublicKey.from_public_bytes(b64url_decode(key))
|
|
83
|
+
for kid, key in self.keys.items()
|
|
84
|
+
},
|
|
85
|
+
issuer=self.issuer,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class StudioNodeHosts:
|
|
90
|
+
def __init__(
|
|
91
|
+
self,
|
|
92
|
+
*,
|
|
93
|
+
studio,
|
|
94
|
+
node,
|
|
95
|
+
authority_id,
|
|
96
|
+
tenant_id,
|
|
97
|
+
state_dir,
|
|
98
|
+
keys,
|
|
99
|
+
effect_adapters=None,
|
|
100
|
+
loaded_build_factory=None,
|
|
101
|
+
):
|
|
102
|
+
self.studio, self.node = studio, node
|
|
103
|
+
self.authority_id, self.tenant_id = authority_id, tenant_id
|
|
104
|
+
self.state_dir, self.keys = Path(state_dir), keys
|
|
105
|
+
self.templates, self.hosts = {}, {}
|
|
106
|
+
self.effect_adapters = dict(effect_adapters or {})
|
|
107
|
+
self.loaded_build_factory = loaded_build_factory
|
|
108
|
+
self.journals = {}
|
|
109
|
+
from ksadk.kernel.teams_material_transport import TeamsHTTPMaterialTransport
|
|
110
|
+
from ksadk.kernel.teams_materials import TeamsMaterializer
|
|
111
|
+
|
|
112
|
+
self.material_transport = TeamsHTTPMaterialTransport(
|
|
113
|
+
node.owner_client.base_url,
|
|
114
|
+
node_id=node.identity["nodeId"],
|
|
115
|
+
authorization=self._material_authorization,
|
|
116
|
+
)
|
|
117
|
+
self.materializer = TeamsMaterializer(
|
|
118
|
+
self.state_dir / "materials",
|
|
119
|
+
fetch_manifest=self.material_transport.fetch_manifest,
|
|
120
|
+
open_blob=self.material_transport.open_blob,
|
|
121
|
+
)
|
|
122
|
+
self.prior_resolver = studio.plugin_runs.execution_policy_resolver
|
|
123
|
+
self.registry = StudioBuildKernelRegistry(
|
|
124
|
+
resolve_build=studio.resolve_run_spec,
|
|
125
|
+
resolve_adapter_provider=studio._scheduler_adapter_provider,
|
|
126
|
+
session_service=studio.session_service,
|
|
127
|
+
runtime_executor=studio.runtime_executor,
|
|
128
|
+
state_dir=self.state_dir / "runtime",
|
|
129
|
+
tenant_id=tenant_id,
|
|
130
|
+
workspace_id=node.identity["nodeId"],
|
|
131
|
+
instance_namespace=node.identity["nodeId"],
|
|
132
|
+
configure_runtime=self._configure_runtime,
|
|
133
|
+
)
|
|
134
|
+
# Must be mounted before provider activation snapshots capabilities and
|
|
135
|
+
# before recovery workers can acquire any persisted invocation.
|
|
136
|
+
studio.plugin_runs.execution_policy_resolver = self
|
|
137
|
+
|
|
138
|
+
async def _configure_runtime(self, runtime, spec, build_id):
|
|
139
|
+
store = runtime.kernel_store
|
|
140
|
+
await store.ensure_schema()
|
|
141
|
+
registry = SQLiteTeamsExecutionContextRegistry(store)
|
|
142
|
+
await registry.initialize()
|
|
143
|
+
from ksadk.kernel.teams_tool_runtime import open_effect_journal
|
|
144
|
+
|
|
145
|
+
journal = await open_effect_journal(registry)
|
|
146
|
+
self.journals[build_id] = journal
|
|
147
|
+
# Explicit Server-only native authority; no local issuer/JWKS merged.
|
|
148
|
+
runtime.kernel._permit_verifier = AgentControlPermitVerifier(
|
|
149
|
+
self.keys,
|
|
150
|
+
nonce_store=registry,
|
|
151
|
+
)
|
|
152
|
+
ref = "local-build:" + build_id
|
|
153
|
+
raw_bundle = str(spec.manifest_sha256 or "")
|
|
154
|
+
bundle = raw_bundle if raw_bundle.startswith("sha256:") else "sha256:" + raw_bundle
|
|
155
|
+
from pydantic import TypeAdapter
|
|
156
|
+
|
|
157
|
+
from ksadk.plugins.teams.cloud_contracts import Digest
|
|
158
|
+
|
|
159
|
+
TypeAdapter(Digest).validate_python(bundle)
|
|
160
|
+
from ksadk.plugins.teams.cloud_contract_fingerprints import teams_cloud_contract_digest
|
|
161
|
+
|
|
162
|
+
binding = HostBinding(
|
|
163
|
+
authority_id=self.authority_id,
|
|
164
|
+
binding_ref=ref,
|
|
165
|
+
provider_ref=spec.request_config.get("provider_ref", spec.launch_context.runtime_type),
|
|
166
|
+
agent_instance_id=runtime.config.agent_instance_id,
|
|
167
|
+
target={
|
|
168
|
+
"kind": "node",
|
|
169
|
+
"nodeId": self.node.identity["nodeId"],
|
|
170
|
+
"nodeGeneration": self.node.identity["nodeGeneration"],
|
|
171
|
+
},
|
|
172
|
+
bundle_digest=bundle,
|
|
173
|
+
contract_digest=teams_cloud_contract_digest(),
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
async def ensure(context):
|
|
177
|
+
session = await self.studio.session_service.get_session_metadata(context.ref.sessionId)
|
|
178
|
+
if session is None:
|
|
179
|
+
session = await self.studio.session_service.create_session(
|
|
180
|
+
agent_id=binding.agent_instance_id,
|
|
181
|
+
user_id=context.owner_subject,
|
|
182
|
+
session_id=context.ref.sessionId,
|
|
183
|
+
)
|
|
184
|
+
return session
|
|
185
|
+
|
|
186
|
+
host = KernelTeamsExecutionHost(
|
|
187
|
+
kernel=runtime.kernel,
|
|
188
|
+
store=store,
|
|
189
|
+
events=runtime.session_events,
|
|
190
|
+
registry=registry,
|
|
191
|
+
binding=binding,
|
|
192
|
+
permit_verifier=self.keys.teams_verifier(),
|
|
193
|
+
context_loader=self.load_context,
|
|
194
|
+
session_ensurer=ensure,
|
|
195
|
+
policy_factory=self.policy,
|
|
196
|
+
material_preparer=self.materializer.prepare,
|
|
197
|
+
effect_journal=journal,
|
|
198
|
+
effect_adapters=self.effect_adapters,
|
|
199
|
+
loaded_build_provider=(
|
|
200
|
+
self.loaded_build_factory(runtime, spec, build_id)
|
|
201
|
+
if self.loaded_build_factory is not None
|
|
202
|
+
else None
|
|
203
|
+
),
|
|
204
|
+
teams_tools_ready=True,
|
|
205
|
+
callback_ready=True,
|
|
206
|
+
policy_enforcement_ready=True,
|
|
207
|
+
canonical_events_durable=True,
|
|
208
|
+
canonical_events_shared=False,
|
|
209
|
+
)
|
|
210
|
+
self.templates[ref] = host
|
|
211
|
+
# Expose only actual descriptor facts for native/runtime reporting.
|
|
212
|
+
runtime.teams_host_descriptor = lambda: self.descriptor(host)
|
|
213
|
+
|
|
214
|
+
async def descriptor(self, host):
|
|
215
|
+
from ksadk.plugins.teams.cloud_contracts import digest
|
|
216
|
+
|
|
217
|
+
capabilities = host.capability_snapshot()
|
|
218
|
+
return {
|
|
219
|
+
"capabilities": capabilities,
|
|
220
|
+
"capabilitiesDigest": digest(capabilities),
|
|
221
|
+
"bundleDigest": host.binding.bundle_digest,
|
|
222
|
+
"contractDigest": host.binding.contract_digest,
|
|
223
|
+
"agentInstanceId": host.binding.agent_instance_id,
|
|
224
|
+
"storeIncarnation": await host.registry.incarnation(),
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async def load_context(self, context_ref):
|
|
228
|
+
command = _CURRENT_COMMAND.get()
|
|
229
|
+
if command is None or isinstance(command, NodeProbeCommand):
|
|
230
|
+
raise ContextConflict("trusted context loading requires a current claimed operation")
|
|
231
|
+
started = time.monotonic()
|
|
232
|
+
response = await self.node._request(
|
|
233
|
+
"POST",
|
|
234
|
+
f"/nodes/{self.node.identity['nodeId']}/contexts/resolve",
|
|
235
|
+
{"nodeCommandId": command.nodeCommandId, "contextRef": context_ref},
|
|
236
|
+
)
|
|
237
|
+
context = PreparedTeamsContext.model_validate(response["context"])
|
|
238
|
+
KernelTeamsNodeExecutor._same_ref(context.ref, command.ref)
|
|
239
|
+
if context.context_ref != context_ref or context.command.tenant_id != self.tenant_id:
|
|
240
|
+
raise ContextConflict("trusted preparation scope mismatch")
|
|
241
|
+
matches = [
|
|
242
|
+
h
|
|
243
|
+
for h in self.templates.values()
|
|
244
|
+
if h.binding.agent_instance_id == context.grant.agent_instance_id
|
|
245
|
+
]
|
|
246
|
+
if len(matches) != 1:
|
|
247
|
+
raise ContextConflict("prepared instance is not an advertised fixed Build")
|
|
248
|
+
if await matches[0].registry.incarnation() != response["storeIncarnation"]:
|
|
249
|
+
raise StoreIdentityMismatch("Server references a different original Kernel store")
|
|
250
|
+
return TrustedPreparation(
|
|
251
|
+
context,
|
|
252
|
+
TrustedGrantWindow(
|
|
253
|
+
response["expiresAt"],
|
|
254
|
+
_clock(response["serverTime"]),
|
|
255
|
+
started,
|
|
256
|
+
),
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
def _bound_host(self, template, binding_ref):
|
|
260
|
+
key = (template.binding.agent_instance_id, binding_ref)
|
|
261
|
+
host = self.hosts.get(key)
|
|
262
|
+
if host is None:
|
|
263
|
+
from copy import copy
|
|
264
|
+
|
|
265
|
+
host = copy(template)
|
|
266
|
+
host.binding = replace(template.binding, binding_ref=binding_ref)
|
|
267
|
+
self.hosts[key] = host
|
|
268
|
+
host.verifier = self.keys.teams_verifier()
|
|
269
|
+
return host
|
|
270
|
+
|
|
271
|
+
async def for_command(self, command):
|
|
272
|
+
await self.keys.refresh()
|
|
273
|
+
if isinstance(command, NodeProbeCommand):
|
|
274
|
+
template = self.templates.get(command.localBindingRef)
|
|
275
|
+
if template is None:
|
|
276
|
+
raise ContextConflict("probe targets an unadvertised local Build")
|
|
277
|
+
return self._bound_host(template, command.bindingRef)
|
|
278
|
+
prior = self.node.execution(command.ref.commandId)
|
|
279
|
+
context = None
|
|
280
|
+
if prior:
|
|
281
|
+
for template in self.templates.values():
|
|
282
|
+
# A shared SQLite session DB has one incarnation, but every
|
|
283
|
+
# context still names its exact Build instance.
|
|
284
|
+
if await template.registry.incarnation() != prior["store_incarnation"]:
|
|
285
|
+
continue
|
|
286
|
+
context = await template.registry.get(
|
|
287
|
+
prior["context_ref"],
|
|
288
|
+
expected_incarnation=prior["store_incarnation"],
|
|
289
|
+
)
|
|
290
|
+
if context:
|
|
291
|
+
break
|
|
292
|
+
if context is None:
|
|
293
|
+
if command.operation != "prepare":
|
|
294
|
+
raise StoreIdentityMismatch("original preparation is unavailable")
|
|
295
|
+
context = (await self.load_context(command.payload.contextRef)).context
|
|
296
|
+
KernelTeamsNodeExecutor._same_ref(context.ref, command.ref)
|
|
297
|
+
for template in self.templates.values():
|
|
298
|
+
if template.binding.agent_instance_id == context.grant.agent_instance_id:
|
|
299
|
+
return self._bound_host(template, context.ref.bindingRef)
|
|
300
|
+
raise ContextConflict("execution instance is not an advertised fixed Build")
|
|
301
|
+
|
|
302
|
+
async def resolve(self, ref, *, request):
|
|
303
|
+
context_ref = request.metadata.get("teams_context_ref")
|
|
304
|
+
if not context_ref:
|
|
305
|
+
if self.prior_resolver is None:
|
|
306
|
+
raise ContextConflict("execution policy resolver unavailable")
|
|
307
|
+
return await self.prior_resolver.resolve(ref, request=request)
|
|
308
|
+
for template in self.templates.values():
|
|
309
|
+
context = await template.registry.get(
|
|
310
|
+
context_ref,
|
|
311
|
+
expected_incarnation=await template.registry.incarnation(),
|
|
312
|
+
)
|
|
313
|
+
if (
|
|
314
|
+
context is not None
|
|
315
|
+
and context.grant.agent_instance_id == template.binding.agent_instance_id
|
|
316
|
+
):
|
|
317
|
+
return await self._bound_host(template, context.ref.bindingRef).resolve(
|
|
318
|
+
ref, request=request
|
|
319
|
+
)
|
|
320
|
+
raise StoreIdentityMismatch("original policy context unavailable")
|
|
321
|
+
|
|
322
|
+
async def _material_authorization(self, context, operation):
|
|
323
|
+
from ksadk.kernel.teams_material_transport import MaterialHTTPAuthorization
|
|
324
|
+
|
|
325
|
+
current = _CURRENT_COMMAND.get()
|
|
326
|
+
node_command_id = None
|
|
327
|
+
if current is not None and not isinstance(current, NodeProbeCommand):
|
|
328
|
+
node_command_id = current.nodeCommandId
|
|
329
|
+
if node_command_id is None:
|
|
330
|
+
row = self.node.db.execute(
|
|
331
|
+
"SELECT id FROM node_v1_operations "
|
|
332
|
+
"WHERE json_extract(body,'$.operation')='prepare' "
|
|
333
|
+
"AND json_extract(body,'$.payload.contextRef')=? ORDER BY rowid LIMIT 1",
|
|
334
|
+
(context.context_ref,),
|
|
335
|
+
).fetchone()
|
|
336
|
+
node_command_id = row["id"] if row else None
|
|
337
|
+
if node_command_id is None:
|
|
338
|
+
raise ContextConflict("original prepare operation is unavailable")
|
|
339
|
+
return MaterialHTTPAuthorization(
|
|
340
|
+
headers={"X-Teams-Node-Token": self.node.identity["accessToken"]},
|
|
341
|
+
node_command_id=node_command_id,
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
async def policy(self, context, *, request):
|
|
345
|
+
from ksadk.kernel.teams_tool_runtime import assemble_teams_tools
|
|
346
|
+
|
|
347
|
+
value = context.context.get("policy")
|
|
348
|
+
if not isinstance(value, dict) or not isinstance(value.get("systemContext"), str):
|
|
349
|
+
raise ContextConflict("trusted execution policy is unavailable")
|
|
350
|
+
if set(value) - {
|
|
351
|
+
"systemContext",
|
|
352
|
+
"childSystemContext",
|
|
353
|
+
"limits",
|
|
354
|
+
"approvalRequired",
|
|
355
|
+
"effects",
|
|
356
|
+
}:
|
|
357
|
+
raise ContextConflict("unsupported trusted execution policy field")
|
|
358
|
+
template = next(
|
|
359
|
+
(
|
|
360
|
+
h
|
|
361
|
+
for h in self.templates.values()
|
|
362
|
+
if h.binding.agent_instance_id == context.grant.agent_instance_id
|
|
363
|
+
),
|
|
364
|
+
None,
|
|
365
|
+
)
|
|
366
|
+
if template is None:
|
|
367
|
+
raise ContextConflict("original Build runtime is unavailable")
|
|
368
|
+
host = self._bound_host(template, context.ref.bindingRef)
|
|
369
|
+
|
|
370
|
+
async def invoke(operation, arguments, call_id):
|
|
371
|
+
return await self.node._request(
|
|
372
|
+
"POST",
|
|
373
|
+
f"/nodes/{self.node.identity['nodeId']}/contexts/invoke",
|
|
374
|
+
{
|
|
375
|
+
"contextRef": context.context_ref,
|
|
376
|
+
"commandId": context.ref.commandId,
|
|
377
|
+
"operation": operation,
|
|
378
|
+
"arguments": arguments,
|
|
379
|
+
"callId": call_id,
|
|
380
|
+
},
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
async def send_effect(operation, value):
|
|
384
|
+
return await self.node._request(
|
|
385
|
+
"POST",
|
|
386
|
+
f"/nodes/{self.node.identity['nodeId']}/effects/{operation}",
|
|
387
|
+
value.model_dump(mode="json"),
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
workspace, tools = await assemble_teams_tools(
|
|
391
|
+
context=context,
|
|
392
|
+
host=host,
|
|
393
|
+
request=request,
|
|
394
|
+
workspace_root=self.state_dir / "workspaces",
|
|
395
|
+
materializer=self.materializer,
|
|
396
|
+
material_transport=self.material_transport,
|
|
397
|
+
adapters=self.effect_adapters,
|
|
398
|
+
invoke=invoke,
|
|
399
|
+
send_effect=send_effect,
|
|
400
|
+
)
|
|
401
|
+
return ExecutionPolicy(
|
|
402
|
+
system_context=value["systemContext"],
|
|
403
|
+
tools=tools,
|
|
404
|
+
workspace_root=workspace,
|
|
405
|
+
child_system_context=value.get("childSystemContext"),
|
|
406
|
+
exclusive_tools=True,
|
|
407
|
+
limits=value.get("limits", {}),
|
|
408
|
+
approval_required=frozenset(value.get("approvalRequired", [])),
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
async def recover_effect_reports(self):
|
|
412
|
+
from ksadk.kernel.teams_effects import drain_effect_reports
|
|
413
|
+
|
|
414
|
+
async def report(record):
|
|
415
|
+
return await self.node._request(
|
|
416
|
+
"POST",
|
|
417
|
+
f"/nodes/{self.node.identity['nodeId']}/effects/recovery",
|
|
418
|
+
record.model_dump(mode="json"),
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
for journal in self.journals.values():
|
|
422
|
+
await drain_effect_reports(journal, report)
|
|
423
|
+
|
|
424
|
+
async def close(self):
|
|
425
|
+
await self.material_transport.close()
|
|
426
|
+
for journal in self.journals.values():
|
|
427
|
+
await journal.close()
|
|
428
|
+
await self.registry.close()
|
|
429
|
+
if self.studio.plugin_runs.execution_policy_resolver is self:
|
|
430
|
+
self.studio.plugin_runs.execution_policy_resolver = self.prior_resolver
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
class BoundNodeExecutor(KernelTeamsNodeExecutor):
|
|
434
|
+
def __init__(self, hosts):
|
|
435
|
+
super().__init__(hosts.for_command)
|
|
436
|
+
self.hosts = hosts
|
|
437
|
+
|
|
438
|
+
async def execute(self, command, **kwargs):
|
|
439
|
+
token = _CURRENT_COMMAND.set(command)
|
|
440
|
+
try:
|
|
441
|
+
return await super().execute(command, **kwargs)
|
|
442
|
+
finally:
|
|
443
|
+
_CURRENT_COMMAND.reset(token)
|
|
444
|
+
|
|
445
|
+
async def recover_effect_reports(self):
|
|
446
|
+
await self.hosts.recover_effect_reports()
|
|
447
|
+
|
|
448
|
+
async def close(self):
|
|
449
|
+
await self.hosts.close()
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
async def create_studio_teams_node(
|
|
453
|
+
*,
|
|
454
|
+
studio,
|
|
455
|
+
owner_client,
|
|
456
|
+
state_dir,
|
|
457
|
+
authority_id,
|
|
458
|
+
name,
|
|
459
|
+
node_transport=None,
|
|
460
|
+
effect_adapters=None,
|
|
461
|
+
loaded_build_factory=None,
|
|
462
|
+
):
|
|
463
|
+
"""RemoteStudioTeamsInstallation.node_v1_factory; no extra caller policy.
|
|
464
|
+
|
|
465
|
+
The node registers with an empty catalog first, obtains its authenticated
|
|
466
|
+
configuration, then advertises descriptors of actually mounted Kernels.
|
|
467
|
+
Preparation and submit remain separate claimed Server operations.
|
|
468
|
+
"""
|
|
469
|
+
from ksadk.sessions.local_service import LocalSessionService
|
|
470
|
+
|
|
471
|
+
if not isinstance(studio.session_service, LocalSessionService):
|
|
472
|
+
raise ContextConflict("outbound local Node requires a durable SQLite session service")
|
|
473
|
+
node = TeamsNodeV1(
|
|
474
|
+
owner_client,
|
|
475
|
+
None,
|
|
476
|
+
state_dir=state_dir,
|
|
477
|
+
name=name,
|
|
478
|
+
bindings=[],
|
|
479
|
+
node_transport=node_transport,
|
|
480
|
+
)
|
|
481
|
+
hosts = None
|
|
482
|
+
try:
|
|
483
|
+
await node.register()
|
|
484
|
+
config = await node._request("GET", f"/nodes/{node.identity['nodeId']}/configuration")
|
|
485
|
+
if (
|
|
486
|
+
config.get("protocolVersion") != "teams-node/v1"
|
|
487
|
+
or config.get("authorityId") != authority_id
|
|
488
|
+
or node.identity["authorityId"] != authority_id
|
|
489
|
+
or not isinstance(config.get("tenantId"), str)
|
|
490
|
+
or not config["tenantId"]
|
|
491
|
+
):
|
|
492
|
+
raise ContextConflict("Server node configuration scope mismatch")
|
|
493
|
+
environment = studio.configuration.environment()
|
|
494
|
+
keys = ServerVerificationKeys(
|
|
495
|
+
node, issuer=environment.get("KSADK_TEAMS_PERMIT_ISSUER", "agentengine-server")
|
|
496
|
+
)
|
|
497
|
+
await keys.refresh()
|
|
498
|
+
hosts = StudioNodeHosts(
|
|
499
|
+
studio=studio,
|
|
500
|
+
node=node,
|
|
501
|
+
authority_id=authority_id,
|
|
502
|
+
tenant_id=config["tenantId"],
|
|
503
|
+
state_dir=state_dir,
|
|
504
|
+
keys=keys,
|
|
505
|
+
effect_adapters=effect_adapters,
|
|
506
|
+
loaded_build_factory=loaded_build_factory,
|
|
507
|
+
)
|
|
508
|
+
node.executor = BoundNodeExecutor(hosts)
|
|
509
|
+
await hosts.registry.start()
|
|
510
|
+
catalog = StudioTeamsCatalog(studio, authority_ref=authority_id)
|
|
511
|
+
bindings = []
|
|
512
|
+
for item in catalog._local():
|
|
513
|
+
if item.get("buildId") is None or item["availability"]["state"] != "unchecked":
|
|
514
|
+
continue
|
|
515
|
+
await hosts.registry.ensure_build(item["buildId"], expected_agent_id=item["agentId"])
|
|
516
|
+
host = hosts.templates[item["bindingRef"]]
|
|
517
|
+
capabilities = host.capability_snapshot()
|
|
518
|
+
if not capabilities["teamsReady"]:
|
|
519
|
+
continue
|
|
520
|
+
from ksadk.plugins.teams.cloud_contracts import digest
|
|
521
|
+
|
|
522
|
+
matrix = host.kernel.capabilities()
|
|
523
|
+
bindings.append(
|
|
524
|
+
{
|
|
525
|
+
"localBindingRef": item["bindingRef"],
|
|
526
|
+
"agentId": item["agentId"],
|
|
527
|
+
"buildId": item["buildId"],
|
|
528
|
+
"providerRef": host.binding.provider_ref,
|
|
529
|
+
"name": item["name"],
|
|
530
|
+
"bundleDigest": host.binding.bundle_digest,
|
|
531
|
+
"contractDigest": host.binding.contract_digest,
|
|
532
|
+
"capabilitiesDigest": digest(capabilities),
|
|
533
|
+
"capabilities": {
|
|
534
|
+
"enqueue": True,
|
|
535
|
+
"leader": True,
|
|
536
|
+
"restore": matrix.durable_restore.supported,
|
|
537
|
+
"idempotentLookup": True,
|
|
538
|
+
"terminalEvidence": True,
|
|
539
|
+
"isolatedSession": True,
|
|
540
|
+
"executionGrant": True,
|
|
541
|
+
"toolPolicy": True,
|
|
542
|
+
"teamsTools": True,
|
|
543
|
+
"materialization": capabilities["materialPreparation"],
|
|
544
|
+
"effectLedger": capabilities["effectLedger"],
|
|
545
|
+
},
|
|
546
|
+
}
|
|
547
|
+
)
|
|
548
|
+
from ksadk.studio.teams_node_v1 import normalized_node_bindings
|
|
549
|
+
|
|
550
|
+
node.bindings = normalized_node_bindings(bindings)
|
|
551
|
+
await node.sync_catalog()
|
|
552
|
+
return node
|
|
553
|
+
except BaseException:
|
|
554
|
+
# Close even if failure precedes executor composition.
|
|
555
|
+
if hosts is not None and node.executor is None:
|
|
556
|
+
await hosts.close()
|
|
557
|
+
await node.close()
|
|
558
|
+
raise
|
|
@@ -18,6 +18,7 @@ async def run_node(
|
|
|
18
18
|
name: str | None = None,
|
|
19
19
|
stop: asyncio.Event | None = None,
|
|
20
20
|
service_factory=None,
|
|
21
|
+
node_v1_factory=None,
|
|
21
22
|
):
|
|
22
23
|
from ksadk.studio.service import StudioService
|
|
23
24
|
|
|
@@ -25,6 +26,8 @@ async def run_node(
|
|
|
25
26
|
if name:
|
|
26
27
|
settings["KSADK_TEAMS_NODE_NAME"] = name
|
|
27
28
|
service = (service_factory or StudioService)(workspace, configuration_overrides=settings)
|
|
29
|
+
if node_v1_factory is not None:
|
|
30
|
+
service.teams_installation.node_v1_factory = node_v1_factory
|
|
28
31
|
stopped = stop or asyncio.Event()
|
|
29
32
|
loop = asyncio.get_running_loop()
|
|
30
33
|
installed = []
|