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
ksadk/codex/client.py
CHANGED
|
@@ -18,24 +18,17 @@
|
|
|
18
18
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
|
-
import asyncio
|
|
22
21
|
import hashlib
|
|
23
22
|
import json
|
|
24
|
-
import os
|
|
25
|
-
import queue
|
|
26
23
|
import re
|
|
27
|
-
import secrets
|
|
28
24
|
import stat
|
|
29
25
|
import threading
|
|
30
26
|
from abc import ABC, abstractmethod
|
|
31
27
|
from collections.abc import Mapping
|
|
32
28
|
from dataclasses import dataclass, field
|
|
33
|
-
from importlib.metadata import PackageNotFoundError, version
|
|
34
29
|
from pathlib import Path
|
|
35
30
|
from typing import Any, AsyncIterator, Optional
|
|
36
|
-
from uuid import uuid4
|
|
37
31
|
|
|
38
|
-
from ksadk.model_proxy import ProxyConfig, ProxyServer
|
|
39
32
|
from ksadk.model_proxy.cache import CapabilityCache, credential_scope
|
|
40
33
|
from ksadk.model_proxy.detect import (
|
|
41
34
|
CODEX_DIRECT_REQUIRED_TOOL_TYPES,
|
|
@@ -457,1046 +450,6 @@ def _missing_codex_error() -> RuntimeError:
|
|
|
457
450
|
)
|
|
458
451
|
|
|
459
452
|
|
|
460
|
-
class AsyncCodexClient(CodexClient):
|
|
461
|
-
"""基于 OpenAI 官方 ``openai-codex`` SDK(``AsyncCodex``)的生产后端。
|
|
462
|
-
|
|
463
|
-
**lazy import** ``openai_codex``:仅在实际使用时导入,缺依赖时显式报错
|
|
464
|
-
(``pip install 'ksadk[codex]'``),不让所有 ksadk 用户默认背几十 MB CLI 二进制。
|
|
465
|
-
构造时校验真实 SDK 方法存在(``thread_start``/``thread_resume``/``close`` 及
|
|
466
|
-
``AsyncThread.turn`` / ``AsyncTurnHandle.stream``/``interrupt``),版本漂移 fail-fast。
|
|
467
|
-
"""
|
|
468
|
-
|
|
469
|
-
def __init__(self, config: Any = None, *, proxy_observer: Any = None) -> None:
|
|
470
|
-
try:
|
|
471
|
-
from openai_codex import ( # type: ignore[import-not-found]
|
|
472
|
-
AsyncCodex,
|
|
473
|
-
AsyncThread,
|
|
474
|
-
AsyncTurnHandle,
|
|
475
|
-
)
|
|
476
|
-
except ImportError as exc:
|
|
477
|
-
raise _missing_codex_error() from exc
|
|
478
|
-
|
|
479
|
-
try:
|
|
480
|
-
sdk_version = version("openai-codex")
|
|
481
|
-
except PackageNotFoundError:
|
|
482
|
-
sdk_version = "unknown"
|
|
483
|
-
required = (
|
|
484
|
-
(AsyncCodex, "thread_start"),
|
|
485
|
-
(AsyncCodex, "thread_resume"),
|
|
486
|
-
(AsyncCodex, "close"),
|
|
487
|
-
(AsyncThread, "turn"),
|
|
488
|
-
(AsyncTurnHandle, "stream"),
|
|
489
|
-
(AsyncTurnHandle, "interrupt"),
|
|
490
|
-
)
|
|
491
|
-
for owner, method_name in required:
|
|
492
|
-
if not hasattr(owner, method_name):
|
|
493
|
-
raise RuntimeError(
|
|
494
|
-
f"openai-codex {sdk_version} SDK 缺少 "
|
|
495
|
-
f"{owner.__name__}.{method_name}(版本不兼容)"
|
|
496
|
-
)
|
|
497
|
-
|
|
498
|
-
# AsyncCodex 0.147.0 only accepts one CodexConfig positional/keyword.
|
|
499
|
-
config, self._proxy = self._maybe_apply_proxy(
|
|
500
|
-
config,
|
|
501
|
-
proxy_observer=proxy_observer,
|
|
502
|
-
)
|
|
503
|
-
self._codex = AsyncCodex(config=config)
|
|
504
|
-
self.sdk_version = sdk_version
|
|
505
|
-
self._threads: dict[str, Any] = {} # thread_id -> AsyncThread
|
|
506
|
-
self._thread_approval_configs: dict[str, dict[str, Any]] = {}
|
|
507
|
-
self._active_handles: dict[str, Any] = {} # thread_id -> 活跃 AsyncTurnHandle
|
|
508
|
-
self._goal_states: dict[str, Any] = {}
|
|
509
|
-
self._approval_queues: dict[str, queue.Queue[Any]] = {}
|
|
510
|
-
self._pending_approvals: dict[str, _PendingApproval] = {}
|
|
511
|
-
self._pending_interactions: dict[str, _PendingInteraction] = {}
|
|
512
|
-
self._approval_lock = threading.Lock()
|
|
513
|
-
self._install_approval_bridge()
|
|
514
|
-
|
|
515
|
-
async def bootstrap_plugins(self, config: CodexPluginBootstrap) -> None:
|
|
516
|
-
"""Install a pinned local marketplace on this client's App Server.
|
|
517
|
-
|
|
518
|
-
This intentionally uses the ``AsyncCodex`` object's already-owned
|
|
519
|
-
low-level transport. Spawning a second bridge process would install
|
|
520
|
-
into a different host lifecycle and would not guarantee that the
|
|
521
|
-
thread started below observes the same plugin inventory.
|
|
522
|
-
"""
|
|
523
|
-
|
|
524
|
-
config.verify()
|
|
525
|
-
try:
|
|
526
|
-
from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
|
|
527
|
-
MarketplaceAddResponse,
|
|
528
|
-
PluginInstallResponse,
|
|
529
|
-
PluginListResponse,
|
|
530
|
-
)
|
|
531
|
-
except ImportError as exc: # pragma: no cover - guarded by __init__
|
|
532
|
-
raise _missing_codex_error() from exc
|
|
533
|
-
|
|
534
|
-
await self._codex._ensure_initialized()
|
|
535
|
-
transport = getattr(self._codex, "_client", None)
|
|
536
|
-
if transport is None or not callable(getattr(transport, "request", None)):
|
|
537
|
-
raise CodexPluginBootstrapError(
|
|
538
|
-
f"openai-codex {self.sdk_version} lacks the App Server request transport"
|
|
539
|
-
)
|
|
540
|
-
|
|
541
|
-
receipt = await transport.request(
|
|
542
|
-
"marketplace/add",
|
|
543
|
-
{
|
|
544
|
-
"source": str(config.root),
|
|
545
|
-
"refName": None,
|
|
546
|
-
"sparsePaths": None,
|
|
547
|
-
},
|
|
548
|
-
response_model=MarketplaceAddResponse,
|
|
549
|
-
)
|
|
550
|
-
if str(receipt.marketplace_name) != config.marketplace_name:
|
|
551
|
-
raise CodexPluginBootstrapError(
|
|
552
|
-
"Codex App Server added an unexpected marketplace: "
|
|
553
|
-
f"expected {config.marketplace_name!r}, got {receipt.marketplace_name!r}"
|
|
554
|
-
)
|
|
555
|
-
installed_root_value = getattr(receipt.installed_root, "root", receipt.installed_root)
|
|
556
|
-
try:
|
|
557
|
-
installed_root = Path(str(installed_root_value)).resolve(strict=True)
|
|
558
|
-
expected_root = config.root.resolve(strict=True)
|
|
559
|
-
except OSError as exc:
|
|
560
|
-
raise CodexPluginBootstrapError(
|
|
561
|
-
"Codex App Server marketplace receipt names an unavailable root"
|
|
562
|
-
) from exc
|
|
563
|
-
if installed_root != expected_root:
|
|
564
|
-
raise CodexPluginBootstrapError(
|
|
565
|
-
"Codex App Server marketplace receipt does not match the pinned root"
|
|
566
|
-
)
|
|
567
|
-
|
|
568
|
-
marketplace_manifest = str(config.manifest_path.resolve(strict=True))
|
|
569
|
-
for plugin_name in config.plugin_names:
|
|
570
|
-
await transport.request(
|
|
571
|
-
"plugin/install",
|
|
572
|
-
{
|
|
573
|
-
"pluginName": plugin_name,
|
|
574
|
-
"marketplacePath": marketplace_manifest,
|
|
575
|
-
"remoteMarketplaceName": None,
|
|
576
|
-
},
|
|
577
|
-
response_model=PluginInstallResponse,
|
|
578
|
-
)
|
|
579
|
-
|
|
580
|
-
inventory = await transport.request(
|
|
581
|
-
"plugin/list",
|
|
582
|
-
{"forceRefetch": True, "cwds": None, "marketplaceKinds": None},
|
|
583
|
-
response_model=PluginListResponse,
|
|
584
|
-
)
|
|
585
|
-
marketplaces = [
|
|
586
|
-
marketplace
|
|
587
|
-
for marketplace in inventory.marketplaces
|
|
588
|
-
if str(marketplace.name) == config.marketplace_name
|
|
589
|
-
]
|
|
590
|
-
if len(marketplaces) != 1:
|
|
591
|
-
raise CodexPluginBootstrapError(
|
|
592
|
-
"Codex App Server did not report exactly one pinned marketplace"
|
|
593
|
-
)
|
|
594
|
-
marketplace = marketplaces[0]
|
|
595
|
-
reported_path_value = getattr(marketplace.path, "root", marketplace.path)
|
|
596
|
-
if reported_path_value is None:
|
|
597
|
-
raise CodexPluginBootstrapError(
|
|
598
|
-
"Codex App Server reported the pinned marketplace as remote"
|
|
599
|
-
)
|
|
600
|
-
try:
|
|
601
|
-
reported_path = Path(str(reported_path_value)).resolve(strict=True)
|
|
602
|
-
except OSError as exc:
|
|
603
|
-
raise CodexPluginBootstrapError(
|
|
604
|
-
"Codex App Server reported an unavailable marketplace manifest"
|
|
605
|
-
) from exc
|
|
606
|
-
if reported_path != Path(marketplace_manifest):
|
|
607
|
-
raise CodexPluginBootstrapError(
|
|
608
|
-
"Codex App Server inventory does not match the pinned marketplace path"
|
|
609
|
-
)
|
|
610
|
-
for plugin_name in config.plugin_names:
|
|
611
|
-
matches = [plugin for plugin in marketplace.plugins if plugin.name == plugin_name]
|
|
612
|
-
if len(matches) != 1 or not matches[0].installed or not matches[0].enabled:
|
|
613
|
-
raise CodexPluginBootstrapError(
|
|
614
|
-
"Codex App Server did not reconcile pinned plugin as installed and enabled: "
|
|
615
|
-
+ plugin_name
|
|
616
|
-
)
|
|
617
|
-
|
|
618
|
-
def _install_approval_bridge(self) -> None:
|
|
619
|
-
"""Replace the SDK's unconditional accept handler with a HITL bridge.
|
|
620
|
-
|
|
621
|
-
``openai-codex==0.147.0`` exposes approval callbacks only on its sync
|
|
622
|
-
JSON-RPC client. The public ``AsyncCodex`` wrapper owns that client, so
|
|
623
|
-
this pinned compatibility seam is validated eagerly instead of silently
|
|
624
|
-
auto-accepting tool and file changes.
|
|
625
|
-
"""
|
|
626
|
-
|
|
627
|
-
async_client = getattr(self._codex, "_client", None)
|
|
628
|
-
sync_client = getattr(async_client, "_sync", None)
|
|
629
|
-
if sync_client is None or not hasattr(sync_client, "_approval_handler"):
|
|
630
|
-
raise RuntimeError(
|
|
631
|
-
f"openai-codex {self.sdk_version} 不支持交互式审批桥接(内部 API 不兼容)"
|
|
632
|
-
)
|
|
633
|
-
sync_client._approval_handler = self._handle_server_request
|
|
634
|
-
|
|
635
|
-
def _active_request_queue(self, raw: dict[str, Any]) -> tuple[str, queue.Queue[Any] | None]:
|
|
636
|
-
thread_id = str(raw.get("threadId") or raw.get("thread_id") or "")
|
|
637
|
-
if not thread_id:
|
|
638
|
-
with self._approval_lock:
|
|
639
|
-
candidates = list(self._approval_queues)
|
|
640
|
-
if len(candidates) == 1:
|
|
641
|
-
thread_id = candidates[0]
|
|
642
|
-
with self._approval_lock:
|
|
643
|
-
return thread_id, self._approval_queues.get(thread_id)
|
|
644
|
-
|
|
645
|
-
def _handle_server_request(
|
|
646
|
-
self,
|
|
647
|
-
method: str,
|
|
648
|
-
params: dict[str, Any] | None,
|
|
649
|
-
) -> dict[str, Any]:
|
|
650
|
-
if method in {
|
|
651
|
-
"item/commandExecution/requestApproval",
|
|
652
|
-
"item/fileChange/requestApproval",
|
|
653
|
-
}:
|
|
654
|
-
return self._handle_approval_request(method, params)
|
|
655
|
-
if method in {"item/tool/requestUserInput", "mcpServer/elicitation/request"}:
|
|
656
|
-
return self._handle_user_input_request(method, params)
|
|
657
|
-
return {}
|
|
658
|
-
|
|
659
|
-
def _handle_approval_request(
|
|
660
|
-
self,
|
|
661
|
-
method: str,
|
|
662
|
-
params: dict[str, Any] | None,
|
|
663
|
-
) -> dict[str, Any]:
|
|
664
|
-
raw = dict(params or {})
|
|
665
|
-
if method not in {
|
|
666
|
-
"item/commandExecution/requestApproval",
|
|
667
|
-
"item/fileChange/requestApproval",
|
|
668
|
-
}:
|
|
669
|
-
return {}
|
|
670
|
-
thread_id, approval_queue = self._active_request_queue(raw)
|
|
671
|
-
approval_id = str(
|
|
672
|
-
raw.get("itemId") or raw.get("item_id") or raw.get("id") or f"approval_{uuid4().hex}"
|
|
673
|
-
)
|
|
674
|
-
pending = _PendingApproval(
|
|
675
|
-
approval_id=approval_id,
|
|
676
|
-
thread_id=thread_id,
|
|
677
|
-
method=method,
|
|
678
|
-
params=raw,
|
|
679
|
-
)
|
|
680
|
-
with self._approval_lock:
|
|
681
|
-
if approval_queue is None:
|
|
682
|
-
# Fail closed when a request cannot be associated with an
|
|
683
|
-
# active run; never fall back to the SDK's auto-accept default.
|
|
684
|
-
return {"decision": "decline"}
|
|
685
|
-
self._pending_approvals[approval_id] = pending
|
|
686
|
-
# 下发原生 JSON-RPC requestApproval 消息(synthetic id=approval_id):
|
|
687
|
-
# canonical mapper 只认原生方法(unsupported_method fail-closed),
|
|
688
|
-
# 旧合成 ``item/approval/requested`` 事件会让整个 run 失败。
|
|
689
|
-
approval_queue.put(
|
|
690
|
-
{
|
|
691
|
-
"id": approval_id,
|
|
692
|
-
"method": method,
|
|
693
|
-
"params": raw,
|
|
694
|
-
}
|
|
695
|
-
)
|
|
696
|
-
pending.resolved.wait()
|
|
697
|
-
with self._approval_lock:
|
|
698
|
-
self._pending_approvals.pop(approval_id, None)
|
|
699
|
-
# 回包也以 JSON-RPC response 形态下发,mapper 才会产出
|
|
700
|
-
# InteractionResolved(原 call_id 闭环)并释放 continuation。
|
|
701
|
-
response = pending.response or {"decision": "decline"}
|
|
702
|
-
if approval_queue is not None:
|
|
703
|
-
approval_queue.put(
|
|
704
|
-
{
|
|
705
|
-
"id": approval_id,
|
|
706
|
-
"result": dict(response),
|
|
707
|
-
}
|
|
708
|
-
)
|
|
709
|
-
return pending.response or {"decision": "decline"}
|
|
710
|
-
|
|
711
|
-
def _handle_user_input_request(
|
|
712
|
-
self,
|
|
713
|
-
method: str,
|
|
714
|
-
params: dict[str, Any] | None,
|
|
715
|
-
) -> dict[str, Any]:
|
|
716
|
-
raw = dict(params or {})
|
|
717
|
-
thread_id, request_queue = self._active_request_queue(raw)
|
|
718
|
-
policy = getattr(self, "_thread_approval_configs", {}).get(thread_id, {})
|
|
719
|
-
metadata = raw.get("_meta") or {}
|
|
720
|
-
# Full access authorizes tool execution, never OAuth login or arbitrary
|
|
721
|
-
# server forms. Only Codex's native, empty tool-approval form qualifies.
|
|
722
|
-
schema = raw.get("requestedSchema") or {}
|
|
723
|
-
if (
|
|
724
|
-
method == "mcpServer/elicitation/request"
|
|
725
|
-
and request_queue is not None
|
|
726
|
-
and isinstance(metadata, dict)
|
|
727
|
-
and metadata.get("codex_approval_kind") == "mcp_tool_call"
|
|
728
|
-
and raw.get("mode") == "form"
|
|
729
|
-
and schema == {"type": "object", "properties": {}}
|
|
730
|
-
and policy.get("sandbox") == "full-access"
|
|
731
|
-
and policy.get("approval_mode") == "deny_all"
|
|
732
|
-
):
|
|
733
|
-
return {"action": "accept", "content": {}}
|
|
734
|
-
interaction_id = str(
|
|
735
|
-
raw.get("itemId")
|
|
736
|
-
or raw.get("item_id")
|
|
737
|
-
or raw.get("requestId")
|
|
738
|
-
or raw.get("request_id")
|
|
739
|
-
or raw.get("id")
|
|
740
|
-
or f"input_{uuid4().hex}"
|
|
741
|
-
)
|
|
742
|
-
pending = _PendingInteraction(
|
|
743
|
-
interaction_id=interaction_id,
|
|
744
|
-
thread_id=thread_id,
|
|
745
|
-
method=method,
|
|
746
|
-
params=raw,
|
|
747
|
-
)
|
|
748
|
-
default_response = (
|
|
749
|
-
{"action": "cancel"} if method == "mcpServer/elicitation/request" else {"answers": {}}
|
|
750
|
-
)
|
|
751
|
-
if request_queue is None:
|
|
752
|
-
return default_response
|
|
753
|
-
|
|
754
|
-
# Preserve the native question contract (including multiple choice and
|
|
755
|
-
# custom answers) for the canonical interaction mapper. Legacy A2UI
|
|
756
|
-
# forms cannot provide the native continuation/response correlation.
|
|
757
|
-
with self._approval_lock:
|
|
758
|
-
self._pending_interactions[interaction_id] = pending
|
|
759
|
-
request_queue.put({"id": interaction_id, "method": method, "params": raw})
|
|
760
|
-
pending.resolved.wait()
|
|
761
|
-
with self._approval_lock:
|
|
762
|
-
self._pending_interactions.pop(interaction_id, None)
|
|
763
|
-
response = pending.response or default_response
|
|
764
|
-
request_queue.put({"id": interaction_id, "result": dict(response)})
|
|
765
|
-
return response
|
|
766
|
-
|
|
767
|
-
@staticmethod
|
|
768
|
-
def _maybe_apply_proxy(
|
|
769
|
-
config: Any,
|
|
770
|
-
*,
|
|
771
|
-
proxy_observer: Any = None,
|
|
772
|
-
) -> tuple[Any, Any]:
|
|
773
|
-
"""codex 代理启用:**智能探测 fallback(带显式覆盖)**。
|
|
774
|
-
|
|
775
|
-
- ``KSADK_CODEX_USE_PROXY=1`` → 强制开代理;``=0`` → 强制直连(可人工覆盖误判)。
|
|
776
|
-
- **未设 env 时智能探测**:OpenAI 官方 base_url 直连(不探测);自定义上游
|
|
777
|
-
(星流等)探测 responses 能力(detect.py + CapabilityCache 缓存,一次探测长缓存):
|
|
778
|
-
- namespace/custom 支持 → 原生 Responses 直连
|
|
779
|
-
- 仅 web_search 缺失 → 仍直连,并关闭该可选能力
|
|
780
|
-
- namespace/custom 缺失或无法确认 → 自动启用代理
|
|
781
|
-
- 凭证闭合:codex 子进程只拿随机 KSADK_PROXY_TOKEN;上游 key 留父进程。
|
|
782
|
-
- 互斥:launch_args_override 已设时 raise(override 整体覆盖命令行)。
|
|
783
|
-
- P1:直连分支(协议必需工具面确认、env=0)遇到自定义 base 也注入
|
|
784
|
-
``ksadk_direct`` provider——否则 codex 子进程回落默认 OpenAI 官方
|
|
785
|
-
端点,自定义上游(OPENAI_API_BASE)静默失效。已显式设
|
|
786
|
-
``model_provider=`` 的 config 不覆盖;官方 base 不注入。
|
|
787
|
-
|
|
788
|
-
返回 (新 config, ProxyServer | None)。staticmethod 便于单测。
|
|
789
|
-
"""
|
|
790
|
-
runtime_env = {**os.environ, **(getattr(config, "env", None) or {})}
|
|
791
|
-
env_val = runtime_env.get("KSADK_CODEX_USE_PROXY")
|
|
792
|
-
if env_val in {"0", "direct"}:
|
|
793
|
-
return AsyncCodexClient._inject_direct_provider(config), None
|
|
794
|
-
if env_val in {"1", "forced"}:
|
|
795
|
-
return AsyncCodexClient._start_proxy_and_inject(
|
|
796
|
-
config,
|
|
797
|
-
proxy_observer=proxy_observer,
|
|
798
|
-
)
|
|
799
|
-
# 未设:智能探测
|
|
800
|
-
base = (
|
|
801
|
-
runtime_env.get("KSADK_PROXY_UPSTREAM_BASE")
|
|
802
|
-
or runtime_env.get("OPENAI_BASE_URL")
|
|
803
|
-
or runtime_env.get("OPENAI_API_BASE")
|
|
804
|
-
or ""
|
|
805
|
-
)
|
|
806
|
-
if not base or _is_openai_official(base):
|
|
807
|
-
return config, None # OpenAI 官方:直连,不探测
|
|
808
|
-
model = runtime_env.get("OPENAI_MODEL_NAME") or runtime_env.get("MODEL_NAME") or ""
|
|
809
|
-
key = runtime_env.get("KSADK_PROXY_UPSTREAM_KEY") or runtime_env.get("OPENAI_API_KEY") or ""
|
|
810
|
-
# Probe the exact URL scheme that Codex/proxy will use. Managed
|
|
811
|
-
# runtimes discover KSPMAS through its historical ``http://`` internal
|
|
812
|
-
# URL, while the provider is upgraded to HTTPS before execution. A
|
|
813
|
-
# probe against HTTP can see only a redirect and incorrectly classify
|
|
814
|
-
# an HTTPS ``/responses`` 404 as unknown, causing a broken direct path.
|
|
815
|
-
probe_base = _upgrade_http_to_https(base)
|
|
816
|
-
route = _probe_capability_route(model, probe_base, key)
|
|
817
|
-
# Future required-tool declarations must be checked here before either
|
|
818
|
-
# proxying or suppressing optional tools.
|
|
819
|
-
if isinstance(route, bool): # compatibility for injected test doubles
|
|
820
|
-
route = _CapabilityRoute(use_proxy=route)
|
|
821
|
-
route.require_available()
|
|
822
|
-
if route.use_proxy:
|
|
823
|
-
return AsyncCodexClient._start_proxy_and_inject(
|
|
824
|
-
config,
|
|
825
|
-
proxy_observer=proxy_observer,
|
|
826
|
-
)
|
|
827
|
-
# 探测确认协议必需工具面:直连,但必须把自定义 base 配成 provider。
|
|
828
|
-
return (
|
|
829
|
-
AsyncCodexClient._inject_direct_provider(
|
|
830
|
-
config,
|
|
831
|
-
disabled_tool_types=route.disabled_tool_types,
|
|
832
|
-
),
|
|
833
|
-
None,
|
|
834
|
-
)
|
|
835
|
-
|
|
836
|
-
@staticmethod
|
|
837
|
-
def _inject_direct_provider(
|
|
838
|
-
config: Any,
|
|
839
|
-
*,
|
|
840
|
-
disabled_tool_types: frozenset[str] = frozenset(),
|
|
841
|
-
) -> Any:
|
|
842
|
-
"""直连模式注入 ``ksadk_direct`` provider(P1:非 proxy 不丢自定义 base)。
|
|
843
|
-
|
|
844
|
-
- 无自定义 base / 官方 OpenAI base → 原样返回。
|
|
845
|
-
- 已设 ``model_provider=`` → 保留 provider,仅追加必要的可选工具关闭项。
|
|
846
|
-
- 否则追加 ``model_provider=ksadk_direct`` + base_url/env_key/wire_api
|
|
847
|
-
(responses;该分支只在探测确认或显式强制直连时到达,其余走 proxy)。
|
|
848
|
-
"""
|
|
849
|
-
import dataclasses
|
|
850
|
-
|
|
851
|
-
from openai_codex import CodexConfig # type: ignore[import-not-found]
|
|
852
|
-
|
|
853
|
-
cfg = config if isinstance(config, CodexConfig) else CodexConfig()
|
|
854
|
-
overrides = list(cfg.config_overrides or ())
|
|
855
|
-
if any(str(o).startswith("model_provider=") for o in overrides):
|
|
856
|
-
if "web_search" in disabled_tool_types and "web_search=disabled" not in overrides:
|
|
857
|
-
return dataclasses.replace(
|
|
858
|
-
cfg,
|
|
859
|
-
config_overrides=tuple([*overrides, "web_search=disabled"]),
|
|
860
|
-
)
|
|
861
|
-
return config
|
|
862
|
-
runtime_env = {**os.environ, **(cfg.env or {})}
|
|
863
|
-
base = (
|
|
864
|
-
runtime_env.get("KSADK_PROXY_UPSTREAM_BASE")
|
|
865
|
-
or runtime_env.get("OPENAI_BASE_URL")
|
|
866
|
-
or runtime_env.get("OPENAI_API_BASE")
|
|
867
|
-
or ""
|
|
868
|
-
)
|
|
869
|
-
if not base or _is_openai_official(base):
|
|
870
|
-
return config
|
|
871
|
-
base = _upgrade_http_to_https(base)
|
|
872
|
-
overrides += [
|
|
873
|
-
"model_provider=ksadk_direct",
|
|
874
|
-
"model_providers.ksadk_direct.name=ksadk_direct",
|
|
875
|
-
f"model_providers.ksadk_direct.base_url={base}",
|
|
876
|
-
"model_providers.ksadk_direct.env_key=OPENAI_API_KEY",
|
|
877
|
-
"model_providers.ksadk_direct.wire_api=responses",
|
|
878
|
-
"model_providers.ksadk_direct.supports_websockets=false",
|
|
879
|
-
]
|
|
880
|
-
if "web_search" in disabled_tool_types and "web_search=disabled" not in overrides:
|
|
881
|
-
overrides.append("web_search=disabled")
|
|
882
|
-
return dataclasses.replace(cfg, config_overrides=tuple(overrides))
|
|
883
|
-
|
|
884
|
-
@staticmethod
|
|
885
|
-
def _start_proxy_and_inject(
|
|
886
|
-
config: Any,
|
|
887
|
-
*,
|
|
888
|
-
proxy_observer: Any = None,
|
|
889
|
-
) -> tuple[Any, Any]:
|
|
890
|
-
"""起进程内 ProxyServer + 注入 codex provider(opt-in/探测判定走代理时)。"""
|
|
891
|
-
import dataclasses
|
|
892
|
-
|
|
893
|
-
from openai_codex import CodexConfig # type: ignore[import-not-found]
|
|
894
|
-
|
|
895
|
-
cfg = config if isinstance(config, CodexConfig) else CodexConfig()
|
|
896
|
-
if cfg.launch_args_override is not None:
|
|
897
|
-
raise RuntimeError(
|
|
898
|
-
"KSADK_CODEX_USE_PROXY 与 CodexConfig.launch_args_override 互斥:"
|
|
899
|
-
"代理注入靠 config_overrides,而 launch_args_override 会整体覆盖命令行"
|
|
900
|
-
)
|
|
901
|
-
runtime_env = {**os.environ, **(cfg.env or {})}
|
|
902
|
-
upstream = (
|
|
903
|
-
runtime_env.get("KSADK_PROXY_UPSTREAM_BASE")
|
|
904
|
-
or runtime_env.get("OPENAI_BASE_URL")
|
|
905
|
-
or runtime_env.get("OPENAI_API_BASE")
|
|
906
|
-
or "https://kspmas.ksyun.com/v1"
|
|
907
|
-
)
|
|
908
|
-
upstream = _upgrade_http_to_https(upstream)
|
|
909
|
-
api_key = (
|
|
910
|
-
runtime_env.get("KSADK_PROXY_UPSTREAM_KEY") or runtime_env.get("OPENAI_API_KEY") or ""
|
|
911
|
-
)
|
|
912
|
-
token = secrets.token_hex(16)
|
|
913
|
-
proxy = ProxyServer(
|
|
914
|
-
ProxyConfig(
|
|
915
|
-
upstream_base=upstream,
|
|
916
|
-
api_key=api_key,
|
|
917
|
-
local_token=token,
|
|
918
|
-
upstream_model=runtime_env.get("OPENAI_MODEL_NAME")
|
|
919
|
-
or runtime_env.get("MODEL_NAME")
|
|
920
|
-
or "",
|
|
921
|
-
event_callback=proxy_observer,
|
|
922
|
-
)
|
|
923
|
-
)
|
|
924
|
-
proxy.start()
|
|
925
|
-
overrides = list(cfg.config_overrides or ())
|
|
926
|
-
# 默认模型必须注入:codex 未配置 model= 时会发自家默认名(如 gpt-5.6-terra),
|
|
927
|
-
# 上游(kspmas)按未知模型 403。注入后 thread 级 model 覆盖仍优先生效
|
|
928
|
-
# (实测 codex thread model > config model=),RunAgent 的 Model 透传靠它。
|
|
929
|
-
default_model = (
|
|
930
|
-
runtime_env.get("OPENAI_MODEL_NAME") or runtime_env.get("MODEL_NAME") or ""
|
|
931
|
-
).strip()
|
|
932
|
-
if default_model and not any(str(o).startswith("model=") for o in overrides):
|
|
933
|
-
overrides.append(f"model={default_model}")
|
|
934
|
-
overrides += [
|
|
935
|
-
"model_provider=ksadk_proxy",
|
|
936
|
-
"model_providers.ksadk_proxy.name=ksadk_proxy",
|
|
937
|
-
f"model_providers.ksadk_proxy.base_url={proxy.base_url}",
|
|
938
|
-
"model_providers.ksadk_proxy.env_key=KSADK_PROXY_TOKEN",
|
|
939
|
-
"model_providers.ksadk_proxy.wire_api=responses",
|
|
940
|
-
"model_providers.ksadk_proxy.supports_websockets=false",
|
|
941
|
-
"web_search=disabled",
|
|
942
|
-
"features.multi_agent=false",
|
|
943
|
-
"features.multi_agent_v2=false",
|
|
944
|
-
]
|
|
945
|
-
# The local proxy owns the upstream credential. The Codex child only
|
|
946
|
-
# receives a random loopback token, so prompt-driven commands cannot
|
|
947
|
-
# read the real provider key from their environment.
|
|
948
|
-
env = dict(runtime_env)
|
|
949
|
-
for secret_name in (
|
|
950
|
-
"OPENAI_API_KEY",
|
|
951
|
-
"AGENTKIT_MODEL_API_KEY",
|
|
952
|
-
"KSADK_PROXY_UPSTREAM_KEY",
|
|
953
|
-
):
|
|
954
|
-
env.pop(secret_name, None)
|
|
955
|
-
env["KSADK_PROXY_TOKEN"] = token
|
|
956
|
-
return dataclasses.replace(cfg, config_overrides=tuple(overrides), env=env), proxy
|
|
957
|
-
|
|
958
|
-
async def start_thread(self, config: Optional[dict[str, Any]] = None) -> str:
|
|
959
|
-
if self._uses_manual_approval(config):
|
|
960
|
-
thread = await self._start_manual_thread(config)
|
|
961
|
-
else:
|
|
962
|
-
thread = await self._codex.thread_start(**self._thread_kwargs(config))
|
|
963
|
-
self._threads[thread.id] = thread
|
|
964
|
-
return str(thread.id)
|
|
965
|
-
|
|
966
|
-
async def compact_thread(self, thread_id: str) -> dict[str, Any]:
|
|
967
|
-
"""Wait for native compaction completion, not just request admission.
|
|
968
|
-
|
|
969
|
-
The caller owns an idle, dedicated client and closes it on timeout.
|
|
970
|
-
No model prompt or shell command is used to emulate compaction.
|
|
971
|
-
"""
|
|
972
|
-
thread = self._threads[thread_id]
|
|
973
|
-
low_level = self._codex._client
|
|
974
|
-
turn_id = None
|
|
975
|
-
compacted = False
|
|
976
|
-
usage: dict[str, Any] = {}
|
|
977
|
-
try:
|
|
978
|
-
async with asyncio.timeout(120):
|
|
979
|
-
before = await thread.read(include_turns=True)
|
|
980
|
-
previous_ids = {turn.id for turn in before.thread.turns}
|
|
981
|
-
await thread.compact()
|
|
982
|
-
# compact/start returns no turn id. The SDK buffers scoped
|
|
983
|
-
# notifications until their turn is registered; global reads
|
|
984
|
-
# deliberately exclude them. Discover the new turn first.
|
|
985
|
-
while turn_id is None:
|
|
986
|
-
current = await thread.read(include_turns=True)
|
|
987
|
-
new_turns = [
|
|
988
|
-
turn for turn in current.thread.turns if turn.id not in previous_ids
|
|
989
|
-
]
|
|
990
|
-
if new_turns:
|
|
991
|
-
turn_id = new_turns[-1].id
|
|
992
|
-
low_level.register_turn_notifications(turn_id)
|
|
993
|
-
break
|
|
994
|
-
await asyncio.sleep(0.25)
|
|
995
|
-
while True:
|
|
996
|
-
notification = await low_level.next_turn_notification(turn_id)
|
|
997
|
-
event = self._notification_to_event_dict(notification) or {}
|
|
998
|
-
params = event.get("params") or {}
|
|
999
|
-
if params.get("threadId") != thread_id:
|
|
1000
|
-
continue
|
|
1001
|
-
method = event.get("method")
|
|
1002
|
-
if method == "item/completed":
|
|
1003
|
-
compacted |= (params.get("item") or {}).get("type") == "contextCompaction"
|
|
1004
|
-
elif method == "thread/tokenUsage/updated":
|
|
1005
|
-
usage = dict(params.get("tokenUsage") or {})
|
|
1006
|
-
elif method == "turn/completed":
|
|
1007
|
-
turn = params["turn"]
|
|
1008
|
-
if turn.get("status") != "completed" or not compacted:
|
|
1009
|
-
raise RuntimeError("Codex context compaction did not complete")
|
|
1010
|
-
return usage
|
|
1011
|
-
finally:
|
|
1012
|
-
if turn_id is not None:
|
|
1013
|
-
low_level.unregister_turn_notifications(turn_id)
|
|
1014
|
-
|
|
1015
|
-
async def resume_thread(self, thread_id: str, config: Optional[dict[str, Any]] = None) -> str:
|
|
1016
|
-
# An ephemeral thread has no rollout on disk, so SDK thread_resume would
|
|
1017
|
-
# fail with -32600. Reuse its live AsyncThread for same-process resume.
|
|
1018
|
-
cached = self._threads.get(thread_id)
|
|
1019
|
-
if cached is not None:
|
|
1020
|
-
return str(cached.id)
|
|
1021
|
-
if self._uses_manual_approval(config):
|
|
1022
|
-
thread = await self._resume_manual_thread(thread_id, config)
|
|
1023
|
-
else:
|
|
1024
|
-
kwargs = self._thread_kwargs(config)
|
|
1025
|
-
# AsyncCodex.thread_resume 0.144.4 has no ephemeral parameter.
|
|
1026
|
-
kwargs.pop("ephemeral", None)
|
|
1027
|
-
thread = await self._codex.thread_resume(thread_id, **kwargs)
|
|
1028
|
-
self._threads[thread.id] = thread
|
|
1029
|
-
return str(thread.id)
|
|
1030
|
-
|
|
1031
|
-
@staticmethod
|
|
1032
|
-
def _uses_manual_approval(config: Optional[dict[str, Any]]) -> bool:
|
|
1033
|
-
return str((config or {}).get("approval_mode") or "").strip().lower() == "manual"
|
|
1034
|
-
|
|
1035
|
-
async def _start_manual_thread(self, config: Optional[dict[str, Any]]) -> Any:
|
|
1036
|
-
"""Start a thread whose native approvals are reviewed by Studio users.
|
|
1037
|
-
|
|
1038
|
-
``openai-codex==0.147.0`` exposes ``ApprovalsReviewer.user`` on the
|
|
1039
|
-
generated app-server contract but omits it from the public
|
|
1040
|
-
``ApprovalMode`` enum. Use that pinned wire contract explicitly rather
|
|
1041
|
-
than falling back to ``auto_review``.
|
|
1042
|
-
"""
|
|
1043
|
-
|
|
1044
|
-
from openai_codex import AsyncThread # type: ignore[import-not-found]
|
|
1045
|
-
from openai_codex._sandbox import _sandbox_mode # type: ignore[import-not-found]
|
|
1046
|
-
from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
|
|
1047
|
-
ApprovalsReviewer,
|
|
1048
|
-
AskForApproval,
|
|
1049
|
-
AskForApprovalValue,
|
|
1050
|
-
ThreadStartParams,
|
|
1051
|
-
)
|
|
1052
|
-
|
|
1053
|
-
kwargs = self._thread_kwargs(self._without_manual_approval(config))
|
|
1054
|
-
kwargs.pop("approval_mode", None)
|
|
1055
|
-
sandbox = kwargs.pop("sandbox", None)
|
|
1056
|
-
await self._codex._ensure_initialized()
|
|
1057
|
-
started = await self._codex._client.thread_start(
|
|
1058
|
-
ThreadStartParams(
|
|
1059
|
-
approval_policy=AskForApproval(root=AskForApprovalValue.on_request),
|
|
1060
|
-
approvals_reviewer=ApprovalsReviewer.user,
|
|
1061
|
-
sandbox=_sandbox_mode(sandbox),
|
|
1062
|
-
**kwargs,
|
|
1063
|
-
)
|
|
1064
|
-
)
|
|
1065
|
-
return AsyncThread(self._codex, started.thread.id)
|
|
1066
|
-
|
|
1067
|
-
async def _resume_manual_thread(
|
|
1068
|
-
self,
|
|
1069
|
-
thread_id: str,
|
|
1070
|
-
config: Optional[dict[str, Any]],
|
|
1071
|
-
) -> Any:
|
|
1072
|
-
from openai_codex import AsyncThread # type: ignore[import-not-found]
|
|
1073
|
-
from openai_codex._sandbox import _sandbox_mode # type: ignore[import-not-found]
|
|
1074
|
-
from openai_codex.generated.v2_all import ( # type: ignore[import-not-found]
|
|
1075
|
-
ApprovalsReviewer,
|
|
1076
|
-
AskForApproval,
|
|
1077
|
-
AskForApprovalValue,
|
|
1078
|
-
ThreadResumeParams,
|
|
1079
|
-
)
|
|
1080
|
-
|
|
1081
|
-
kwargs = self._thread_kwargs(self._without_manual_approval(config))
|
|
1082
|
-
kwargs.pop("approval_mode", None)
|
|
1083
|
-
kwargs.pop("ephemeral", None)
|
|
1084
|
-
sandbox = kwargs.pop("sandbox", None)
|
|
1085
|
-
await self._codex._ensure_initialized()
|
|
1086
|
-
resumed = await self._codex._client.thread_resume(
|
|
1087
|
-
thread_id,
|
|
1088
|
-
ThreadResumeParams(
|
|
1089
|
-
thread_id=thread_id,
|
|
1090
|
-
approval_policy=AskForApproval(root=AskForApprovalValue.on_request),
|
|
1091
|
-
approvals_reviewer=ApprovalsReviewer.user,
|
|
1092
|
-
sandbox=_sandbox_mode(sandbox),
|
|
1093
|
-
**kwargs,
|
|
1094
|
-
),
|
|
1095
|
-
)
|
|
1096
|
-
return AsyncThread(self._codex, resumed.thread.id)
|
|
1097
|
-
|
|
1098
|
-
@staticmethod
|
|
1099
|
-
def _without_manual_approval(
|
|
1100
|
-
config: Optional[dict[str, Any]],
|
|
1101
|
-
) -> dict[str, Any]:
|
|
1102
|
-
result = dict(config or {})
|
|
1103
|
-
result.pop("approval_mode", None)
|
|
1104
|
-
return result
|
|
1105
|
-
|
|
1106
|
-
def run_turn(
|
|
1107
|
-
self,
|
|
1108
|
-
thread_id: str,
|
|
1109
|
-
prompt: Any,
|
|
1110
|
-
*,
|
|
1111
|
-
config: Optional[dict[str, Any]] = None,
|
|
1112
|
-
) -> AsyncIterator[dict[str, Any]]:
|
|
1113
|
-
return self._run_turn_gen(thread_id, prompt, config)
|
|
1114
|
-
|
|
1115
|
-
def run_goal(
|
|
1116
|
-
self,
|
|
1117
|
-
thread_id: str,
|
|
1118
|
-
objective: str,
|
|
1119
|
-
*,
|
|
1120
|
-
config: Optional[dict[str, Any]] = None,
|
|
1121
|
-
) -> AsyncIterator[dict[str, Any]]:
|
|
1122
|
-
return self._run_goal_gen(thread_id, objective, config)
|
|
1123
|
-
|
|
1124
|
-
async def _run_turn_gen(
|
|
1125
|
-
self, thread_id: str, prompt: Any, config: Optional[dict[str, Any]]
|
|
1126
|
-
) -> AsyncIterator[dict[str, Any]]:
|
|
1127
|
-
thread = self._threads.get(thread_id)
|
|
1128
|
-
if thread is None:
|
|
1129
|
-
# 未显式 start/resume 的 thread_id:按 resume 语义接入真实后端。
|
|
1130
|
-
await self.resume_thread(thread_id, config)
|
|
1131
|
-
thread = self._threads[thread_id]
|
|
1132
|
-
approval_queue: queue.Queue[Any] = queue.Queue()
|
|
1133
|
-
with self._approval_lock:
|
|
1134
|
-
self._approval_queues[thread_id] = approval_queue
|
|
1135
|
-
self._thread_approval_configs[thread_id] = dict(config or {})
|
|
1136
|
-
handle = await self._start_turn(thread, self._coerce_input(prompt), config)
|
|
1137
|
-
self._active_handles[thread_id] = handle
|
|
1138
|
-
notifications = handle.stream()
|
|
1139
|
-
notification_task: Any = None
|
|
1140
|
-
approval_task: Any = None
|
|
1141
|
-
try:
|
|
1142
|
-
while True:
|
|
1143
|
-
if notification_task is None:
|
|
1144
|
-
notification_task = asyncio.create_task(notifications.__anext__())
|
|
1145
|
-
if approval_task is None:
|
|
1146
|
-
approval_task = asyncio.create_task(asyncio.to_thread(approval_queue.get))
|
|
1147
|
-
done, _pending = await asyncio.wait(
|
|
1148
|
-
{notification_task, approval_task},
|
|
1149
|
-
return_when=asyncio.FIRST_COMPLETED,
|
|
1150
|
-
)
|
|
1151
|
-
if approval_task in done:
|
|
1152
|
-
approval_event = approval_task.result()
|
|
1153
|
-
approval_task = None
|
|
1154
|
-
if approval_event is not None:
|
|
1155
|
-
yield approval_event
|
|
1156
|
-
if notification_task in done:
|
|
1157
|
-
try:
|
|
1158
|
-
notification = notification_task.result()
|
|
1159
|
-
except StopAsyncIteration:
|
|
1160
|
-
break
|
|
1161
|
-
notification_task = None
|
|
1162
|
-
event = self._notification_to_event_dict(notification)
|
|
1163
|
-
if event is not None:
|
|
1164
|
-
yield event
|
|
1165
|
-
finally:
|
|
1166
|
-
approval_queue.put(None)
|
|
1167
|
-
for task in (notification_task, approval_task):
|
|
1168
|
-
if task is not None and not task.done():
|
|
1169
|
-
task.cancel()
|
|
1170
|
-
await asyncio.gather(
|
|
1171
|
-
*(task for task in (notification_task, approval_task) if task is not None),
|
|
1172
|
-
return_exceptions=True,
|
|
1173
|
-
)
|
|
1174
|
-
self._active_handles.pop(thread_id, None)
|
|
1175
|
-
with self._approval_lock:
|
|
1176
|
-
self._approval_queues.pop(thread_id, None)
|
|
1177
|
-
|
|
1178
|
-
async def _run_goal_gen(
|
|
1179
|
-
self,
|
|
1180
|
-
thread_id: str,
|
|
1181
|
-
objective: str,
|
|
1182
|
-
config: Optional[dict[str, Any]],
|
|
1183
|
-
) -> AsyncIterator[dict[str, Any]]:
|
|
1184
|
-
if thread_id not in self._threads:
|
|
1185
|
-
await self.resume_thread(thread_id, config)
|
|
1186
|
-
from openai_codex._goal import _AsyncGoalNotificationStream
|
|
1187
|
-
|
|
1188
|
-
low_level = self._codex._client
|
|
1189
|
-
approval_queue: queue.Queue[Any] = queue.Queue()
|
|
1190
|
-
with self._approval_lock:
|
|
1191
|
-
self._approval_queues[thread_id] = approval_queue
|
|
1192
|
-
self._thread_approval_configs[thread_id] = dict(config or {})
|
|
1193
|
-
state, _logical_turn_id = await low_level.start_goal_operation(thread_id, objective)
|
|
1194
|
-
self._goal_states[thread_id] = state
|
|
1195
|
-
notifications = _AsyncGoalNotificationStream(
|
|
1196
|
-
state=state,
|
|
1197
|
-
next_notification=lambda: low_level.next_goal_notification(state),
|
|
1198
|
-
unregister=lambda: low_level.unregister_goal_operation(state),
|
|
1199
|
-
cancel_goal=lambda: low_level.cancel_goal_operation(state),
|
|
1200
|
-
)
|
|
1201
|
-
notification_task: Any = None
|
|
1202
|
-
approval_task: Any = None
|
|
1203
|
-
try:
|
|
1204
|
-
while True:
|
|
1205
|
-
if notification_task is None:
|
|
1206
|
-
notification_task = asyncio.create_task(notifications.__anext__())
|
|
1207
|
-
if approval_task is None:
|
|
1208
|
-
approval_task = asyncio.create_task(asyncio.to_thread(approval_queue.get))
|
|
1209
|
-
done, _pending = await asyncio.wait(
|
|
1210
|
-
{notification_task, approval_task},
|
|
1211
|
-
return_when=asyncio.FIRST_COMPLETED,
|
|
1212
|
-
)
|
|
1213
|
-
if approval_task in done:
|
|
1214
|
-
approval_event = approval_task.result()
|
|
1215
|
-
approval_task = None
|
|
1216
|
-
if approval_event is not None:
|
|
1217
|
-
yield approval_event
|
|
1218
|
-
if notification_task in done:
|
|
1219
|
-
try:
|
|
1220
|
-
notification = notification_task.result()
|
|
1221
|
-
except StopAsyncIteration:
|
|
1222
|
-
break
|
|
1223
|
-
notification_task = None
|
|
1224
|
-
event = self._notification_to_event_dict(notification)
|
|
1225
|
-
if event is not None:
|
|
1226
|
-
yield event
|
|
1227
|
-
finally:
|
|
1228
|
-
approval_queue.put(None)
|
|
1229
|
-
for task in (notification_task, approval_task):
|
|
1230
|
-
if task is not None and not task.done():
|
|
1231
|
-
task.cancel()
|
|
1232
|
-
await asyncio.gather(
|
|
1233
|
-
*(task for task in (notification_task, approval_task) if task is not None),
|
|
1234
|
-
return_exceptions=True,
|
|
1235
|
-
)
|
|
1236
|
-
await notifications.aclose()
|
|
1237
|
-
self._goal_states.pop(thread_id, None)
|
|
1238
|
-
with self._approval_lock:
|
|
1239
|
-
self._approval_queues.pop(thread_id, None)
|
|
1240
|
-
|
|
1241
|
-
async def _start_turn(
|
|
1242
|
-
self,
|
|
1243
|
-
thread: Any,
|
|
1244
|
-
prompt: Any,
|
|
1245
|
-
config: Optional[dict[str, Any]],
|
|
1246
|
-
) -> Any:
|
|
1247
|
-
mode = str((config or {}).get("collaboration_mode") or "").strip().lower()
|
|
1248
|
-
if not mode or mode == "default":
|
|
1249
|
-
return await thread.turn(prompt, **self._turn_kwargs(config))
|
|
1250
|
-
if mode != "plan":
|
|
1251
|
-
raise ValueError("collaboration_mode must be default or plan")
|
|
1252
|
-
|
|
1253
|
-
# openai-codex 0.144.4 predates the public collaboration_mode argument,
|
|
1254
|
-
# while the bundled app-server already accepts it. Keep this private
|
|
1255
|
-
# compatibility seam small and covered by a wire-payload test.
|
|
1256
|
-
from openai_codex import AsyncTurnHandle
|
|
1257
|
-
from openai_codex._approval_mode import _approval_mode_override_settings
|
|
1258
|
-
from openai_codex._inputs import _normalize_run_input, _to_wire_input
|
|
1259
|
-
from openai_codex._sandbox import _sandbox_policy
|
|
1260
|
-
from openai_codex.generated.v2_all import TurnStartParams
|
|
1261
|
-
|
|
1262
|
-
turn_config = self._turn_kwargs(config)
|
|
1263
|
-
approval_mode = turn_config.pop("approval_mode", None)
|
|
1264
|
-
sandbox = turn_config.pop("sandbox", None)
|
|
1265
|
-
approval_policy, approvals_reviewer = _approval_mode_override_settings(approval_mode)
|
|
1266
|
-
wire_input = _to_wire_input(_normalize_run_input(prompt))
|
|
1267
|
-
params = TurnStartParams(
|
|
1268
|
-
thread_id=thread.id,
|
|
1269
|
-
input=wire_input,
|
|
1270
|
-
approval_policy=approval_policy,
|
|
1271
|
-
approvals_reviewer=approvals_reviewer,
|
|
1272
|
-
sandbox_policy=_sandbox_policy(sandbox),
|
|
1273
|
-
**turn_config,
|
|
1274
|
-
).model_dump(mode="json", by_alias=True, exclude_none=True)
|
|
1275
|
-
params["collaborationMode"] = {
|
|
1276
|
-
"mode": "plan",
|
|
1277
|
-
"settings": {
|
|
1278
|
-
"model": str((config or {}).get("model") or ""),
|
|
1279
|
-
"reasoning_effort": None,
|
|
1280
|
-
"developer_instructions": None,
|
|
1281
|
-
},
|
|
1282
|
-
}
|
|
1283
|
-
started = await self._codex._client.turn_start(thread.id, wire_input, params=params)
|
|
1284
|
-
return AsyncTurnHandle(self._codex, thread.id, started.turn.id)
|
|
1285
|
-
|
|
1286
|
-
async def interrupt_active_turn(self, thread_id: str) -> bool:
|
|
1287
|
-
handle = self._active_handles.get(thread_id)
|
|
1288
|
-
if handle is None:
|
|
1289
|
-
return False
|
|
1290
|
-
await handle.interrupt()
|
|
1291
|
-
return True
|
|
1292
|
-
|
|
1293
|
-
async def pause_goal(self, thread_id: str) -> bool:
|
|
1294
|
-
state = self._goal_states.get(thread_id)
|
|
1295
|
-
if state is None:
|
|
1296
|
-
return False
|
|
1297
|
-
await self._codex._client.pause_goal(thread_id)
|
|
1298
|
-
return True
|
|
1299
|
-
|
|
1300
|
-
async def cancel_goal(self, thread_id: str) -> bool:
|
|
1301
|
-
state = self._goal_states.get(thread_id)
|
|
1302
|
-
if state is None:
|
|
1303
|
-
return False
|
|
1304
|
-
await self._codex._client.cancel_goal_operation(state)
|
|
1305
|
-
return True
|
|
1306
|
-
|
|
1307
|
-
async def resolve_approval(self, approval_id: str, decision: str) -> bool:
|
|
1308
|
-
normalized = {
|
|
1309
|
-
"approve": "accept",
|
|
1310
|
-
"accept": "accept",
|
|
1311
|
-
"approve_session": "acceptForSession",
|
|
1312
|
-
"accept_for_session": "acceptForSession",
|
|
1313
|
-
"deny": "decline",
|
|
1314
|
-
"decline": "decline",
|
|
1315
|
-
"cancel": "cancel",
|
|
1316
|
-
}.get(str(decision).strip().lower())
|
|
1317
|
-
if normalized is None:
|
|
1318
|
-
raise ValueError("approval decision must be approve, approve_session, deny, or cancel")
|
|
1319
|
-
with self._approval_lock:
|
|
1320
|
-
pending = self._pending_approvals.get(approval_id)
|
|
1321
|
-
if pending is None:
|
|
1322
|
-
return False
|
|
1323
|
-
pending.response = {"decision": normalized}
|
|
1324
|
-
pending.resolved.set()
|
|
1325
|
-
return True
|
|
1326
|
-
|
|
1327
|
-
async def resolve_interaction(
|
|
1328
|
-
self,
|
|
1329
|
-
interaction_id: str,
|
|
1330
|
-
data: dict[str, Any],
|
|
1331
|
-
) -> bool:
|
|
1332
|
-
answers: dict[str, dict[str, list[str]]] = {}
|
|
1333
|
-
for key, value in data.items():
|
|
1334
|
-
if key in {"decision", "name", "action"} or value is None:
|
|
1335
|
-
continue
|
|
1336
|
-
raw_answers = value if isinstance(value, list) else [value]
|
|
1337
|
-
normalized = [str(answer) for answer in raw_answers if str(answer)]
|
|
1338
|
-
answers[str(key)] = {"answers": normalized}
|
|
1339
|
-
with self._approval_lock:
|
|
1340
|
-
pending = self._pending_interactions.get(interaction_id)
|
|
1341
|
-
if pending is None:
|
|
1342
|
-
return False
|
|
1343
|
-
if pending.method == "mcpServer/elicitation/request":
|
|
1344
|
-
action = data.get("action") or {
|
|
1345
|
-
"cancel": "cancel",
|
|
1346
|
-
"skip": "decline",
|
|
1347
|
-
"reject": "decline",
|
|
1348
|
-
"deny": "decline",
|
|
1349
|
-
"decline": "decline",
|
|
1350
|
-
}.get(str(data.get("decision") or ""), "accept")
|
|
1351
|
-
if action not in {"accept", "decline", "cancel"}:
|
|
1352
|
-
raise ValueError("MCP elicitation action must be accept, decline, or cancel")
|
|
1353
|
-
pending.response = {"action": action}
|
|
1354
|
-
if action == "accept":
|
|
1355
|
-
pending.response["content"] = {
|
|
1356
|
-
key: value
|
|
1357
|
-
for key, value in data.items()
|
|
1358
|
-
if key not in {"action", "decision"}
|
|
1359
|
-
}
|
|
1360
|
-
else:
|
|
1361
|
-
pending.response = {"answers": answers}
|
|
1362
|
-
pending.resolved.set()
|
|
1363
|
-
return True
|
|
1364
|
-
|
|
1365
|
-
async def close(self) -> None:
|
|
1366
|
-
approval_lock = getattr(self, "_approval_lock", None)
|
|
1367
|
-
if approval_lock is None:
|
|
1368
|
-
pending: list[_PendingApproval] = []
|
|
1369
|
-
else:
|
|
1370
|
-
with approval_lock:
|
|
1371
|
-
pending = list(getattr(self, "_pending_approvals", {}).values())
|
|
1372
|
-
for approval in pending:
|
|
1373
|
-
approval.response = {"decision": "cancel"}
|
|
1374
|
-
approval.resolved.set()
|
|
1375
|
-
if approval_lock is None:
|
|
1376
|
-
interactions: list[_PendingInteraction] = []
|
|
1377
|
-
else:
|
|
1378
|
-
with approval_lock:
|
|
1379
|
-
interactions = list(getattr(self, "_pending_interactions", {}).values())
|
|
1380
|
-
for interaction in interactions:
|
|
1381
|
-
interaction.response = (
|
|
1382
|
-
{"action": "cancel"}
|
|
1383
|
-
if interaction.method == "mcpServer/elicitation/request"
|
|
1384
|
-
else {"answers": {}}
|
|
1385
|
-
)
|
|
1386
|
-
interaction.resolved.set()
|
|
1387
|
-
for thread_id, state in list(getattr(self, "_goal_states", {}).items()):
|
|
1388
|
-
try:
|
|
1389
|
-
await self._codex._client.cancel_goal_operation(state)
|
|
1390
|
-
except Exception:
|
|
1391
|
-
pass
|
|
1392
|
-
finally:
|
|
1393
|
-
self._goal_states.pop(thread_id, None)
|
|
1394
|
-
try:
|
|
1395
|
-
await self._codex.close()
|
|
1396
|
-
finally:
|
|
1397
|
-
self._active_handles.clear()
|
|
1398
|
-
self._threads.clear()
|
|
1399
|
-
if self._proxy is not None:
|
|
1400
|
-
self._proxy.stop()
|
|
1401
|
-
self._proxy = None
|
|
1402
|
-
|
|
1403
|
-
# ---- 内部:config / input / 事件映射 ----
|
|
1404
|
-
|
|
1405
|
-
@staticmethod
|
|
1406
|
-
def _thread_kwargs(config: Optional[dict[str, Any]]) -> dict[str, Any]:
|
|
1407
|
-
"""Map runtime config to the exact 0.144.4 thread API surface."""
|
|
1408
|
-
from openai_codex import ApprovalMode, Sandbox # type: ignore[import-not-found]
|
|
1409
|
-
|
|
1410
|
-
config = config or {}
|
|
1411
|
-
known = {
|
|
1412
|
-
"approval_mode",
|
|
1413
|
-
"model",
|
|
1414
|
-
"model_provider",
|
|
1415
|
-
"cwd",
|
|
1416
|
-
"sandbox",
|
|
1417
|
-
"service_tier",
|
|
1418
|
-
"base_instructions",
|
|
1419
|
-
"developer_instructions",
|
|
1420
|
-
"ephemeral",
|
|
1421
|
-
}
|
|
1422
|
-
result = {k: v for k, v in config.items() if k in known}
|
|
1423
|
-
# KSADK sessions are ephemeral so an interrupted/half-written turn cannot
|
|
1424
|
-
# later be revived from Codex's on-disk session store.
|
|
1425
|
-
result.setdefault("ephemeral", True)
|
|
1426
|
-
if config.get("sandbox_read_only", False):
|
|
1427
|
-
result["sandbox"] = Sandbox.read_only
|
|
1428
|
-
result.setdefault("approval_mode", ApprovalMode.deny_all)
|
|
1429
|
-
else:
|
|
1430
|
-
result["sandbox"] = _coerce_enum(Sandbox, result.get("sandbox"))
|
|
1431
|
-
result["approval_mode"] = _coerce_enum(ApprovalMode, result.get("approval_mode"))
|
|
1432
|
-
return {key: value for key, value in result.items() if value is not None}
|
|
1433
|
-
|
|
1434
|
-
@staticmethod
|
|
1435
|
-
def _turn_kwargs(config: Optional[dict[str, Any]]) -> dict[str, Any]:
|
|
1436
|
-
"""Map runtime config to the exact 0.144.4 AsyncThread.turn surface."""
|
|
1437
|
-
from openai_codex import ApprovalMode, Sandbox # type: ignore[import-not-found]
|
|
1438
|
-
|
|
1439
|
-
config = config or {}
|
|
1440
|
-
known = {
|
|
1441
|
-
"approval_mode",
|
|
1442
|
-
"cwd",
|
|
1443
|
-
"effort",
|
|
1444
|
-
"model",
|
|
1445
|
-
"output_schema",
|
|
1446
|
-
"personality",
|
|
1447
|
-
"sandbox",
|
|
1448
|
-
"service_tier",
|
|
1449
|
-
"summary",
|
|
1450
|
-
}
|
|
1451
|
-
result = {key: value for key, value in config.items() if key in known}
|
|
1452
|
-
if config.get("sandbox_read_only", False):
|
|
1453
|
-
result["sandbox"] = Sandbox.read_only
|
|
1454
|
-
result.setdefault("approval_mode", ApprovalMode.deny_all)
|
|
1455
|
-
else:
|
|
1456
|
-
result["sandbox"] = _coerce_enum(Sandbox, result.get("sandbox"))
|
|
1457
|
-
result["approval_mode"] = _coerce_enum(ApprovalMode, result.get("approval_mode"))
|
|
1458
|
-
return {key: value for key, value in result.items() if value is not None}
|
|
1459
|
-
|
|
1460
|
-
@staticmethod
|
|
1461
|
-
def _coerce_input(prompt: Any) -> Any:
|
|
1462
|
-
# RunInput 接受 str 或 [TextInput|...];str 直接透传。
|
|
1463
|
-
return prompt if isinstance(prompt, str) else prompt
|
|
1464
|
-
|
|
1465
|
-
@staticmethod
|
|
1466
|
-
def _notification_to_event_dict(notification: Any) -> Optional[dict[str, Any]]:
|
|
1467
|
-
"""把真实 ``Notification``(method + 类型化 payload)映射为运行时消费的规范化 dict。
|
|
1468
|
-
|
|
1469
|
-
按 payload 类型路由(结构已对生成的 payload 类型实证);字段级 phase 细节在接
|
|
1470
|
-
真实后端时对齐。
|
|
1471
|
-
"""
|
|
1472
|
-
payload = notification.payload
|
|
1473
|
-
if hasattr(payload, "model_dump"):
|
|
1474
|
-
params = payload.model_dump(mode="json", by_alias=True)
|
|
1475
|
-
else:
|
|
1476
|
-
params = getattr(payload, "params", None)
|
|
1477
|
-
if not isinstance(params, dict):
|
|
1478
|
-
params = {}
|
|
1479
|
-
|
|
1480
|
-
method = str(getattr(notification, "method", ""))
|
|
1481
|
-
supported_methods = {
|
|
1482
|
-
"item/started",
|
|
1483
|
-
"item/completed",
|
|
1484
|
-
"item/agentMessage/delta",
|
|
1485
|
-
"item/autoApprovalReview/started",
|
|
1486
|
-
"item/autoApprovalReview/completed",
|
|
1487
|
-
"thread/tokenUsage/updated",
|
|
1488
|
-
"turn/started",
|
|
1489
|
-
"turn/completed",
|
|
1490
|
-
"error",
|
|
1491
|
-
"item/reasoning/summaryTextDelta",
|
|
1492
|
-
"item/reasoning/textDelta",
|
|
1493
|
-
"item/reasoning/summaryPartAdded",
|
|
1494
|
-
"thread/goal/updated",
|
|
1495
|
-
"thread/goal/cleared",
|
|
1496
|
-
}
|
|
1497
|
-
if method in supported_methods:
|
|
1498
|
-
return {"method": method, "params": params}
|
|
1499
|
-
return None
|
|
1500
453
|
|
|
1501
454
|
|
|
1502
455
|
def _coerce_enum(enum_type: Any, value: Any) -> Any:
|
|
@@ -1518,3 +471,6 @@ __all__ = [
|
|
|
1518
471
|
"CodexPluginBootstrapError",
|
|
1519
472
|
"codex_marketplace_tree_digest",
|
|
1520
473
|
]
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
from ksadk.codex.async_client import AsyncCodexClient # noqa: E402
|