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/api/client.py
CHANGED
|
@@ -23,6 +23,9 @@ import urllib3
|
|
|
23
23
|
|
|
24
24
|
from ksadk.api.environment import environment_variables_payload
|
|
25
25
|
from ksadk.common.auth import AWSV4Auth
|
|
26
|
+
from ksadk.common.cloud_headers import build_cloud_headers
|
|
27
|
+
|
|
28
|
+
from ksadk.api.sse_stream import AgentEngineSSEStream, _next_stream_chunk
|
|
26
29
|
|
|
27
30
|
logger = logging.getLogger(__name__)
|
|
28
31
|
|
|
@@ -37,69 +40,6 @@ class AttachmentContent:
|
|
|
37
40
|
display_name: str
|
|
38
41
|
|
|
39
42
|
|
|
40
|
-
def _next_stream_chunk(iterator: Iterator[bytes]) -> bytes | None:
|
|
41
|
-
"""Read one non-empty requests chunk without leaking StopIteration to asyncio."""
|
|
42
|
-
|
|
43
|
-
while True:
|
|
44
|
-
try:
|
|
45
|
-
chunk = next(iterator)
|
|
46
|
-
except StopIteration:
|
|
47
|
-
return None
|
|
48
|
-
if chunk:
|
|
49
|
-
return chunk
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class AgentEngineSSEStream(AsyncIterator[bytes]):
|
|
53
|
-
"""Async owner for one dedicated blocking requests SSE connection."""
|
|
54
|
-
|
|
55
|
-
def __init__(self, response: requests.Response, session: requests.Session) -> None:
|
|
56
|
-
self._response: requests.Response | None = response
|
|
57
|
-
self._session: requests.Session | None = session
|
|
58
|
-
# Read SSE as logical lines with the smallest requests read size. A
|
|
59
|
-
# fixed 8 KiB ``iter_content`` block makes short runs appear
|
|
60
|
-
# non-streaming, while ``chunk_size=None`` waits for EOF on urllib3.
|
|
61
|
-
# ``iter_lines`` performs the byte-at-a-time buffering inside the
|
|
62
|
-
# blocking worker and yields complete lines, avoiding one thread hop
|
|
63
|
-
# per byte. Re-add the delimiter so downstream SSE parsers keep their
|
|
64
|
-
# normal framing, including the blank line between events.
|
|
65
|
-
self._chunks = (line + b"\n" for line in response.iter_lines(chunk_size=1))
|
|
66
|
-
self._closed = False
|
|
67
|
-
|
|
68
|
-
def __aiter__(self) -> "AgentEngineSSEStream":
|
|
69
|
-
return self
|
|
70
|
-
|
|
71
|
-
async def __anext__(self) -> bytes:
|
|
72
|
-
if self._closed:
|
|
73
|
-
raise StopAsyncIteration
|
|
74
|
-
try:
|
|
75
|
-
chunk = await asyncio.to_thread(_next_stream_chunk, self._chunks)
|
|
76
|
-
except BaseException:
|
|
77
|
-
await self.aclose()
|
|
78
|
-
raise
|
|
79
|
-
if chunk is None:
|
|
80
|
-
await self.aclose()
|
|
81
|
-
raise StopAsyncIteration
|
|
82
|
-
return chunk
|
|
83
|
-
|
|
84
|
-
async def aclose(self) -> None:
|
|
85
|
-
if self._closed:
|
|
86
|
-
return
|
|
87
|
-
self._closed = True
|
|
88
|
-
response, session = self._response, self._session
|
|
89
|
-
self._response = None
|
|
90
|
-
self._session = None
|
|
91
|
-
|
|
92
|
-
def close_transport() -> None:
|
|
93
|
-
try:
|
|
94
|
-
if response is not None:
|
|
95
|
-
response.close()
|
|
96
|
-
finally:
|
|
97
|
-
if session is not None:
|
|
98
|
-
session.close()
|
|
99
|
-
|
|
100
|
-
await asyncio.to_thread(close_transport)
|
|
101
|
-
|
|
102
|
-
|
|
103
43
|
class DryRunExit(Exception):
|
|
104
44
|
"""DryRun 模式退出异常。"""
|
|
105
45
|
|
|
@@ -590,7 +530,7 @@ class AgentEngineClient:
|
|
|
590
530
|
account_id = self._resolve_account_id()
|
|
591
531
|
if account_id:
|
|
592
532
|
headers["X-Ksc-Account-Id"] = account_id
|
|
593
|
-
return headers
|
|
533
|
+
return build_cloud_headers(headers)
|
|
594
534
|
|
|
595
535
|
def _resolve_user_uuid(self) -> Optional[str]:
|
|
596
536
|
"""解析子账号 user uuid(X-Ksc-User-uuid 值)。
|
|
@@ -1055,7 +995,7 @@ class AgentEngineClient:
|
|
|
1055
995
|
response = self._get_session().request(
|
|
1056
996
|
method="POST",
|
|
1057
997
|
url=f"{endpoint}/agentengine/api/v1/{action}",
|
|
1058
|
-
headers={"Authorization": f"Bearer {api_key}"},
|
|
998
|
+
headers=build_cloud_headers({"Authorization": f"Bearer {api_key}"}),
|
|
1059
999
|
json=params,
|
|
1060
1000
|
timeout=self.timeout,
|
|
1061
1001
|
verify=self._request_ssl_verify(),
|
|
@@ -1246,7 +1186,7 @@ class AgentEngineClient:
|
|
|
1246
1186
|
response = self._get_session().request(
|
|
1247
1187
|
method=method,
|
|
1248
1188
|
url=url,
|
|
1249
|
-
headers=headers
|
|
1189
|
+
headers=build_cloud_headers(headers),
|
|
1250
1190
|
params=params,
|
|
1251
1191
|
files=files,
|
|
1252
1192
|
stream=False,
|
|
@@ -1313,6 +1253,7 @@ class AgentEngineClient:
|
|
|
1313
1253
|
params: Optional[Dict[str, Any]] = None,
|
|
1314
1254
|
*,
|
|
1315
1255
|
ignore_dry_run: bool = False,
|
|
1256
|
+
preserve_case: bool = False,
|
|
1316
1257
|
) -> Dict[str, Any]:
|
|
1317
1258
|
"""通用 Action API 调用"""
|
|
1318
1259
|
body = params or {}
|
|
@@ -1336,7 +1277,7 @@ class AgentEngineClient:
|
|
|
1336
1277
|
|
|
1337
1278
|
# 提取 Data 并统一转换为 snake_case
|
|
1338
1279
|
data = result.get("Data") if result.get("Data") is not None else result
|
|
1339
|
-
data = self._to_snake_case(data)
|
|
1280
|
+
data = data if preserve_case else self._to_snake_case(data)
|
|
1340
1281
|
|
|
1341
1282
|
# 预发环境 endpoint 协议归一化: https -> http
|
|
1342
1283
|
if self.logical_region and self.logical_region.strip().lower() == "pre-online":
|
|
@@ -1584,6 +1525,7 @@ class AgentEngineClient:
|
|
|
1584
1525
|
"Bucket": ks3.get("bucket"),
|
|
1585
1526
|
"Command": data.get("code_command"),
|
|
1586
1527
|
"Checksum": data.get("code_checksum"),
|
|
1528
|
+
"AgentKernelContractDigest": data.get("agent_kernel_contract_digest"),
|
|
1587
1529
|
}
|
|
1588
1530
|
elif params["DeploymentType"] == "ManagedRuntime":
|
|
1589
1531
|
params["ManagedRuntimeConfig"] = self._managed_runtime_config_payload(data)
|
|
@@ -1888,7 +1830,7 @@ class AgentEngineClient:
|
|
|
1888
1830
|
return True
|
|
1889
1831
|
|
|
1890
1832
|
async def update_agent(self, agent_id: str, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
1891
|
-
"""
|
|
1833
|
+
"""提交 Agent 更新并直接返回响应;Code 更新由服务端后台执行。"""
|
|
1892
1834
|
params: Dict[str, Any] = {"AgentId": agent_id}
|
|
1893
1835
|
artifact_type = data.get("artifact_type")
|
|
1894
1836
|
if artifact_type:
|
|
@@ -1916,6 +1858,7 @@ class AgentEngineClient:
|
|
|
1916
1858
|
"Bucket": ks3.get("bucket"),
|
|
1917
1859
|
"Command": data.get("code_command"),
|
|
1918
1860
|
"Checksum": data.get("code_checksum"),
|
|
1861
|
+
"AgentKernelContractDigest": data.get("agent_kernel_contract_digest"),
|
|
1919
1862
|
}
|
|
1920
1863
|
|
|
1921
1864
|
if data.get("resources"):
|
|
@@ -1933,7 +1876,14 @@ class AgentEngineClient:
|
|
|
1933
1876
|
|
|
1934
1877
|
envs = data.get("env_vars") or data.get("environment_variables")
|
|
1935
1878
|
if envs:
|
|
1936
|
-
|
|
1879
|
+
env_payload = environment_variables_payload(envs)
|
|
1880
|
+
if data.get("environment_variables_is_patch"):
|
|
1881
|
+
params["EnvironmentVariablePatch"] = {
|
|
1882
|
+
"Upsert": env_payload,
|
|
1883
|
+
"Delete": [],
|
|
1884
|
+
}
|
|
1885
|
+
else:
|
|
1886
|
+
params["EnvironmentVariables"] = env_payload
|
|
1937
1887
|
|
|
1938
1888
|
network_payload = self._normalize_network_payload(data.get("network"))
|
|
1939
1889
|
if network_payload:
|
|
@@ -1978,7 +1928,7 @@ class AgentEngineClient:
|
|
|
1978
1928
|
if advanced:
|
|
1979
1929
|
params["Advanced"] = advanced
|
|
1980
1930
|
|
|
1981
|
-
return self.
|
|
1931
|
+
return await self._action_async("UpdateAgent", params)
|
|
1982
1932
|
|
|
1983
1933
|
# ===== Session Actions =====
|
|
1984
1934
|
|
|
@@ -2593,16 +2543,18 @@ class AgentEngineClient:
|
|
|
2593
2543
|
params["Metadata"] = {"agentengine": execution_metadata}
|
|
2594
2544
|
return await self._action_async("RunAgent", params)
|
|
2595
2545
|
|
|
2596
|
-
def _open_chat_stream(
|
|
2546
|
+
def _open_chat_stream(
|
|
2547
|
+
self, params: Dict[str, Any], *, action: str = "RunAgent", method: str = "POST"
|
|
2548
|
+
) -> AgentEngineSSEStream:
|
|
2597
2549
|
"""Open RunAgent SSE synchronously in a worker-owned requests session."""
|
|
2598
2550
|
|
|
2599
|
-
path = "/agentengine/api/v1/
|
|
2600
|
-
_kop_mode, headers, full_url = self._build_action_request_target(path,
|
|
2551
|
+
path = f"/agentengine/api/v1/{action}"
|
|
2552
|
+
_kop_mode, headers, full_url = self._build_action_request_target(path, action)
|
|
2601
2553
|
body_str = json.dumps(params, ensure_ascii=False)
|
|
2602
2554
|
if self.dry_run:
|
|
2603
2555
|
# Reuse the established dry-run contract, which raises DryRunExit
|
|
2604
2556
|
# with the signed request rather than opening a socket.
|
|
2605
|
-
self._request(
|
|
2557
|
+
self._request(method, path, params)
|
|
2606
2558
|
raise AssertionError("dry-run request unexpectedly returned")
|
|
2607
2559
|
|
|
2608
2560
|
session = requests.Session()
|
|
@@ -2612,9 +2564,10 @@ class AgentEngineClient:
|
|
|
2612
2564
|
try:
|
|
2613
2565
|
while True:
|
|
2614
2566
|
response = session.request(
|
|
2615
|
-
method=
|
|
2567
|
+
method=method,
|
|
2616
2568
|
url=full_url,
|
|
2617
|
-
data=body_str.encode("utf-8"),
|
|
2569
|
+
data=body_str.encode("utf-8") if method == "POST" else None,
|
|
2570
|
+
params=params if method == "GET" else None,
|
|
2618
2571
|
headers=headers,
|
|
2619
2572
|
auth=self._auth.get_auth(),
|
|
2620
2573
|
# A foreground Agent turn can legitimately spend minutes
|
|
@@ -2650,7 +2603,7 @@ class AgentEngineClient:
|
|
|
2650
2603
|
str(
|
|
2651
2604
|
details.get("remote_error_message") or details.get("message") or ""
|
|
2652
2605
|
).strip()
|
|
2653
|
-
or "
|
|
2606
|
+
or f"{action} stream did not return text/event-stream"
|
|
2654
2607
|
)
|
|
2655
2608
|
raise AgentEngineAPIError(
|
|
2656
2609
|
error_code,
|
|
@@ -2663,12 +2616,12 @@ class AgentEngineClient:
|
|
|
2663
2616
|
response = None
|
|
2664
2617
|
self._switch_to_inner_aicp_endpoint()
|
|
2665
2618
|
_kop_mode, headers, full_url = self._build_action_request_target(
|
|
2666
|
-
path,
|
|
2619
|
+
path, action
|
|
2667
2620
|
)
|
|
2668
2621
|
continue
|
|
2669
2622
|
|
|
2670
2623
|
self._log_http_error(
|
|
2671
|
-
method=
|
|
2624
|
+
method=method,
|
|
2672
2625
|
full_url=full_url,
|
|
2673
2626
|
status_code=response.status_code,
|
|
2674
2627
|
details=details,
|
ksadk/api/sse_stream.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Own a cancellable blocking HTTP SSE connection from asyncio."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import socket
|
|
7
|
+
from typing import AsyncIterator, Iterator
|
|
8
|
+
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _next_stream_chunk(iterator: Iterator[bytes]) -> bytes | None:
|
|
13
|
+
"""Read one non-empty requests chunk without leaking StopIteration to asyncio."""
|
|
14
|
+
|
|
15
|
+
while True:
|
|
16
|
+
try:
|
|
17
|
+
chunk = next(iterator)
|
|
18
|
+
except StopIteration:
|
|
19
|
+
return None
|
|
20
|
+
if chunk:
|
|
21
|
+
return chunk
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AgentEngineSSEStream(AsyncIterator[bytes]):
|
|
25
|
+
"""Async owner for one dedicated blocking requests SSE connection."""
|
|
26
|
+
|
|
27
|
+
def __init__(self, response: requests.Response, session: requests.Session) -> None:
|
|
28
|
+
self._response: requests.Response | None = response
|
|
29
|
+
self._session: requests.Session | None = session
|
|
30
|
+
# Read SSE as logical lines with the smallest requests read size. A
|
|
31
|
+
# fixed 8 KiB ``iter_content`` block makes short runs appear
|
|
32
|
+
# non-streaming, while ``chunk_size=None`` waits for EOF on urllib3.
|
|
33
|
+
# ``iter_lines`` performs the byte-at-a-time buffering inside the
|
|
34
|
+
# blocking worker and yields complete lines, avoiding one thread hop
|
|
35
|
+
# per byte. Re-add the delimiter so downstream SSE parsers keep their
|
|
36
|
+
# normal framing, including the blank line between events.
|
|
37
|
+
self._chunks = (line + b"\n" for line in response.iter_lines(chunk_size=1))
|
|
38
|
+
self._closed = False
|
|
39
|
+
# requests/urllib3 close() waits for the buffered reader's lock. A
|
|
40
|
+
# worker blocked in an unlimited SSE read holds that lock, so closing
|
|
41
|
+
# from another thread must first wake the socket. Capture it before
|
|
42
|
+
# EOF can clear urllib3's connection reference. Connection: close
|
|
43
|
+
# responses may only retain it through HTTPResponse's buffered file.
|
|
44
|
+
raw = getattr(response, "raw", None)
|
|
45
|
+
connection = getattr(raw, "_connection", None)
|
|
46
|
+
transport_socket = getattr(connection, "sock", None)
|
|
47
|
+
if not isinstance(transport_socket, socket.socket):
|
|
48
|
+
response_file = getattr(getattr(raw, "_fp", None), "fp", None)
|
|
49
|
+
transport_socket = getattr(getattr(response_file, "raw", None), "_sock", None)
|
|
50
|
+
self._socket = transport_socket if isinstance(transport_socket, socket.socket) else None
|
|
51
|
+
|
|
52
|
+
def __aiter__(self) -> "AgentEngineSSEStream":
|
|
53
|
+
return self
|
|
54
|
+
|
|
55
|
+
async def __anext__(self) -> bytes:
|
|
56
|
+
if self._closed:
|
|
57
|
+
raise StopAsyncIteration
|
|
58
|
+
try:
|
|
59
|
+
chunk = await asyncio.to_thread(_next_stream_chunk, self._chunks)
|
|
60
|
+
except Exception:
|
|
61
|
+
if self._closed:
|
|
62
|
+
raise StopAsyncIteration from None
|
|
63
|
+
await self.aclose()
|
|
64
|
+
raise
|
|
65
|
+
except BaseException:
|
|
66
|
+
await self.aclose()
|
|
67
|
+
raise
|
|
68
|
+
if chunk is None or self._closed:
|
|
69
|
+
await self.aclose()
|
|
70
|
+
raise StopAsyncIteration
|
|
71
|
+
return chunk
|
|
72
|
+
|
|
73
|
+
async def aclose(self) -> None:
|
|
74
|
+
if self._closed:
|
|
75
|
+
return
|
|
76
|
+
self._closed = True
|
|
77
|
+
response, session = self._response, self._session
|
|
78
|
+
self._response = None
|
|
79
|
+
self._session = None
|
|
80
|
+
transport_socket, self._socket = self._socket, None
|
|
81
|
+
|
|
82
|
+
def close_transport() -> None:
|
|
83
|
+
try:
|
|
84
|
+
if transport_socket is not None:
|
|
85
|
+
try:
|
|
86
|
+
transport_socket.shutdown(socket.SHUT_RDWR)
|
|
87
|
+
except OSError:
|
|
88
|
+
# EOF or a simultaneous peer disconnect already closed it.
|
|
89
|
+
pass
|
|
90
|
+
if response is not None:
|
|
91
|
+
response.close()
|
|
92
|
+
finally:
|
|
93
|
+
if session is not None:
|
|
94
|
+
session.close()
|
|
95
|
+
|
|
96
|
+
await asyncio.to_thread(close_transport)
|
ksadk/builders/code_builder.py
CHANGED
|
@@ -41,8 +41,46 @@ from ksadk.builders.requirements_utils import (
|
|
|
41
41
|
parse_requirements_text,
|
|
42
42
|
)
|
|
43
43
|
|
|
44
|
+
from ksadk.builders.source_provenance import _git_provenance, _package_provenance as _read_package_provenance
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _package_provenance(package_name: str, package_root: Path) -> dict:
|
|
48
|
+
return _read_package_provenance(package_name, package_root, git_reader=_git_provenance)
|
|
49
|
+
|
|
44
50
|
BUILD_INFO_SCHEMA = "ksadk-build-info/v1"
|
|
45
51
|
BUILD_INFO_ARCNAME = "ksadk/BUILD-INFO.json"
|
|
52
|
+
DEPLOYMENT_CONTRACT_ARCNAME = "ksadk/DEPLOYMENT-CONTRACT.json"
|
|
53
|
+
HOSTED_CODE_COMMAND = [
|
|
54
|
+
"ksadk", "web", "/app/code", "--port", "8080", "--host", "0.0.0.0", "--no-open",
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def read_code_deployment_contract(zip_path: Path) -> dict[str, Any] | None:
|
|
59
|
+
"""Read the declaration from this exact built ZIP; never infer it from the caller's SDK."""
|
|
60
|
+
try:
|
|
61
|
+
with zipfile.ZipFile(zip_path) as archive:
|
|
62
|
+
return json.loads(archive.read(DEPLOYMENT_CONTRACT_ARCNAME))
|
|
63
|
+
except (OSError, KeyError, ValueError, zipfile.BadZipFile):
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _bundled_kernel_contract_digest(files) -> str | None:
|
|
68
|
+
for package_name, relative, file_path in files:
|
|
69
|
+
if package_name != "ksadk" or relative != "kernel/contract_fingerprints.py":
|
|
70
|
+
continue
|
|
71
|
+
try:
|
|
72
|
+
tree = ast.parse(file_path.read_text(encoding="utf-8"))
|
|
73
|
+
for node in tree.body:
|
|
74
|
+
if isinstance(node, ast.Assign) and any(
|
|
75
|
+
isinstance(target, ast.Name) and target.id == "AGENT_KERNEL_V1_AGGREGATE_DIGEST"
|
|
76
|
+
for target in node.targets
|
|
77
|
+
):
|
|
78
|
+
value = ast.literal_eval(node.value)
|
|
79
|
+
if isinstance(value, str) and re.fullmatch(r"[0-9a-f]{64}", value):
|
|
80
|
+
return value
|
|
81
|
+
except (OSError, SyntaxError, ValueError, TypeError):
|
|
82
|
+
return None
|
|
83
|
+
return None
|
|
46
84
|
|
|
47
85
|
|
|
48
86
|
def _sha256_file(path: Path) -> str:
|
|
@@ -70,84 +108,6 @@ def _bundled_content_fingerprint(files: List[Any]) -> str:
|
|
|
70
108
|
return digest.hexdigest()
|
|
71
109
|
|
|
72
110
|
|
|
73
|
-
def _git_provenance(start: Path) -> Optional[dict]:
|
|
74
|
-
"""返回 start 所在 git 仓库的提交信息;非 git 目录返回 None。"""
|
|
75
|
-
|
|
76
|
-
def _git(*args: str) -> Optional[str]:
|
|
77
|
-
try:
|
|
78
|
-
proc = subprocess.run(
|
|
79
|
-
["git", "-C", str(start), *args],
|
|
80
|
-
capture_output=True,
|
|
81
|
-
text=True,
|
|
82
|
-
timeout=10,
|
|
83
|
-
)
|
|
84
|
-
except Exception:
|
|
85
|
-
return None
|
|
86
|
-
if proc.returncode != 0:
|
|
87
|
-
return None
|
|
88
|
-
return proc.stdout.strip()
|
|
89
|
-
|
|
90
|
-
toplevel = _git("rev-parse", "--show-toplevel")
|
|
91
|
-
if not toplevel:
|
|
92
|
-
return None
|
|
93
|
-
commit = _git("rev-parse", "HEAD")
|
|
94
|
-
branch = _git("rev-parse", "--abbrev-ref", "HEAD")
|
|
95
|
-
status = _git("status", "--porcelain")
|
|
96
|
-
return {
|
|
97
|
-
"repo_root": toplevel,
|
|
98
|
-
"commit": commit,
|
|
99
|
-
"branch": branch or None,
|
|
100
|
-
"dirty": bool(status),
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def _package_provenance(package_name: str, package_root: Path) -> dict:
|
|
105
|
-
"""采集被 vendored 包的安装来源:dist 元信息 / 本地路径 / git 提交。"""
|
|
106
|
-
|
|
107
|
-
info: dict[str, Any] = {
|
|
108
|
-
"source_dir": str(package_root),
|
|
109
|
-
"dist_version": None,
|
|
110
|
-
"installer": None,
|
|
111
|
-
"direct_url": None,
|
|
112
|
-
"source_type": "unknown",
|
|
113
|
-
"git": None,
|
|
114
|
-
}
|
|
115
|
-
try:
|
|
116
|
-
dist = importlib_metadata.distribution(package_name)
|
|
117
|
-
except Exception:
|
|
118
|
-
dist = None
|
|
119
|
-
if dist is not None:
|
|
120
|
-
info["dist_version"] = dist.version
|
|
121
|
-
installer = (dist.read_text("INSTALLER") or "").strip()
|
|
122
|
-
info["installer"] = installer or None
|
|
123
|
-
raw_direct_url = dist.read_text("direct_url.json")
|
|
124
|
-
if raw_direct_url:
|
|
125
|
-
try:
|
|
126
|
-
direct_url = json.loads(raw_direct_url)
|
|
127
|
-
except ValueError:
|
|
128
|
-
direct_url = None
|
|
129
|
-
if isinstance(direct_url, dict):
|
|
130
|
-
info["direct_url"] = direct_url.get("url")
|
|
131
|
-
url = str(direct_url.get("url") or "")
|
|
132
|
-
dir_info = direct_url.get("dir_info") or {}
|
|
133
|
-
archive_info = direct_url.get("archive_info") or {}
|
|
134
|
-
if url.startswith("file://"):
|
|
135
|
-
if dir_info.get("editable"):
|
|
136
|
-
info["source_type"] = "editable-install"
|
|
137
|
-
elif url.endswith(".whl"):
|
|
138
|
-
info["source_type"] = "local-wheel"
|
|
139
|
-
else:
|
|
140
|
-
info["source_type"] = "local-path"
|
|
141
|
-
elif archive_info:
|
|
142
|
-
info["source_type"] = "remote-dist"
|
|
143
|
-
if info["direct_url"] is None and info["dist_version"] is not None:
|
|
144
|
-
# pip 从 index 安装的常规 dist 通常不写 direct_url.json
|
|
145
|
-
info["source_type"] = "installed-dist"
|
|
146
|
-
if info["source_type"] in {"editable-install", "local-path", "unknown"}:
|
|
147
|
-
info["git"] = _git_provenance(package_root)
|
|
148
|
-
return info
|
|
149
|
-
|
|
150
|
-
|
|
151
111
|
def build_bundled_source_manifest(
|
|
152
112
|
package_roots: dict,
|
|
153
113
|
bundled_files: List[Any],
|
|
@@ -249,6 +209,7 @@ class CodeBuilder(BaseBuilder):
|
|
|
249
209
|
".yaml",
|
|
250
210
|
".yml",
|
|
251
211
|
".json",
|
|
212
|
+
".sql",
|
|
252
213
|
".jinja2",
|
|
253
214
|
".j2",
|
|
254
215
|
".txt",
|
|
@@ -270,6 +231,9 @@ class CodeBuilder(BaseBuilder):
|
|
|
270
231
|
}
|
|
271
232
|
BUNDLED_KSADK_CORE_RUNTIME_REQUIREMENTS = (
|
|
272
233
|
"a2a-sdk>=0.3.22",
|
|
234
|
+
# Code archives run `ksadk web` in the plain Runtime image as well as
|
|
235
|
+
# the Kernel Host image. ksadk.cli imports rich during startup.
|
|
236
|
+
"rich>=13.0.0",
|
|
273
237
|
"culsans>=0.11.0",
|
|
274
238
|
"httpx-sse>=0.4.0",
|
|
275
239
|
"sse-starlette>=2.1.0",
|
|
@@ -281,8 +245,10 @@ class CodeBuilder(BaseBuilder):
|
|
|
281
245
|
"requests-aws4auth>=1.2.0",
|
|
282
246
|
"kingsoftcloud-sdk-python>=1.5.8.94",
|
|
283
247
|
"cryptography>=44.0.0",
|
|
248
|
+
"rfc8785==0.1.4",
|
|
284
249
|
"websockets>=12.0,<16.0",
|
|
285
250
|
"qrcode>=7.4.0",
|
|
251
|
+
"rfc8785>=0.1.4",
|
|
286
252
|
)
|
|
287
253
|
BUNDLED_KSADK_MCP_RUNTIME_REQUIREMENTS = (
|
|
288
254
|
"mcp>=1.1.0",
|
|
@@ -344,11 +310,17 @@ class CodeBuilder(BaseBuilder):
|
|
|
344
310
|
|
|
345
311
|
def build(self) -> BuildResult:
|
|
346
312
|
"""执行 Code 模式构建"""
|
|
313
|
+
from ksadk.a2a.build_validation import validate_a2a_exposure_sources
|
|
347
314
|
from ksadk.detection import FrameworkDetector
|
|
348
315
|
|
|
349
316
|
self._load_dotenv()
|
|
350
317
|
config = self._load_config()
|
|
351
318
|
|
|
319
|
+
try:
|
|
320
|
+
validate_a2a_exposure_sources(self.project_dir)
|
|
321
|
+
except ValueError as exc:
|
|
322
|
+
return BuildResult(success=False, error_message=str(exc))
|
|
323
|
+
|
|
352
324
|
# 检测框架
|
|
353
325
|
detector = FrameworkDetector(str(self.project_dir))
|
|
354
326
|
detection_result = detector.detect()
|
|
@@ -891,7 +863,10 @@ class CodeBuilder(BaseBuilder):
|
|
|
891
863
|
|
|
892
864
|
def _should_skip_ksadk_relative_path(self, relative_path: Path) -> bool:
|
|
893
865
|
parts = relative_path.parts
|
|
894
|
-
return len(parts) >= 2 and parts[
|
|
866
|
+
return len(parts) >= 2 and parts[:2] in {
|
|
867
|
+
("server", "web-ui"),
|
|
868
|
+
("studio", "react-ui"),
|
|
869
|
+
}
|
|
895
870
|
|
|
896
871
|
def _warn_on_nonrelease_bundled_source(self, build_info: dict) -> None:
|
|
897
872
|
"""vendored ksadk 源码来自本地路径/editable/来源不明时给出醒目提示。
|
|
@@ -1012,6 +987,13 @@ class CodeBuilder(BaseBuilder):
|
|
|
1012
987
|
)
|
|
1013
988
|
final_deps = merge_requirement_lists(final_deps, user_deps)
|
|
1014
989
|
|
|
990
|
+
# User pins may narrow the supported framework window, but an unpinned
|
|
991
|
+
# template dependency must not erase it. Keeping both requirements lets
|
|
992
|
+
# pip intersect constraints and reject incompatible pins at build time.
|
|
993
|
+
for requirement in code_requirements_for_framework(detection_result.type.value):
|
|
994
|
+
if requirement not in final_deps:
|
|
995
|
+
final_deps.append(requirement)
|
|
996
|
+
|
|
1015
997
|
return final_deps
|
|
1016
998
|
|
|
1017
999
|
def _bundled_ksadk_extra_requirements(self, requirements: List[str]) -> tuple[str, ...]:
|
|
@@ -1869,6 +1851,17 @@ class CodeBuilder(BaseBuilder):
|
|
|
1869
1851
|
BUILD_INFO_ARCNAME,
|
|
1870
1852
|
json.dumps(build_info, ensure_ascii=False, indent=2, sort_keys=True) + "\n",
|
|
1871
1853
|
)
|
|
1854
|
+
zf.writestr(
|
|
1855
|
+
DEPLOYMENT_CONTRACT_ARCNAME,
|
|
1856
|
+
json.dumps({
|
|
1857
|
+
"schema": "ksadk-code-deployment/v1",
|
|
1858
|
+
"framework": detection_result.type.value,
|
|
1859
|
+
"command": HOSTED_CODE_COMMAND,
|
|
1860
|
+
"agentKernelContractDigest": _bundled_kernel_contract_digest(
|
|
1861
|
+
bundled_source_files
|
|
1862
|
+
),
|
|
1863
|
+
}, sort_keys=True, separators=(",", ":")) + "\n",
|
|
1864
|
+
)
|
|
1872
1865
|
self._warn_on_nonrelease_bundled_source(build_info)
|
|
1873
1866
|
|
|
1874
1867
|
click.echo(f" ✓ 打包运行时源码: {bundled_source_count} 个文件")
|
|
@@ -2212,43 +2205,27 @@ runtime_context = RuntimeLaunchContext(
|
|
|
2212
2205
|
detection=detection_result,
|
|
2213
2206
|
config=dict(runtime_build_config),
|
|
2214
2207
|
)
|
|
2215
|
-
#
|
|
2216
|
-
|
|
2217
|
-
|
|
2208
|
+
# Runtime identity is available before registration for discovery. Operator
|
|
2209
|
+
# enables the complete composition only after every Secret projection exists.
|
|
2210
|
+
_managed_a2a_bootstrap = None
|
|
2218
2211
|
_a2a_adapter = None
|
|
2219
2212
|
if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
_managed_a2a_card = build_managed_a2a_card_if_configured()
|
|
2223
|
-
try:
|
|
2224
|
-
from ksadk.a2a.routes import A2AConfig
|
|
2213
|
+
if os.environ.get("KSADK_A2A_MANAGED_BOOTSTRAP_ENABLED", "").strip().lower() == "true":
|
|
2214
|
+
from ksadk.a2a.platform import build_managed_a2a_bootstrap_from_env
|
|
2225
2215
|
from ksadk.runtime.factory import create_runtime_adapter
|
|
2226
2216
|
|
|
2227
2217
|
_a2a_adapter = create_runtime_adapter(runtime_context)
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
enabled=True,
|
|
2234
|
-
base_url=_base,
|
|
2235
|
-
agent_name=(
|
|
2236
|
-
os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
|
|
2237
|
-
or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
|
|
2238
|
-
),
|
|
2239
|
-
streaming=True,
|
|
2240
|
-
task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
|
|
2241
|
-
)
|
|
2242
|
-
except Exception as _e:
|
|
2243
|
-
logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
|
|
2244
|
-
_a2a_config = None
|
|
2245
|
-
_a2a_adapter = None
|
|
2218
|
+
_managed_a2a_bootstrap = build_managed_a2a_bootstrap_from_env()
|
|
2219
|
+
else:
|
|
2220
|
+
from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
|
|
2221
|
+
|
|
2222
|
+
_managed_a2a_bootstrap = build_managed_a2a_card_if_configured()
|
|
2246
2223
|
app = create_runtime_app(
|
|
2247
2224
|
RuntimeAppConfig(
|
|
2248
2225
|
runtime_type=detection_result.type.value,
|
|
2249
2226
|
runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
|
|
2250
2227
|
launch_context=runtime_context,
|
|
2251
|
-
a2a=
|
|
2228
|
+
a2a=_managed_a2a_bootstrap,
|
|
2252
2229
|
a2a_runtime_adapter=_a2a_adapter,
|
|
2253
2230
|
),
|
|
2254
2231
|
configure_runtime_app,
|
|
@@ -561,45 +561,27 @@ runtime_context = RuntimeLaunchContext(
|
|
|
561
561
|
detection=detection_result,
|
|
562
562
|
config=dict(runtime_build_config),
|
|
563
563
|
)
|
|
564
|
-
#
|
|
565
|
-
#
|
|
566
|
-
|
|
567
|
-
_managed_a2a_card = None
|
|
568
|
-
_a2a_config = None
|
|
564
|
+
# Runtime identity is available before registration for discovery. Operator
|
|
565
|
+
# enables the complete composition only after every Secret projection exists.
|
|
566
|
+
_managed_a2a_bootstrap = None
|
|
569
567
|
_a2a_adapter = None
|
|
570
568
|
if os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip():
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
_managed_a2a_card = build_managed_a2a_card_if_configured()
|
|
574
|
-
try:
|
|
575
|
-
from ksadk.a2a.routes import A2AConfig
|
|
569
|
+
if os.environ.get("KSADK_A2A_MANAGED_BOOTSTRAP_ENABLED", "").strip().lower() == "true":
|
|
570
|
+
from ksadk.a2a.platform import build_managed_a2a_bootstrap_from_env
|
|
576
571
|
from ksadk.runtime.factory import create_runtime_adapter
|
|
577
572
|
|
|
578
573
|
_a2a_adapter = create_runtime_adapter(runtime_context)
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
enabled=True,
|
|
585
|
-
base_url=_base,
|
|
586
|
-
agent_name=(
|
|
587
|
-
os.environ.get("KSADK_A2A_AGENT_NAME", "").strip()
|
|
588
|
-
or os.environ.get("KSADK_A2A_RUNTIME_ID", "").strip()
|
|
589
|
-
),
|
|
590
|
-
streaming=True,
|
|
591
|
-
task_store_dsn="sqlite+aiosqlite:///.agentengine/a2a_tasks.db",
|
|
592
|
-
)
|
|
593
|
-
except Exception as _e:
|
|
594
|
-
logger.warning(f"managed A2A 数据面装配失败,回退 discovery-only: {{_e}}")
|
|
595
|
-
_a2a_config = None
|
|
596
|
-
_a2a_adapter = None
|
|
574
|
+
_managed_a2a_bootstrap = build_managed_a2a_bootstrap_from_env()
|
|
575
|
+
else:
|
|
576
|
+
from ksadk.managed_a2a_card import build_managed_a2a_card_if_configured
|
|
577
|
+
|
|
578
|
+
_managed_a2a_bootstrap = build_managed_a2a_card_if_configured()
|
|
597
579
|
app = create_runtime_app(
|
|
598
580
|
RuntimeAppConfig(
|
|
599
581
|
runtime_type=detection_result.type.value,
|
|
600
582
|
runtime_executor=RuntimeExecutor(build_default_runtime_registry()),
|
|
601
583
|
launch_context=runtime_context,
|
|
602
|
-
a2a=
|
|
584
|
+
a2a=_managed_a2a_bootstrap,
|
|
603
585
|
a2a_runtime_adapter=_a2a_adapter,
|
|
604
586
|
),
|
|
605
587
|
configure_runtime_app,
|
|
@@ -19,6 +19,8 @@ LANGCHAIN_ECOSYSTEM_REQUIREMENTS = (
|
|
|
19
19
|
"langchain-openai>=1.4.0,<2.0.0",
|
|
20
20
|
"langchain-core>=1.5.0,<2.0.0",
|
|
21
21
|
"langgraph>=1.2.0,<1.3.0",
|
|
22
|
+
# Plain Code runtimes use the local SQLite checkpoint backend by default.
|
|
23
|
+
"langgraph-checkpoint-sqlite>=2.0.0",
|
|
22
24
|
)
|
|
23
25
|
|
|
24
26
|
DEEPAGENTS_REQUIREMENTS = ("deepagents>=0.6.2,<1.0.0",)
|