agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
- agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +38 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +121 -118
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +22 -2
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +64 -88
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +69 -17
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1047
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +216 -143
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +134 -0
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +9 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +69 -20
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +51 -155
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +12 -0
- ksadk/conversations/runtime_persistence.py +296 -32
- ksadk/conversations/runtime_preparation.py +98 -13
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +46 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +18 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +230 -0
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +332 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +153 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +504 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +388 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/context_tuning.py +168 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +57 -0
- ksadk/harness/engine/context_pipeline.py +1351 -0
- ksadk/harness/engine/graph_builder.py +352 -0
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +1049 -0
- ksadk/harness/engine/mcp_disclosure.py +701 -0
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +81 -0
- ksadk/harness/engine/postgres_checkpointer.py +386 -0
- ksadk/harness/engine/run_control_bridge.py +100 -0
- ksadk/harness/engine/run_types.py +98 -0
- ksadk/harness/engine/skill_disclosure.py +275 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +360 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +249 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +498 -0
- ksadk/harness/execution_policy.py +104 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +699 -0
- ksadk/harness/loop/tools.py +907 -0
- ksadk/harness/managed_runtime.py +1044 -0
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +504 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +468 -0
- ksadk/harness/model_provider.py +430 -0
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +132 -0
- ksadk/harness/public_activity.py +213 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +779 -17
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +773 -0
- ksadk/harness/runtime.py +157 -113
- ksadk/harness/runtime_capabilities.py +228 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +733 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +589 -0
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +317 -0
- ksadk/harness/spec.py +342 -0
- ksadk/harness/state.py +155 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +263 -0
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +134 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +9 -2
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +220 -252
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +30 -0
- ksadk/kernel/control.py +180 -29
- ksadk/kernel/execution_grants.py +428 -0
- ksadk/kernel/execution_grants_memory.py +252 -0
- ksadk/kernel/execution_grants_postgres.py +395 -0
- ksadk/kernel/execution_grants_sqlite.py +435 -0
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +139 -226
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +61 -58
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +230 -231
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +166 -16
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +28 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +410 -200
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +104 -5
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +369 -340
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +74 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +159 -7
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +280 -67
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +14 -9
- ksadk/model_proxy/transform.py +72 -6
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +29 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +417 -185
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +92 -21
- ksadk/plugins/execution_host.py +107 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +52 -40
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +49 -143
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +413 -52
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +670 -0
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +550 -0
- ksadk/plugins/providers/harness_tools.py +455 -0
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +540 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1480 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +352 -0
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +853 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +519 -0
- ksadk/plugins/teams/task_decisions.py +436 -0
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +96 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +83 -401
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +220 -350
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +208 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +134 -129
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +29 -3
- ksadk/runtime/executor.py +105 -7
- ksadk/runtime/factory.py +45 -3
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +160 -21
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +105 -1
- ksadk/sandbox/backends/e2b.py +272 -24
- ksadk/sandbox/backends/local_process.py +73 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +776 -0
- ksadk/sandbox/local_launcher.py +124 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +112 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +26 -3
- ksadk/server/routes/misc.py +331 -33
- ksadk/server/routes/models.py +28 -4
- ksadk/server/routes/openai_compat.py +82 -13
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +112 -37
- ksadk/server/routes/sessions.py +493 -358
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +135 -23
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/loader.py +44 -2
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +400 -56
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/service_client.py +6 -1
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +784 -419
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +31 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +32 -2
- ksadk/studio/capabilities.py +31 -9
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +113 -387
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +82 -2
- ksadk/studio/codex_agent_service.py +19 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +112 -6
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +260 -202
- ksadk/studio/dsh_application.py +183 -27
- ksadk/studio/dsh_capability_service.py +302 -189
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +53 -5
- ksadk/studio/execution_host.py +598 -0
- ksadk/studio/framework_run.py +50 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +429 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1939 -345
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +89 -40
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +39 -12
- ksadk/studio/plugin_kernel_adapter.py +89 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +832 -99
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +69 -34
- ksadk/studio/resource_catalog.py +14 -12
- ksadk/studio/run_activity.py +848 -0
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +1220 -335
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +73 -11
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +615 -246
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +518 -181
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-CkufcPYo.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +166 -0
- ksadk/studio/teams_installation.py +217 -0
- ksadk/studio/teams_node.py +549 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +72 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +496 -0
- ksadk/studio/templates.py +41 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +138 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +93 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +344 -326
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +28 -14
- agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
|
@@ -0,0 +1,782 @@
|
|
|
1
|
+
"""SQLite RunStore with transactional CAS, fencing and append-only event rows.
|
|
2
|
+
|
|
3
|
+
No external side effect executes inside these transactions. A prepared intent
|
|
4
|
+
is committed first, then claimed once. A running intent after restart needs
|
|
5
|
+
reconciliation; claiming it again is explicitly forbidden.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sqlite3
|
|
11
|
+
from contextlib import contextmanager
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from threading import RLock
|
|
14
|
+
from time import time
|
|
15
|
+
from typing import Iterator
|
|
16
|
+
|
|
17
|
+
from ksadk.harness.native.fork import ForkCreation
|
|
18
|
+
from ksadk.harness.native.restore_contract import SNAPSHOT_READER_VERSION, StoreRestoreAudit
|
|
19
|
+
from ksadk.harness.native.state import (
|
|
20
|
+
CommandReceipt,
|
|
21
|
+
CommitBatch,
|
|
22
|
+
EffectIntent,
|
|
23
|
+
EffectReceipt,
|
|
24
|
+
NativeEvent,
|
|
25
|
+
RunCommand,
|
|
26
|
+
RunScope,
|
|
27
|
+
RunSnapshot,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
from .native_command_settlement import settle_terminal_commands
|
|
31
|
+
from .native_contract import (
|
|
32
|
+
EffectAlreadyClaimed,
|
|
33
|
+
LeaseBusy,
|
|
34
|
+
PendingCommandConflict,
|
|
35
|
+
ScopeMismatch,
|
|
36
|
+
StoreConflict,
|
|
37
|
+
check_commit,
|
|
38
|
+
check_fence,
|
|
39
|
+
check_fork,
|
|
40
|
+
check_initial,
|
|
41
|
+
check_intent,
|
|
42
|
+
check_receipt,
|
|
43
|
+
check_scope,
|
|
44
|
+
check_turn,
|
|
45
|
+
detached,
|
|
46
|
+
duplicate_fork,
|
|
47
|
+
encode,
|
|
48
|
+
)
|
|
49
|
+
from .native_sqlite_audit import (
|
|
50
|
+
CONSERVATIVE_MIGRATION_ID,
|
|
51
|
+
historical_migrations,
|
|
52
|
+
initialize_audit_tables,
|
|
53
|
+
)
|
|
54
|
+
from .native_sqlite_migration import _fingerprint, restore_legacy_session_heads
|
|
55
|
+
|
|
56
|
+
_SCHEMA = """
|
|
57
|
+
CREATE TABLE IF NOT EXISTS native_runs (
|
|
58
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, snapshot TEXT NOT NULL,
|
|
59
|
+
fence INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (scope, run_id)
|
|
60
|
+
);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS native_runs_id ON native_runs(run_id);
|
|
62
|
+
CREATE TABLE IF NOT EXISTS native_session_heads (
|
|
63
|
+
scope TEXT NOT NULL, session_id TEXT NOT NULL, run_id TEXT NOT NULL,
|
|
64
|
+
PRIMARY KEY (scope, session_id),
|
|
65
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
66
|
+
);
|
|
67
|
+
CREATE TABLE IF NOT EXISTS native_events (
|
|
68
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, seq INTEGER NOT NULL,
|
|
69
|
+
event_id TEXT NOT NULL, data TEXT NOT NULL,
|
|
70
|
+
PRIMARY KEY (scope, run_id, seq), UNIQUE (scope, run_id, event_id),
|
|
71
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
72
|
+
);
|
|
73
|
+
CREATE TABLE IF NOT EXISTS native_outbox_cursors (
|
|
74
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, consumer TEXT NOT NULL,
|
|
75
|
+
cursor INTEGER NOT NULL DEFAULT 0 CHECK (cursor >= 0),
|
|
76
|
+
PRIMARY KEY (scope, run_id, consumer),
|
|
77
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
78
|
+
);
|
|
79
|
+
CREATE TABLE IF NOT EXISTS native_run_leases (
|
|
80
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, owner_id TEXT NOT NULL,
|
|
81
|
+
expires_at REAL NOT NULL,
|
|
82
|
+
PRIMARY KEY (scope, run_id),
|
|
83
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
84
|
+
);
|
|
85
|
+
CREATE TABLE IF NOT EXISTS native_intents (
|
|
86
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, operation_key TEXT NOT NULL,
|
|
87
|
+
data TEXT NOT NULL, PRIMARY KEY (scope, run_id, operation_key),
|
|
88
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
89
|
+
);
|
|
90
|
+
CREATE TABLE IF NOT EXISTS native_receipts (
|
|
91
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, operation_key TEXT NOT NULL,
|
|
92
|
+
data TEXT NOT NULL, PRIMARY KEY (scope, run_id, operation_key),
|
|
93
|
+
FOREIGN KEY (scope, run_id, operation_key)
|
|
94
|
+
REFERENCES native_intents(scope, run_id, operation_key)
|
|
95
|
+
);
|
|
96
|
+
CREATE TABLE IF NOT EXISTS native_commands (
|
|
97
|
+
enqueue_order INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
98
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, command_id TEXT NOT NULL,
|
|
99
|
+
priority INTEGER NOT NULL, data TEXT NOT NULL, consumed INTEGER NOT NULL DEFAULT 0,
|
|
100
|
+
UNIQUE (scope, run_id, command_id),
|
|
101
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
102
|
+
);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS native_commands_pending
|
|
104
|
+
ON native_commands(scope, run_id, consumed, priority DESC, enqueue_order);
|
|
105
|
+
CREATE TABLE IF NOT EXISTS native_commits (
|
|
106
|
+
scope TEXT NOT NULL, run_id TEXT NOT NULL, commit_id TEXT NOT NULL,
|
|
107
|
+
payload TEXT NOT NULL, snapshot TEXT NOT NULL,
|
|
108
|
+
PRIMARY KEY (scope, run_id, commit_id),
|
|
109
|
+
FOREIGN KEY (scope, run_id) REFERENCES native_runs(scope, run_id)
|
|
110
|
+
);
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class SQLiteRunStore:
|
|
115
|
+
def __init__(self, path: str | Path) -> None:
|
|
116
|
+
self._lock = RLock()
|
|
117
|
+
self._closed = False
|
|
118
|
+
self._executed_migration_ids: tuple[str, ...] = ()
|
|
119
|
+
self._connection = sqlite3.connect(
|
|
120
|
+
str(path), timeout=5, isolation_level=None, check_same_thread=False
|
|
121
|
+
)
|
|
122
|
+
try:
|
|
123
|
+
self._connection.execute("PRAGMA foreign_keys = ON")
|
|
124
|
+
self._connection.execute("PRAGMA journal_mode = WAL")
|
|
125
|
+
self._connection.execute("PRAGMA synchronous = FULL")
|
|
126
|
+
# Inspect and migrate under the same SQLite writer lock. Another
|
|
127
|
+
# process's completed upgrade must not be recorded as our work.
|
|
128
|
+
self._connection.execute("BEGIN IMMEDIATE")
|
|
129
|
+
version = self._connection.execute("PRAGMA user_version").fetchone()[0]
|
|
130
|
+
if version not in {0, 1, 2}:
|
|
131
|
+
raise StoreConflict("unsupported native SQLite schema version")
|
|
132
|
+
if version < 2:
|
|
133
|
+
# Version 0 is the original unmarked schema. DDL and the
|
|
134
|
+
# marker commit together; an interrupted upgrade rolls back.
|
|
135
|
+
prior_runs = (
|
|
136
|
+
self._connection.execute(
|
|
137
|
+
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='native_runs'"
|
|
138
|
+
).fetchone()
|
|
139
|
+
is not None
|
|
140
|
+
)
|
|
141
|
+
source_digest = _fingerprint(self._connection) if prior_runs else None
|
|
142
|
+
# This is our fixed DDL, with no literal semicolons. Unlike
|
|
143
|
+
# executescript, execute does not commit the inspection lock.
|
|
144
|
+
for statement in _SCHEMA.split(";"):
|
|
145
|
+
if statement.strip():
|
|
146
|
+
self._connection.execute(statement)
|
|
147
|
+
restore_legacy_session_heads(self._connection)
|
|
148
|
+
self._connection.execute("PRAGMA user_version = 2")
|
|
149
|
+
initialize_audit_tables(self._connection)
|
|
150
|
+
if prior_runs:
|
|
151
|
+
self._connection.execute(
|
|
152
|
+
"INSERT INTO native_store_migrations VALUES (?,?,?,?)",
|
|
153
|
+
(CONSERVATIVE_MIGRATION_ID, SNAPSHOT_READER_VERSION, source_digest, "[]"),
|
|
154
|
+
)
|
|
155
|
+
self._executed_migration_ids = (CONSERVATIVE_MIGRATION_ID,)
|
|
156
|
+
else:
|
|
157
|
+
initialize_audit_tables(self._connection)
|
|
158
|
+
self._connection.commit()
|
|
159
|
+
except BaseException:
|
|
160
|
+
self._connection.rollback()
|
|
161
|
+
self._connection.close()
|
|
162
|
+
self._closed = True
|
|
163
|
+
raise
|
|
164
|
+
|
|
165
|
+
@contextmanager
|
|
166
|
+
def _transaction(self, *, write: bool = False) -> Iterator[sqlite3.Connection]:
|
|
167
|
+
with self._lock:
|
|
168
|
+
if self._closed:
|
|
169
|
+
raise StoreConflict("store is closed")
|
|
170
|
+
connection = self._connection
|
|
171
|
+
connection.execute("BEGIN IMMEDIATE" if write else "BEGIN")
|
|
172
|
+
try:
|
|
173
|
+
yield connection
|
|
174
|
+
connection.commit()
|
|
175
|
+
except sqlite3.IntegrityError as exc:
|
|
176
|
+
connection.rollback()
|
|
177
|
+
raise StoreConflict("persistent uniqueness or integrity conflict") from exc
|
|
178
|
+
except BaseException:
|
|
179
|
+
connection.rollback()
|
|
180
|
+
raise
|
|
181
|
+
|
|
182
|
+
@staticmethod
|
|
183
|
+
def _row(connection: sqlite3.Connection, scope: str, run_id: str) -> tuple[str, int]:
|
|
184
|
+
row = connection.execute(
|
|
185
|
+
"SELECT snapshot, fence FROM native_runs WHERE scope = ? AND run_id = ?",
|
|
186
|
+
(scope, run_id),
|
|
187
|
+
).fetchone()
|
|
188
|
+
if row is None:
|
|
189
|
+
if connection.execute(
|
|
190
|
+
"SELECT 1 FROM native_runs WHERE run_id = ? LIMIT 1", (run_id,)
|
|
191
|
+
).fetchone():
|
|
192
|
+
raise ScopeMismatch("run authorization scope mismatch")
|
|
193
|
+
raise KeyError("run not found")
|
|
194
|
+
return row
|
|
195
|
+
|
|
196
|
+
def create(self, snapshot: RunSnapshot) -> None:
|
|
197
|
+
snapshot = detached(snapshot)
|
|
198
|
+
check_initial(snapshot)
|
|
199
|
+
if snapshot.fork_source is not None or snapshot.fork_command is not None:
|
|
200
|
+
raise StoreConflict("fork requires atomic branch creation")
|
|
201
|
+
with self._transaction(write=True) as connection:
|
|
202
|
+
connection.execute(
|
|
203
|
+
"INSERT INTO native_runs(scope, run_id, snapshot) VALUES (?, ?, ?)",
|
|
204
|
+
(encode(snapshot.scope), snapshot.run_id, encode(snapshot)),
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
def load(self, scope: RunScope, run_id: str) -> RunSnapshot:
|
|
208
|
+
with self._transaction() as connection:
|
|
209
|
+
row = self._row(connection, encode(scope), run_id)
|
|
210
|
+
return RunSnapshot.model_validate_json(row[0])
|
|
211
|
+
|
|
212
|
+
def record_restore(
|
|
213
|
+
self,
|
|
214
|
+
scope: RunScope,
|
|
215
|
+
run_id: str,
|
|
216
|
+
*,
|
|
217
|
+
reader_version: str,
|
|
218
|
+
configuration_digest: str,
|
|
219
|
+
fencing_token: int | None,
|
|
220
|
+
) -> None:
|
|
221
|
+
with self._transaction(write=True) as connection:
|
|
222
|
+
raw, fence = self._row(connection, encode(scope), run_id)
|
|
223
|
+
snapshot = RunSnapshot.model_validate_json(raw)
|
|
224
|
+
check_scope(scope, snapshot)
|
|
225
|
+
if snapshot.configuration_digest != configuration_digest:
|
|
226
|
+
raise StoreConflict("restore configuration binding mismatch")
|
|
227
|
+
if fencing_token is not None:
|
|
228
|
+
check_fence(fence, fencing_token)
|
|
229
|
+
audit = StoreRestoreAudit(
|
|
230
|
+
reader_version=reader_version,
|
|
231
|
+
snapshot_schema_version=snapshot.schema_version,
|
|
232
|
+
configuration_digest=configuration_digest,
|
|
233
|
+
fencing_token=fencing_token,
|
|
234
|
+
executed_migration_ids=self._executed_migration_ids,
|
|
235
|
+
historical_migration_ids=historical_migrations(connection),
|
|
236
|
+
)
|
|
237
|
+
connection.execute(
|
|
238
|
+
"INSERT INTO native_restore_audits(scope,run_id,data) VALUES (?,?,?)",
|
|
239
|
+
(encode(scope), run_id, encode(audit)),
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
def restore_audits(self, scope: RunScope, run_id: str) -> tuple[StoreRestoreAudit, ...]:
|
|
243
|
+
with self._transaction() as connection:
|
|
244
|
+
self._row(connection, encode(scope), run_id)
|
|
245
|
+
return tuple(
|
|
246
|
+
StoreRestoreAudit.model_validate_json(row[0])
|
|
247
|
+
for row in connection.execute(
|
|
248
|
+
"SELECT data FROM native_restore_audits "
|
|
249
|
+
"WHERE scope=? AND run_id=? ORDER BY audit_id",
|
|
250
|
+
(encode(scope), run_id),
|
|
251
|
+
)
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
def session_head(self, scope: RunScope, session_id: str) -> RunSnapshot | None:
|
|
255
|
+
with self._transaction() as connection:
|
|
256
|
+
return self._session_head(connection, encode(scope), session_id)
|
|
257
|
+
|
|
258
|
+
def _session_head(
|
|
259
|
+
self, connection: sqlite3.Connection, scope: str, session_id: str
|
|
260
|
+
) -> RunSnapshot | None:
|
|
261
|
+
row = connection.execute(
|
|
262
|
+
"SELECT run_id FROM native_session_heads WHERE scope = ? AND session_id = ?",
|
|
263
|
+
(scope, session_id),
|
|
264
|
+
).fetchone()
|
|
265
|
+
return (
|
|
266
|
+
RunSnapshot.model_validate_json(self._row(connection, scope, row[0])[0])
|
|
267
|
+
if row
|
|
268
|
+
else None
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
def create_turn(self, snapshot: RunSnapshot, *, expected_parent_run_id: str | None) -> None:
|
|
272
|
+
snapshot = detached(snapshot)
|
|
273
|
+
key = encode(snapshot.scope)
|
|
274
|
+
with self._transaction(write=True) as connection:
|
|
275
|
+
head = self._session_head(connection, key, snapshot.session_id)
|
|
276
|
+
check_turn(snapshot, head, expected_parent_run_id)
|
|
277
|
+
connection.execute(
|
|
278
|
+
"INSERT INTO native_runs(scope, run_id, snapshot) VALUES (?, ?, ?)",
|
|
279
|
+
(key, snapshot.run_id, encode(snapshot)),
|
|
280
|
+
)
|
|
281
|
+
connection.execute(
|
|
282
|
+
"INSERT INTO native_session_heads(scope, session_id, run_id) VALUES (?, ?, ?) "
|
|
283
|
+
"ON CONFLICT(scope, session_id) DO UPDATE SET run_id = excluded.run_id",
|
|
284
|
+
(key, snapshot.session_id, snapshot.run_id),
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
def create_fork(self, snapshot: RunSnapshot) -> ForkCreation:
|
|
288
|
+
snapshot = detached(snapshot)
|
|
289
|
+
key = encode(snapshot.scope)
|
|
290
|
+
with self._transaction(write=True) as connection:
|
|
291
|
+
ref = snapshot.fork_source
|
|
292
|
+
if ref is None:
|
|
293
|
+
raise StoreConflict("fork source boundary required")
|
|
294
|
+
source = RunSnapshot.model_validate_json(
|
|
295
|
+
self._row(connection, key, ref.source_run_id)[0]
|
|
296
|
+
)
|
|
297
|
+
check_fork(snapshot, source)
|
|
298
|
+
if snapshot.fork_command is not None:
|
|
299
|
+
prior = connection.execute(
|
|
300
|
+
"SELECT snapshot FROM native_runs WHERE scope=? AND run_id=?",
|
|
301
|
+
(key, snapshot.run_id),
|
|
302
|
+
).fetchone()
|
|
303
|
+
if prior is not None:
|
|
304
|
+
return duplicate_fork(snapshot, RunSnapshot.model_validate_json(prior[0]))
|
|
305
|
+
if self._session_head(connection, key, snapshot.session_id) is not None:
|
|
306
|
+
raise StoreConflict("fork destination already exists")
|
|
307
|
+
connection.execute(
|
|
308
|
+
"INSERT INTO native_runs(scope, run_id, snapshot) VALUES (?, ?, ?)",
|
|
309
|
+
(key, snapshot.run_id, encode(snapshot)),
|
|
310
|
+
)
|
|
311
|
+
connection.execute(
|
|
312
|
+
"INSERT INTO native_session_heads(scope, session_id, run_id) VALUES (?, ?, ?)",
|
|
313
|
+
(key, snapshot.session_id, snapshot.run_id),
|
|
314
|
+
)
|
|
315
|
+
return ForkCreation(snapshot=snapshot, created=True)
|
|
316
|
+
|
|
317
|
+
def acquire(self, scope: RunScope, run_id: str) -> int:
|
|
318
|
+
key = encode(scope)
|
|
319
|
+
with self._transaction(write=True) as connection:
|
|
320
|
+
_, fence = self._row(connection, key, run_id)
|
|
321
|
+
lease = connection.execute(
|
|
322
|
+
"SELECT expires_at FROM native_run_leases WHERE scope = ? AND run_id = ?",
|
|
323
|
+
(key, run_id),
|
|
324
|
+
).fetchone()
|
|
325
|
+
if lease is not None:
|
|
326
|
+
if lease[0] > time():
|
|
327
|
+
raise LeaseBusy("run has an active owner lease")
|
|
328
|
+
connection.execute(
|
|
329
|
+
"DELETE FROM native_run_leases WHERE scope = ? AND run_id = ?",
|
|
330
|
+
(key, run_id),
|
|
331
|
+
)
|
|
332
|
+
connection.execute(
|
|
333
|
+
"UPDATE native_runs SET fence = ? WHERE scope = ? AND run_id = ?",
|
|
334
|
+
(fence + 1, key, run_id),
|
|
335
|
+
)
|
|
336
|
+
return fence + 1
|
|
337
|
+
|
|
338
|
+
@staticmethod
|
|
339
|
+
def _lease_args(owner_id: str, ttl_seconds: float) -> None:
|
|
340
|
+
if not isinstance(owner_id, str) or not owner_id.strip() or len(owner_id) > 160:
|
|
341
|
+
raise ValueError("lease owner must be a nonempty bounded ID")
|
|
342
|
+
if type(ttl_seconds) not in {int, float} or not 0 < ttl_seconds <= 3600:
|
|
343
|
+
raise ValueError("lease TTL must be positive and at most one hour")
|
|
344
|
+
|
|
345
|
+
def acquire_lease(
|
|
346
|
+
self, scope: RunScope, run_id: str, *, owner_id: str, ttl_seconds: float
|
|
347
|
+
) -> int:
|
|
348
|
+
"""Claim an unowned/expired run; an active owner keeps its epoch."""
|
|
349
|
+
self._lease_args(owner_id, ttl_seconds)
|
|
350
|
+
key = encode(scope)
|
|
351
|
+
with self._transaction(write=True) as connection:
|
|
352
|
+
_, fence = self._row(connection, key, run_id)
|
|
353
|
+
now = time()
|
|
354
|
+
lease = connection.execute(
|
|
355
|
+
"SELECT owner_id, expires_at FROM native_run_leases WHERE scope = ? AND run_id = ?",
|
|
356
|
+
(key, run_id),
|
|
357
|
+
).fetchone()
|
|
358
|
+
if lease is not None and lease[1] > now:
|
|
359
|
+
if lease[0] != owner_id:
|
|
360
|
+
raise LeaseBusy("run has an active owner lease")
|
|
361
|
+
connection.execute(
|
|
362
|
+
"UPDATE native_run_leases SET expires_at = ? WHERE scope = ? AND run_id = ?",
|
|
363
|
+
(now + ttl_seconds, key, run_id),
|
|
364
|
+
)
|
|
365
|
+
return fence
|
|
366
|
+
next_fence = fence + 1
|
|
367
|
+
connection.execute(
|
|
368
|
+
"UPDATE native_runs SET fence = ? WHERE scope = ? AND run_id = ?",
|
|
369
|
+
(next_fence, key, run_id),
|
|
370
|
+
)
|
|
371
|
+
connection.execute(
|
|
372
|
+
"INSERT INTO native_run_leases(scope, run_id, owner_id, expires_at) "
|
|
373
|
+
"VALUES (?, ?, ?, ?) ON CONFLICT(scope, run_id) DO UPDATE SET "
|
|
374
|
+
"owner_id = excluded.owner_id, expires_at = excluded.expires_at",
|
|
375
|
+
(key, run_id, owner_id, now + ttl_seconds),
|
|
376
|
+
)
|
|
377
|
+
return next_fence
|
|
378
|
+
|
|
379
|
+
def renew_lease(
|
|
380
|
+
self,
|
|
381
|
+
scope: RunScope,
|
|
382
|
+
run_id: str,
|
|
383
|
+
*,
|
|
384
|
+
owner_id: str,
|
|
385
|
+
fencing_token: int,
|
|
386
|
+
ttl_seconds: float,
|
|
387
|
+
) -> None:
|
|
388
|
+
self._lease_args(owner_id, ttl_seconds)
|
|
389
|
+
key = encode(scope)
|
|
390
|
+
with self._transaction(write=True) as connection:
|
|
391
|
+
_, fence = self._row(connection, key, run_id)
|
|
392
|
+
check_fence(fence, fencing_token)
|
|
393
|
+
now = time()
|
|
394
|
+
changed = connection.execute(
|
|
395
|
+
"UPDATE native_run_leases SET expires_at = ? "
|
|
396
|
+
"WHERE scope = ? AND run_id = ? AND owner_id = ? AND expires_at > ?",
|
|
397
|
+
(now + ttl_seconds, key, run_id, owner_id, now),
|
|
398
|
+
).rowcount
|
|
399
|
+
if changed != 1:
|
|
400
|
+
raise StoreConflict("run lease expired or changed owner")
|
|
401
|
+
|
|
402
|
+
def release_lease(
|
|
403
|
+
self, scope: RunScope, run_id: str, *, owner_id: str, fencing_token: int
|
|
404
|
+
) -> None:
|
|
405
|
+
key = encode(scope)
|
|
406
|
+
with self._transaction(write=True) as connection:
|
|
407
|
+
_, fence = self._row(connection, key, run_id)
|
|
408
|
+
check_fence(fence, fencing_token)
|
|
409
|
+
changed = connection.execute(
|
|
410
|
+
"DELETE FROM native_run_leases WHERE scope = ? AND run_id = ? AND owner_id = ?",
|
|
411
|
+
(key, run_id, owner_id),
|
|
412
|
+
).rowcount
|
|
413
|
+
if changed != 1:
|
|
414
|
+
raise StoreConflict("run lease is not owned by caller")
|
|
415
|
+
# Revocation must fence even a previously successful commit replay.
|
|
416
|
+
connection.execute(
|
|
417
|
+
"UPDATE native_runs SET fence = ? WHERE scope = ? AND run_id = ?",
|
|
418
|
+
(fence + 1, key, run_id),
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
@staticmethod
|
|
422
|
+
def _check_live_lease(connection: sqlite3.Connection, key: str, run_id: str) -> None:
|
|
423
|
+
lease = connection.execute(
|
|
424
|
+
"SELECT expires_at FROM native_run_leases WHERE scope = ? AND run_id = ?",
|
|
425
|
+
(key, run_id),
|
|
426
|
+
).fetchone()
|
|
427
|
+
if lease is not None and lease[0] <= time():
|
|
428
|
+
raise StoreConflict("run lease expired")
|
|
429
|
+
|
|
430
|
+
def enqueue(self, scope: RunScope, run_id: str, command: RunCommand) -> CommandReceipt:
|
|
431
|
+
command = detached(command)
|
|
432
|
+
key, raw = encode(scope), encode(command)
|
|
433
|
+
with self._transaction(write=True) as connection:
|
|
434
|
+
saved, _ = self._row(connection, key, run_id)
|
|
435
|
+
existing = connection.execute(
|
|
436
|
+
"SELECT data FROM native_commands "
|
|
437
|
+
"WHERE scope = ? AND run_id = ? AND command_id = ?",
|
|
438
|
+
(key, run_id, command.command_id),
|
|
439
|
+
).fetchone()
|
|
440
|
+
if existing is not None:
|
|
441
|
+
if existing[0] != raw:
|
|
442
|
+
raise StoreConflict("command ID payload mismatch")
|
|
443
|
+
return CommandReceipt(command_id=command.command_id, status="duplicate")
|
|
444
|
+
if RunSnapshot.model_validate_json(saved).phase.terminal:
|
|
445
|
+
return CommandReceipt(
|
|
446
|
+
command_id=command.command_id, status="rejected", reason="run is terminal"
|
|
447
|
+
)
|
|
448
|
+
connection.execute(
|
|
449
|
+
"INSERT INTO native_commands(scope, run_id, command_id, priority, data) "
|
|
450
|
+
"VALUES (?, ?, ?, ?, ?)",
|
|
451
|
+
(key, run_id, command.command_id, command.priority, raw),
|
|
452
|
+
)
|
|
453
|
+
return CommandReceipt(command_id=command.command_id, status="accepted")
|
|
454
|
+
|
|
455
|
+
def commands(self, scope: RunScope, run_id: str) -> tuple[RunCommand, ...]:
|
|
456
|
+
key = encode(scope)
|
|
457
|
+
with self._transaction() as connection:
|
|
458
|
+
self._row(connection, key, run_id)
|
|
459
|
+
rows = connection.execute(
|
|
460
|
+
"SELECT data FROM native_commands WHERE scope = ? AND run_id = ? AND consumed = 0 "
|
|
461
|
+
"ORDER BY priority DESC, enqueue_order ASC",
|
|
462
|
+
(key, run_id),
|
|
463
|
+
).fetchall()
|
|
464
|
+
return tuple(RunCommand.model_validate_json(row[0]) for row in rows)
|
|
465
|
+
|
|
466
|
+
def commit(
|
|
467
|
+
self, scope: RunScope, batch: CommitBatch, *, expected_revision: int, fencing_token: int
|
|
468
|
+
) -> RunSnapshot:
|
|
469
|
+
return self._commit(scope, batch, expected_revision=expected_revision,
|
|
470
|
+
fencing_token=fencing_token)
|
|
471
|
+
|
|
472
|
+
def commit_child_input(self, scope, batch, *, expected_revision, fencing_token, delivery):
|
|
473
|
+
return self._commit(scope, batch, expected_revision=expected_revision,
|
|
474
|
+
fencing_token=fencing_token, delivery=detached(delivery))
|
|
475
|
+
|
|
476
|
+
def _commit(self, scope, batch, *, expected_revision, fencing_token, delivery=None):
|
|
477
|
+
batch = detached(batch)
|
|
478
|
+
check_scope(scope, batch.snapshot)
|
|
479
|
+
key, run_id, raw = encode(scope), batch.snapshot.run_id, encode(batch)
|
|
480
|
+
if delivery is not None:
|
|
481
|
+
raw += "\n" + encode(delivery)
|
|
482
|
+
with self._transaction(write=True) as connection:
|
|
483
|
+
current_raw, fence = self._row(connection, key, run_id)
|
|
484
|
+
check_fence(fence, fencing_token)
|
|
485
|
+
self._check_live_lease(connection, key, run_id)
|
|
486
|
+
prior = connection.execute(
|
|
487
|
+
"SELECT payload, snapshot FROM native_commits "
|
|
488
|
+
"WHERE scope = ? AND run_id = ? AND commit_id = ?",
|
|
489
|
+
(key, run_id, batch.commit_id),
|
|
490
|
+
).fetchone()
|
|
491
|
+
if prior is not None:
|
|
492
|
+
if prior[0] != raw:
|
|
493
|
+
raise StoreConflict("commit ID payload mismatch")
|
|
494
|
+
return RunSnapshot.model_validate_json(prior[1])
|
|
495
|
+
current = RunSnapshot.model_validate_json(current_raw)
|
|
496
|
+
check_commit(current, batch, expected_revision)
|
|
497
|
+
if delivery is not None:
|
|
498
|
+
from ksadk.harness.native.child_input import ChildInputRejected, check_delivery
|
|
499
|
+
|
|
500
|
+
child_key = encode(delivery.target.scope)
|
|
501
|
+
try:
|
|
502
|
+
child_raw, _ = self._row(connection, child_key, delivery.target.run_id)
|
|
503
|
+
except (KeyError, ScopeMismatch) as exc:
|
|
504
|
+
raise ChildInputRejected("child_input_origin_changed") from exc
|
|
505
|
+
def pending_commands(command_scope, command_run_id):
|
|
506
|
+
rows = connection.execute(
|
|
507
|
+
"SELECT data FROM native_commands WHERE scope = ? AND run_id = ? "
|
|
508
|
+
"AND consumed = 0 ORDER BY priority DESC, enqueue_order ASC",
|
|
509
|
+
(command_scope, command_run_id),
|
|
510
|
+
).fetchall()
|
|
511
|
+
return tuple(RunCommand.model_validate_json(row[0]) for row in rows)
|
|
512
|
+
|
|
513
|
+
parent_commands = pending_commands(key, run_id)
|
|
514
|
+
command = next((item for item in parent_commands
|
|
515
|
+
if item.command_id == batch.consumed_command_id), None)
|
|
516
|
+
if command is None:
|
|
517
|
+
raise StoreConflict("command is missing or already consumed")
|
|
518
|
+
check_delivery(
|
|
519
|
+
current, RunSnapshot.model_validate_json(child_raw), command, delivery,
|
|
520
|
+
parent_commands=parent_commands,
|
|
521
|
+
child_commands=pending_commands(child_key, delivery.target.run_id),
|
|
522
|
+
)
|
|
523
|
+
child_command_raw = encode(delivery.command)
|
|
524
|
+
existing = connection.execute(
|
|
525
|
+
"SELECT data FROM native_commands WHERE scope = ? AND run_id = ? "
|
|
526
|
+
"AND command_id = ?", (child_key, delivery.target.run_id,
|
|
527
|
+
delivery.command.command_id),
|
|
528
|
+
).fetchone()
|
|
529
|
+
if existing is not None and existing[0] != child_command_raw:
|
|
530
|
+
raise StoreConflict("child command ID payload mismatch")
|
|
531
|
+
if existing is None:
|
|
532
|
+
connection.execute(
|
|
533
|
+
"INSERT INTO native_commands(scope, run_id, command_id, priority, data) "
|
|
534
|
+
"VALUES (?, ?, ?, ?, ?)", (child_key, delivery.target.run_id,
|
|
535
|
+
delivery.command.command_id, delivery.command.priority,
|
|
536
|
+
child_command_raw),
|
|
537
|
+
)
|
|
538
|
+
if (batch.snapshot.phase.terminal or batch.require_no_pending_commands) and (
|
|
539
|
+
batch.consumed_command_id is None
|
|
540
|
+
):
|
|
541
|
+
pending = connection.execute(
|
|
542
|
+
"SELECT 1 FROM native_commands WHERE scope = ? AND run_id = ? "
|
|
543
|
+
"AND consumed = 0 LIMIT 1",
|
|
544
|
+
(key, run_id),
|
|
545
|
+
).fetchone()
|
|
546
|
+
if pending is not None:
|
|
547
|
+
raise PendingCommandConflict(
|
|
548
|
+
"pending command prevents guarded commit"
|
|
549
|
+
if batch.require_no_pending_commands
|
|
550
|
+
else "pending command prevents terminal commit"
|
|
551
|
+
)
|
|
552
|
+
discarded_ids = ()
|
|
553
|
+
if batch.snapshot.phase.terminal and batch.consumed_command_id is not None:
|
|
554
|
+
rows = connection.execute(
|
|
555
|
+
"SELECT data FROM native_commands WHERE scope = ? AND run_id = ? "
|
|
556
|
+
"AND consumed = 0 ORDER BY priority DESC, enqueue_order ASC",
|
|
557
|
+
(key, run_id),
|
|
558
|
+
).fetchall()
|
|
559
|
+
pending_commands = tuple(RunCommand.model_validate_json(row[0]) for row in rows)
|
|
560
|
+
if not any(
|
|
561
|
+
command.command_id == batch.consumed_command_id
|
|
562
|
+
for command in pending_commands
|
|
563
|
+
):
|
|
564
|
+
raise StoreConflict("command is missing or already consumed")
|
|
565
|
+
batch, discarded_ids = settle_terminal_commands(current, batch, pending_commands)
|
|
566
|
+
check_commit(current, batch, expected_revision)
|
|
567
|
+
# Event inserts are append-only; uniqueness constraints also detect
|
|
568
|
+
# a reused event ID from an earlier revision, rolling everything back.
|
|
569
|
+
for event in batch.events:
|
|
570
|
+
connection.execute(
|
|
571
|
+
"INSERT INTO native_events(scope, run_id, seq, event_id, data) "
|
|
572
|
+
"VALUES (?, ?, ?, ?, ?)",
|
|
573
|
+
(key, run_id, event.seq, event.event_id, encode(event)),
|
|
574
|
+
)
|
|
575
|
+
for intent in batch.intents:
|
|
576
|
+
existing = connection.execute(
|
|
577
|
+
"SELECT data FROM native_intents "
|
|
578
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
579
|
+
(key, run_id, intent.operation_key),
|
|
580
|
+
).fetchone()
|
|
581
|
+
check_intent(
|
|
582
|
+
EffectIntent.model_validate_json(existing[0]) if existing else None, intent
|
|
583
|
+
)
|
|
584
|
+
if existing is None:
|
|
585
|
+
connection.execute(
|
|
586
|
+
"INSERT INTO native_intents(scope, run_id, operation_key, data) "
|
|
587
|
+
"VALUES (?, ?, ?, ?)",
|
|
588
|
+
(key, run_id, intent.operation_key, encode(intent)),
|
|
589
|
+
)
|
|
590
|
+
for receipt in batch.receipts:
|
|
591
|
+
intent = connection.execute(
|
|
592
|
+
"SELECT 1 FROM native_intents "
|
|
593
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
594
|
+
(key, run_id, receipt.operation_key),
|
|
595
|
+
).fetchone()
|
|
596
|
+
if intent is None:
|
|
597
|
+
raise StoreConflict("receipt has no prepared intent")
|
|
598
|
+
existing = connection.execute(
|
|
599
|
+
"SELECT data FROM native_receipts "
|
|
600
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
601
|
+
(key, run_id, receipt.operation_key),
|
|
602
|
+
).fetchone()
|
|
603
|
+
check_receipt(
|
|
604
|
+
EffectReceipt.model_validate_json(existing[0]) if existing else None, receipt
|
|
605
|
+
)
|
|
606
|
+
if existing is None:
|
|
607
|
+
connection.execute(
|
|
608
|
+
"INSERT INTO native_receipts(scope, run_id, operation_key, data) "
|
|
609
|
+
"VALUES (?, ?, ?, ?)",
|
|
610
|
+
(key, run_id, receipt.operation_key, encode(receipt)),
|
|
611
|
+
)
|
|
612
|
+
if batch.consumed_command_id is not None:
|
|
613
|
+
changed = connection.execute(
|
|
614
|
+
"UPDATE native_commands SET consumed = 1 WHERE scope = ? AND run_id = ? "
|
|
615
|
+
"AND command_id = ? AND consumed = 0",
|
|
616
|
+
(key, run_id, batch.consumed_command_id),
|
|
617
|
+
).rowcount
|
|
618
|
+
if changed != 1:
|
|
619
|
+
raise StoreConflict("command is missing or already consumed")
|
|
620
|
+
for command_id in discarded_ids:
|
|
621
|
+
connection.execute(
|
|
622
|
+
"UPDATE native_commands SET consumed = 1 WHERE scope = ? AND run_id = ? "
|
|
623
|
+
"AND command_id = ? AND consumed = 0",
|
|
624
|
+
(key, run_id, command_id),
|
|
625
|
+
)
|
|
626
|
+
saved = encode(batch.snapshot)
|
|
627
|
+
connection.execute(
|
|
628
|
+
"UPDATE native_runs SET snapshot = ? WHERE scope = ? AND run_id = ?",
|
|
629
|
+
(saved, key, run_id),
|
|
630
|
+
)
|
|
631
|
+
connection.execute(
|
|
632
|
+
"INSERT INTO native_commits(scope, run_id, commit_id, payload, snapshot) "
|
|
633
|
+
"VALUES (?, ?, ?, ?, ?)",
|
|
634
|
+
(key, run_id, batch.commit_id, raw, saved),
|
|
635
|
+
)
|
|
636
|
+
return RunSnapshot.model_validate_json(saved)
|
|
637
|
+
|
|
638
|
+
def events(self, scope: RunScope, run_id: str, after_seq: int = 0) -> tuple[NativeEvent, ...]:
|
|
639
|
+
key = encode(scope)
|
|
640
|
+
with self._transaction() as connection:
|
|
641
|
+
self._row(connection, key, run_id)
|
|
642
|
+
rows = connection.execute(
|
|
643
|
+
"SELECT data FROM native_events "
|
|
644
|
+
"WHERE scope = ? AND run_id = ? AND seq > ? ORDER BY seq",
|
|
645
|
+
(key, run_id, after_seq),
|
|
646
|
+
).fetchall()
|
|
647
|
+
return tuple(NativeEvent.model_validate_json(row[0]) for row in rows)
|
|
648
|
+
|
|
649
|
+
def pending_outbox(
|
|
650
|
+
self, scope: RunScope, run_id: str, consumer: str, *, limit: int = 100
|
|
651
|
+
) -> tuple[NativeEvent, ...]:
|
|
652
|
+
"""Read committed events after this consumer's durable cursor.
|
|
653
|
+
|
|
654
|
+
``native_events`` is the transactional outbox payload: the event row
|
|
655
|
+
and snapshot commit are written together. Delivery remains at least
|
|
656
|
+
once until the consumer acknowledges the event identity.
|
|
657
|
+
"""
|
|
658
|
+
if not consumer.strip() or type(limit) is not int or not 1 <= limit <= 1000:
|
|
659
|
+
raise ValueError("outbox consumer and limit must be valid")
|
|
660
|
+
key = encode(scope)
|
|
661
|
+
with self._transaction() as connection:
|
|
662
|
+
self._row(connection, key, run_id)
|
|
663
|
+
row = connection.execute(
|
|
664
|
+
"SELECT cursor FROM native_outbox_cursors "
|
|
665
|
+
"WHERE scope = ? AND run_id = ? AND consumer = ?",
|
|
666
|
+
(key, run_id, consumer),
|
|
667
|
+
).fetchone()
|
|
668
|
+
cursor = row[0] if row else 0
|
|
669
|
+
rows = connection.execute(
|
|
670
|
+
"SELECT data FROM native_events WHERE scope = ? AND run_id = ? AND seq > ? "
|
|
671
|
+
"ORDER BY seq LIMIT ?",
|
|
672
|
+
(key, run_id, cursor, limit),
|
|
673
|
+
).fetchall()
|
|
674
|
+
return tuple(NativeEvent.model_validate_json(item[0]) for item in rows)
|
|
675
|
+
|
|
676
|
+
def ack_outbox(
|
|
677
|
+
self, scope: RunScope, run_id: str, consumer: str, *, seq: int, event_id: str
|
|
678
|
+
) -> int:
|
|
679
|
+
"""Advance one contiguous event; reject gaps and mismatched identity."""
|
|
680
|
+
if not consumer.strip() or type(seq) is not int or seq < 1 or not event_id:
|
|
681
|
+
raise ValueError("outbox acknowledgment must identify an event")
|
|
682
|
+
key = encode(scope)
|
|
683
|
+
with self._transaction(write=True) as connection:
|
|
684
|
+
self._row(connection, key, run_id)
|
|
685
|
+
event = connection.execute(
|
|
686
|
+
"SELECT event_id FROM native_events WHERE scope = ? AND run_id = ? AND seq = ?",
|
|
687
|
+
(key, run_id, seq),
|
|
688
|
+
).fetchone()
|
|
689
|
+
if event is None or event[0] != event_id:
|
|
690
|
+
raise StoreConflict("outbox event identity mismatch")
|
|
691
|
+
row = connection.execute(
|
|
692
|
+
"SELECT cursor FROM native_outbox_cursors "
|
|
693
|
+
"WHERE scope = ? AND run_id = ? AND consumer = ?",
|
|
694
|
+
(key, run_id, consumer),
|
|
695
|
+
).fetchone()
|
|
696
|
+
cursor = row[0] if row else 0
|
|
697
|
+
if seq > cursor + 1:
|
|
698
|
+
raise StoreConflict("outbox acknowledgment would skip events")
|
|
699
|
+
if seq <= cursor:
|
|
700
|
+
return cursor
|
|
701
|
+
connection.execute(
|
|
702
|
+
"INSERT INTO native_outbox_cursors(scope, run_id, consumer, cursor) "
|
|
703
|
+
"VALUES (?, ?, ?, ?) ON CONFLICT(scope, run_id, consumer) "
|
|
704
|
+
"DO UPDATE SET cursor = excluded.cursor",
|
|
705
|
+
(key, run_id, consumer, seq),
|
|
706
|
+
)
|
|
707
|
+
return seq
|
|
708
|
+
|
|
709
|
+
def get_intent(self, scope: RunScope, run_id: str, operation_key: str) -> EffectIntent | None:
|
|
710
|
+
key = encode(scope)
|
|
711
|
+
with self._transaction() as connection:
|
|
712
|
+
self._row(connection, key, run_id)
|
|
713
|
+
row = connection.execute(
|
|
714
|
+
"SELECT data FROM native_intents "
|
|
715
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
716
|
+
(key, run_id, operation_key),
|
|
717
|
+
).fetchone()
|
|
718
|
+
return EffectIntent.model_validate_json(row[0]) if row else None
|
|
719
|
+
|
|
720
|
+
def claim_intent(
|
|
721
|
+
self, scope: RunScope, run_id: str, operation_key: str, *, fencing_token: int,
|
|
722
|
+
require_no_pending_commands: bool = False,
|
|
723
|
+
) -> EffectIntent:
|
|
724
|
+
key = encode(scope)
|
|
725
|
+
with self._transaction(write=True) as connection:
|
|
726
|
+
snapshot, fence = self._row(connection, key, run_id)
|
|
727
|
+
check_fence(fence, fencing_token)
|
|
728
|
+
self._check_live_lease(connection, key, run_id)
|
|
729
|
+
if RunSnapshot.model_validate_json(snapshot).phase.terminal:
|
|
730
|
+
raise StoreConflict("terminal run is immutable")
|
|
731
|
+
if require_no_pending_commands and connection.execute(
|
|
732
|
+
"SELECT 1 FROM native_commands WHERE scope=? AND run_id=? AND consumed=0 LIMIT 1",
|
|
733
|
+
(key, run_id),
|
|
734
|
+
).fetchone() is not None:
|
|
735
|
+
raise PendingCommandConflict("pending command prevents effect claim")
|
|
736
|
+
row = connection.execute(
|
|
737
|
+
"SELECT data FROM native_intents "
|
|
738
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
739
|
+
(key, run_id, operation_key),
|
|
740
|
+
).fetchone()
|
|
741
|
+
if row is None:
|
|
742
|
+
raise KeyError("intent not found")
|
|
743
|
+
intent = EffectIntent.model_validate_json(row[0])
|
|
744
|
+
receipt = connection.execute(
|
|
745
|
+
"SELECT 1 FROM native_receipts "
|
|
746
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
747
|
+
(key, run_id, operation_key),
|
|
748
|
+
).fetchone()
|
|
749
|
+
if intent.status != "prepared" or receipt is not None:
|
|
750
|
+
raise EffectAlreadyClaimed("effect is running or already has a receipt")
|
|
751
|
+
claimed = intent.model_copy(update={"status": "running"})
|
|
752
|
+
connection.execute(
|
|
753
|
+
"UPDATE native_intents SET data = ? "
|
|
754
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
755
|
+
(encode(claimed), key, run_id, operation_key),
|
|
756
|
+
)
|
|
757
|
+
return detached(claimed)
|
|
758
|
+
|
|
759
|
+
def get_receipt(self, scope: RunScope, run_id: str, operation_key: str) -> EffectReceipt | None:
|
|
760
|
+
key = encode(scope)
|
|
761
|
+
with self._transaction() as connection:
|
|
762
|
+
self._row(connection, key, run_id)
|
|
763
|
+
row = connection.execute(
|
|
764
|
+
"SELECT data FROM native_receipts "
|
|
765
|
+
"WHERE scope = ? AND run_id = ? AND operation_key = ?",
|
|
766
|
+
(key, run_id, operation_key),
|
|
767
|
+
).fetchone()
|
|
768
|
+
return EffectReceipt.model_validate_json(row[0]) if row else None
|
|
769
|
+
|
|
770
|
+
def close(self) -> None:
|
|
771
|
+
with self._lock:
|
|
772
|
+
if not self._closed:
|
|
773
|
+
self._connection.close()
|
|
774
|
+
self._closed = True
|
|
775
|
+
|
|
776
|
+
def __enter__(self) -> SQLiteRunStore:
|
|
777
|
+
if self._closed:
|
|
778
|
+
raise StoreConflict("store is closed")
|
|
779
|
+
return self
|
|
780
|
+
|
|
781
|
+
def __exit__(self, *_args) -> None:
|
|
782
|
+
self.close()
|