agentengine-sdk-python 0.8.5__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +12 -8
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/RECORD +823 -388
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/api/client.py +32 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +83 -106
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +2 -0
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_invoke.py +45 -92
- ksadk/cli/cmd_studio.py +5 -1
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1048
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/env_registry.py +106 -127
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +53 -5
- ksadk/configs/global_config.py +1 -0
- ksadk/configs/settings.py +6 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachments.py +53 -15
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +30 -125
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_payloads.py +4 -0
- ksadk/conversations/runtime_persistence.py +192 -24
- ksadk/conversations/runtime_preparation.py +85 -6
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_langgraph_support.py +12 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/harness/__init__.py +4 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +26 -9
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +104 -9
- ksadk/harness/compaction_record.py +31 -0
- ksadk/harness/compiler.py +3 -3
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/contract.py +9 -11
- ksadk/harness/context_engine.py +18 -33
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/engine/completion_guard.py +16 -1
- ksadk/harness/engine/context_pipeline.py +864 -92
- ksadk/harness/engine/graph_builder.py +123 -630
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +126 -8
- ksadk/harness/engine/mcp_disclosure.py +65 -114
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +21 -10
- ksadk/harness/engine/postgres_checkpointer.py +325 -2
- ksadk/harness/engine/run_control_bridge.py +21 -1
- ksadk/harness/engine/run_types.py +10 -0
- ksadk/harness/engine/skill_disclosure.py +98 -12
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +18 -1
- ksadk/harness/engine/tool_dispatch.py +112 -7
- ksadk/harness/events.py +39 -2
- ksadk/harness/execution_policy.py +10 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/loop/reason.py +281 -36
- ksadk/harness/loop/tools.py +157 -12
- ksadk/harness/managed_runtime.py +254 -94
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +33 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +223 -8
- ksadk/harness/model_provider.py +214 -4
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +65 -3
- ksadk/harness/public_activity.py +59 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/reasoner.py +331 -22
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +107 -2
- ksadk/harness/runtime.py +11 -2
- ksadk/harness/runtime_capabilities.py +71 -1
- ksadk/harness/sandbox_backend.py +203 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +370 -24
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_runtime.py +74 -16
- ksadk/harness/spec.py +20 -10
- ksadk/harness/state.py +2 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/subagent.py +12 -2
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +3 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/interaction/providers/langgraph.py +8 -1
- ksadk/kernel/bootstrap.py +144 -160
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +25 -0
- ksadk/kernel/control.py +153 -33
- ksadk/kernel/execution_grants.py +209 -2
- ksadk/kernel/execution_grants_memory.py +127 -8
- ksadk/kernel/execution_grants_postgres.py +188 -10
- ksadk/kernel/execution_grants_sqlite.py +235 -9
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +117 -204
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/memory_store.py +38 -48
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +167 -198
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +89 -3
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +5 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +147 -216
- ksadk/kernel/store.py +47 -15
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +323 -332
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_identity.py +27 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/extraction.py +120 -7
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_sqlite.py +252 -78
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/server.py +10 -7
- ksadk/model_proxy/transform.py +37 -9
- ksadk/plugins/bridges/dsh.py +18 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +380 -186
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_toolchain.py +24 -35
- ksadk/plugins/execution_host.py +8 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +1 -1
- ksadk/plugins/providers/codex.py +42 -38
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +16 -171
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +247 -34
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +91 -14
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +269 -175
- ksadk/plugins/providers/harness_tools.py +165 -36
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/teams/application.py +3 -143
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/domain.py +201 -148
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/postgres_store.py +299 -85
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +116 -40
- ksadk/plugins/teams/store.py +214 -6
- ksadk/plugins/teams/task_decisions.py +21 -8
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +8 -3
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +6 -400
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/adk_runner.py +195 -290
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +82 -86
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +83 -128
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +4 -2
- ksadk/runtime/executor.py +97 -7
- ksadk/runtime/factory.py +13 -6
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/runner_adapter.py +123 -13
- ksadk/runtime_context.py +2 -0
- ksadk/sandbox/backends/e2b.py +30 -4
- ksadk/sandbox/backends/local_process.py +10 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +32 -2
- ksadk/sandbox/local_launcher.py +34 -0
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/control.py +51 -3
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +17 -2
- ksadk/server/routes/misc.py +102 -12
- ksadk/server/routes/models.py +25 -1
- ksadk/server/routes/openai_compat.py +6 -0
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +6 -2
- ksadk/server/routes/sessions.py +301 -342
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +5 -2
- ksadk/server/static/assets/{ArtifactsPanel-C1YoaKhx.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DHuAWfr5.js → CodeBlock-BVrNVtJC.js} +1 -1
- ksadk/server/static/assets/{MathMessageMarkdown-cvdrBwYr.js → MathMessageMarkdown-Dp7c4wWD.js} +1 -1
- ksadk/server/static/assets/{MermaidBlock-DeBkbJvI.js → MermaidBlock-Dxop8Rd7.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-oJj44_sV.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-Dhfv25o2.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-C35w-pn1.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-FoMY_u6D.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-zD4Rt7oE.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BCtGGkhN.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-C2Ms13_k.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BoTj-qgx.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DOMyyjHH.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DbJJqDli.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CLuRCt_W.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-D0Dz847e.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-BWSRzEcd.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-CPoHqkCY.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-Bx1jS-X-.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-LzyWm4m0.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-BlW_bHED.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-Bu_S86_i.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-B7nCawed.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-W_Zow2Km.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CLIKAHON.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Dv6_QAlN.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-BWAWRDtZ.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-XA_rWMss.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-CGt_UGeO.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-C0J5_3qM.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-CIpWk_5f.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-B3bA05-e.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-DWfdmz9s.js → dist-BBsYarrI.js} +1 -1
- ksadk/server/static/assets/{dist-BLpRy_Yx.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CIRMvUM4.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-BdNFAney.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-n3n6t_FO.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DppE_r-D.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-qe8xjesy.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-2vL2sAdF.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-1nXCdsej.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-DNKuMzWc.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-t6MzE0jU.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-CPyieXEf.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-DyG6Ya-z.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/{dist-0X_j2Rcc.js → dist-bupkyEBZ.js} +1 -1
- ksadk/server/static/assets/{dist-mqD5TZup.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-M-SrdhhZ.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-D-92S-Fd.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-BO_UwatH.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-BfCzF1Xi.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-Dpz9_0zn.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DDaG1f4_.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DcxzRwYC.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CYMdn6lQ.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CLHFAD6c.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-BHSKQGAl.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-D5W3tjTT.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-mtjOi4KM.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-BETqsxE_.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-DPWrvs90.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-CJG2mfBP.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-GjAPNaqn.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-ToIewrqr.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-4d78KiEY.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-DKzx4xfv.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-CJYljxQS.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-DLU2fV1w.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CVqysrA9.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-BUxfmTHc.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-CNFgYI9E.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-B6qCMe8N.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-CMD3x_U_.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BqtUqvXM.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-B5KfDjI-.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BaUlSZrn.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/loader.py +44 -2
- ksadk/skills/runtime/backends/e2b.py +17 -14
- ksadk/skills/service_client.py +6 -1
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +219 -389
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +23 -0
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +20 -2
- ksadk/studio/capabilities.py +8 -3
- ksadk/studio/cloud.py +83 -377
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +7 -0
- ksadk/studio/codex_agent_service.py +17 -0
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/compiler.py +102 -6
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +231 -201
- ksadk/studio/dsh_application.py +58 -12
- ksadk/studio/dsh_capability_service.py +17 -171
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/event_store.py +17 -0
- ksadk/studio/execution_host.py +84 -11
- ksadk/studio/framework_run.py +18 -0
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +12 -1
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1241 -761
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +65 -31
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +26 -10
- ksadk/studio/plugin_kernel_adapter.py +75 -1
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +639 -119
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/resource_authority.py +11 -3
- ksadk/studio/resource_catalog.py +8 -12
- ksadk/studio/run_activity.py +338 -385
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_service.py +908 -319
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +23 -4
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/service.py +356 -282
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +393 -169
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/{CodeBlock-DMIf4h33-UIqo-BPW.js → CodeBlock-DMIf4h33-CkufcPYo.js} +3 -3
- ksadk/studio/static/assets/{MathMessageMarkdown-BesSeCYl-OhNwH4K9.js → MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js} +1 -1
- ksadk/studio/static/assets/{MessageMarkdown-CwMTvgFj-g0I-I4dD.js → MessageMarkdown-CwMTvgFj-BeyLyQHu.js} +2 -2
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/index.html +3 -3
- ksadk/studio/teams_catalog.py +33 -0
- ksadk/studio/teams_installation.py +4 -1
- ksadk/studio/teams_node.py +4 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +3 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +259 -37
- ksadk/studio/templates.py +1 -0
- ksadk/studio/workspace_plugins.py +3 -1
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +82 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +342 -324
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/workspace_files/router.py +2 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +0 -1
- ksadk/server/static/assets/channel-_KDifNys.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +0 -1
- ksadk/server/static/assets/index-BMd2mucF.css +0 -2
- ksadk/server/static/assets/index-D5qyyhTH.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +0 -1
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +0 -8
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +0 -3
- ksadk/studio/static/assets/index-CfEnms6Y.css +0 -2
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.5.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Conservative Linux process-group liveness after a successful killpg probe."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def linux_group_has_live_members(process_group: int, *, proc_root: Path = Path("/proc")) -> bool:
|
|
8
|
+
"""Ignore only a proven zombie/dead-only group in a complete proc view.
|
|
9
|
+
|
|
10
|
+
Linux keeps orphan zombies in their process group until their new parent
|
|
11
|
+
reaps them. killpg(pgid, 0) still succeeds, although no signal can stop a
|
|
12
|
+
zombie. Unknown visibility or a racing empty snapshot stays conservative.
|
|
13
|
+
"""
|
|
14
|
+
try:
|
|
15
|
+
mounts = (proc_root / "self" / "mountinfo").read_text().splitlines()
|
|
16
|
+
candidates = [line.split() for line in mounts if line.split()[4] == "/proc"]
|
|
17
|
+
if len(candidates) != 1:
|
|
18
|
+
return True # An overmount can hide members from the older view.
|
|
19
|
+
proc_mount = candidates[0]
|
|
20
|
+
separator = proc_mount.index("-")
|
|
21
|
+
if proc_mount[separator + 1] != "proc":
|
|
22
|
+
return True
|
|
23
|
+
options = (proc_mount[5] + "," + proc_mount[separator + 3]).split(",")
|
|
24
|
+
if any(option.startswith("hidepid=") and option != "hidepid=0" for option in options):
|
|
25
|
+
return True
|
|
26
|
+
own = (proc_root / "self" / "stat").read_text()
|
|
27
|
+
own_fields = own.rsplit(")", 1)[1].split()
|
|
28
|
+
if int(own.split(" ", 1)[0]) != os.getpid() or int(own_fields[2]) != os.getpgrp():
|
|
29
|
+
return True # An ancestor PID namespace can use different IDs.
|
|
30
|
+
status = (proc_root / "self" / "status").read_text().splitlines()
|
|
31
|
+
namespace_pids = next(line for line in status if line.startswith("NSpid:")).split()[1:]
|
|
32
|
+
if namespace_pids != [str(os.getpid())]:
|
|
33
|
+
return True # Matching numbers alone cannot prove namespace identity.
|
|
34
|
+
matched = False
|
|
35
|
+
for entry in proc_root.iterdir():
|
|
36
|
+
if not entry.name.isdecimal():
|
|
37
|
+
continue
|
|
38
|
+
try:
|
|
39
|
+
# comm is parenthesized and can contain spaces and ')'.
|
|
40
|
+
stat = (entry / "stat").read_text().rsplit(")", 1)[1].split()
|
|
41
|
+
group = int(stat[2])
|
|
42
|
+
except FileNotFoundError:
|
|
43
|
+
continue # This process was reaped during the snapshot.
|
|
44
|
+
if group == process_group:
|
|
45
|
+
matched = True
|
|
46
|
+
if stat[0] not in {"Z", "X", "x"}:
|
|
47
|
+
return True
|
|
48
|
+
return not matched
|
|
49
|
+
except (OSError, ValueError, IndexError, StopIteration):
|
|
50
|
+
return True
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
export const name = 'dsh-knowledge'
|
|
2
2
|
export const inject = ['tools', 'platformResources']
|
|
3
3
|
|
|
4
|
+
// The platform retrieval service may prefix a chunk with its internal object
|
|
5
|
+
// storage key (for example ``upload_files/<numeric-id>/<uuid>.md,``). That
|
|
6
|
+
// value is neither useful evidence nor safe user-facing content. Long numeric
|
|
7
|
+
// object keys also look like payment-card numbers to the Harness DLP policy,
|
|
8
|
+
// which forces an otherwise harmless knowledge result into an unreadable
|
|
9
|
+
// sensitive artifact. Strip only this well-known transport prefix and retain
|
|
10
|
+
// the document title and every byte of authored content that follows it.
|
|
11
|
+
export function sanitizeKnowledgeContent(value) {
|
|
12
|
+
if (typeof value !== 'string') return value
|
|
13
|
+
return value.replace(/^upload_files\/[^,\r\n]+,/, '')
|
|
14
|
+
}
|
|
15
|
+
|
|
4
16
|
export function apply(ctx) {
|
|
5
17
|
ctx.effect(() => ctx.platformResources.registerTool('search_knowledge_base', 'search_knowledge_base'))
|
|
6
18
|
ctx.tools.register({
|
|
@@ -46,8 +58,18 @@ export function apply(ctx) {
|
|
|
46
58
|
},
|
|
47
59
|
},
|
|
48
60
|
isConcurrencySafe: () => true,
|
|
49
|
-
execute(args, execution) {
|
|
50
|
-
|
|
61
|
+
async execute(args, execution) {
|
|
62
|
+
const result = await ctx.platformResources.call(
|
|
63
|
+
'search_knowledge_base', args, { signal: execution.signal },
|
|
64
|
+
)
|
|
65
|
+
if (!result || !Array.isArray(result.items)) return result
|
|
66
|
+
return {
|
|
67
|
+
...result,
|
|
68
|
+
items: result.items.map(item => ({
|
|
69
|
+
...item,
|
|
70
|
+
content: sanitizeKnowledgeContent(item.content),
|
|
71
|
+
})),
|
|
72
|
+
}
|
|
51
73
|
},
|
|
52
74
|
})
|
|
53
75
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"engines": {"node": ">=22.19.0"},
|
|
10
10
|
"peerDependencies": {
|
|
11
11
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
12
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
12
|
+
"@deepseek-ai/dsh-tools": "0.1.7-rc.1",
|
|
13
13
|
"@kingsoftcloud/dsh-platform-resources": "0.1.0"
|
|
14
14
|
},
|
|
15
15
|
"dsh": {"bundle": {"patch": "./cordis.patch.yml"}}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"engines": {"node": ">=22.19.0"},
|
|
10
10
|
"peerDependencies": {
|
|
11
11
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
12
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
12
|
+
"@deepseek-ai/dsh-tools": "0.1.7-rc.1",
|
|
13
13
|
"@kingsoftcloud/dsh-platform-resources": "0.1.0"
|
|
14
14
|
},
|
|
15
15
|
"dsh": {"bundle": {"patch": "./cordis.patch.yml"}}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"engines": {"node": ">=22.19.0"},
|
|
10
10
|
"peerDependencies": {
|
|
11
11
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
12
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
12
|
+
"@deepseek-ai/dsh-tools": "0.1.7-rc.1",
|
|
13
13
|
"@kingsoftcloud/dsh-platform-resources": "0.1.0"
|
|
14
14
|
},
|
|
15
15
|
"dsh": {"bundle": {"patch": "./cordis.patch.yml"}}
|
ksadk/plugins/providers/codex.py
CHANGED
|
@@ -35,6 +35,8 @@ from ksadk.runtime.conversation_execution import invoke_runtime_conversation_onc
|
|
|
35
35
|
from ksadk.sessions import create_session_service
|
|
36
36
|
from ksadk.sessions.base import BaseSessionService
|
|
37
37
|
|
|
38
|
+
from ksadk.plugins.providers.codex_skills import _resolve_skills
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
@dataclass(frozen=True)
|
|
40
42
|
class CodexProviderInventory:
|
|
@@ -194,6 +196,7 @@ class CodexAgentProviderRuntime:
|
|
|
194
196
|
runtime_state_root: Path | None = None,
|
|
195
197
|
local_launch_resolver: Callable[..., RuntimeLaunchContext | None] | None = None,
|
|
196
198
|
runtime_executor: RuntimeExecutor | None = None,
|
|
199
|
+
managed_a2a_bootstrap: Any = None,
|
|
197
200
|
) -> None:
|
|
198
201
|
self._plugin_id = plugin_id
|
|
199
202
|
self._session_service = session_service
|
|
@@ -202,6 +205,7 @@ class CodexAgentProviderRuntime:
|
|
|
202
205
|
self._runtime_state_root = runtime_state_root
|
|
203
206
|
self._local_launch_resolver = local_launch_resolver
|
|
204
207
|
self._runtime_executor = runtime_executor
|
|
208
|
+
self._managed_a2a_bootstrap = managed_a2a_bootstrap
|
|
205
209
|
self._ready = False
|
|
206
210
|
self._disposed = False
|
|
207
211
|
self._last_activation: CodexAgentActivation | None = None
|
|
@@ -266,6 +270,7 @@ class CodexAgentProviderRuntime:
|
|
|
266
270
|
codex_client_factory=self._client_factory,
|
|
267
271
|
mcp_projection=projection,
|
|
268
272
|
runtime_executor=self._runtime_executor,
|
|
273
|
+
managed_a2a_bootstrap=self._managed_a2a_bootstrap,
|
|
269
274
|
)
|
|
270
275
|
except BaseException:
|
|
271
276
|
await projection.aclose()
|
|
@@ -323,6 +328,7 @@ class CodexAgentProviderFactory:
|
|
|
323
328
|
runtime_state_root=runtime_state_root,
|
|
324
329
|
local_launch_resolver=services.get("codex_local_launch_resolver"),
|
|
325
330
|
runtime_executor=runtime_executor,
|
|
331
|
+
managed_a2a_bootstrap=services.get("managed_a2a_bootstrap"),
|
|
326
332
|
)
|
|
327
333
|
return self.runtime
|
|
328
334
|
|
|
@@ -337,6 +343,7 @@ class CodexAgentActivation:
|
|
|
337
343
|
codex_client_factory: Callable[..., Any] | None,
|
|
338
344
|
mcp_projection: MCPProjectionLease,
|
|
339
345
|
runtime_executor: RuntimeExecutor | None = None,
|
|
346
|
+
managed_a2a_bootstrap: Any = None,
|
|
340
347
|
) -> None:
|
|
341
348
|
self._bundle = bundle
|
|
342
349
|
self._config = config
|
|
@@ -347,7 +354,8 @@ class CodexAgentActivation:
|
|
|
347
354
|
runtime_type="codex",
|
|
348
355
|
project_dir=config.project_dir,
|
|
349
356
|
config=config.launch_config,
|
|
350
|
-
services=RuntimeServices(codex_client_factory=codex_client_factory
|
|
357
|
+
services=RuntimeServices(codex_client_factory=codex_client_factory,
|
|
358
|
+
managed_a2a_bootstrap=managed_a2a_bootstrap),
|
|
351
359
|
)
|
|
352
360
|
self._ready = False
|
|
353
361
|
self._disposed = False
|
|
@@ -564,6 +572,30 @@ def _reject_external_execution(
|
|
|
564
572
|
)
|
|
565
573
|
|
|
566
574
|
|
|
575
|
+
def _bundle_a2a_experts(spec):
|
|
576
|
+
"""Only frozen Bundle bindings may declare fixed experts."""
|
|
577
|
+
if "remoteAgents" in spec and "remote_agents" in spec:
|
|
578
|
+
raise PluginHostError("a2a_binding_invalid", "Duplicate A2A binding fields")
|
|
579
|
+
raw = spec.get("remoteAgents", spec.get("remote_agents", []))
|
|
580
|
+
# ResolvedPluginBundle freezes JSON arrays into tuples.
|
|
581
|
+
if not isinstance(raw, (list, tuple)):
|
|
582
|
+
raise PluginHostError("a2a_binding_invalid", "A2A bindings must be a list")
|
|
583
|
+
if not raw:
|
|
584
|
+
return []
|
|
585
|
+
from ksadk.studio.contracts import RemoteAgentBinding
|
|
586
|
+
from ksadk.a2a.invocation_types import RemoteAgentSpec
|
|
587
|
+
from ksadk.a2a.codex import compile_codex_experts
|
|
588
|
+
|
|
589
|
+
bindings = [RemoteAgentBinding.model_validate(value) for value in raw]
|
|
590
|
+
specs = [RemoteAgentSpec(
|
|
591
|
+
local_name=b.local_name, binding_id=b.binding_id, space_id=b.space_id,
|
|
592
|
+
target_agent_id=b.target_agent_id, expected_version_id=b.expected_version_id,
|
|
593
|
+
exposure=b.exposure, policy_ref=b.policy_ref,
|
|
594
|
+
) for b in bindings]
|
|
595
|
+
compile_codex_experts(specs)
|
|
596
|
+
return [value.model_dump(mode="json") for value in specs]
|
|
597
|
+
|
|
598
|
+
|
|
567
599
|
def _resolve_bundle_config(
|
|
568
600
|
bundle: ResolvedPluginBundle,
|
|
569
601
|
*,
|
|
@@ -573,6 +605,10 @@ def _resolve_bundle_config(
|
|
|
573
605
|
local_launch: RuntimeLaunchContext | None = None,
|
|
574
606
|
) -> _CodexBundleConfig:
|
|
575
607
|
spec = bundle.resolved_agent_spec
|
|
608
|
+
a2a_experts = _bundle_a2a_experts(spec)
|
|
609
|
+
if local_launch is not None and "a2a_experts" in local_launch.config:
|
|
610
|
+
if local_launch.config["a2a_experts"] != a2a_experts:
|
|
611
|
+
raise PluginHostError("a2a_binding_drift", "Local experts differ from immutable Bundle")
|
|
576
612
|
raw_model = spec.get("model")
|
|
577
613
|
if not isinstance(raw_model, Mapping):
|
|
578
614
|
raise PluginHostError(
|
|
@@ -666,6 +702,11 @@ def _resolve_bundle_config(
|
|
|
666
702
|
# Local launch compatibility never replaces immutable Bundle Skill bytes.
|
|
667
703
|
launch_config["skills"] = skills
|
|
668
704
|
launch_config["enforce_bound_skills"] = True
|
|
705
|
+
# Local launch configuration cannot add, remove, or retarget experts.
|
|
706
|
+
if a2a_experts:
|
|
707
|
+
launch_config["a2a_experts"] = a2a_experts
|
|
708
|
+
else:
|
|
709
|
+
launch_config.pop("a2a_experts", None)
|
|
669
710
|
return _CodexBundleConfig(
|
|
670
711
|
model=model,
|
|
671
712
|
allowed_models=allowed_models,
|
|
@@ -833,43 +874,6 @@ def _resolve_allowed_models(
|
|
|
833
874
|
return models
|
|
834
875
|
|
|
835
876
|
|
|
836
|
-
def _resolve_skills(root: Path, value: Any) -> list[dict[str, str]]:
|
|
837
|
-
if value is None:
|
|
838
|
-
return []
|
|
839
|
-
if not isinstance(value, Sequence) or isinstance(value, (str, bytes)):
|
|
840
|
-
raise PluginHostError("codex_skill_invalid", "Bundle Skills must be a list")
|
|
841
|
-
resolved: list[dict[str, str]] = []
|
|
842
|
-
seen: set[str] = set()
|
|
843
|
-
for index, item in enumerate(value):
|
|
844
|
-
if not isinstance(item, Mapping):
|
|
845
|
-
raise PluginHostError(
|
|
846
|
-
"codex_skill_invalid", f"Bundle Skills[{index}] must be an object"
|
|
847
|
-
)
|
|
848
|
-
name = str(item.get("name") or "").strip()
|
|
849
|
-
relative = PurePosixPath(str(item.get("bundlePath") or item.get("bundle_path") or ""))
|
|
850
|
-
if not name or not relative.parts or relative.is_absolute() or ".." in relative.parts:
|
|
851
|
-
raise PluginHostError(
|
|
852
|
-
"codex_skill_invalid", f"Bundle Skills[{index}] has an invalid native path"
|
|
853
|
-
)
|
|
854
|
-
path = (root / Path(*relative.parts)).resolve()
|
|
855
|
-
try:
|
|
856
|
-
path.relative_to(root)
|
|
857
|
-
except ValueError as error:
|
|
858
|
-
raise PluginHostError(
|
|
859
|
-
"codex_skill_invalid", f"Bundle Skill {name!r} escapes the Bundle root"
|
|
860
|
-
) from error
|
|
861
|
-
if not (path / "SKILL.md").is_file():
|
|
862
|
-
raise PluginHostError("codex_skill_missing", f"Bundle Skill {name!r} has no SKILL.md")
|
|
863
|
-
if name in seen:
|
|
864
|
-
raise PluginHostError("codex_skill_invalid", f"duplicate Bundle Skill {name!r}")
|
|
865
|
-
seen.add(name)
|
|
866
|
-
# Codex's native SkillInput expects the concrete SKILL.md source, not
|
|
867
|
-
# its containing directory. A directory is accepted by the Python
|
|
868
|
-
# model but silently omitted by the real App Server turn projection.
|
|
869
|
-
resolved.append({"name": name, "path": str(path / "SKILL.md")})
|
|
870
|
-
return resolved
|
|
871
|
-
|
|
872
|
-
|
|
873
877
|
def _resolve_mcp(
|
|
874
878
|
value: Any,
|
|
875
879
|
*,
|
|
@@ -167,11 +167,29 @@ def _codex_home_key(
|
|
|
167
167
|
return value
|
|
168
168
|
|
|
169
169
|
|
|
170
|
+
def _codex_a2a_experts(config, bootstrap):
|
|
171
|
+
"""Validate immutable fixed targets before client or home creation."""
|
|
172
|
+
raw = config.get("a2a_experts", [])
|
|
173
|
+
if not isinstance(raw, list):
|
|
174
|
+
raise ValueError("A2A_CODEX_EXPERT_CONFIG_INVALID")
|
|
175
|
+
if not raw:
|
|
176
|
+
return ()
|
|
177
|
+
from ksadk.a2a.codex import compile_codex_experts
|
|
178
|
+
from ksadk.a2a.invocation_types import RemoteAgentSpec
|
|
179
|
+
|
|
180
|
+
specs = tuple(RemoteAgentSpec.model_validate(value) for value in raw)
|
|
181
|
+
compile_codex_experts(specs)
|
|
182
|
+
if bootstrap is None or not bootstrap.outbound_enabled:
|
|
183
|
+
raise ValueError("A2A_MANAGED_BOOTSTRAP_REQUIRED")
|
|
184
|
+
return specs
|
|
185
|
+
|
|
186
|
+
|
|
170
187
|
def create_codex_adapter(context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
171
188
|
from ksadk.codex.runtime import CodexRuntimeAdapter
|
|
172
189
|
|
|
173
190
|
client_factory = context.services.codex_client_factory or AsyncCodexClient
|
|
174
191
|
config = dict(context.config)
|
|
192
|
+
a2a_specs = _codex_a2a_experts(config, context.services.managed_a2a_bootstrap)
|
|
175
193
|
plugin_bootstrap = _codex_plugin_bootstrap(config)
|
|
176
194
|
codex_home_key = _codex_home_key(config, plugin_bootstrap)
|
|
177
195
|
bound_skill_paths: dict[str, str] = {}
|
|
@@ -241,6 +259,8 @@ def create_codex_adapter(context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
|
241
259
|
enforce_bound_skills=bool(config.get("enforce_bound_skills")),
|
|
242
260
|
),
|
|
243
261
|
plugin_bootstrap=plugin_bootstrap,
|
|
262
|
+
a2a_experts=a2a_specs,
|
|
263
|
+
managed_a2a_bootstrap=context.services.managed_a2a_bootstrap,
|
|
244
264
|
)
|
|
245
265
|
|
|
246
266
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Resolve pinned Codex bundle Skill inputs without escaping the bundle root."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Mapping, Sequence
|
|
6
|
+
from pathlib import Path, PurePosixPath
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from ksadk.plugins.host import PluginHostError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _resolve_skills(root: Path, value: Any) -> list[dict[str, str]]:
|
|
13
|
+
if value is None:
|
|
14
|
+
return []
|
|
15
|
+
if not isinstance(value, Sequence) or isinstance(value, (str, bytes)):
|
|
16
|
+
raise PluginHostError("codex_skill_invalid", "Bundle Skills must be a list")
|
|
17
|
+
resolved: list[dict[str, str]] = []
|
|
18
|
+
seen: set[str] = set()
|
|
19
|
+
for index, item in enumerate(value):
|
|
20
|
+
if not isinstance(item, Mapping):
|
|
21
|
+
raise PluginHostError(
|
|
22
|
+
"codex_skill_invalid", f"Bundle Skills[{index}] must be an object"
|
|
23
|
+
)
|
|
24
|
+
name = str(item.get("name") or "").strip()
|
|
25
|
+
relative = PurePosixPath(str(item.get("bundlePath") or item.get("bundle_path") or ""))
|
|
26
|
+
if not name or not relative.parts or relative.is_absolute() or ".." in relative.parts:
|
|
27
|
+
raise PluginHostError(
|
|
28
|
+
"codex_skill_invalid", f"Bundle Skills[{index}] has an invalid native path"
|
|
29
|
+
)
|
|
30
|
+
path = (root / Path(*relative.parts)).resolve()
|
|
31
|
+
try:
|
|
32
|
+
path.relative_to(root)
|
|
33
|
+
except ValueError as error:
|
|
34
|
+
raise PluginHostError(
|
|
35
|
+
"codex_skill_invalid", f"Bundle Skill {name!r} escapes the Bundle root"
|
|
36
|
+
) from error
|
|
37
|
+
if not (path / "SKILL.md").is_file():
|
|
38
|
+
raise PluginHostError("codex_skill_missing", f"Bundle Skill {name!r} has no SKILL.md")
|
|
39
|
+
if name in seen:
|
|
40
|
+
raise PluginHostError("codex_skill_invalid", f"duplicate Bundle Skill {name!r}")
|
|
41
|
+
seen.add(name)
|
|
42
|
+
# Codex's native SkillInput expects the concrete SKILL.md source, not
|
|
43
|
+
# its containing directory. A directory is accepted by the Python
|
|
44
|
+
# model but silently omitted by the real App Server turn projection.
|
|
45
|
+
resolved.append({"name": name, "path": str(path / "SKILL.md")})
|
|
46
|
+
return resolved
|
|
@@ -10,19 +10,18 @@ Streamable HTTP MCP lease. Tool discovery and execution stay inside the real
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
12
|
import asyncio
|
|
13
|
-
import base64
|
|
14
13
|
import hashlib
|
|
15
|
-
import hmac
|
|
16
14
|
import json
|
|
17
15
|
import math
|
|
18
16
|
import os
|
|
19
17
|
import re
|
|
20
|
-
import secrets
|
|
18
|
+
import secrets as secrets # Public-module injection seam for scoped token tests.
|
|
21
19
|
import shutil
|
|
22
20
|
import signal
|
|
23
21
|
import struct
|
|
22
|
+
import sys
|
|
24
23
|
import tempfile
|
|
25
|
-
import time
|
|
24
|
+
import time as time # Shared clock seam remains available at the original module.
|
|
26
25
|
from collections import deque
|
|
27
26
|
from collections.abc import Mapping, Sequence
|
|
28
27
|
from dataclasses import dataclass, field
|
|
@@ -37,6 +36,7 @@ from ksadk.plugins.bridges.dsh import DshProfileProjection, dsh_subprocess_envir
|
|
|
37
36
|
from ksadk.plugins.contracts import PluginContractModel
|
|
38
37
|
from ksadk.plugins.host import PluginHostError
|
|
39
38
|
from ksadk.plugins.providers.dsh import DshCircuitBreaker, DshCircuitSnapshot
|
|
39
|
+
from ksadk.plugins.providers.dsh_connector_lease import _TOOL_NAME, DshConnectorLeaseTokens
|
|
40
40
|
|
|
41
41
|
DSH_CAPABILITY_HOST_PROTOCOL = "ksadk.dsh-capability-host/v1"
|
|
42
42
|
DSH_CAPABILITY_HOST_VERSION = "1.0.0"
|
|
@@ -49,7 +49,6 @@ DSH_CAPABILITY_MIN_NODE_VERSION = (22, 19, 0)
|
|
|
49
49
|
_DIGEST = re.compile(r"^sha256:[0-9a-f]{64}$")
|
|
50
50
|
_SEMVER = re.compile(r"^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$")
|
|
51
51
|
_PROFILE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$")
|
|
52
|
-
_TOOL_NAME = re.compile(r"^[A-Za-z0-9_.:-]+$")
|
|
53
52
|
_ENV_NAME = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
|
|
54
53
|
_NODE_VERSION = re.compile(r"^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$")
|
|
55
54
|
_SECRET_ENV = re.compile(
|
|
@@ -316,7 +315,7 @@ class DshProfileCapabilityDescriptor(PluginContractModel):
|
|
|
316
315
|
|
|
317
316
|
|
|
318
317
|
@dataclass(frozen=True)
|
|
319
|
-
class DshMcpConnectorLease:
|
|
318
|
+
class DshMcpConnectorLease(DshConnectorLeaseTokens):
|
|
320
319
|
"""Ephemeral connection material for one running ``mcp.connector/v1``."""
|
|
321
320
|
|
|
322
321
|
endpoint: str = field(repr=False)
|
|
@@ -330,169 +329,9 @@ class DshMcpConnectorLease:
|
|
|
330
329
|
transport: Literal["streamable-http"] = "streamable-http"
|
|
331
330
|
protocol_version: Literal["2025-06-18"] = "2025-06-18"
|
|
332
331
|
|
|
333
|
-
def
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
return {"Authorization": f"Bearer {self._bearer_token}"}
|
|
337
|
-
|
|
338
|
-
def companion_bearer_token(
|
|
339
|
-
self, *, plugin_id: str, generation_id: str, handle: str,
|
|
340
|
-
tool_name: str, call_id: str, ttl_seconds: int = 60,
|
|
341
|
-
) -> str:
|
|
342
|
-
"""Sign only an opaque Python grant and one exact native tool call."""
|
|
343
|
-
if (not re.fullmatch(r"[A-Za-z0-9_.-]{1,128}", plugin_id)
|
|
344
|
-
or not re.fullmatch(r"dshgen_[A-Za-z0-9_-]{24,96}", generation_id)
|
|
345
|
-
or not re.fullmatch(r"[A-Za-z0-9_-]{32,256}", handle)
|
|
346
|
-
or not _TOOL_NAME.fullmatch(tool_name)
|
|
347
|
-
or not re.fullmatch(r"[A-Za-z0-9_.:-]{1,128}", call_id)
|
|
348
|
-
or not 1 <= ttl_seconds <= 120):
|
|
349
|
-
raise ValueError("invalid companion invocation scope")
|
|
350
|
-
payload = {
|
|
351
|
-
"v": 3, "profileDigest": self.profile_digest,
|
|
352
|
-
"pluginId": plugin_id, "generationId": generation_id,
|
|
353
|
-
"handle": handle, "callId": call_id,
|
|
354
|
-
"aliases": {tool_name: tool_name},
|
|
355
|
-
"exp": int(time.time()) + ttl_seconds,
|
|
356
|
-
"jti": secrets.token_urlsafe(24),
|
|
357
|
-
}
|
|
358
|
-
raw = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode()
|
|
359
|
-
encoded = base64.urlsafe_b64encode(raw).rstrip(b"=").decode()
|
|
360
|
-
message = f"ks3.{encoded}"
|
|
361
|
-
signature = base64.urlsafe_b64encode(
|
|
362
|
-
hmac.new(self._bearer_token.encode(), message.encode(), hashlib.sha256).digest()
|
|
363
|
-
).rstrip(b"=").decode()
|
|
364
|
-
return f"{message}.{signature}"
|
|
365
|
-
|
|
366
|
-
def resource_bearer_token(self, tool_aliases: Mapping[str, str], resource_leases) -> str:
|
|
367
|
-
"""Mint scope v2 from host-issued, activation-bound resource leases."""
|
|
368
|
-
from ksadk.resource_runtime.leases import ResourceLease
|
|
369
|
-
|
|
370
|
-
leases = tuple(resource_leases)
|
|
371
|
-
if not leases or any(not isinstance(lease, ResourceLease) for lease in leases):
|
|
372
|
-
raise ValueError("Resource scope requires host-issued leases")
|
|
373
|
-
first = leases[0].scope
|
|
374
|
-
if first.profile_digest != self.profile_digest:
|
|
375
|
-
raise ValueError("Resource scope belongs to another profile")
|
|
376
|
-
aliases = dict(tool_aliases)
|
|
377
|
-
if not 1 <= len(aliases) <= 32 or any(
|
|
378
|
-
not isinstance(alias, str)
|
|
379
|
-
or not isinstance(source, str)
|
|
380
|
-
or not re.fullmatch(r"[A-Za-z0-9_-]{1,64}", alias)
|
|
381
|
-
or not _TOOL_NAME.fullmatch(source)
|
|
382
|
-
for alias, source in aliases.items()
|
|
383
|
-
):
|
|
384
|
-
raise ValueError("Resource scope requires explicit valid tool aliases")
|
|
385
|
-
resources = {}
|
|
386
|
-
lifetime = 600
|
|
387
|
-
for lease in leases:
|
|
388
|
-
scope = lease.scope
|
|
389
|
-
if (
|
|
390
|
-
scope.generation_id != first.generation_id
|
|
391
|
-
or scope.activation_id != first.activation_id
|
|
392
|
-
or scope.build_digest != first.build_digest
|
|
393
|
-
or scope.binding_snapshot_digest != first.binding_snapshot_digest
|
|
394
|
-
or scope.identity != first.identity
|
|
395
|
-
or scope.profile_digest != first.profile_digest
|
|
396
|
-
):
|
|
397
|
-
raise ValueError("Resource scope cannot mix activations")
|
|
398
|
-
lifetime = min(lifetime, math.floor(lease.expires_at - time.monotonic()))
|
|
399
|
-
for operation in scope.allowed_operations:
|
|
400
|
-
if operation not in aliases.values():
|
|
401
|
-
continue
|
|
402
|
-
if operation in resources:
|
|
403
|
-
raise ValueError("Resource operation has ambiguous bindings")
|
|
404
|
-
resources[operation] = {
|
|
405
|
-
"handle": lease.handle,
|
|
406
|
-
"bindingId": scope.binding_id,
|
|
407
|
-
"operation": operation,
|
|
408
|
-
}
|
|
409
|
-
if lifetime < 1 or not resources:
|
|
410
|
-
raise ValueError("Resource scope has no live operations")
|
|
411
|
-
issued = int(time.time())
|
|
412
|
-
payload = {
|
|
413
|
-
"v": 2,
|
|
414
|
-
"profileDigest": self.profile_digest,
|
|
415
|
-
"generationId": first.generation_id,
|
|
416
|
-
"activationId": first.activation_id,
|
|
417
|
-
"buildDigest": first.build_digest,
|
|
418
|
-
"bindingSnapshotDigest": first.binding_snapshot_digest,
|
|
419
|
-
"identity": first.identity.model_dump(by_alias=True, mode="json"),
|
|
420
|
-
"aliases": aliases,
|
|
421
|
-
"resources": resources,
|
|
422
|
-
"issuedAt": issued,
|
|
423
|
-
"expiresAt": issued + lifetime,
|
|
424
|
-
"jti": secrets.token_urlsafe(24),
|
|
425
|
-
}
|
|
426
|
-
raw = json.dumps(
|
|
427
|
-
payload, ensure_ascii=False, sort_keys=True, separators=(",", ":"), allow_nan=False
|
|
428
|
-
).encode()
|
|
429
|
-
encoded = base64.urlsafe_b64encode(raw).rstrip(b"=").decode()
|
|
430
|
-
message = f"ks2.{encoded}"
|
|
431
|
-
signature = (
|
|
432
|
-
base64.urlsafe_b64encode(
|
|
433
|
-
hmac.new(self._bearer_token.encode(), message.encode(), hashlib.sha256).digest()
|
|
434
|
-
)
|
|
435
|
-
.rstrip(b"=")
|
|
436
|
-
.decode()
|
|
437
|
-
)
|
|
438
|
-
token = f"{message}.{signature}"
|
|
439
|
-
if len(token) > 12 * 1024:
|
|
440
|
-
raise ValueError("Resource scope exceeds header size limit")
|
|
441
|
-
return token
|
|
442
|
-
|
|
443
|
-
def browser_url(self) -> str:
|
|
444
|
-
"""Return the one-time full Core DSH browser handoff URL."""
|
|
445
|
-
|
|
446
|
-
if self.web_route_count < 1 or not self._browser_token:
|
|
447
|
-
raise PluginHostError(
|
|
448
|
-
"dsh_core_web_unavailable",
|
|
449
|
-
"The selected DSH Profile does not expose the Core Web application",
|
|
450
|
-
)
|
|
451
|
-
parsed = urlsplit(self.endpoint)
|
|
452
|
-
return f"http://127.0.0.1:{parsed.port}/?token={self._browser_token}"
|
|
453
|
-
|
|
454
|
-
def bearer_token_for_runtime(self, tool_aliases: Mapping[str, str]) -> str:
|
|
455
|
-
"""Mint a generation-bound token limited to explicit tool names."""
|
|
456
|
-
|
|
457
|
-
aliases = {
|
|
458
|
-
str(alias).strip(): str(source).strip() for alias, source in tool_aliases.items()
|
|
459
|
-
}
|
|
460
|
-
if (
|
|
461
|
-
not aliases
|
|
462
|
-
or len(aliases) != len(tool_aliases)
|
|
463
|
-
or len(aliases) > 32
|
|
464
|
-
or any(
|
|
465
|
-
not re.fullmatch(r"[A-Za-z0-9_-]{1,64}", alias) or not _TOOL_NAME.fullmatch(source)
|
|
466
|
-
for alias, source in aliases.items()
|
|
467
|
-
)
|
|
468
|
-
):
|
|
469
|
-
raise PluginHostError(
|
|
470
|
-
"dsh_capability_scope_invalid",
|
|
471
|
-
"DSH capability tokens require an explicit valid tool scope",
|
|
472
|
-
)
|
|
473
|
-
payload = json.dumps(
|
|
474
|
-
{
|
|
475
|
-
"v": 1,
|
|
476
|
-
"profileDigest": self.profile_digest,
|
|
477
|
-
"exp": int(time.time()) + _SCOPED_TOKEN_LIFETIME_SECONDS,
|
|
478
|
-
"jti": secrets.token_urlsafe(16),
|
|
479
|
-
"aliases": dict(sorted(aliases.items())),
|
|
480
|
-
},
|
|
481
|
-
allow_nan=False,
|
|
482
|
-
ensure_ascii=False,
|
|
483
|
-
sort_keys=True,
|
|
484
|
-
separators=(",", ":"),
|
|
485
|
-
).encode("utf-8")
|
|
486
|
-
encoded = base64.urlsafe_b64encode(payload).rstrip(b"=")
|
|
487
|
-
signature = hmac.new(self._bearer_token.encode("utf-8"), encoded, hashlib.sha256).digest()
|
|
488
|
-
encoded_signature = base64.urlsafe_b64encode(signature).rstrip(b"=")
|
|
489
|
-
token = f"ks1.{encoded.decode('ascii')}.{encoded_signature.decode('ascii')}"
|
|
490
|
-
if len(token) > 12 * 1024:
|
|
491
|
-
raise PluginHostError(
|
|
492
|
-
"dsh_capability_scope_too_large",
|
|
493
|
-
"DSH capability token scope exceeds the HTTP header budget",
|
|
494
|
-
)
|
|
495
|
-
return token
|
|
332
|
+
def _runtime_token_lifetime(self) -> int:
|
|
333
|
+
# Preserve the host module's dynamic policy/monkeypatch seam.
|
|
334
|
+
return _SCOPED_TOKEN_LIFETIME_SECONDS
|
|
496
335
|
|
|
497
336
|
|
|
498
337
|
class DshProfileCapabilityInventory(PluginContractModel):
|
|
@@ -1324,8 +1163,10 @@ class DshProfileCapabilityHost:
|
|
|
1324
1163
|
if remaining <= 0:
|
|
1325
1164
|
break
|
|
1326
1165
|
await asyncio.sleep(min(0.05, remaining))
|
|
1327
|
-
|
|
1328
|
-
|
|
1166
|
+
# Always seal the owned group after the liveness snapshot. A
|
|
1167
|
+
# descendant can fork between /proc enumeration and becoming a
|
|
1168
|
+
# zombie; the new child must not escape a zombie-only fast exit.
|
|
1169
|
+
self._signal_process_group(process.pid, signal.SIGKILL)
|
|
1329
1170
|
elif process.returncode is None:
|
|
1330
1171
|
process.kill()
|
|
1331
1172
|
|
|
@@ -1347,6 +1188,10 @@ class DshProfileCapabilityHost:
|
|
|
1347
1188
|
return False
|
|
1348
1189
|
except PermissionError:
|
|
1349
1190
|
return True
|
|
1191
|
+
if sys.platform == "linux":
|
|
1192
|
+
from ksadk.plugins.providers._process_group import linux_group_has_live_members
|
|
1193
|
+
|
|
1194
|
+
return linux_group_has_live_members(process_group)
|
|
1350
1195
|
return True
|
|
1351
1196
|
|
|
1352
1197
|
def _record_process_failure(self) -> None:
|