agentengine-sdk-python 0.8.4__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.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
- agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
- 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/_process.py +83 -0
- ksadk/_str_enum.py +17 -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/a2ui/core.py +3 -3
- ksadk/api/client.py +38 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +121 -118
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +22 -2
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +64 -88
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +69 -17
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -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 -1047
- 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/__init__.py +1 -1
- ksadk/configs/env_registry.py +216 -143
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +134 -0
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +9 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +69 -20
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +51 -155
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +12 -0
- ksadk/conversations/runtime_persistence.py +296 -32
- ksadk/conversations/runtime_preparation.py +98 -13
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- 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/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +46 -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/events/session_event.py +2 -2
- ksadk/harness/__init__.py +18 -0
- ksadk/harness/app.py +11 -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 +230 -0
- 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/capabilities.py +115 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +332 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +153 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +504 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +388 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/context_tuning.py +168 -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/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +57 -0
- ksadk/harness/engine/context_pipeline.py +1351 -0
- ksadk/harness/engine/graph_builder.py +352 -0
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +1049 -0
- ksadk/harness/engine/mcp_disclosure.py +701 -0
- 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 +81 -0
- ksadk/harness/engine/postgres_checkpointer.py +386 -0
- ksadk/harness/engine/run_control_bridge.py +100 -0
- ksadk/harness/engine/run_types.py +98 -0
- ksadk/harness/engine/skill_disclosure.py +275 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +360 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +249 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +498 -0
- ksadk/harness/execution_policy.py +104 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +699 -0
- ksadk/harness/loop/tools.py +907 -0
- ksadk/harness/managed_runtime.py +1044 -0
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +504 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -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 +468 -0
- ksadk/harness/model_provider.py +430 -0
- 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/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +132 -0
- ksadk/harness/public_activity.py +213 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +779 -17
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +773 -0
- ksadk/harness/runtime.py +157 -113
- ksadk/harness/runtime_capabilities.py +228 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +733 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +589 -0
- 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_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +317 -0
- ksadk/harness/spec.py +342 -0
- ksadk/harness/state.py +155 -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/strategies.py +149 -0
- ksadk/harness/subagent.py +263 -0
- 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 +134 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -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/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +9 -2
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +220 -252
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +30 -0
- ksadk/kernel/control.py +180 -29
- ksadk/kernel/execution_grants.py +428 -0
- ksadk/kernel/execution_grants_memory.py +252 -0
- ksadk/kernel/execution_grants_postgres.py +395 -0
- ksadk/kernel/execution_grants_sqlite.py +435 -0
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +139 -226
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +61 -58
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +230 -231
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +166 -16
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +28 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +410 -200
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +104 -5
- 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 +369 -340
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +74 -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/coordinator.py +22 -6
- ksadk/memory/extraction.py +159 -7
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +280 -67
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- 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_policy.py +2 -2
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +14 -9
- ksadk/model_proxy/transform.py +72 -6
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +29 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +417 -185
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +92 -21
- ksadk/plugins/execution_host.py +107 -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-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -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-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +52 -40
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +49 -143
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +413 -52
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +670 -0
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +550 -0
- ksadk/plugins/providers/harness_tools.py +455 -0
- 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/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +540 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- 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/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1480 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +352 -0
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +853 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +519 -0
- ksadk/plugins/teams/task_decisions.py +436 -0
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +96 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- 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 +83 -401
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +220 -350
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +208 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- 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 +134 -129
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +29 -3
- ksadk/runtime/executor.py +105 -7
- ksadk/runtime/factory.py +45 -3
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +160 -21
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +105 -1
- ksadk/sandbox/backends/e2b.py +272 -24
- ksadk/sandbox/backends/local_process.py +73 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +776 -0
- ksadk/sandbox/local_launcher.py +124 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/invocation_identity.py +118 -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/common.py +32 -3
- ksadk/server/routes/control.py +112 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +26 -3
- ksadk/server/routes/misc.py +331 -33
- ksadk/server/routes/models.py +28 -4
- ksadk/server/routes/openai_compat.py +82 -13
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +112 -37
- ksadk/server/routes/sessions.py +493 -358
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +135 -23
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.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-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.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-Bf9D3tzJ.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-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.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-Cp_r9Hb6.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-Dlhc8Wr8.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-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.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-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.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-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.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-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -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/invocation_identity.py +235 -0
- 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/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/loader.py +44 -2
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +400 -56
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/service_client.py +6 -1
- ksadk/skills/tool_defs.py +108 -3
- 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 +784 -419
- 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 +31 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +32 -2
- ksadk/studio/capabilities.py +31 -9
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +113 -387
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +82 -2
- ksadk/studio/codex_agent_service.py +19 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +112 -6
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +260 -202
- ksadk/studio/dsh_application.py +183 -27
- ksadk/studio/dsh_capability_service.py +302 -189
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +53 -5
- ksadk/studio/execution_host.py +598 -0
- ksadk/studio/framework_run.py +50 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +429 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- 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 +1939 -345
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +89 -40
- 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_documents.py +172 -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 +39 -12
- ksadk/studio/plugin_kernel_adapter.py +89 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +832 -99
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +69 -34
- ksadk/studio/resource_catalog.py +14 -12
- ksadk/studio/run_activity.py +848 -0
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +1220 -335
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +73 -11
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +615 -246
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +518 -181
- 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-CkufcPYo.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +166 -0
- ksadk/studio/teams_installation.py +217 -0
- ksadk/studio/teams_node.py +549 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +72 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +496 -0
- ksadk/studio/templates.py +41 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +138 -0
- ksadk/studio/workspace_registry.py +286 -0
- 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 +93 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +344 -326
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_identity.py +15 -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/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +28 -14
- agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
|
@@ -0,0 +1,938 @@
|
|
|
1
|
+
"""Async Codex backend implementation.
|
|
2
|
+
|
|
3
|
+
The protocol and marketplace contracts stay in :mod:`ksadk.codex.client`;
|
|
4
|
+
this module owns the provider lifecycle, approval bridge, and turn streams.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import os
|
|
11
|
+
import queue
|
|
12
|
+
import secrets
|
|
13
|
+
import threading
|
|
14
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, AsyncIterator, Optional
|
|
17
|
+
from uuid import uuid4
|
|
18
|
+
|
|
19
|
+
from ksadk.codex import client as _client_module
|
|
20
|
+
from ksadk.codex.client import (
|
|
21
|
+
CodexClient,
|
|
22
|
+
CodexPluginBootstrap,
|
|
23
|
+
CodexPluginBootstrapError,
|
|
24
|
+
_CapabilityRoute,
|
|
25
|
+
_is_openai_official,
|
|
26
|
+
_missing_codex_error,
|
|
27
|
+
_PendingApproval,
|
|
28
|
+
_PendingInteraction,
|
|
29
|
+
_upgrade_http_to_https,
|
|
30
|
+
)
|
|
31
|
+
from ksadk.codex.client_payloads import (
|
|
32
|
+
coerce_input,
|
|
33
|
+
notification_to_event_dict,
|
|
34
|
+
thread_kwargs,
|
|
35
|
+
turn_kwargs,
|
|
36
|
+
)
|
|
37
|
+
from ksadk.model_proxy import ProxyConfig, ProxyServer
|
|
38
|
+
|
|
39
|
+
from ksadk.codex.async_approval import _AsyncApprovalMixin
|
|
40
|
+
|
|
41
|
+
from ksadk.codex.async_proxy import _AsyncProxyMixin
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AsyncCodexClient(_AsyncProxyMixin, _AsyncApprovalMixin, CodexClient):
|
|
45
|
+
"""基于 OpenAI 官方 ``openai-codex`` SDK(``AsyncCodex``)的生产后端。
|
|
46
|
+
|
|
47
|
+
**lazy import** ``openai_codex``:仅在实际使用时导入,缺依赖时显式报错
|
|
48
|
+
(``pip install 'ksadk[codex]'``),不让所有 ksadk 用户默认背几十 MB CLI 二进制。
|
|
49
|
+
构造时校验真实 SDK 方法存在(``thread_start``/``thread_resume``/``close`` 及
|
|
50
|
+
``AsyncThread.turn`` / ``AsyncTurnHandle.stream``/``interrupt``),版本漂移 fail-fast。
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
_notification_to_event_dict = staticmethod(notification_to_event_dict)
|
|
54
|
+
|
|
55
|
+
@staticmethod
|
|
56
|
+
def _start_proxy_and_inject(config: Any, *, proxy_observer: Any = None) -> tuple[Any, Any]:
|
|
57
|
+
return _AsyncProxyMixin._start_proxy_and_inject(
|
|
58
|
+
config, proxy_observer=proxy_observer,
|
|
59
|
+
proxy_factory=ProxyServer, config_factory=ProxyConfig,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def __init__(self, config: Any = None, *, proxy_observer: Any = None) -> None:
|
|
63
|
+
try:
|
|
64
|
+
from openai_codex import ( # type: ignore[import-not-found]
|
|
65
|
+
AsyncCodex,
|
|
66
|
+
AsyncThread,
|
|
67
|
+
AsyncTurnHandle,
|
|
68
|
+
)
|
|
69
|
+
except ImportError as exc:
|
|
70
|
+
raise _missing_codex_error() from exc
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
sdk_version = version("openai-codex")
|
|
74
|
+
except PackageNotFoundError:
|
|
75
|
+
sdk_version = "unknown"
|
|
76
|
+
required = (
|
|
77
|
+
(AsyncCodex, "thread_start"),
|
|
78
|
+
(AsyncCodex, "thread_resume"),
|
|
79
|
+
(AsyncCodex, "close"),
|
|
80
|
+
(AsyncThread, "turn"),
|
|
81
|
+
(AsyncTurnHandle, "stream"),
|
|
82
|
+
(AsyncTurnHandle, "interrupt"),
|
|
83
|
+
)
|
|
84
|
+
for owner, method_name in required:
|
|
85
|
+
if not hasattr(owner, method_name):
|
|
86
|
+
raise RuntimeError(
|
|
87
|
+
f"openai-codex {sdk_version} SDK 缺少 "
|
|
88
|
+
f"{owner.__name__}.{method_name}(版本不兼容)"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# AsyncCodex 0.147.0 only accepts one CodexConfig positional/keyword.
|
|
92
|
+
config, self._proxy = self._maybe_apply_proxy(
|
|
93
|
+
config,
|
|
94
|
+
proxy_observer=proxy_observer,
|
|
95
|
+
)
|
|
96
|
+
self._codex = AsyncCodex(config=config)
|
|
97
|
+
self._checkpoint_home = (getattr(config, "env", None) or {}).get("CODEX_HOME")
|
|
98
|
+
self.sdk_version = sdk_version
|
|
99
|
+
self._threads: dict[str, Any] = {} # thread_id -> AsyncThread
|
|
100
|
+
self._thread_approval_configs: dict[str, dict[str, Any]] = {}
|
|
101
|
+
self._active_handles: dict[str, Any] = {} # thread_id -> 活跃 AsyncTurnHandle
|
|
102
|
+
self._goal_states: dict[str, Any] = {}
|
|
103
|
+
self._approval_queues: dict[str, queue.Queue[Any]] = {}
|
|
104
|
+
self._pending_approvals: dict[str, _PendingApproval] = {}
|
|
105
|
+
self._pending_interactions: dict[str, _PendingInteraction] = {}
|
|
106
|
+
self._approval_lock = threading.Lock()
|
|
107
|
+
self._a2a_expert_bridge = None
|
|
108
|
+
self._install_approval_bridge()
|
|
109
|
+
|
|
110
|
+
async def bootstrap_plugins(self, config: CodexPluginBootstrap) -> None:
|
|
111
|
+
"""Install a pinned local marketplace on this client's App Server.
|
|
112
|
+
|
|
113
|
+
This intentionally uses the ``AsyncCodex`` object's already-owned
|
|
114
|
+
low-level transport. Spawning a second bridge process would install
|
|
115
|
+
into a different host lifecycle and would not guarantee that the
|
|
116
|
+
thread started below observes the same plugin inventory.
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
config.verify()
|
|
120
|
+
try:
|
|
121
|
+
from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
|
|
122
|
+
MarketplaceAddResponse,
|
|
123
|
+
PluginInstallResponse,
|
|
124
|
+
PluginListResponse,
|
|
125
|
+
)
|
|
126
|
+
except ImportError as exc: # pragma: no cover - guarded by __init__
|
|
127
|
+
raise _missing_codex_error() from exc
|
|
128
|
+
|
|
129
|
+
await self._codex._ensure_initialized()
|
|
130
|
+
transport = getattr(self._codex, "_client", None)
|
|
131
|
+
if transport is None or not callable(getattr(transport, "request", None)):
|
|
132
|
+
raise CodexPluginBootstrapError(
|
|
133
|
+
f"openai-codex {self.sdk_version} lacks the App Server request transport"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
receipt = await transport.request(
|
|
137
|
+
"marketplace/add",
|
|
138
|
+
{
|
|
139
|
+
"source": str(config.root),
|
|
140
|
+
"refName": None,
|
|
141
|
+
"sparsePaths": None,
|
|
142
|
+
},
|
|
143
|
+
response_model=MarketplaceAddResponse,
|
|
144
|
+
)
|
|
145
|
+
if str(receipt.marketplace_name) != config.marketplace_name:
|
|
146
|
+
raise CodexPluginBootstrapError(
|
|
147
|
+
"Codex App Server added an unexpected marketplace: "
|
|
148
|
+
f"expected {config.marketplace_name!r}, got {receipt.marketplace_name!r}"
|
|
149
|
+
)
|
|
150
|
+
installed_root_value = getattr(receipt.installed_root, "root", receipt.installed_root)
|
|
151
|
+
try:
|
|
152
|
+
installed_root = Path(str(installed_root_value)).resolve(strict=True)
|
|
153
|
+
expected_root = config.root.resolve(strict=True)
|
|
154
|
+
except OSError as exc:
|
|
155
|
+
raise CodexPluginBootstrapError(
|
|
156
|
+
"Codex App Server marketplace receipt names an unavailable root"
|
|
157
|
+
) from exc
|
|
158
|
+
if installed_root != expected_root:
|
|
159
|
+
raise CodexPluginBootstrapError(
|
|
160
|
+
"Codex App Server marketplace receipt does not match the pinned root"
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
marketplace_manifest = str(config.manifest_path.resolve(strict=True))
|
|
164
|
+
for plugin_name in config.plugin_names:
|
|
165
|
+
await transport.request(
|
|
166
|
+
"plugin/install",
|
|
167
|
+
{
|
|
168
|
+
"pluginName": plugin_name,
|
|
169
|
+
"marketplacePath": marketplace_manifest,
|
|
170
|
+
"remoteMarketplaceName": None,
|
|
171
|
+
},
|
|
172
|
+
response_model=PluginInstallResponse,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
inventory = await transport.request(
|
|
176
|
+
"plugin/list",
|
|
177
|
+
{"forceRefetch": True, "cwds": None, "marketplaceKinds": None},
|
|
178
|
+
response_model=PluginListResponse,
|
|
179
|
+
)
|
|
180
|
+
marketplaces = [
|
|
181
|
+
marketplace
|
|
182
|
+
for marketplace in inventory.marketplaces
|
|
183
|
+
if str(marketplace.name) == config.marketplace_name
|
|
184
|
+
]
|
|
185
|
+
if len(marketplaces) != 1:
|
|
186
|
+
raise CodexPluginBootstrapError(
|
|
187
|
+
"Codex App Server did not report exactly one pinned marketplace"
|
|
188
|
+
)
|
|
189
|
+
marketplace = marketplaces[0]
|
|
190
|
+
reported_path_value = getattr(marketplace.path, "root", marketplace.path)
|
|
191
|
+
if reported_path_value is None:
|
|
192
|
+
raise CodexPluginBootstrapError(
|
|
193
|
+
"Codex App Server reported the pinned marketplace as remote"
|
|
194
|
+
)
|
|
195
|
+
try:
|
|
196
|
+
reported_path = Path(str(reported_path_value)).resolve(strict=True)
|
|
197
|
+
except OSError as exc:
|
|
198
|
+
raise CodexPluginBootstrapError(
|
|
199
|
+
"Codex App Server reported an unavailable marketplace manifest"
|
|
200
|
+
) from exc
|
|
201
|
+
if reported_path != Path(marketplace_manifest):
|
|
202
|
+
raise CodexPluginBootstrapError(
|
|
203
|
+
"Codex App Server inventory does not match the pinned marketplace path"
|
|
204
|
+
)
|
|
205
|
+
for plugin_name in config.plugin_names:
|
|
206
|
+
matches = [plugin for plugin in marketplace.plugins if plugin.name == plugin_name]
|
|
207
|
+
if len(matches) != 1 or not matches[0].installed or not matches[0].enabled:
|
|
208
|
+
raise CodexPluginBootstrapError(
|
|
209
|
+
"Codex App Server did not reconcile pinned plugin as installed and enabled: "
|
|
210
|
+
+ plugin_name
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
async def start_thread(self, config: Optional[dict[str, Any]] = None) -> str:
|
|
214
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
215
|
+
if bridge is not None and bridge.experts:
|
|
216
|
+
thread = await self._start_expert_thread(config)
|
|
217
|
+
bridge.register_thread(str(thread.id))
|
|
218
|
+
elif self._uses_manual_approval(config):
|
|
219
|
+
thread = await self._start_manual_thread(config)
|
|
220
|
+
else:
|
|
221
|
+
thread = await self._codex.thread_start(**thread_kwargs(config))
|
|
222
|
+
self._threads[thread.id] = thread
|
|
223
|
+
return str(thread.id)
|
|
224
|
+
|
|
225
|
+
async def compact_thread(self, thread_id: str) -> dict[str, Any]:
|
|
226
|
+
"""Wait for native compaction completion, not just request admission.
|
|
227
|
+
|
|
228
|
+
The caller owns an idle, dedicated client and closes it on timeout.
|
|
229
|
+
No model prompt or shell command is used to emulate compaction.
|
|
230
|
+
"""
|
|
231
|
+
thread = self._threads[thread_id]
|
|
232
|
+
low_level = self._codex._client
|
|
233
|
+
turn_id = None
|
|
234
|
+
compacted = False
|
|
235
|
+
usage: dict[str, Any] = {}
|
|
236
|
+
try:
|
|
237
|
+
async with asyncio.timeout(120):
|
|
238
|
+
before = await thread.read(include_turns=True)
|
|
239
|
+
previous_ids = {turn.id for turn in before.thread.turns}
|
|
240
|
+
await thread.compact()
|
|
241
|
+
# compact/start returns no turn id. The SDK buffers scoped
|
|
242
|
+
# notifications until their turn is registered; global reads
|
|
243
|
+
# deliberately exclude them. Discover the new turn first.
|
|
244
|
+
while turn_id is None:
|
|
245
|
+
current = await thread.read(include_turns=True)
|
|
246
|
+
new_turns = [
|
|
247
|
+
turn for turn in current.thread.turns if turn.id not in previous_ids
|
|
248
|
+
]
|
|
249
|
+
if new_turns:
|
|
250
|
+
turn_id = new_turns[-1].id
|
|
251
|
+
low_level.register_turn_notifications(turn_id)
|
|
252
|
+
break
|
|
253
|
+
await asyncio.sleep(0.25)
|
|
254
|
+
while True:
|
|
255
|
+
notification = await low_level.next_turn_notification(turn_id)
|
|
256
|
+
event = self._notification_to_event_dict(notification) or {}
|
|
257
|
+
params = event.get("params") or {}
|
|
258
|
+
if params.get("threadId") != thread_id:
|
|
259
|
+
continue
|
|
260
|
+
method = event.get("method")
|
|
261
|
+
if method == "item/completed":
|
|
262
|
+
compacted |= (params.get("item") or {}).get("type") == "contextCompaction"
|
|
263
|
+
elif method == "thread/tokenUsage/updated":
|
|
264
|
+
usage = dict(params.get("tokenUsage") or {})
|
|
265
|
+
elif method == "turn/completed":
|
|
266
|
+
turn = params["turn"]
|
|
267
|
+
if turn.get("status") != "completed" or not compacted:
|
|
268
|
+
raise RuntimeError("Codex context compaction did not complete")
|
|
269
|
+
return usage
|
|
270
|
+
finally:
|
|
271
|
+
if turn_id is not None:
|
|
272
|
+
low_level.unregister_turn_notifications(turn_id)
|
|
273
|
+
|
|
274
|
+
async def resume_thread(self, thread_id: str, config: Optional[dict[str, Any]] = None) -> str:
|
|
275
|
+
# An ephemeral thread has no rollout on disk, so SDK thread_resume would
|
|
276
|
+
# fail with -32600. Reuse its live AsyncThread for same-process resume.
|
|
277
|
+
cached = self._threads.get(thread_id)
|
|
278
|
+
if cached is not None:
|
|
279
|
+
return str(cached.id)
|
|
280
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
281
|
+
if bridge is not None and bridge.experts:
|
|
282
|
+
raise ValueError("A2A_CODEX_EXPERT_RESUME_UNVERIFIED")
|
|
283
|
+
if self._uses_manual_approval(config):
|
|
284
|
+
thread = await self._resume_manual_thread(thread_id, config)
|
|
285
|
+
else:
|
|
286
|
+
kwargs = thread_kwargs(config)
|
|
287
|
+
# AsyncCodex.thread_resume 0.144.4 has no ephemeral parameter.
|
|
288
|
+
kwargs.pop("ephemeral", None)
|
|
289
|
+
thread = await self._codex.thread_resume(thread_id, **kwargs)
|
|
290
|
+
self._threads[thread.id] = thread
|
|
291
|
+
return str(thread.id)
|
|
292
|
+
|
|
293
|
+
@staticmethod
|
|
294
|
+
def _uses_manual_approval(config: Optional[dict[str, Any]]) -> bool:
|
|
295
|
+
return str((config or {}).get("approval_mode") or "").strip().lower() == "manual"
|
|
296
|
+
|
|
297
|
+
async def _start_manual_thread(self, config: Optional[dict[str, Any]]) -> Any:
|
|
298
|
+
"""Start a thread whose native approvals are reviewed by Studio users.
|
|
299
|
+
|
|
300
|
+
``openai-codex==0.147.0`` exposes ``ApprovalsReviewer.user`` on the
|
|
301
|
+
generated app-server contract but omits it from the public
|
|
302
|
+
``ApprovalMode`` enum. Use that pinned wire contract explicitly rather
|
|
303
|
+
than falling back to ``auto_review``.
|
|
304
|
+
"""
|
|
305
|
+
|
|
306
|
+
from openai_codex import AsyncThread # type: ignore[import-not-found]
|
|
307
|
+
from openai_codex._sandbox import _sandbox_mode # type: ignore[import-not-found]
|
|
308
|
+
from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
|
|
309
|
+
ApprovalsReviewer,
|
|
310
|
+
AskForApproval,
|
|
311
|
+
AskForApprovalValue,
|
|
312
|
+
ThreadStartParams,
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
kwargs = thread_kwargs(self._without_manual_approval(config))
|
|
316
|
+
kwargs.pop("approval_mode", None)
|
|
317
|
+
sandbox = kwargs.pop("sandbox", None)
|
|
318
|
+
await self._codex._ensure_initialized()
|
|
319
|
+
started = await self._codex._client.thread_start(
|
|
320
|
+
ThreadStartParams(
|
|
321
|
+
approval_policy=AskForApproval(root=AskForApprovalValue.on_request),
|
|
322
|
+
approvals_reviewer=ApprovalsReviewer.user,
|
|
323
|
+
sandbox=_sandbox_mode(sandbox),
|
|
324
|
+
**kwargs,
|
|
325
|
+
)
|
|
326
|
+
)
|
|
327
|
+
return AsyncThread(self._codex, started.thread.id)
|
|
328
|
+
|
|
329
|
+
async def _resume_manual_thread(
|
|
330
|
+
self,
|
|
331
|
+
thread_id: str,
|
|
332
|
+
config: Optional[dict[str, Any]],
|
|
333
|
+
) -> Any:
|
|
334
|
+
from openai_codex import AsyncThread # type: ignore[import-not-found]
|
|
335
|
+
from openai_codex._sandbox import _sandbox_mode # type: ignore[import-not-found]
|
|
336
|
+
from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
|
|
337
|
+
ApprovalsReviewer,
|
|
338
|
+
AskForApproval,
|
|
339
|
+
AskForApprovalValue,
|
|
340
|
+
ThreadResumeParams,
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
kwargs = thread_kwargs(self._without_manual_approval(config))
|
|
344
|
+
kwargs.pop("approval_mode", None)
|
|
345
|
+
kwargs.pop("ephemeral", None)
|
|
346
|
+
sandbox = kwargs.pop("sandbox", None)
|
|
347
|
+
await self._codex._ensure_initialized()
|
|
348
|
+
resumed = await self._codex._client.thread_resume(
|
|
349
|
+
thread_id,
|
|
350
|
+
ThreadResumeParams(
|
|
351
|
+
thread_id=thread_id,
|
|
352
|
+
approval_policy=AskForApproval(root=AskForApprovalValue.on_request),
|
|
353
|
+
approvals_reviewer=ApprovalsReviewer.user,
|
|
354
|
+
sandbox=_sandbox_mode(sandbox),
|
|
355
|
+
**kwargs,
|
|
356
|
+
),
|
|
357
|
+
)
|
|
358
|
+
return AsyncThread(self._codex, resumed.thread.id)
|
|
359
|
+
|
|
360
|
+
@staticmethod
|
|
361
|
+
def _without_manual_approval(
|
|
362
|
+
config: Optional[dict[str, Any]],
|
|
363
|
+
) -> dict[str, Any]:
|
|
364
|
+
result = dict(config or {})
|
|
365
|
+
result.pop("approval_mode", None)
|
|
366
|
+
return result
|
|
367
|
+
|
|
368
|
+
def run_turn(
|
|
369
|
+
self,
|
|
370
|
+
thread_id: str,
|
|
371
|
+
prompt: Any,
|
|
372
|
+
*,
|
|
373
|
+
config: Optional[dict[str, Any]] = None,
|
|
374
|
+
) -> AsyncIterator[dict[str, Any]]:
|
|
375
|
+
return self._run_turn_gen(thread_id, prompt, config)
|
|
376
|
+
|
|
377
|
+
def run_goal(
|
|
378
|
+
self,
|
|
379
|
+
thread_id: str,
|
|
380
|
+
objective: str,
|
|
381
|
+
*,
|
|
382
|
+
config: Optional[dict[str, Any]] = None,
|
|
383
|
+
) -> AsyncIterator[dict[str, Any]]:
|
|
384
|
+
return self._run_goal_gen(thread_id, objective, config)
|
|
385
|
+
|
|
386
|
+
async def _run_turn_gen(
|
|
387
|
+
self, thread_id: str, prompt: Any, config: Optional[dict[str, Any]]
|
|
388
|
+
) -> AsyncIterator[dict[str, Any]]:
|
|
389
|
+
thread = self._threads.get(thread_id)
|
|
390
|
+
if thread is None:
|
|
391
|
+
# 未显式 start/resume 的 thread_id:按 resume 语义接入真实后端。
|
|
392
|
+
await self.resume_thread(thread_id, config)
|
|
393
|
+
thread = self._threads[thread_id]
|
|
394
|
+
approval_queue: queue.Queue[Any] = queue.Queue()
|
|
395
|
+
with self._approval_lock:
|
|
396
|
+
self._approval_queues[thread_id] = approval_queue
|
|
397
|
+
self._thread_approval_configs[thread_id] = dict(config or {})
|
|
398
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
399
|
+
if bridge is not None and bridge.experts:
|
|
400
|
+
bridge.activate(thread_id, approval_queue)
|
|
401
|
+
try:
|
|
402
|
+
handle = await self._start_turn(thread, coerce_input(prompt), config)
|
|
403
|
+
except BaseException:
|
|
404
|
+
if bridge is not None:
|
|
405
|
+
bridge.deactivate(thread_id)
|
|
406
|
+
with self._approval_lock:
|
|
407
|
+
self._approval_queues.pop(thread_id, None)
|
|
408
|
+
raise
|
|
409
|
+
self._active_handles[thread_id] = handle
|
|
410
|
+
notifications = handle.stream()
|
|
411
|
+
notification_task: Any = None
|
|
412
|
+
approval_task: Any = None
|
|
413
|
+
try:
|
|
414
|
+
while True:
|
|
415
|
+
if notification_task is None:
|
|
416
|
+
notification_task = asyncio.create_task(notifications.__anext__())
|
|
417
|
+
if approval_task is None:
|
|
418
|
+
approval_task = asyncio.create_task(asyncio.to_thread(approval_queue.get))
|
|
419
|
+
done, _pending = await asyncio.wait(
|
|
420
|
+
{notification_task, approval_task},
|
|
421
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
422
|
+
)
|
|
423
|
+
if approval_task in done:
|
|
424
|
+
approval_event = approval_task.result()
|
|
425
|
+
approval_task = None
|
|
426
|
+
if approval_event is not None:
|
|
427
|
+
yield approval_event
|
|
428
|
+
if notification_task in done:
|
|
429
|
+
try:
|
|
430
|
+
notification = notification_task.result()
|
|
431
|
+
except StopAsyncIteration:
|
|
432
|
+
break
|
|
433
|
+
notification_task = None
|
|
434
|
+
event = self._notification_to_event_dict(notification)
|
|
435
|
+
if event is not None:
|
|
436
|
+
yield event
|
|
437
|
+
finally:
|
|
438
|
+
if bridge is not None:
|
|
439
|
+
bridge.deactivate(thread_id)
|
|
440
|
+
approval_queue.put(None)
|
|
441
|
+
for task in (notification_task, approval_task):
|
|
442
|
+
if task is not None and not task.done():
|
|
443
|
+
task.cancel()
|
|
444
|
+
await asyncio.gather(
|
|
445
|
+
*(task for task in (notification_task, approval_task) if task is not None),
|
|
446
|
+
return_exceptions=True,
|
|
447
|
+
)
|
|
448
|
+
self._active_handles.pop(thread_id, None)
|
|
449
|
+
with self._approval_lock:
|
|
450
|
+
self._approval_queues.pop(thread_id, None)
|
|
451
|
+
|
|
452
|
+
async def _run_goal_gen(
|
|
453
|
+
self,
|
|
454
|
+
thread_id: str,
|
|
455
|
+
objective: str,
|
|
456
|
+
config: Optional[dict[str, Any]],
|
|
457
|
+
) -> AsyncIterator[dict[str, Any]]:
|
|
458
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
459
|
+
if bridge is not None and bridge.experts:
|
|
460
|
+
raise ValueError("A2A_CODEX_EXPERT_GOAL_UNSUPPORTED")
|
|
461
|
+
if thread_id not in self._threads:
|
|
462
|
+
await self.resume_thread(thread_id, config)
|
|
463
|
+
from openai_codex._goal import _AsyncGoalNotificationStream
|
|
464
|
+
|
|
465
|
+
low_level = self._codex._client
|
|
466
|
+
approval_queue: queue.Queue[Any] = queue.Queue()
|
|
467
|
+
with self._approval_lock:
|
|
468
|
+
self._approval_queues[thread_id] = approval_queue
|
|
469
|
+
self._thread_approval_configs[thread_id] = dict(config or {})
|
|
470
|
+
state, _logical_turn_id = await low_level.start_goal_operation(thread_id, objective)
|
|
471
|
+
self._goal_states[thread_id] = state
|
|
472
|
+
notifications = _AsyncGoalNotificationStream(
|
|
473
|
+
state=state,
|
|
474
|
+
next_notification=lambda: low_level.next_goal_notification(state),
|
|
475
|
+
unregister=lambda: low_level.unregister_goal_operation(state),
|
|
476
|
+
cancel_goal=lambda: low_level.cancel_goal_operation(state),
|
|
477
|
+
)
|
|
478
|
+
notification_task: Any = None
|
|
479
|
+
approval_task: Any = None
|
|
480
|
+
try:
|
|
481
|
+
while True:
|
|
482
|
+
if notification_task is None:
|
|
483
|
+
notification_task = asyncio.create_task(notifications.__anext__())
|
|
484
|
+
if approval_task is None:
|
|
485
|
+
approval_task = asyncio.create_task(asyncio.to_thread(approval_queue.get))
|
|
486
|
+
done, _pending = await asyncio.wait(
|
|
487
|
+
{notification_task, approval_task},
|
|
488
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
489
|
+
)
|
|
490
|
+
if approval_task in done:
|
|
491
|
+
approval_event = approval_task.result()
|
|
492
|
+
approval_task = None
|
|
493
|
+
if approval_event is not None:
|
|
494
|
+
yield approval_event
|
|
495
|
+
if notification_task in done:
|
|
496
|
+
try:
|
|
497
|
+
notification = notification_task.result()
|
|
498
|
+
except StopAsyncIteration:
|
|
499
|
+
break
|
|
500
|
+
notification_task = None
|
|
501
|
+
event = self._notification_to_event_dict(notification)
|
|
502
|
+
if event is not None:
|
|
503
|
+
yield event
|
|
504
|
+
finally:
|
|
505
|
+
approval_queue.put(None)
|
|
506
|
+
for task in (notification_task, approval_task):
|
|
507
|
+
if task is not None and not task.done():
|
|
508
|
+
task.cancel()
|
|
509
|
+
await asyncio.gather(
|
|
510
|
+
*(task for task in (notification_task, approval_task) if task is not None),
|
|
511
|
+
return_exceptions=True,
|
|
512
|
+
)
|
|
513
|
+
await notifications.aclose()
|
|
514
|
+
self._goal_states.pop(thread_id, None)
|
|
515
|
+
with self._approval_lock:
|
|
516
|
+
self._approval_queues.pop(thread_id, None)
|
|
517
|
+
|
|
518
|
+
async def _start_turn(
|
|
519
|
+
self,
|
|
520
|
+
thread: Any,
|
|
521
|
+
prompt: Any,
|
|
522
|
+
config: Optional[dict[str, Any]],
|
|
523
|
+
) -> Any:
|
|
524
|
+
mode = str((config or {}).get("collaboration_mode") or "").strip().lower()
|
|
525
|
+
if not mode or mode == "default":
|
|
526
|
+
return await thread.turn(prompt, **turn_kwargs(config))
|
|
527
|
+
if mode != "plan":
|
|
528
|
+
raise ValueError("collaboration_mode must be default or plan")
|
|
529
|
+
|
|
530
|
+
# openai-codex 0.144.4 predates the public collaboration_mode argument,
|
|
531
|
+
# while the bundled app-server already accepts it. Keep this private
|
|
532
|
+
# compatibility seam small and covered by a wire-payload test.
|
|
533
|
+
from openai_codex import AsyncTurnHandle
|
|
534
|
+
from openai_codex._approval_mode import _approval_mode_override_settings
|
|
535
|
+
from openai_codex._inputs import _normalize_run_input, _to_wire_input
|
|
536
|
+
from openai_codex._sandbox import _sandbox_policy
|
|
537
|
+
from openai_codex.generated.v2_all import TurnStartParams
|
|
538
|
+
|
|
539
|
+
turn_config = turn_kwargs(config)
|
|
540
|
+
approval_mode = turn_config.pop("approval_mode", None)
|
|
541
|
+
sandbox = turn_config.pop("sandbox", None)
|
|
542
|
+
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
|
|
543
|
+
wire_input = _to_wire_input(_normalize_run_input(prompt))
|
|
544
|
+
params = TurnStartParams(
|
|
545
|
+
thread_id=thread.id,
|
|
546
|
+
input=wire_input,
|
|
547
|
+
approval_policy=approval_policy,
|
|
548
|
+
approvals_reviewer=approvals_reviewer,
|
|
549
|
+
sandbox_policy=_sandbox_policy(sandbox),
|
|
550
|
+
**turn_config,
|
|
551
|
+
).model_dump(mode="json", by_alias=True, exclude_none=True)
|
|
552
|
+
params["collaborationMode"] = {
|
|
553
|
+
"mode": "plan",
|
|
554
|
+
"settings": {
|
|
555
|
+
"model": str((config or {}).get("model") or ""),
|
|
556
|
+
"reasoning_effort": None,
|
|
557
|
+
"developer_instructions": None,
|
|
558
|
+
},
|
|
559
|
+
}
|
|
560
|
+
started = await self._codex._client.turn_start(thread.id, wire_input, params=params)
|
|
561
|
+
return AsyncTurnHandle(self._codex, thread.id, started.turn.id)
|
|
562
|
+
|
|
563
|
+
async def interrupt_active_turn(self, thread_id: str) -> bool:
|
|
564
|
+
handle = self._active_handles.get(thread_id)
|
|
565
|
+
if handle is None:
|
|
566
|
+
return False
|
|
567
|
+
# The SDK reader synchronously waits for dynamic tool responses.
|
|
568
|
+
# Release callbacks before waiting for the interrupt RPC response.
|
|
569
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
570
|
+
if bridge is not None:
|
|
571
|
+
bridge.deactivate(thread_id)
|
|
572
|
+
await handle.interrupt()
|
|
573
|
+
return True
|
|
574
|
+
|
|
575
|
+
async def pause_goal(self, thread_id: str) -> bool:
|
|
576
|
+
state = self._goal_states.get(thread_id)
|
|
577
|
+
if state is None:
|
|
578
|
+
return False
|
|
579
|
+
await self._codex._client.pause_goal(thread_id)
|
|
580
|
+
# Pausing the persisted goal only prevents its next continuation.
|
|
581
|
+
# The SDK cleanup also interrupts the active physical turn (including
|
|
582
|
+
# a racing continuation), while retaining the paused goal and thread.
|
|
583
|
+
# Without it the runtime drain deadline closes the model proxy, making
|
|
584
|
+
# the next resume reconnect to a dead local address.
|
|
585
|
+
await self._codex._client.cancel_goal_operation(state)
|
|
586
|
+
return True
|
|
587
|
+
|
|
588
|
+
async def cancel_goal(self, thread_id: str) -> bool:
|
|
589
|
+
state = self._goal_states.get(thread_id)
|
|
590
|
+
if state is None:
|
|
591
|
+
return False
|
|
592
|
+
await self._codex._client.cancel_goal_operation(state)
|
|
593
|
+
return True
|
|
594
|
+
|
|
595
|
+
async def resolve_approval(self, approval_id: str, decision: str) -> bool:
|
|
596
|
+
normalized = {
|
|
597
|
+
"approve": "accept",
|
|
598
|
+
"accept": "accept",
|
|
599
|
+
"approve_session": "acceptForSession",
|
|
600
|
+
"accept_for_session": "acceptForSession",
|
|
601
|
+
"deny": "decline",
|
|
602
|
+
"decline": "decline",
|
|
603
|
+
"cancel": "cancel",
|
|
604
|
+
}.get(str(decision).strip().lower())
|
|
605
|
+
if normalized is None:
|
|
606
|
+
raise ValueError("approval decision must be approve, approve_session, deny, or cancel")
|
|
607
|
+
with self._approval_lock:
|
|
608
|
+
pending = self._pending_approvals.get(approval_id)
|
|
609
|
+
if pending is None:
|
|
610
|
+
return False
|
|
611
|
+
pending.response = {"decision": normalized}
|
|
612
|
+
pending.resolved.set()
|
|
613
|
+
return True
|
|
614
|
+
|
|
615
|
+
async def resolve_interaction(
|
|
616
|
+
self,
|
|
617
|
+
interaction_id: str,
|
|
618
|
+
data: dict[str, Any],
|
|
619
|
+
) -> bool:
|
|
620
|
+
answers: dict[str, dict[str, list[str]]] = {}
|
|
621
|
+
for key, value in data.items():
|
|
622
|
+
if key in {"decision", "name", "action"} or value is None:
|
|
623
|
+
continue
|
|
624
|
+
raw_answers = value if isinstance(value, list) else [value]
|
|
625
|
+
normalized = [str(answer) for answer in raw_answers if str(answer)]
|
|
626
|
+
answers[str(key)] = {"answers": normalized}
|
|
627
|
+
with self._approval_lock:
|
|
628
|
+
pending = self._pending_interactions.get(interaction_id)
|
|
629
|
+
if pending is None:
|
|
630
|
+
return False
|
|
631
|
+
if pending.method == "mcpServer/elicitation/request":
|
|
632
|
+
action = data.get("action") or {
|
|
633
|
+
"cancel": "cancel",
|
|
634
|
+
"skip": "decline",
|
|
635
|
+
"reject": "decline",
|
|
636
|
+
"deny": "decline",
|
|
637
|
+
"decline": "decline",
|
|
638
|
+
}.get(str(data.get("decision") or ""), "accept")
|
|
639
|
+
if action not in {"accept", "decline", "cancel"}:
|
|
640
|
+
raise ValueError("MCP elicitation action must be accept, decline, or cancel")
|
|
641
|
+
pending.response = {"action": action}
|
|
642
|
+
if action == "accept":
|
|
643
|
+
pending.response["content"] = {
|
|
644
|
+
key: value
|
|
645
|
+
for key, value in data.items()
|
|
646
|
+
if key not in {"action", "decision"}
|
|
647
|
+
}
|
|
648
|
+
else:
|
|
649
|
+
pending.response = {"answers": answers}
|
|
650
|
+
pending.resolved.set()
|
|
651
|
+
return True
|
|
652
|
+
|
|
653
|
+
async def close(self) -> None:
|
|
654
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
655
|
+
if bridge is not None:
|
|
656
|
+
bridge.close()
|
|
657
|
+
approval_lock = getattr(self, "_approval_lock", None)
|
|
658
|
+
if approval_lock is None:
|
|
659
|
+
pending: list[_PendingApproval] = []
|
|
660
|
+
else:
|
|
661
|
+
with approval_lock:
|
|
662
|
+
pending = list(getattr(self, "_pending_approvals", {}).values())
|
|
663
|
+
for approval in pending:
|
|
664
|
+
approval.response = {"decision": "cancel"}
|
|
665
|
+
approval.resolved.set()
|
|
666
|
+
if approval_lock is None:
|
|
667
|
+
interactions: list[_PendingInteraction] = []
|
|
668
|
+
else:
|
|
669
|
+
with approval_lock:
|
|
670
|
+
interactions = list(getattr(self, "_pending_interactions", {}).values())
|
|
671
|
+
for interaction in interactions:
|
|
672
|
+
interaction.response = (
|
|
673
|
+
{"action": "cancel"}
|
|
674
|
+
if interaction.method == "mcpServer/elicitation/request"
|
|
675
|
+
else {"answers": {}}
|
|
676
|
+
)
|
|
677
|
+
interaction.resolved.set()
|
|
678
|
+
for thread_id, state in list(getattr(self, "_goal_states", {}).items()):
|
|
679
|
+
try:
|
|
680
|
+
await self._codex._client.cancel_goal_operation(state)
|
|
681
|
+
except Exception:
|
|
682
|
+
pass
|
|
683
|
+
finally:
|
|
684
|
+
self._goal_states.pop(thread_id, None)
|
|
685
|
+
try:
|
|
686
|
+
await self._codex.close()
|
|
687
|
+
finally:
|
|
688
|
+
self._active_handles.clear()
|
|
689
|
+
self._threads.clear()
|
|
690
|
+
if self._proxy is not None:
|
|
691
|
+
self._proxy.stop()
|
|
692
|
+
self._proxy = None
|
|
693
|
+
|
|
694
|
+
def configure_a2a_experts(self, specs):
|
|
695
|
+
from ksadk.codex.a2a_tools import CodexExpertBridge
|
|
696
|
+
if self._threads:
|
|
697
|
+
raise ValueError("A2A_CODEX_EXPERTS_ALREADY_REGISTERED")
|
|
698
|
+
bridge = CodexExpertBridge(specs)
|
|
699
|
+
if bridge.experts:
|
|
700
|
+
from ksadk.codex._expert_request_reader import install_expert_request_reader
|
|
701
|
+
install_expert_request_reader(self._codex._client._sync)
|
|
702
|
+
self._a2a_expert_bridge = bridge
|
|
703
|
+
|
|
704
|
+
|
|
705
|
+
def resolve_a2a_tool(self, call, response):
|
|
706
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
707
|
+
return bridge.resolve(call, response) if bridge is not None else False
|
|
708
|
+
|
|
709
|
+
|
|
710
|
+
async def capture_a2a_rollout(self, call):
|
|
711
|
+
"""Read and validate the real native record before an expert side effect."""
|
|
712
|
+
from pathlib import Path
|
|
713
|
+
|
|
714
|
+
from ksadk.a2a.codex import CodexToolCall
|
|
715
|
+
from ksadk.codex.rollout_checkpoint import capture_rollout
|
|
716
|
+
|
|
717
|
+
call = CodexToolCall.model_validate(call)
|
|
718
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
719
|
+
if not self._checkpoint_home or bridge is None or call.tool not in bridge.experts:
|
|
720
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_CONTEXT_REQUIRED")
|
|
721
|
+
thread = self._threads.get(call.thread_id)
|
|
722
|
+
if thread is None:
|
|
723
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_THREAD_UNKNOWN")
|
|
724
|
+
async with asyncio.timeout(5):
|
|
725
|
+
while True:
|
|
726
|
+
native = await thread.read(include_turns=True)
|
|
727
|
+
if native.thread.id != call.thread_id or not native.thread.path:
|
|
728
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_NATIVE_IDENTITY_INVALID")
|
|
729
|
+
try:
|
|
730
|
+
checkpoint = await asyncio.to_thread(
|
|
731
|
+
capture_rollout,
|
|
732
|
+
Path(self._checkpoint_home),
|
|
733
|
+
Path(native.thread.path),
|
|
734
|
+
thread_id=call.thread_id,
|
|
735
|
+
)
|
|
736
|
+
checkpoint.require_call(
|
|
737
|
+
turn_id=call.turn_id,
|
|
738
|
+
call_id=call.call_id,
|
|
739
|
+
tool=call.tool,
|
|
740
|
+
arguments=call.arguments,
|
|
741
|
+
)
|
|
742
|
+
return checkpoint
|
|
743
|
+
except ValueError as exc:
|
|
744
|
+
# The native writer may not have flushed the call yet.
|
|
745
|
+
# Identity conflicts, corruption and duplicates never retry.
|
|
746
|
+
if str(exc) != "CODEX_ROLLOUT_CALL_MISSING":
|
|
747
|
+
raise
|
|
748
|
+
await asyncio.sleep(0.05)
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
async def capture_completed_a2a_rollout(self, thread_id: str, turn_id: str):
|
|
752
|
+
"""Capture terminal history for a later turn, including turns without tools."""
|
|
753
|
+
from pathlib import Path
|
|
754
|
+
|
|
755
|
+
from ksadk.codex.rollout_checkpoint import capture_rollout
|
|
756
|
+
|
|
757
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
758
|
+
if not self._checkpoint_home or bridge is None or not bridge.experts:
|
|
759
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_CONTEXT_REQUIRED")
|
|
760
|
+
thread = self._threads.get(thread_id)
|
|
761
|
+
if thread is None:
|
|
762
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_THREAD_UNKNOWN")
|
|
763
|
+
async with asyncio.timeout(5):
|
|
764
|
+
while True:
|
|
765
|
+
native = await thread.read(include_turns=True)
|
|
766
|
+
if native.thread.id != thread_id or not native.thread.path:
|
|
767
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_NATIVE_IDENTITY_INVALID")
|
|
768
|
+
turns = native.thread.turns
|
|
769
|
+
if not turns or turns[-1].id != turn_id:
|
|
770
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_NATIVE_TURN_CONFLICT")
|
|
771
|
+
if turns[-1].status.value != "completed":
|
|
772
|
+
raise ValueError("A2A_CODEX_CHECKPOINT_NATIVE_TURN_NOT_COMPLETED")
|
|
773
|
+
checkpoint = await asyncio.to_thread(
|
|
774
|
+
capture_rollout, Path(self._checkpoint_home), Path(native.thread.path),
|
|
775
|
+
thread_id=thread_id,
|
|
776
|
+
)
|
|
777
|
+
try:
|
|
778
|
+
checkpoint.require_completed_turn(turn_id)
|
|
779
|
+
return checkpoint
|
|
780
|
+
except ValueError as exc:
|
|
781
|
+
if str(exc) != "CODEX_ROLLOUT_COMPLETION_MISSING":
|
|
782
|
+
raise
|
|
783
|
+
await asyncio.sleep(0.05)
|
|
784
|
+
|
|
785
|
+
async def ensure_managed_a2a_output(self, call, output: str):
|
|
786
|
+
"""Inject one verified expert output and return its flushed native record.
|
|
787
|
+
|
|
788
|
+
An RPC timeout is an uncertain write: never resend in this invocation.
|
|
789
|
+
A subsequent recovery must reread the actual native transcript first.
|
|
790
|
+
"""
|
|
791
|
+
from pydantic import BaseModel
|
|
792
|
+
|
|
793
|
+
from ksadk.a2a.codex import CodexToolCall
|
|
794
|
+
|
|
795
|
+
call = CodexToolCall.model_validate(call)
|
|
796
|
+
if not isinstance(output, str):
|
|
797
|
+
raise ValueError("A2A_CODEX_RECOVERY_OUTPUT_INVALID")
|
|
798
|
+
rollout = await self.capture_a2a_rollout(call)
|
|
799
|
+
existing = rollout.function_output(call.call_id)
|
|
800
|
+
if existing is not None:
|
|
801
|
+
if existing != output:
|
|
802
|
+
raise ValueError("A2A_CODEX_RECOVERY_OUTPUT_CONFLICT")
|
|
803
|
+
return rollout
|
|
804
|
+
|
|
805
|
+
class EmptyResponse(BaseModel):
|
|
806
|
+
pass
|
|
807
|
+
|
|
808
|
+
async with asyncio.timeout(10):
|
|
809
|
+
await self._codex._client.request(
|
|
810
|
+
"thread/inject_items",
|
|
811
|
+
{"threadId": call.thread_id, "items": [
|
|
812
|
+
{"type": "function_call_output", "call_id": call.call_id, "output": output},
|
|
813
|
+
]},
|
|
814
|
+
response_model=EmptyResponse,
|
|
815
|
+
)
|
|
816
|
+
while True:
|
|
817
|
+
rollout = await self.capture_a2a_rollout(call)
|
|
818
|
+
existing = rollout.function_output(call.call_id)
|
|
819
|
+
if existing is not None:
|
|
820
|
+
if existing != output:
|
|
821
|
+
raise ValueError("A2A_CODEX_RECOVERY_OUTPUT_CONFLICT")
|
|
822
|
+
return rollout
|
|
823
|
+
await asyncio.sleep(0.05)
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
async def restore_completed_a2a_thread(self, checkpoint):
|
|
827
|
+
"""Attach a Kernel-validated completed session without replaying its tools."""
|
|
828
|
+
from pathlib import Path
|
|
829
|
+
|
|
830
|
+
from ksadk.a2a.codex_session_checkpoint import CodexSessionCheckpoint
|
|
831
|
+
from ksadk.codex.rollout_checkpoint import restore_rollout
|
|
832
|
+
|
|
833
|
+
checkpoint = CodexSessionCheckpoint.model_validate(checkpoint.model_dump(by_alias=True))
|
|
834
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
835
|
+
if (not self._checkpoint_home or bridge is None
|
|
836
|
+
or checkpoint.bindings != {name: expert.spec for name, expert in bridge.experts.items()}):
|
|
837
|
+
raise ValueError("A2A_CODEX_SESSION_BINDING_CONFLICT")
|
|
838
|
+
# Kernel can consume the terminal event just before the native generator
|
|
839
|
+
# finishes its finally block. Wait for that owner to release the handle;
|
|
840
|
+
# never pop it or interrupt an execution to force a handoff.
|
|
841
|
+
try:
|
|
842
|
+
async with asyncio.timeout(5):
|
|
843
|
+
while checkpoint.thread_id in self._active_handles:
|
|
844
|
+
await asyncio.sleep(0.01)
|
|
845
|
+
except TimeoutError:
|
|
846
|
+
raise ValueError("A2A_CODEX_SESSION_THREAD_ALREADY_ATTACHED") from None
|
|
847
|
+
native = self._threads.get(checkpoint.thread_id)
|
|
848
|
+
if native is None:
|
|
849
|
+
# Exact-byte restore rejects a newer local turn; never trim or overwrite it.
|
|
850
|
+
await asyncio.to_thread(restore_rollout, Path(self._checkpoint_home), checkpoint.rollout)
|
|
851
|
+
config = dict(checkpoint.start_request.config)
|
|
852
|
+
if checkpoint.start_request.model:
|
|
853
|
+
config["model"] = checkpoint.start_request.model
|
|
854
|
+
async with asyncio.timeout(10):
|
|
855
|
+
if native is None:
|
|
856
|
+
if self._uses_manual_approval(config):
|
|
857
|
+
native = await self._resume_manual_thread(checkpoint.thread_id, config)
|
|
858
|
+
else:
|
|
859
|
+
kwargs = thread_kwargs(config)
|
|
860
|
+
kwargs.pop("ephemeral", None)
|
|
861
|
+
native = await self._codex.thread_resume(checkpoint.thread_id, **kwargs)
|
|
862
|
+
read = await native.read(include_turns=True)
|
|
863
|
+
if (native.id != checkpoint.thread_id or read.thread.id != checkpoint.thread_id
|
|
864
|
+
or not read.thread.turns or read.thread.turns[-1].id != checkpoint.turn_id
|
|
865
|
+
or read.thread.turns[-1].status.value != "completed"):
|
|
866
|
+
raise ValueError("A2A_CODEX_SESSION_NATIVE_TERMINAL_INVALID")
|
|
867
|
+
bridge.register_thread(native.id)
|
|
868
|
+
self._threads[native.id] = native
|
|
869
|
+
return str(native.id)
|
|
870
|
+
|
|
871
|
+
async def restore_managed_a2a_thread(self, recovery):
|
|
872
|
+
"""Restore a Kernel-validated expert checkpoint without starting a turn."""
|
|
873
|
+
from pathlib import Path
|
|
874
|
+
|
|
875
|
+
from ksadk.a2a.codex_recovery import CodexRecoveryCheckpoint
|
|
876
|
+
from ksadk.codex.rollout_checkpoint import restore_recovery_rollout
|
|
877
|
+
|
|
878
|
+
recovery = CodexRecoveryCheckpoint.model_validate(recovery.model_dump(by_alias=True))
|
|
879
|
+
if recovery.continuation_started:
|
|
880
|
+
raise ValueError("A2A_CODEX_RECOVERY_CONTINUATION_UNCERTAIN")
|
|
881
|
+
bridge = getattr(self, "_a2a_expert_bridge", None)
|
|
882
|
+
if (not self._checkpoint_home or bridge is None
|
|
883
|
+
or recovery.bindings != {name: expert.spec for name, expert in bridge.experts.items()}):
|
|
884
|
+
raise ValueError("A2A_CODEX_RECOVERY_BINDING_CONFLICT")
|
|
885
|
+
if recovery.thread_id in self._threads or recovery.thread_id in self._active_handles:
|
|
886
|
+
raise ValueError("A2A_CODEX_RECOVERY_THREAD_ALREADY_ATTACHED")
|
|
887
|
+
native_record = await asyncio.to_thread(
|
|
888
|
+
restore_recovery_rollout, Path(self._checkpoint_home), recovery.rollout,
|
|
889
|
+
call_ids=tuple(call.call_id for call in recovery.calls),
|
|
890
|
+
)
|
|
891
|
+
config = dict(recovery.start_request.config)
|
|
892
|
+
if recovery.start_request.model:
|
|
893
|
+
config['model'] = recovery.start_request.model
|
|
894
|
+
async with asyncio.timeout(10):
|
|
895
|
+
if self._uses_manual_approval(config):
|
|
896
|
+
native = await self._resume_manual_thread(recovery.thread_id, config)
|
|
897
|
+
else:
|
|
898
|
+
kwargs = thread_kwargs(config)
|
|
899
|
+
kwargs.pop('ephemeral', None)
|
|
900
|
+
native = await self._codex.thread_resume(recovery.thread_id, **kwargs)
|
|
901
|
+
read = await native.read(include_turns=True)
|
|
902
|
+
if native.id != recovery.thread_id or read.thread.id != recovery.thread_id:
|
|
903
|
+
raise ValueError("A2A_CODEX_RECOVERY_NATIVE_IDENTITY_INVALID")
|
|
904
|
+
turns = {turn.id: turn.status.value for turn in read.thread.turns}
|
|
905
|
+
for call in recovery.calls:
|
|
906
|
+
status = turns.get(call.turn_id)
|
|
907
|
+
output = native_record.function_output(call.call_id)
|
|
908
|
+
allowed = {"interrupted", "completed"} if output is not None else {"interrupted"}
|
|
909
|
+
if status not in allowed:
|
|
910
|
+
raise ValueError("A2A_CODEX_RECOVERY_NATIVE_TURN_NOT_INTERRUPTED")
|
|
911
|
+
bridge.register_thread(native.id)
|
|
912
|
+
self._threads[native.id] = native
|
|
913
|
+
return str(native.id)
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
async def _start_expert_thread(self, config):
|
|
917
|
+
# Verified against the installed 0.154.0 app-server experimental schema:
|
|
918
|
+
# its dynamicTools field is omitted from the public generated params.
|
|
919
|
+
from openai_codex import ApprovalMode, AsyncThread
|
|
920
|
+
from openai_codex._approval_mode import _approval_mode_settings
|
|
921
|
+
from openai_codex._sandbox import _sandbox_mode
|
|
922
|
+
from openai_codex.generated.v2_all import (
|
|
923
|
+
ApprovalsReviewer, AskForApproval, AskForApprovalValue, ThreadStartParams,
|
|
924
|
+
)
|
|
925
|
+
if not self._codex._client._sync.config.experimental_api:
|
|
926
|
+
raise ValueError("A2A_CODEX_EXPERIMENTAL_API_REQUIRED")
|
|
927
|
+
kwargs = thread_kwargs(self._without_manual_approval(config))
|
|
928
|
+
mode = kwargs.pop("approval_mode", ApprovalMode.auto_review)
|
|
929
|
+
sandbox = kwargs.pop("sandbox", None)
|
|
930
|
+
policy, reviewer = _approval_mode_settings(mode)
|
|
931
|
+
if self._uses_manual_approval(config):
|
|
932
|
+
policy, reviewer = AskForApproval(root=AskForApprovalValue.on_request), ApprovalsReviewer.user
|
|
933
|
+
payload = ThreadStartParams(approval_policy=policy, approvals_reviewer=reviewer,
|
|
934
|
+
sandbox=_sandbox_mode(sandbox), **kwargs).model_dump(mode="json", by_alias=True, exclude_none=True)
|
|
935
|
+
payload["dynamicTools"] = self._a2a_expert_bridge.declarations()
|
|
936
|
+
await self._codex._ensure_initialized()
|
|
937
|
+
started = await self._codex._client.thread_start(payload)
|
|
938
|
+
return AsyncThread(self._codex, started.thread.id)
|