agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/METADATA +17 -10
- agentengine_sdk_python-0.8.6.dist-info/RECORD +1731 -0
- ksadk/_async_iterators.py +79 -0
- ksadk/_build_provenance.json +1 -1
- ksadk/_model_anthropic.py +49 -0
- ksadk/_model_input.py +86 -0
- ksadk/_model_json.py +40 -0
- ksadk/_model_reasoning.py +17 -0
- ksadk/_model_refusal.py +20 -0
- ksadk/_model_sse.py +163 -0
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2a/__init__.py +157 -167
- ksadk/a2a/_invocation_state.py +86 -0
- ksadk/a2a/_space_client_events.py +33 -22
- ksadk/a2a/adk.py +194 -0
- ksadk/a2a/adk_invocation_context.py +242 -0
- ksadk/a2a/adk_runtime.py +126 -0
- ksadk/a2a/adk_tools.py +319 -0
- ksadk/a2a/bootstrap.py +149 -23
- ksadk/a2a/build_validation.py +147 -0
- ksadk/a2a/card.py +23 -15
- ksadk/a2a/codex.py +160 -0
- ksadk/a2a/codex_checkpoint.py +111 -0
- ksadk/a2a/codex_recovery.py +96 -0
- ksadk/a2a/codex_recovery_events.py +123 -0
- ksadk/a2a/codex_runtime.py +198 -0
- ksadk/a2a/codex_session_checkpoint.py +162 -0
- ksadk/a2a/composition.py +88 -0
- ksadk/a2a/context_store.py +118 -19
- ksadk/a2a/control_plane.py +108 -106
- ksadk/a2a/event_adapter.py +92 -193
- ksadk/a2a/executor.py +257 -85
- ksadk/a2a/exposure.py +106 -0
- ksadk/a2a/external_transport.py +3 -4
- ksadk/a2a/identity.py +106 -12
- ksadk/a2a/ids.py +14 -3
- ksadk/a2a/inbound_kernel.py +133 -0
- ksadk/a2a/interaction_wire.py +76 -0
- ksadk/a2a/invocation_checkpoint.py +274 -0
- ksadk/a2a/invocation_policy.py +87 -0
- ksadk/a2a/invocation_publication.py +210 -0
- ksadk/a2a/invocation_service.py +972 -0
- ksadk/a2a/invocation_types.py +459 -0
- ksadk/a2a/kernel_task_adapter.py +259 -0
- ksadk/a2a/langgraph.py +20 -7
- ksadk/a2a/langgraph_invocation_context.py +136 -0
- ksadk/a2a/langgraph_managed.py +150 -0
- ksadk/a2a/langgraph_recovery.py +32 -0
- ksadk/a2a/langgraph_runtime.py +89 -0
- ksadk/a2a/langgraph_tool_runtime.py +132 -0
- ksadk/a2a/langgraph_tools.py +63 -0
- ksadk/a2a/message_digest.py +40 -0
- ksadk/a2a/platform.py +389 -0
- ksadk/a2a/policy_refs.py +13 -0
- ksadk/a2a/presentation.py +402 -0
- ksadk/a2a/product_kernel_facts.py +177 -0
- ksadk/a2a/product_key.py +99 -0
- ksadk/a2a/protocol_errors.py +116 -0
- ksadk/a2a/result_text.py +49 -0
- ksadk/a2a/resume_store.py +93 -3
- ksadk/a2a/routes.py +6 -1
- ksadk/a2a/runtime_approval.py +198 -0
- ksadk/a2a/runtime_input.py +151 -0
- ksadk/a2a/server.py +16 -7
- ksadk/a2a/space_client.py +101 -16
- ksadk/a2a/task_adapter.py +19 -5
- ksadk/a2a/task_event_dispatcher.py +39 -2
- ksadk/a2a/task_event_outbox.py +215 -0
- ksadk/a2a/task_event_outbox_owned.py +130 -0
- ksadk/a2a/task_store.py +37 -0
- ksadk/a2a/tool_activity.py +176 -0
- ksadk/a2a/workload_tokens.py +134 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +38 -79
- ksadk/api/sse_stream.py +96 -0
- ksadk/builders/code_builder.py +121 -118
- ksadk/builders/container_builder.py +11 -29
- ksadk/builders/framework_requirements.py +22 -2
- ksadk/builders/managed_runtime_builder.py +12 -0
- ksadk/builders/source_provenance.py +87 -0
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_a2a.py +43 -0
- ksadk/cli/cmd_build.py +9 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_deploy.py +27 -2
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +64 -88
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +69 -17
- ksadk/cli/cmd_web.py +2 -0
- ksadk/cli/hosted_invoke.py +206 -0
- ksadk/cli/invoke_content.py +60 -0
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/cli/runtime_bootstrap.py +27 -5
- ksadk/codex/_expert_request_reader.py +48 -0
- ksadk/codex/a2a_tools.py +140 -0
- ksadk/codex/async_approval.py +169 -0
- ksadk/codex/async_client.py +938 -0
- ksadk/codex/async_proxy.py +216 -0
- ksadk/codex/base_runtime.py +25 -0
- ksadk/codex/client.py +3 -1047
- ksadk/codex/client_payloads.py +85 -0
- ksadk/codex/rollout_checkpoint.py +264 -0
- ksadk/codex/runtime.py +290 -54
- ksadk/common/auth.py +2 -2
- ksadk/common/cloud_headers.py +36 -0
- ksadk/common/diagnostics.py +34 -0
- ksadk/common/kop_client.py +2 -1
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +216 -143
- ksadk/configs/env_registry_a2a.py +173 -0
- ksadk/configs/env_registry_studio.py +134 -0
- ksadk/configs/global_config.py +2 -1
- ksadk/configs/settings.py +9 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/assembler.py +9 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/context_engine/contributors.py +80 -17
- ksadk/context_engine/instruction_authority.py +18 -0
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +69 -20
- ksadk/conversations/contracts.py +28 -9
- ksadk/conversations/message_projection.py +51 -155
- ksadk/conversations/message_projection_blocks.py +137 -0
- ksadk/conversations/model_context.py +11 -3
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +63 -0
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_compaction.py +7 -2
- ksadk/conversations/runtime_input.py +16 -4
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +12 -0
- ksadk/conversations/runtime_persistence.py +296 -32
- ksadk/conversations/runtime_preparation.py +98 -13
- ksadk/conversations/runtime_projection.py +217 -0
- ksadk/conversations/runtime_resume.py +141 -70
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/conversations/tool_receipt_resume.py +387 -0
- ksadk/conversations/tool_receipts.py +32 -0
- ksadk/deployment/env_forward.py +5 -0
- ksadk/deployment/manager.py +15 -6
- ksadk/deployment/providers/serverless.py +76 -136
- ksadk/deployment/providers/serverless_payloads.py +122 -0
- ksadk/evaluation/agent_eval_client.py +2 -1
- ksadk/evaluation/contracts.py +78 -3
- ksadk/evaluation/evaluators.py +166 -1
- ksadk/evaluation/evidence.py +271 -4
- ksadk/evaluation/local_adapter.py +76 -12
- ksadk/evaluation/studio_build_adapter.py +73 -9
- ksadk/events/adapters/_a2a_checkpoint.py +151 -0
- ksadk/events/adapters/_a2a_snapshot.py +18 -14
- ksadk/events/adapters/_a2a_support.py +15 -3
- ksadk/events/adapters/_a2a_tool_activity.py +123 -0
- ksadk/events/adapters/_codex_errors.py +49 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +46 -1
- ksadk/events/adapters/a2a.py +54 -26
- ksadk/events/adapters/adk.py +188 -30
- ksadk/events/adapters/codex.py +33 -7
- ksadk/events/adapters/langgraph.py +16 -6
- ksadk/events/canonical.py +5 -0
- ksadk/events/canonical_store.py +200 -4
- ksadk/events/reducer.py +82 -0
- ksadk/events/run_authority.py +176 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +18 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_adapters/__init__.py +1 -0
- ksadk/harness/artifact_adapters/native_page_budget.py +172 -0
- ksadk/harness/artifact_adapters/native_search.py +249 -0
- ksadk/harness/artifact_adapters/native_search_budget.py +134 -0
- ksadk/harness/artifact_adapters/native_store.py +115 -0
- ksadk/harness/artifact_adapters/native_tool.py +222 -0
- ksadk/harness/artifact_store.py +230 -0
- ksadk/harness/browser_adapters/__init__.py +6 -0
- ksadk/harness/browser_adapters/native_browser_tool.py +92 -0
- ksadk/harness/browser_adapters/native_dom_snapshot.py +187 -0
- ksadk/harness/browser_adapters/native_playwright.py +953 -0
- ksadk/harness/browser_adapters/native_vision.py +295 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_adapters/__init__.py +1 -0
- ksadk/harness/capability_adapters/native_dsh.py +289 -0
- ksadk/harness/capability_runtime.py +332 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +153 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/config.py +28 -5
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +504 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +388 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_sections.py +397 -0
- ksadk/harness/context_tuning.py +168 -0
- ksadk/harness/diagnostic_adapters/__init__.py +1 -0
- ksadk/harness/diagnostic_adapters/contracts.py +70 -0
- ksadk/harness/diagnostic_adapters/lsp_rpc.py +210 -0
- ksadk/harness/diagnostic_adapters/native_lsp.py +286 -0
- ksadk/harness/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +57 -0
- ksadk/harness/engine/context_pipeline.py +1351 -0
- ksadk/harness/engine/graph_builder.py +352 -0
- ksadk/harness/engine/hooked_reasoner.py +380 -0
- ksadk/harness/engine/langgraph.py +1049 -0
- ksadk/harness/engine/mcp_disclosure.py +701 -0
- ksadk/harness/engine/phases/__init__.py +6 -0
- ksadk/harness/engine/phases/context.py +48 -0
- ksadk/harness/engine/phases/interaction.py +31 -0
- ksadk/harness/engine/phases/reason.py +552 -0
- ksadk/harness/engine/phases/tools.py +638 -0
- ksadk/harness/engine/policy_runtime.py +81 -0
- ksadk/harness/engine/postgres_checkpointer.py +386 -0
- ksadk/harness/engine/run_control_bridge.py +100 -0
- ksadk/harness/engine/run_types.py +98 -0
- ksadk/harness/engine/skill_disclosure.py +275 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/steering.py +177 -0
- ksadk/harness/engine/subagents.py +360 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +249 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +498 -0
- ksadk/harness/execution_policy.py +104 -0
- ksadk/harness/hooks.py +259 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +699 -0
- ksadk/harness/loop/tools.py +907 -0
- ksadk/harness/managed_runtime.py +1044 -0
- ksadk/harness/mcp_disclosure_contract.py +85 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_result_policy.py +44 -0
- ksadk/harness/mcp_runtime.py +504 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -0
- ksadk/harness/micro_compact.py +69 -0
- ksadk/harness/model_adapters/__init__.py +1 -0
- ksadk/harness/model_adapters/native_mcp_media.py +100 -0
- ksadk/harness/model_adapters/native_mcp_result.py +36 -0
- ksadk/harness/model_adapters/native_openai.py +703 -0
- ksadk/harness/model_capability.py +468 -0
- ksadk/harness/model_provider.py +430 -0
- ksadk/harness/multimodal.py +57 -0
- ksadk/harness/native/__init__.py +1 -0
- ksadk/harness/native/activation_contract.py +25 -0
- ksadk/harness/native/activation_recovery.py +29 -0
- ksadk/harness/native/adapters.py +291 -0
- ksadk/harness/native/artifact_contract.py +14 -0
- ksadk/harness/native/artifact_partial_read_capacity.py +171 -0
- ksadk/harness/native/artifact_read_capacity.py +182 -0
- ksadk/harness/native/artifact_read_contract.py +27 -0
- ksadk/harness/native/artifact_runtime.py +408 -0
- ksadk/harness/native/artifact_search_capacity.py +206 -0
- ksadk/harness/native/artifact_search_contract.py +40 -0
- ksadk/harness/native/artifact_single_read_capacity.py +170 -0
- ksadk/harness/native/browser_contract.py +229 -0
- ksadk/harness/native/browser_recovery.py +183 -0
- ksadk/harness/native/capabilities.py +204 -0
- ksadk/harness/native/child_approval.py +60 -0
- ksadk/harness/native/child_budget.py +136 -0
- ksadk/harness/native/child_cancellation.py +80 -0
- ksadk/harness/native/child_input.py +98 -0
- ksadk/harness/native/child_input_runtime.py +59 -0
- ksadk/harness/native/child_interruption.py +81 -0
- ksadk/harness/native/child_lifecycle.py +246 -0
- ksadk/harness/native/child_lifecycle_contract.py +91 -0
- ksadk/harness/native/child_notifications.py +75 -0
- ksadk/harness/native/child_promotion.py +66 -0
- ksadk/harness/native/command_runtime.py +99 -0
- ksadk/harness/native/completion.py +302 -0
- ksadk/harness/native/completion_text.py +116 -0
- ksadk/harness/native/context.py +358 -0
- ksadk/harness/native/context_artifact_page.py +75 -0
- ksadk/harness/native/context_compaction_projection.py +131 -0
- ksadk/harness/native/context_contributions.py +320 -0
- ksadk/harness/native/context_contributor_contract.py +133 -0
- ksadk/harness/native/context_driver.py +820 -0
- ksadk/harness/native/context_fresh_tools.py +49 -0
- ksadk/harness/native/context_history.py +272 -0
- ksadk/harness/native/context_microcompact.py +61 -0
- ksadk/harness/native/context_partial_summary.py +58 -0
- ksadk/harness/native/context_partition.py +492 -0
- ksadk/harness/native/context_pruning.py +275 -0
- ksadk/harness/native/context_reduction.py +60 -0
- ksadk/harness/native/context_replay.py +148 -0
- ksadk/harness/native/context_request_projection.py +526 -0
- ksadk/harness/native/context_runtime.py +976 -0
- ksadk/harness/native/context_runtime_contracts.py +409 -0
- ksadk/harness/native/context_search.py +112 -0
- ksadk/harness/native/context_source_fragments.py +188 -0
- ksadk/harness/native/context_source_progress.py +119 -0
- ksadk/harness/native/context_summary_planning.py +788 -0
- ksadk/harness/native/context_summary_recovery.py +105 -0
- ksadk/harness/native/delivery_review.py +331 -0
- ksadk/harness/native/delivery_review_contract.py +54 -0
- ksadk/harness/native/effect_admission.py +82 -0
- ksadk/harness/native/effect_control.py +318 -0
- ksadk/harness/native/effect_receipts.py +729 -0
- ksadk/harness/native/effect_runtime.py +303 -0
- ksadk/harness/native/effective_configuration.py +28 -0
- ksadk/harness/native/engine.py +945 -0
- ksadk/harness/native/final_output.py +34 -0
- ksadk/harness/native/final_submission.py +58 -0
- ksadk/harness/native/finalization_workspace.py +96 -0
- ksadk/harness/native/fork.py +151 -0
- ksadk/harness/native/guidance.py +91 -0
- ksadk/harness/native/history.py +381 -0
- ksadk/harness/native/hook_executor.py +205 -0
- ksadk/harness/native/hook_runtime_contract.py +282 -0
- ksadk/harness/native/interaction_observation.py +117 -0
- ksadk/harness/native/lease.py +103 -0
- ksadk/harness/native/machine.py +974 -0
- ksadk/harness/native/mcp_result_governance.py +156 -0
- ksadk/harness/native/model.py +570 -0
- ksadk/harness/native/model_feedback.py +63 -0
- ksadk/harness/native/model_input.py +30 -0
- ksadk/harness/native/model_recovery_contract.py +35 -0
- ksadk/harness/native/model_replay.py +128 -0
- ksadk/harness/native/model_request.py +133 -0
- ksadk/harness/native/model_runtime.py +196 -0
- ksadk/harness/native/model_takeover.py +419 -0
- ksadk/harness/native/model_tool_batch.py +40 -0
- ksadk/harness/native/observed_progress.py +46 -0
- ksadk/harness/native/operator_guidance.py +201 -0
- ksadk/harness/native/output_contract.py +80 -0
- ksadk/harness/native/output_recovery.py +24 -0
- ksadk/harness/native/ports.py +749 -0
- ksadk/harness/native/precompact_hook_runtime.py +171 -0
- ksadk/harness/native/replay_context.py +149 -0
- ksadk/harness/native/request_media.py +112 -0
- ksadk/harness/native/restore_contract.py +16 -0
- ksadk/harness/native/run_clock.py +120 -0
- ksadk/harness/native/state.py +436 -0
- ksadk/harness/native/steering.py +170 -0
- ksadk/harness/native/stop_hook_runtime.py +151 -0
- ksadk/harness/native/studio_admission.py +29 -0
- ksadk/harness/native/subagents.py +86 -0
- ksadk/harness/native/task_policy.py +99 -0
- ksadk/harness/native/task_progress.py +86 -0
- ksadk/harness/native/terminal_verification.py +43 -0
- ksadk/harness/native/tool_argument_feedback.py +178 -0
- ksadk/harness/native/tool_budget.py +253 -0
- ksadk/harness/native/tool_error_streak.py +89 -0
- ksadk/harness/native/tool_hook_runtime.py +343 -0
- ksadk/harness/native/tool_input_validation.py +58 -0
- ksadk/harness/native/tool_interruption.py +96 -0
- ksadk/harness/native/tool_observation.py +259 -0
- ksadk/harness/native/tool_progress.py +223 -0
- ksadk/harness/native/tool_recovery.py +25 -0
- ksadk/harness/native/tool_scheduling.py +33 -0
- ksadk/harness/native/tool_schema.py +126 -0
- ksadk/harness/native/transitions.py +151 -0
- ksadk/harness/native/turn_control.py +98 -0
- ksadk/harness/native/user_document.py +98 -0
- ksadk/harness/native/user_document_capture.py +49 -0
- ksadk/harness/native/user_input.py +87 -0
- ksadk/harness/native/verification.py +432 -0
- ksadk/harness/native/verification_binding.py +40 -0
- ksadk/harness/native/verification_runtime.py +233 -0
- ksadk/harness/native/verification_workspace.py +67 -0
- ksadk/harness/native_driver_failure.py +123 -0
- ksadk/harness/native_facade.py +977 -0
- ksadk/harness/native_factory.py +244 -0
- ksadk/harness/native_projection.py +503 -0
- ksadk/harness/native_runtime.py +621 -0
- ksadk/harness/native_shadow.py +250 -0
- ksadk/harness/native_shadow_inputs.py +146 -0
- ksadk/harness/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/progress_adapters/__init__.py +5 -0
- ksadk/harness/progress_adapters/native_todo.py +75 -0
- ksadk/harness/prompt_cache.py +132 -0
- ksadk/harness/public_activity.py +213 -0
- ksadk/harness/public_output.py +30 -0
- ksadk/harness/public_summary.py +36 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +779 -17
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/rpc.py +200 -0
- ksadk/harness/run_control.py +773 -0
- ksadk/harness/runtime.py +157 -113
- ksadk/harness/runtime_capabilities.py +228 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +733 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/sdk.py +153 -0
- ksadk/harness/session_store.py +589 -0
- ksadk/harness/skill_adapters/__init__.py +1 -0
- ksadk/harness/skill_adapters/native_bundle.py +148 -0
- ksadk/harness/skill_adapters/native_disclosure.py +306 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_intent.py +47 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +317 -0
- ksadk/harness/spec.py +342 -0
- ksadk/harness/state.py +155 -0
- ksadk/harness/stores/__init__.py +14 -0
- ksadk/harness/stores/native_command_settlement.py +65 -0
- ksadk/harness/stores/native_contract.py +311 -0
- ksadk/harness/stores/native_memory.py +326 -0
- ksadk/harness/stores/native_memory_archive.py +70 -0
- ksadk/harness/stores/native_migration_cli.py +91 -0
- ksadk/harness/stores/native_outbox.py +56 -0
- ksadk/harness/stores/native_sqlite.py +782 -0
- ksadk/harness/stores/native_sqlite_audit.py +29 -0
- ksadk/harness/stores/native_sqlite_migration.py +252 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +263 -0
- ksadk/harness/subagent_adapters/checkpoint_recovery.py +120 -0
- ksadk/harness/subagent_adapters/native_background_child.py +803 -0
- ksadk/harness/subagent_adapters/native_child.py +819 -0
- ksadk/harness/subagent_adapters/native_child_approval.py +128 -0
- ksadk/harness/subagent_adapters/native_child_continuation.py +51 -0
- ksadk/harness/subagent_adapters/native_child_result.py +392 -0
- ksadk/harness/subagent_adapters/prepared_recovery.py +120 -0
- ksadk/harness/tool_display.py +75 -0
- ksadk/harness/tool_display_contract.py +134 -0
- ksadk/harness/tool_output.py +141 -0
- ksadk/harness/tool_policy.py +134 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/tool_result_policy.py +216 -0
- ksadk/harness/tools.py +52 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -0
- ksadk/harness/workspace_adapters/__init__.py +6 -0
- ksadk/harness/workspace_adapters/native_directory.py +180 -0
- ksadk/harness/workspace_adapters/native_git.py +208 -0
- ksadk/harness/workspace_adapters/native_isolation.py +350 -0
- ksadk/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +9 -2
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +220 -252
- ksadk/kernel/contract_fingerprints.py +45 -1
- ksadk/kernel/contracts.py +30 -0
- ksadk/kernel/control.py +180 -29
- ksadk/kernel/execution_grants.py +428 -0
- ksadk/kernel/execution_grants_memory.py +252 -0
- ksadk/kernel/execution_grants_postgres.py +395 -0
- ksadk/kernel/execution_grants_sqlite.py +435 -0
- ksadk/kernel/execution_host_ingress.py +1071 -0
- ksadk/kernel/history_projection.py +120 -0
- ksadk/kernel/ingress.py +139 -226
- ksadk/kernel/ingress_bootstrap.py +268 -0
- ksadk/kernel/legacy_history.py +179 -0
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +61 -58
- ksadk/kernel/memory_store_projection.py +63 -0
- ksadk/kernel/postgres_event_log.py +181 -0
- ksadk/kernel/postgres_store.py +230 -231
- ksadk/kernel/readiness.py +125 -0
- ksadk/kernel/recovery.py +166 -16
- ksadk/kernel/recovery_projection.py +124 -0
- ksadk/kernel/runtime_checkpoint.py +34 -0
- ksadk/kernel/sql/001_agent_kernel.sql +28 -0
- ksadk/kernel/sqlite_schema.py +100 -0
- ksadk/kernel/sqlite_store.py +410 -200
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +104 -5
- ksadk/kernel/teams_artifact_tools.py +392 -0
- ksadk/kernel/teams_effects.py +851 -0
- ksadk/kernel/teams_execution_context.py +408 -0
- ksadk/kernel/teams_host_http.py +237 -0
- ksadk/kernel/teams_material_transport.py +245 -0
- ksadk/kernel/teams_materials.py +318 -0
- ksadk/kernel/teams_runtime_bootstrap.py +604 -0
- ksadk/kernel/teams_tool_runtime.py +273 -0
- ksadk/kernel/teams_workspace.py +259 -0
- ksadk/kernel/worker.py +369 -340
- ksadk/kernel/worker_controls.py +454 -0
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +74 -0
- ksadk/kernel/worker_interactions.py +197 -0
- ksadk/knowledge_base/client.py +15 -1
- ksadk/managed_runtime.py +29 -2
- ksadk/memory/adk/backends/http_ltm_backend.py +2 -1
- ksadk/memory/adk/backends/sdk_ltm_backend.py +15 -1
- ksadk/memory/adk/bounded_database_session_service.py +232 -0
- ksadk/memory/adk/resilient_session_service.py +115 -15
- ksadk/memory/adk/short_term_memory.py +8 -9
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +159 -7
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_candidates.py +183 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +280 -67
- ksadk/memory/resolved_policy.py +12 -7
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_gateway/__init__.py +29 -0
- ksadk/model_gateway/client.py +253 -0
- ksadk/model_gateway/events.py +113 -0
- ksadk/model_gateway/matrix.py +297 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/compat.py +670 -0
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +14 -9
- ksadk/model_proxy/transform.py +72 -6
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +29 -20
- ksadk/plugins/bridges/dsh_profile_manifest.py +36 -0
- ksadk/plugins/builtin_resources.py +199 -0
- ksadk/plugins/builtins.py +417 -185
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/context_contributor.py +15 -4
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_dependency_policy.py +41 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +92 -21
- ksadk/plugins/execution_host.py +107 -0
- ksadk/plugins/host.py +73 -5
- ksadk/plugins/kernel_adapter.py +44 -1
- ksadk/plugins/memory_provider.py +180 -0
- ksadk/plugins/providers/_process_group.py +50 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +24 -2
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +52 -40
- ksadk/plugins/providers/codex_native.py +20 -0
- ksadk/plugins/providers/codex_skills.py +46 -0
- ksadk/plugins/providers/dsh_capabilities.py +49 -143
- ksadk/plugins/providers/dsh_connector_lease.py +225 -0
- ksadk/plugins/providers/dsh_mcp.py +163 -1
- ksadk/plugins/providers/harness.py +413 -52
- ksadk/plugins/providers/harness_context.py +61 -0
- ksadk/plugins/providers/harness_contributions.py +241 -0
- ksadk/plugins/providers/harness_delegation.py +670 -0
- ksadk/plugins/providers/harness_hooks.py +121 -0
- ksadk/plugins/providers/harness_managed.py +550 -0
- ksadk/plugins/providers/harness_tools.py +455 -0
- ksadk/plugins/providers/legacy_catalog.py +1 -1
- ksadk/plugins/providers/mcp_projection.py +100 -3
- ksadk/plugins/providers/platform_resources.py +16 -6
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +540 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/build_artifacts.py +460 -0
- ksadk/plugins/teams/cloud_contract_fingerprints.py +22 -0
- ksadk/plugins/teams/cloud_contracts.py +928 -0
- ksadk/plugins/teams/cloud_permits.py +250 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1480 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/effect_contracts.py +255 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/execution_projection.py +255 -0
- ksadk/plugins/teams/leader_decisions.py +106 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +352 -0
- ksadk/plugins/teams/release_contracts.py +60 -0
- ksadk/plugins/teams/runtime.py +853 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +519 -0
- ksadk/plugins/teams/task_decisions.py +436 -0
- ksadk/plugins/teams/tool_service.py +152 -0
- ksadk/plugins/teams/transport.py +96 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/resource_runtime/skill_runtime.py +3 -0
- ksadk/resource_runtime/socket_server.py +11 -0
- ksadk/resource_runtime/worker.py +28 -4
- ksadk/runners/_adk_a2a_stream.py +122 -0
- ksadk/runners/_adk_canonical_stream.py +474 -0
- ksadk/runners/_langgraph_canonical_streams.py +527 -0
- ksadk/runners/_langgraph_runner_streams.py +83 -401
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_langgraph_tool_projection.py +86 -0
- ksadk/runners/_langgraph_tools_transformer.py +27 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +220 -350
- ksadk/runners/base_runner.py +6 -5
- ksadk/runners/langgraph_runner.py +208 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runners/utils/loader.py +28 -14
- ksadk/runtime/_runner_adapter/a2ui_surface.py +145 -0
- ksadk/runtime/_runner_adapter/gateway_approvals.py +93 -0
- ksadk/runtime/_runner_adapter/stream_mapping.py +134 -129
- ksadk/runtime/adapter.py +40 -3
- ksadk/runtime/conversation_execution.py +29 -3
- ksadk/runtime/executor.py +105 -7
- ksadk/runtime/factory.py +45 -3
- ksadk/runtime/framework_adapters.py +184 -10
- ksadk/runtime/hosted_finalizer.py +4 -6
- ksadk/runtime/launch.py +2 -0
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +160 -21
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +105 -1
- ksadk/sandbox/backends/e2b.py +272 -24
- ksadk/sandbox/backends/local_process.py +73 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +9 -1
- ksadk/sandbox/local_controls.py +776 -0
- ksadk/sandbox/local_launcher.py +124 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/factory.py +178 -25
- ksadk/server/history_deadline.py +158 -0
- ksadk/server/history_page_cache.py +129 -0
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/checkpoint_audit.py +88 -0
- ksadk/server/routes/checkpoint_listing.py +294 -0
- ksadk/server/routes/checkpoint_resolution.py +73 -20
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +112 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/display_projection.py +154 -0
- ksadk/server/routes/kernel_ingress.py +26 -3
- ksadk/server/routes/misc.py +331 -33
- ksadk/server/routes/models.py +28 -4
- ksadk/server/routes/openai_compat.py +82 -13
- ksadk/server/routes/projection.py +159 -216
- ksadk/server/routes/run.py +112 -37
- ksadk/server/routes/sessions.py +493 -358
- ksadk/server/routes/streaming.py +68 -15
- ksadk/server/routes/tool_receipt_claim_routes.py +107 -0
- ksadk/server/routes/workspace.py +135 -23
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-CILaW-fC.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-BVrNVtJC.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-Dp7c4wWD.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-Dxop8Rd7.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-Cjjz8B30.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-ckWDmOzw.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-DqxJede-.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-pn_DuLy6.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-SEQA4bVi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-pM0B-6NJ.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-m2tuCNVq.js} +1 -1
- ksadk/server/static/assets/channel-fySsnkft.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-BheGxKRQ.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-GJHDr9Ww.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-CbAN45AV.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-D5ngbbzF.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-Cc5IwuYC.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CprgDDdJ.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-CDZhSy82.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-CZchUNro.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-BVruqk6T.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-4ld9SxPN.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DSfLtNYm.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-Dmyyk_Vp.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-PFWIGtvA.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BIyq3EJb.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-eBw08Qdk.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-DfvnEf45.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-CUSrE3Mg.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-Dq5Zw2gy.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-DyUHfNwT.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-CREmM89O.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-Dw9zhHUK.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-0uJ4tdx6.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-AEv-vXf-.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-B49GzZDb.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B8Myiet9.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-BBsYarrI.js} +2 -2
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BQMrUwdI.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-BX_-FENW.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-CD4L6ymH.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-CHpW1BHj.js} +1 -1
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-CVPau3tn.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-C_qdxcSH.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-Co68Apq4.js} +1 -1
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-Cp2PaOMY.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-CuR5Bgme.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-DDSyLEOX.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-DUxO0R99.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-QzbGrED_.js} +1 -1
- ksadk/server/static/assets/dist-bupkyEBZ.js +1 -0
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-cxTGfdqx.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-hL5p1til.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-lOy23y43.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-pq-nD33R.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BS5LdNoR.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Bv1QtiY-.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-DsM4upQX.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-D5NA16k9.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-musi-e0G.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-DUCVz-ih.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DH37EGkG.js} +1 -1
- ksadk/server/static/assets/index-CZdkAvsv.js +244 -0
- ksadk/server/static/assets/index-CvXdHgF3.css +2 -0
- ksadk/server/static/assets/info-A6RAGUB7-rw0ZNHZp.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-C1kEtv2y.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-BCNPyMka.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL--cDbKnjP.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-R1rAVw2f.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-BT-X-V7U.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-DTR631iG.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DfFzJhX8.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-D4by_rmk.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-Ca4Hvki9.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-xWXPEh0c.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-hwiz6fbw.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-BudBDlCI.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-DXZ0PCJF.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-BR1oZXLM.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-DfgEISfX.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-CWOC3rdk.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CiRvHCLY.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-DSDDyJ2f.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-BdAYRYB8.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CBBmaL70.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-Doc3rdwp.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-0J8R8hWW.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-CfFLlWsK.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-jBwkjtTy.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-Cw1fPb5w.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B0WxTQf8.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-Cc3JMBAF.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-BfCT_75A.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-C05SJHxo.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-BqNLAhc3.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-9gX1VMDC.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-DokNktqB.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-sEs_BP6O.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-Ll4jvUN9.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/__init__.py +8 -1
- ksadk/sessions/_checkpoint_resume_audit.py +44 -0
- ksadk/sessions/_in_memory_query.py +112 -0
- ksadk/sessions/_local_service_sync.py +157 -156
- ksadk/sessions/_local_state_sync.py +152 -0
- ksadk/sessions/_local_tables.py +2 -0
- ksadk/sessions/_postgres_checkpoint_read.py +323 -0
- ksadk/sessions/_postgres_checkpoint_stats.py +330 -0
- ksadk/sessions/_postgres_history_read.py +678 -0
- ksadk/sessions/_postgres_schema.py +44 -2
- ksadk/sessions/_postgres_tables.py +2 -0
- ksadk/sessions/_postgres_tool_receipts.py +169 -0
- ksadk/sessions/_resilient_read.py +630 -0
- ksadk/sessions/_tool_receipt_sync.py +119 -0
- ksadk/sessions/agent_identity.py +16 -0
- ksadk/sessions/base.py +278 -0
- ksadk/sessions/db_budget.py +332 -0
- ksadk/sessions/errors.py +12 -0
- ksadk/sessions/history_budget.py +36 -0
- ksadk/sessions/history_identity.py +27 -0
- ksadk/sessions/in_memory.py +376 -113
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/sessions/local_service.py +345 -0
- ksadk/sessions/postgres_service.py +515 -549
- ksadk/sessions/resilience.py +21 -14
- ksadk/sessions/resilient.py +611 -504
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/loader.py +44 -2
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +400 -56
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/service_client.py +6 -1
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/a2a_bindings.py +407 -0
- ksadk/studio/a2a_orchestration.py +178 -0
- ksadk/studio/active_run_output.py +92 -0
- ksadk/studio/activity_records.py +542 -0
- ksadk/studio/agent_configuration.py +173 -0
- ksadk/studio/api.py +784 -419
- ksadk/studio/api_a2a_routes.py +93 -0
- ksadk/studio/api_catalog_routes.py +13 -0
- ksadk/studio/api_cloud_chat_routes.py +382 -0
- ksadk/studio/api_contracts.py +31 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/attachment_store.py +14 -2
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/build_resolution.py +117 -0
- ksadk/studio/build_singleflight.py +37 -0
- ksadk/studio/builder.py +32 -2
- ksadk/studio/capabilities.py +31 -9
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +113 -387
- ksadk/studio/cloud_gateways.py +424 -0
- ksadk/studio/cloud_shared_web.py +82 -2
- ksadk/studio/codex_agent_service.py +19 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_manifest.py +5 -1
- ksadk/studio/codex_provider_build.py +65 -0
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +112 -6
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contract_base.py +19 -0
- ksadk/studio/contracts.py +260 -202
- ksadk/studio/dsh_application.py +183 -27
- ksadk/studio/dsh_capability_service.py +302 -189
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_mcp_transport.py +191 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +53 -5
- ksadk/studio/execution_host.py +598 -0
- ksadk/studio/framework_run.py +50 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/interaction_submission.py +265 -0
- ksadk/studio/kernel_registry.py +429 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/lifecycle_status.py +43 -0
- ksadk/studio/model_buffered_wire.py +227 -0
- ksadk/studio/model_chat_tools.py +143 -0
- ksadk/studio/model_client.py +1939 -345
- ksadk/studio/model_content_stream.py +129 -0
- ksadk/studio/model_credentials.py +196 -0
- ksadk/studio/model_profile_service.py +89 -40
- ksadk/studio/model_request_projection.py +284 -0
- ksadk/studio/model_responses_content.py +296 -0
- ksadk/studio/model_usage.py +109 -0
- ksadk/studio/model_wire_failure.py +110 -0
- ksadk/studio/model_wire_identity.py +138 -0
- ksadk/studio/model_wire_snapshot.py +45 -0
- ksadk/studio/model_wire_tools.py +283 -0
- ksadk/studio/native_acceptance.py +68 -0
- ksadk/studio/native_approval.py +111 -0
- ksadk/studio/native_browser_port.py +861 -0
- ksadk/studio/native_child_mcp.py +87 -0
- ksadk/studio/native_child_publication.py +68 -0
- ksadk/studio/native_child_skills.py +72 -0
- ksadk/studio/native_child_workspace.py +176 -0
- ksadk/studio/native_command_policy.py +53 -0
- ksadk/studio/native_context_port.py +326 -0
- ksadk/studio/native_context_registration.py +54 -0
- ksadk/studio/native_document_input.py +88 -0
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/native_final_shape.py +852 -0
- ksadk/studio/native_gateway_stream.py +69 -0
- ksadk/studio/native_hook_port.py +145 -0
- ksadk/studio/native_hook_registration.py +70 -0
- ksadk/studio/native_inventory_disclosure.py +223 -0
- ksadk/studio/native_kernel_admission.py +84 -0
- ksadk/studio/native_language_diagnostics.py +320 -0
- ksadk/studio/native_mcp_disclosure.py +198 -0
- ksadk/studio/native_mcp_tool_port.py +219 -0
- ksadk/studio/native_memory_acceptance.py +362 -0
- ksadk/studio/native_memory_context.py +266 -0
- ksadk/studio/native_memory_flush.py +174 -0
- ksadk/studio/native_memory_sources.py +80 -0
- ksadk/studio/native_memory_tool_port.py +360 -0
- ksadk/studio/native_memory_turn.py +183 -0
- ksadk/studio/native_model_port.py +765 -0
- ksadk/studio/native_model_recovery.py +126 -0
- ksadk/studio/native_options.py +75 -0
- ksadk/studio/native_output_fields.py +58 -0
- ksadk/studio/native_planning.py +156 -0
- ksadk/studio/native_product.py +988 -0
- ksadk/studio/native_read_budget.py +426 -0
- ksadk/studio/native_recovery.py +171 -0
- ksadk/studio/native_scope.py +35 -0
- ksadk/studio/native_session_context_port.py +141 -0
- ksadk/studio/native_session_engine.py +14 -0
- ksadk/studio/native_skill_source.py +74 -0
- ksadk/studio/native_subagent_port.py +700 -0
- ksadk/studio/native_terminal_recovery.py +95 -0
- ksadk/studio/native_test_action.py +610 -0
- ksadk/studio/native_tool_port.py +477 -0
- ksadk/studio/native_user_input.py +60 -0
- ksadk/studio/native_verification_presentation.py +65 -0
- ksadk/studio/native_workspace_diagnostics.py +183 -0
- ksadk/studio/native_workspace_port.py +43 -0
- ksadk/studio/operations.py +34 -9
- ksadk/studio/plugin_composition.py +39 -12
- ksadk/studio/plugin_kernel_adapter.py +89 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_native_activation.py +163 -0
- ksadk/studio/plugin_runtime.py +832 -99
- ksadk/studio/plugin_runtime_admission.py +57 -0
- ksadk/studio/presentation.py +92 -0
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/public_output_store.py +69 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +69 -34
- ksadk/studio/resource_catalog.py +14 -12
- ksadk/studio/run_activity.py +848 -0
- ksadk/studio/run_controls.py +185 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +1220 -335
- ksadk/studio/run_submission_receipts.py +68 -0
- ksadk/studio/runtime_catalog.py +73 -11
- ksadk/studio/runtime_prewarm.py +22 -0
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_assistant.py +4 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +615 -246
- ksadk/studio/service_settings.py +229 -0
- ksadk/studio/shared_web.py +518 -181
- ksadk/studio/shared_web_response_events.py +180 -0
- ksadk/studio/shared_web_run_state.py +133 -0
- ksadk/studio/skill_discovery.py +305 -3
- ksadk/studio/static/assets/ChannelsPage-xX5HlMId.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-CkufcPYo.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-DYG1Wzbx.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-BeyLyQHu.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-CCaaGaVp.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-C7DNDik2.css +2 -0
- ksadk/studio/static/assets/index-Cy68gTlH.js +265 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +166 -0
- ksadk/studio/teams_installation.py +217 -0
- ksadk/studio/teams_node.py +549 -0
- ksadk/studio/teams_node_factory.py +558 -0
- ksadk/studio/teams_node_runner.py +72 -0
- ksadk/studio/teams_node_v1.py +935 -0
- ksadk/studio/teams_remote.py +496 -0
- ksadk/studio/templates.py +41 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +138 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/tools/a2a_policy.py +5 -0
- ksadk/tools/artifact_observation.py +53 -0
- ksadk/tools/captured_source_artifact.py +68 -0
- ksadk/tools/schema.py +34 -0
- ksadk/toolsets/__init__.py +93 -88
- ksadk/toolsets/a2a.py +89 -89
- ksadk/toolsets/sandbox.py +377 -6
- ksadk/toolsets/skill_management.py +315 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/tool_selection.py +94 -0
- ksadk/toolsets/workspace.py +344 -326
- ksadk/toolsets/workspace_editing.py +291 -0
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/toolsets/workspace_model_observation.py +104 -0
- ksadk/toolsets/workspace_mutation.py +75 -0
- ksadk/toolsets/workspace_read_budget.py +216 -0
- ksadk/toolsets/workspace_search.py +192 -0
- ksadk/toolsets/workspace_search_process.py +129 -0
- ksadk/toolsets/workspace_state.py +6 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/http_headers.py +18 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +28 -14
- agentengine_sdk_python-0.8.4.dist-info/RECORD +0 -1070
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.6.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/kernel/sqlite_store.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""SQLite ``AgentKernelStore``(
|
|
2
|
+
"""SQLite ``AgentKernelStore``(Kernel Task 3 Step 5)。
|
|
3
3
|
|
|
4
4
|
单文件 durable Inbox / Run / ActivationLease 存储:
|
|
5
5
|
- WAL journal + 每次 mutation ``BEGIN IMMEDIATE`` 做跨进程 CAS;
|
|
@@ -22,8 +22,6 @@ from datetime import datetime, timezone
|
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
from typing import Any
|
|
24
24
|
|
|
25
|
-
from uuid import uuid4
|
|
26
|
-
|
|
27
25
|
import aiosqlite
|
|
28
26
|
|
|
29
27
|
from ksadk.events.session_event import (
|
|
@@ -35,15 +33,15 @@ from ksadk.events.session_event import (
|
|
|
35
33
|
validate_write_guard,
|
|
36
34
|
)
|
|
37
35
|
from ksadk.interaction.contracts import (
|
|
38
|
-
InteractionRecord,
|
|
39
36
|
InteractionReceipt,
|
|
37
|
+
InteractionRecord,
|
|
40
38
|
InteractionSubmission,
|
|
41
39
|
is_terminal,
|
|
42
40
|
)
|
|
43
41
|
from ksadk.interaction.ledger import (
|
|
44
42
|
ALREADY_RESOLVED,
|
|
45
|
-
REVISION_MISMATCH,
|
|
46
43
|
REQUEST_CONFLICT,
|
|
44
|
+
REVISION_MISMATCH,
|
|
47
45
|
interaction_event,
|
|
48
46
|
request_digest,
|
|
49
47
|
requested_event_payload,
|
|
@@ -60,6 +58,7 @@ from ksadk.kernel.contracts import (
|
|
|
60
58
|
SessionEventEnvelope,
|
|
61
59
|
)
|
|
62
60
|
from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
|
|
61
|
+
from ksadk.kernel.execution_grants_sqlite import EXECUTION_GRANT_SCHEMA, SQLiteExecutionGrantMixin
|
|
63
62
|
from ksadk.kernel.state import (
|
|
64
63
|
InboxState,
|
|
65
64
|
assert_inbox_transition,
|
|
@@ -79,105 +78,9 @@ from ksadk.sessions._local_tables import KSADK_EVENTS_TABLE, KSADK_SESSIONS_TABL
|
|
|
79
78
|
from ksadk.sessions.base import SessionEvent
|
|
80
79
|
from ksadk.sessions.local_service import LocalSessionService
|
|
81
80
|
|
|
82
|
-
SCHEMA_VERSION
|
|
83
|
-
|
|
84
|
-
_SCHEMA = """
|
|
85
|
-
CREATE TABLE IF NOT EXISTS kernel_inbox (
|
|
86
|
-
message_id TEXT PRIMARY KEY,
|
|
87
|
-
agent_instance_id TEXT NOT NULL,
|
|
88
|
-
session_id TEXT NOT NULL,
|
|
89
|
-
idempotency_key TEXT NOT NULL,
|
|
90
|
-
request_digest TEXT NOT NULL,
|
|
91
|
-
accepted_seq INTEGER NOT NULL,
|
|
92
|
-
status TEXT NOT NULL CHECK (status IN ('accepted','claimed','completed','discarded')),
|
|
93
|
-
claimed_fence INTEGER,
|
|
94
|
-
payload_json TEXT NOT NULL,
|
|
95
|
-
UNIQUE(session_id, idempotency_key)
|
|
96
|
-
);
|
|
97
|
-
CREATE INDEX IF NOT EXISTS idx_kernel_inbox_claim
|
|
98
|
-
ON kernel_inbox (agent_instance_id, session_id, status, accepted_seq);
|
|
99
|
-
CREATE INDEX IF NOT EXISTS idx_kernel_inbox_idempotency
|
|
100
|
-
ON kernel_inbox (session_id, idempotency_key);
|
|
101
|
-
|
|
102
|
-
CREATE TABLE IF NOT EXISTS kernel_runs (
|
|
103
|
-
run_id TEXT PRIMARY KEY,
|
|
104
|
-
agent_instance_id TEXT NOT NULL,
|
|
105
|
-
session_id TEXT NOT NULL,
|
|
106
|
-
state TEXT NOT NULL CHECK (state IN (
|
|
107
|
-
'pending','running','paused','waiting','completed','failed','cancelled','interrupted'
|
|
108
|
-
)),
|
|
109
|
-
activation_fence INTEGER NOT NULL DEFAULT 0,
|
|
110
|
-
created_at TEXT NOT NULL,
|
|
111
|
-
updated_at TEXT NOT NULL,
|
|
112
|
-
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
113
|
-
);
|
|
114
|
-
CREATE INDEX IF NOT EXISTS idx_kernel_runs_session_state
|
|
115
|
-
ON kernel_runs (session_id, state);
|
|
116
|
-
|
|
117
|
-
CREATE TABLE IF NOT EXISTS kernel_activations (
|
|
118
|
-
agent_instance_id TEXT NOT NULL,
|
|
119
|
-
session_id TEXT NOT NULL,
|
|
120
|
-
activation_id TEXT NOT NULL,
|
|
121
|
-
fencing_token INTEGER NOT NULL,
|
|
122
|
-
lease_expires_at REAL NOT NULL,
|
|
123
|
-
lease_expires_at_iso TEXT NOT NULL,
|
|
124
|
-
released INTEGER NOT NULL DEFAULT 0,
|
|
125
|
-
runtime_type TEXT NOT NULL DEFAULT 'ksadk',
|
|
126
|
-
bundle_digest TEXT NOT NULL DEFAULT '',
|
|
127
|
-
capability_digest TEXT NOT NULL DEFAULT '',
|
|
128
|
-
PRIMARY KEY (agent_instance_id, session_id)
|
|
129
|
-
);
|
|
130
|
-
CREATE INDEX IF NOT EXISTS idx_kernel_activations_expiry
|
|
131
|
-
ON kernel_activations (lease_expires_at);
|
|
132
|
-
|
|
133
|
-
CREATE TABLE IF NOT EXISTS kernel_accepted_seq (
|
|
134
|
-
session_id TEXT PRIMARY KEY,
|
|
135
|
-
last_seq INTEGER NOT NULL DEFAULT 0
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
CREATE TABLE IF NOT EXISTS kernel_interactions (
|
|
139
|
-
interaction_id TEXT NOT NULL,
|
|
140
|
-
tenant_id TEXT NOT NULL,
|
|
141
|
-
agent_instance_id TEXT NOT NULL,
|
|
142
|
-
session_id TEXT NOT NULL,
|
|
143
|
-
run_id TEXT NOT NULL,
|
|
144
|
-
kind TEXT NOT NULL CHECK (kind IN ('approval','structured_input','plan_review','custom')),
|
|
145
|
-
request_schema_json TEXT NOT NULL,
|
|
146
|
-
presentation_json TEXT,
|
|
147
|
-
revision INTEGER NOT NULL,
|
|
148
|
-
status TEXT NOT NULL CHECK (status IN (
|
|
149
|
-
'pending','resolving','resolved','cancelled','expired'
|
|
150
|
-
)),
|
|
151
|
-
created_at TEXT NOT NULL,
|
|
152
|
-
expires_at TEXT,
|
|
153
|
-
provider_id TEXT NOT NULL DEFAULT '',
|
|
154
|
-
native_target_json TEXT,
|
|
155
|
-
continuation_json TEXT,
|
|
156
|
-
request_digest TEXT NOT NULL,
|
|
157
|
-
response_json TEXT,
|
|
158
|
-
outcome TEXT,
|
|
159
|
-
actor TEXT,
|
|
160
|
-
event_id TEXT,
|
|
161
|
-
accepted_seq INTEGER,
|
|
162
|
-
fencing_token INTEGER,
|
|
163
|
-
updated_at TEXT,
|
|
164
|
-
PRIMARY KEY (tenant_id, interaction_id)
|
|
165
|
-
);
|
|
166
|
-
CREATE INDEX IF NOT EXISTS idx_kernel_interactions_pending
|
|
167
|
-
ON kernel_interactions (tenant_id, session_id, status);
|
|
168
|
-
|
|
169
|
-
CREATE TABLE IF NOT EXISTS kernel_interaction_submissions (
|
|
170
|
-
tenant_id TEXT NOT NULL,
|
|
171
|
-
interaction_id TEXT NOT NULL,
|
|
172
|
-
idempotency_key TEXT NOT NULL,
|
|
173
|
-
submission_digest TEXT NOT NULL,
|
|
174
|
-
receipt_json TEXT NOT NULL,
|
|
175
|
-
PRIMARY KEY (tenant_id, interaction_id, idempotency_key)
|
|
176
|
-
);
|
|
177
|
-
"""
|
|
178
|
-
|
|
81
|
+
from ksadk.kernel.sqlite_schema import SCHEMA_VERSION, _SCHEMA
|
|
179
82
|
|
|
180
|
-
class SQLiteAgentKernelStore:
|
|
83
|
+
class SQLiteAgentKernelStore(SQLiteExecutionGrantMixin):
|
|
181
84
|
def __init__(
|
|
182
85
|
self,
|
|
183
86
|
db_path: str | Path,
|
|
@@ -204,9 +107,15 @@ class SQLiteAgentKernelStore:
|
|
|
204
107
|
connection = await self._connect()
|
|
205
108
|
async with self._write_lock:
|
|
206
109
|
# CREATE ... IF NOT EXISTS + 整数 user_version,重复启动幂等。
|
|
207
|
-
await connection.executescript(_SCHEMA)
|
|
208
|
-
await connection.execute(
|
|
209
|
-
|
|
110
|
+
await connection.executescript(_SCHEMA + EXECUTION_GRANT_SCHEMA)
|
|
111
|
+
await connection.execute("BEGIN IMMEDIATE")
|
|
112
|
+
try:
|
|
113
|
+
await self._migrate_execution_grants(connection)
|
|
114
|
+
await connection.execute(f"PRAGMA user_version={SCHEMA_VERSION}")
|
|
115
|
+
await connection.commit()
|
|
116
|
+
except BaseException:
|
|
117
|
+
await connection.rollback()
|
|
118
|
+
raise
|
|
210
119
|
|
|
211
120
|
async def close(self) -> None:
|
|
212
121
|
if self._connection is not None:
|
|
@@ -222,10 +131,12 @@ class SQLiteAgentKernelStore:
|
|
|
222
131
|
|
|
223
132
|
@staticmethod
|
|
224
133
|
async def _fetchone(connection: aiosqlite.Connection, sql: str, params: tuple) -> Any:
|
|
225
|
-
cursor
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
134
|
+
# Consume the cursor in one SQLite worker call. An unfinished SELECT on
|
|
135
|
+
# this shared connection can otherwise overlap another coroutine's
|
|
136
|
+
# BEGIN IMMEDIATE and fail with SQLITE_BUSY_SNAPSHOT after an event-log
|
|
137
|
+
# writer commits. No authorization/transaction retry is involved.
|
|
138
|
+
rows = await connection.execute_fetchall(sql, params)
|
|
139
|
+
return rows[0] if rows else None
|
|
229
140
|
|
|
230
141
|
@staticmethod
|
|
231
142
|
def _activation_row(row: aiosqlite.Row | None) -> dict[str, Any] | None:
|
|
@@ -234,7 +145,10 @@ class SQLiteAgentKernelStore:
|
|
|
234
145
|
return dict(row)
|
|
235
146
|
|
|
236
147
|
async def _check_fence(
|
|
237
|
-
self,
|
|
148
|
+
self,
|
|
149
|
+
connection: aiosqlite.Connection,
|
|
150
|
+
agent_instance_id: str,
|
|
151
|
+
session_id: str,
|
|
238
152
|
expected_fence: int,
|
|
239
153
|
) -> dict[str, Any]:
|
|
240
154
|
row = await self._fetchone(
|
|
@@ -259,16 +173,26 @@ class SQLiteAgentKernelStore:
|
|
|
259
173
|
return activation
|
|
260
174
|
|
|
261
175
|
async def _emit_admission(
|
|
262
|
-
self,
|
|
176
|
+
self,
|
|
177
|
+
envelope: SessionEventEnvelope,
|
|
178
|
+
command: AgentControlCommand,
|
|
179
|
+
*,
|
|
180
|
+
connection: aiosqlite.Connection | None = None,
|
|
263
181
|
) -> None:
|
|
264
182
|
# admission 事实的 guard 绑定提交方 permit 引用与 command_id。
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
authorization_ref=command.authorization_ref,
|
|
269
|
-
command_id=command.command_id,
|
|
270
|
-
),
|
|
183
|
+
guard = AdmissionWriteGuard(
|
|
184
|
+
authorization_ref=command.authorization_ref,
|
|
185
|
+
command_id=command.command_id,
|
|
271
186
|
)
|
|
187
|
+
service = getattr(self._events, "session_service", None)
|
|
188
|
+
if (
|
|
189
|
+
connection is not None
|
|
190
|
+
and isinstance(service, LocalSessionService)
|
|
191
|
+
and service.db_path == self.db_path
|
|
192
|
+
):
|
|
193
|
+
await self._append_interaction_event_on(connection, envelope, guard)
|
|
194
|
+
else:
|
|
195
|
+
await self._events.append(envelope, guard=guard)
|
|
272
196
|
|
|
273
197
|
async def _emit_activation(
|
|
274
198
|
self, envelope: SessionEventEnvelope, activation: dict[str, Any], fence: int
|
|
@@ -333,9 +257,7 @@ class SQLiteAgentKernelStore:
|
|
|
333
257
|
"rejected",
|
|
334
258
|
error=ControlError(
|
|
335
259
|
code="idempotency_conflict",
|
|
336
|
-
message=(
|
|
337
|
-
"idempotency key reused with a different request digest"
|
|
338
|
-
),
|
|
260
|
+
message=("idempotency key reused with a different request digest"),
|
|
339
261
|
retryable=False,
|
|
340
262
|
),
|
|
341
263
|
)
|
|
@@ -347,6 +269,16 @@ class SQLiteAgentKernelStore:
|
|
|
347
269
|
accepted_seq=existing["accepted_seq"],
|
|
348
270
|
)
|
|
349
271
|
|
|
272
|
+
grant_error = await self._sqlite_admission_grant_error(connection, command)
|
|
273
|
+
if grant_error:
|
|
274
|
+
await connection.commit()
|
|
275
|
+
return await self.reject_command(
|
|
276
|
+
command,
|
|
277
|
+
status="rejected",
|
|
278
|
+
code=grant_error,
|
|
279
|
+
message=grant_error,
|
|
280
|
+
)
|
|
281
|
+
|
|
350
282
|
depth_row = await self._fetchone(
|
|
351
283
|
connection,
|
|
352
284
|
"SELECT COUNT(*) AS depth FROM kernel_inbox "
|
|
@@ -406,14 +338,9 @@ class SQLiteAgentKernelStore:
|
|
|
406
338
|
command.model_dump_json(),
|
|
407
339
|
),
|
|
408
340
|
)
|
|
409
|
-
#
|
|
410
|
-
#
|
|
411
|
-
#
|
|
412
|
-
# 不产生 "persisted-but-untracked" 半状态,客户端可安全重试。
|
|
413
|
-
# 残余窗口:事件已追加但 kernel commit 崩溃 -> 出现一条孤儿
|
|
414
|
-
# accepted 事件而无 Inbox 行;该窗口不返回 ack,重试会重新
|
|
415
|
-
# 走完整路径(seq 单调,可能产生一条重复 accepted 事件),
|
|
416
|
-
# 不存在已 ack 但未持久化的状态。
|
|
341
|
+
# Shared local storage appends the event through this same
|
|
342
|
+
# connection, atomically with Inbox admission. Legacy external
|
|
343
|
+
# event stores retain the pre-existing persist-before-ack path.
|
|
417
344
|
await self._emit_admission(
|
|
418
345
|
control_event(
|
|
419
346
|
session_id=command.session_id,
|
|
@@ -428,14 +355,13 @@ class SQLiteAgentKernelStore:
|
|
|
428
355
|
causation_id=str(command.command_id),
|
|
429
356
|
),
|
|
430
357
|
command,
|
|
358
|
+
connection=connection,
|
|
431
359
|
)
|
|
432
360
|
await connection.commit()
|
|
433
361
|
except BaseException:
|
|
434
362
|
await connection.rollback()
|
|
435
363
|
raise
|
|
436
|
-
return self._receipt(
|
|
437
|
-
command, "accepted", message_id=message_id, accepted_seq=accepted_seq
|
|
438
|
-
)
|
|
364
|
+
return self._receipt(command, "accepted", message_id=message_id, accepted_seq=accepted_seq)
|
|
439
365
|
|
|
440
366
|
async def load_message(self, message_id: str) -> InboxMessage | None:
|
|
441
367
|
connection = await self._connect()
|
|
@@ -456,17 +382,228 @@ class SQLiteAgentKernelStore:
|
|
|
456
382
|
command=AgentControlCommand.model_validate_json(row["payload_json"]),
|
|
457
383
|
)
|
|
458
384
|
|
|
385
|
+
async def load_by_idempotency(
|
|
386
|
+
self, session_id: str, idempotency_key: str
|
|
387
|
+
) -> InboxMessage | None:
|
|
388
|
+
connection = await self._connect()
|
|
389
|
+
row = await self._fetchone(
|
|
390
|
+
connection,
|
|
391
|
+
"SELECT message_id FROM kernel_inbox WHERE session_id=? AND idempotency_key=?",
|
|
392
|
+
(session_id, idempotency_key),
|
|
393
|
+
)
|
|
394
|
+
return await self.load_message(row["message_id"]) if row is not None else None
|
|
395
|
+
|
|
396
|
+
async def reject_command(
|
|
397
|
+
self,
|
|
398
|
+
command: AgentControlCommand,
|
|
399
|
+
*,
|
|
400
|
+
status: str,
|
|
401
|
+
code: str,
|
|
402
|
+
message: str,
|
|
403
|
+
retryable: bool = False,
|
|
404
|
+
) -> AgentControlReceipt:
|
|
405
|
+
"""Persist a redacted admission rejection without creating Inbox work."""
|
|
406
|
+
|
|
407
|
+
await self._emit_admission(
|
|
408
|
+
control_event(
|
|
409
|
+
session_id=command.session_id,
|
|
410
|
+
event_type="control.command_rejected",
|
|
411
|
+
payload={
|
|
412
|
+
"command_id": str(command.command_id),
|
|
413
|
+
"status": status,
|
|
414
|
+
"reason": code,
|
|
415
|
+
},
|
|
416
|
+
causation_id=str(command.command_id),
|
|
417
|
+
),
|
|
418
|
+
command,
|
|
419
|
+
)
|
|
420
|
+
return self._receipt(
|
|
421
|
+
command,
|
|
422
|
+
status,
|
|
423
|
+
error=ControlError(code=code, message=message, retryable=retryable),
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
async def list_messages(
|
|
427
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
428
|
+
) -> list[InboxMessage]:
|
|
429
|
+
connection = await self._connect()
|
|
430
|
+
sql = "SELECT message_id FROM kernel_inbox WHERE agent_instance_id=?"
|
|
431
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
432
|
+
if session_id is not None:
|
|
433
|
+
sql += " AND session_id=?"
|
|
434
|
+
params += (session_id,)
|
|
435
|
+
sql += " ORDER BY accepted_seq"
|
|
436
|
+
rows = await connection.execute_fetchall(sql, params)
|
|
437
|
+
messages = [await self.load_message(row["message_id"]) for row in rows]
|
|
438
|
+
return [message for message in messages if message is not None]
|
|
439
|
+
|
|
440
|
+
async def list_pending(
|
|
441
|
+
self,
|
|
442
|
+
agent_instance_id: str,
|
|
443
|
+
session_id: str | None = None,
|
|
444
|
+
*,
|
|
445
|
+
fencing_token: int | None = None,
|
|
446
|
+
) -> list[InboxMessage]:
|
|
447
|
+
"""Return FIFO-visible Inbox rows for the current activation.
|
|
448
|
+
|
|
449
|
+
``accepted`` rows are always pending. When a fence is supplied,
|
|
450
|
+
``claimed`` rows are included as well so the same owner can retry and
|
|
451
|
+
a takeover owner can reclaim work left by an older process.
|
|
452
|
+
"""
|
|
453
|
+
|
|
454
|
+
connection = await self._connect()
|
|
455
|
+
sql = "SELECT message_id FROM kernel_inbox WHERE agent_instance_id=?"
|
|
456
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
457
|
+
if session_id is not None:
|
|
458
|
+
sql += " AND session_id=?"
|
|
459
|
+
params += (session_id,)
|
|
460
|
+
if fencing_token is None:
|
|
461
|
+
sql += " AND status='accepted'"
|
|
462
|
+
else:
|
|
463
|
+
sql += " AND status IN ('accepted','claimed')"
|
|
464
|
+
sql += " ORDER BY accepted_seq"
|
|
465
|
+
rows = await connection.execute_fetchall(sql, params)
|
|
466
|
+
messages = [await self.load_message(row["message_id"]) for row in rows]
|
|
467
|
+
return [message for message in messages if message is not None]
|
|
468
|
+
|
|
469
|
+
async def claim_message(self, message_id: str, fencing_token: int) -> InboxMessage:
|
|
470
|
+
"""Claim one selected message, idempotently for the same fence."""
|
|
471
|
+
|
|
472
|
+
message_id = str(message_id)
|
|
473
|
+
async with self._write_lock:
|
|
474
|
+
connection = await self._begin()
|
|
475
|
+
try:
|
|
476
|
+
row = await self._fetchone(
|
|
477
|
+
connection,
|
|
478
|
+
"SELECT * FROM kernel_inbox WHERE message_id=?",
|
|
479
|
+
(message_id,),
|
|
480
|
+
)
|
|
481
|
+
if row is None:
|
|
482
|
+
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
483
|
+
activation = await self._check_fence(
|
|
484
|
+
connection,
|
|
485
|
+
row["agent_instance_id"],
|
|
486
|
+
row["session_id"],
|
|
487
|
+
fencing_token,
|
|
488
|
+
)
|
|
489
|
+
await self._sqlite_require_claim_grant(connection, row)
|
|
490
|
+
if row["status"] == InboxState.CLAIMED.value and row["claimed_fence"] == int(
|
|
491
|
+
fencing_token
|
|
492
|
+
):
|
|
493
|
+
await connection.commit()
|
|
494
|
+
message = await self.load_message(message_id)
|
|
495
|
+
assert message is not None
|
|
496
|
+
return message
|
|
497
|
+
await self._sqlite_require_claim_grant(connection, row)
|
|
498
|
+
if row["status"] not in (
|
|
499
|
+
InboxState.ACCEPTED.value,
|
|
500
|
+
InboxState.CLAIMED.value,
|
|
501
|
+
):
|
|
502
|
+
raise InvalidCommandError(
|
|
503
|
+
f"message {message_id!r} is not claimable at status {row['status']}"
|
|
504
|
+
)
|
|
505
|
+
if row["status"] == InboxState.ACCEPTED.value:
|
|
506
|
+
assert_inbox_transition(InboxState(row["status"]), InboxState.CLAIMED)
|
|
507
|
+
await connection.execute(
|
|
508
|
+
"UPDATE kernel_inbox SET status='claimed', claimed_fence=? WHERE message_id=?",
|
|
509
|
+
(int(fencing_token), message_id),
|
|
510
|
+
)
|
|
511
|
+
await connection.commit()
|
|
512
|
+
except BaseException:
|
|
513
|
+
await connection.rollback()
|
|
514
|
+
raise
|
|
515
|
+
await self._emit_activation(
|
|
516
|
+
control_event(
|
|
517
|
+
session_id=row["session_id"],
|
|
518
|
+
event_type="control.message_claimed",
|
|
519
|
+
payload={
|
|
520
|
+
"message_id": message_id,
|
|
521
|
+
"accepted_seq": int(row["accepted_seq"]),
|
|
522
|
+
"fencing_token": int(fencing_token),
|
|
523
|
+
},
|
|
524
|
+
),
|
|
525
|
+
activation,
|
|
526
|
+
fencing_token,
|
|
527
|
+
)
|
|
528
|
+
message = await self.load_message(message_id)
|
|
529
|
+
assert message is not None
|
|
530
|
+
return message
|
|
531
|
+
|
|
532
|
+
async def discard_claim(self, message_id: str, *, expected_fence: int) -> None:
|
|
533
|
+
"""Settle a typed rejection as ``claimed -> discarded``."""
|
|
534
|
+
|
|
535
|
+
message_id = str(message_id)
|
|
536
|
+
async with self._write_lock:
|
|
537
|
+
connection = await self._begin()
|
|
538
|
+
try:
|
|
539
|
+
row = await self._fetchone(
|
|
540
|
+
connection,
|
|
541
|
+
"SELECT * FROM kernel_inbox WHERE message_id=?",
|
|
542
|
+
(message_id,),
|
|
543
|
+
)
|
|
544
|
+
if row is None:
|
|
545
|
+
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
546
|
+
activation = await self._check_fence(
|
|
547
|
+
connection,
|
|
548
|
+
row["agent_instance_id"],
|
|
549
|
+
row["session_id"],
|
|
550
|
+
expected_fence,
|
|
551
|
+
)
|
|
552
|
+
if row["status"] != InboxState.CLAIMED.value or row["claimed_fence"] != int(
|
|
553
|
+
expected_fence
|
|
554
|
+
):
|
|
555
|
+
raise StaleFenceError(
|
|
556
|
+
f"message {message_id!r} is not claimed at fence {expected_fence}"
|
|
557
|
+
)
|
|
558
|
+
assert_inbox_transition(InboxState(row["status"]), InboxState.DISCARDED)
|
|
559
|
+
await connection.execute(
|
|
560
|
+
"UPDATE kernel_inbox SET status='discarded' WHERE message_id=?",
|
|
561
|
+
(message_id,),
|
|
562
|
+
)
|
|
563
|
+
await connection.commit()
|
|
564
|
+
except BaseException:
|
|
565
|
+
await connection.rollback()
|
|
566
|
+
raise
|
|
567
|
+
await self._emit_activation(
|
|
568
|
+
control_event(
|
|
569
|
+
session_id=row["session_id"],
|
|
570
|
+
event_type="control.message_discarded",
|
|
571
|
+
payload={
|
|
572
|
+
"message_id": message_id,
|
|
573
|
+
"fencing_token": int(expected_fence),
|
|
574
|
+
},
|
|
575
|
+
),
|
|
576
|
+
activation,
|
|
577
|
+
expected_fence,
|
|
578
|
+
)
|
|
579
|
+
|
|
580
|
+
async def inbox_depth(self, agent_instance_id: str, session_id: str | None = None) -> int:
|
|
581
|
+
connection = await self._connect()
|
|
582
|
+
sql = (
|
|
583
|
+
"SELECT COUNT(*) AS depth FROM kernel_inbox "
|
|
584
|
+
"WHERE agent_instance_id=? AND status='accepted'"
|
|
585
|
+
)
|
|
586
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
587
|
+
if session_id is not None:
|
|
588
|
+
sql += " AND session_id=?"
|
|
589
|
+
params += (session_id,)
|
|
590
|
+
row = await self._fetchone(connection, sql, params)
|
|
591
|
+
return int(row["depth"] if row is not None else 0)
|
|
592
|
+
|
|
459
593
|
async def claim_next(
|
|
460
594
|
self, agent_instance_id: str, session_id: str, fencing_token: int
|
|
461
595
|
) -> InboxMessage | None:
|
|
462
596
|
async with self._write_lock:
|
|
463
597
|
connection = await self._begin()
|
|
464
598
|
try:
|
|
465
|
-
activation = self._activation_row(
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
599
|
+
activation = self._activation_row(
|
|
600
|
+
await self._fetchone(
|
|
601
|
+
connection,
|
|
602
|
+
"SELECT * FROM kernel_activations "
|
|
603
|
+
"WHERE agent_instance_id=? AND session_id=?",
|
|
604
|
+
(agent_instance_id, session_id),
|
|
605
|
+
)
|
|
606
|
+
)
|
|
470
607
|
if (
|
|
471
608
|
activation is None
|
|
472
609
|
or activation["lease_expires_at"] <= time.time()
|
|
@@ -490,6 +627,7 @@ class SQLiteAgentKernelStore:
|
|
|
490
627
|
if row is None:
|
|
491
628
|
await connection.commit()
|
|
492
629
|
return None
|
|
630
|
+
await self._sqlite_require_claim_grant(connection, row)
|
|
493
631
|
if row["status"] == InboxState.ACCEPTED.value:
|
|
494
632
|
assert_inbox_transition(InboxState(row["status"]), InboxState.CLAIMED)
|
|
495
633
|
await connection.execute(
|
|
@@ -524,9 +662,8 @@ class SQLiteAgentKernelStore:
|
|
|
524
662
|
activation = await self._check_fence(
|
|
525
663
|
connection, row["agent_instance_id"], row["session_id"], expected_fence
|
|
526
664
|
)
|
|
527
|
-
if (
|
|
528
|
-
|
|
529
|
-
or row["claimed_fence"] != int(expected_fence)
|
|
665
|
+
if row["status"] != InboxState.CLAIMED.value or row["claimed_fence"] != int(
|
|
666
|
+
expected_fence
|
|
530
667
|
):
|
|
531
668
|
raise StaleFenceError(
|
|
532
669
|
f"message {message_id!r} is not claimed at fence {expected_fence}"
|
|
@@ -557,7 +694,7 @@ class SQLiteAgentKernelStore:
|
|
|
557
694
|
connection: aiosqlite.Connection,
|
|
558
695
|
agent_instance_id: str,
|
|
559
696
|
session_id: str,
|
|
560
|
-
guard: ActivationWriteGuard,
|
|
697
|
+
guard: ActivationWriteGuard | AdmissionWriteGuard,
|
|
561
698
|
) -> dict[str, Any]:
|
|
562
699
|
row = await self._fetchone(
|
|
563
700
|
connection,
|
|
@@ -598,7 +735,10 @@ class SQLiteAgentKernelStore:
|
|
|
598
735
|
if isinstance(self._events, SessionServiceEventStore)
|
|
599
736
|
else None
|
|
600
737
|
)
|
|
601
|
-
if
|
|
738
|
+
if (
|
|
739
|
+
not isinstance(service, LocalSessionService)
|
|
740
|
+
or service.db_path != self.db_path.resolve()
|
|
741
|
+
):
|
|
602
742
|
raise RuntimeError(
|
|
603
743
|
"SQLite InteractionLedger requires SessionEventStore backed by the "
|
|
604
744
|
"same SQLite database"
|
|
@@ -731,9 +871,7 @@ class SQLiteAgentKernelStore:
|
|
|
731
871
|
|
|
732
872
|
presentation = None
|
|
733
873
|
if row["presentation_json"]:
|
|
734
|
-
presentation = InteractionPresentation.model_validate_json(
|
|
735
|
-
row["presentation_json"]
|
|
736
|
-
)
|
|
874
|
+
presentation = InteractionPresentation.model_validate_json(row["presentation_json"])
|
|
737
875
|
return InteractionRecord(
|
|
738
876
|
interaction_id=row["interaction_id"],
|
|
739
877
|
tenant_id=row["tenant_id"],
|
|
@@ -749,14 +887,10 @@ class SQLiteAgentKernelStore:
|
|
|
749
887
|
presentation=presentation,
|
|
750
888
|
provider_id=row["provider_id"] or "",
|
|
751
889
|
native_target=(
|
|
752
|
-
json.loads(row["native_target_json"])
|
|
753
|
-
if row["native_target_json"]
|
|
754
|
-
else None
|
|
890
|
+
json.loads(row["native_target_json"]) if row["native_target_json"] else None
|
|
755
891
|
),
|
|
756
892
|
continuation_metadata=(
|
|
757
|
-
json.loads(row["continuation_json"])
|
|
758
|
-
if row["continuation_json"]
|
|
759
|
-
else None
|
|
893
|
+
json.loads(row["continuation_json"]) if row["continuation_json"] else None
|
|
760
894
|
),
|
|
761
895
|
)
|
|
762
896
|
|
|
@@ -769,11 +903,7 @@ class SQLiteAgentKernelStore:
|
|
|
769
903
|
record.run_id,
|
|
770
904
|
record.kind,
|
|
771
905
|
json.dumps(record.request_schema, ensure_ascii=False),
|
|
772
|
-
(
|
|
773
|
-
record.presentation.model_dump_json()
|
|
774
|
-
if record.presentation is not None
|
|
775
|
-
else None
|
|
776
|
-
),
|
|
906
|
+
(record.presentation.model_dump_json() if record.presentation is not None else None),
|
|
777
907
|
record.revision,
|
|
778
908
|
record.status,
|
|
779
909
|
record.created_at,
|
|
@@ -869,17 +999,11 @@ class SQLiteAgentKernelStore:
|
|
|
869
999
|
submission.idempotency_key,
|
|
870
1000
|
),
|
|
871
1001
|
)
|
|
872
|
-
if
|
|
873
|
-
existing_sub is not None
|
|
874
|
-
and existing_sub["submission_digest"] == sub_digest
|
|
875
|
-
):
|
|
1002
|
+
if existing_sub is not None and existing_sub["submission_digest"] == sub_digest:
|
|
876
1003
|
await connection.commit()
|
|
877
|
-
return InteractionReceipt.model_validate_json(
|
|
878
|
-
existing_sub["receipt_json"]
|
|
879
|
-
)
|
|
1004
|
+
return InteractionReceipt.model_validate_json(existing_sub["receipt_json"])
|
|
880
1005
|
raise InvalidCommandError(
|
|
881
|
-
"interaction already reached terminal status"
|
|
882
|
-
f" {current.status!r}",
|
|
1006
|
+
f"interaction already reached terminal status {current.status!r}",
|
|
883
1007
|
details={
|
|
884
1008
|
"reason": ALREADY_RESOLVED,
|
|
885
1009
|
"interaction_id": current.interaction_id,
|
|
@@ -967,13 +1091,9 @@ class SQLiteAgentKernelStore:
|
|
|
967
1091
|
async with self._write_lock:
|
|
968
1092
|
connection = await self._begin()
|
|
969
1093
|
try:
|
|
970
|
-
row = await self._interaction_row_for_guard(
|
|
971
|
-
connection, interaction_id, guard
|
|
972
|
-
)
|
|
1094
|
+
row = await self._interaction_row_for_guard(connection, interaction_id, guard)
|
|
973
1095
|
if row is None:
|
|
974
|
-
raise InvalidCommandError(
|
|
975
|
-
f"unknown interaction_id {interaction_id!r}"
|
|
976
|
-
)
|
|
1096
|
+
raise InvalidCommandError(f"unknown interaction_id {interaction_id!r}")
|
|
977
1097
|
await self._check_interaction_guard(
|
|
978
1098
|
connection, row["agent_instance_id"], row["session_id"], guard
|
|
979
1099
|
)
|
|
@@ -981,8 +1101,7 @@ class SQLiteAgentKernelStore:
|
|
|
981
1101
|
assert current is not None
|
|
982
1102
|
if is_terminal(current.status):
|
|
983
1103
|
raise InvalidCommandError(
|
|
984
|
-
f"interaction already reached terminal status"
|
|
985
|
-
f" {current.status!r}",
|
|
1104
|
+
f"interaction already reached terminal status {current.status!r}",
|
|
986
1105
|
details={
|
|
987
1106
|
"reason": ALREADY_RESOLVED,
|
|
988
1107
|
"interaction_id": current.interaction_id,
|
|
@@ -1002,9 +1121,7 @@ class SQLiteAgentKernelStore:
|
|
|
1002
1121
|
update={"status": status, "revision": current.revision + 1}
|
|
1003
1122
|
)
|
|
1004
1123
|
event_type = (
|
|
1005
|
-
"interaction.cancelled"
|
|
1006
|
-
if status == "cancelled"
|
|
1007
|
-
else "interaction.expired"
|
|
1124
|
+
"interaction.cancelled" if status == "cancelled" else "interaction.expired"
|
|
1008
1125
|
)
|
|
1009
1126
|
stored = await self._append_interaction_event_on(
|
|
1010
1127
|
connection,
|
|
@@ -1099,12 +1216,10 @@ class SQLiteAgentKernelStore:
|
|
|
1099
1216
|
(interaction_id, tenant_id, agent_instance_id, session_id, run_id),
|
|
1100
1217
|
)
|
|
1101
1218
|
return self._row_to_record(row)
|
|
1102
|
-
|
|
1219
|
+
rows = await connection.execute_fetchall(
|
|
1103
1220
|
"SELECT * FROM kernel_interactions WHERE interaction_id=? LIMIT 2",
|
|
1104
1221
|
(interaction_id,),
|
|
1105
1222
|
)
|
|
1106
|
-
rows = await cursor.fetchall()
|
|
1107
|
-
await cursor.close()
|
|
1108
1223
|
if len(rows) > 1:
|
|
1109
1224
|
raise InvalidCommandError(
|
|
1110
1225
|
f"interaction_id {interaction_id!r} is ambiguous without trusted scope",
|
|
@@ -1113,17 +1228,23 @@ class SQLiteAgentKernelStore:
|
|
|
1113
1228
|
return self._row_to_record(rows[0]) if rows else None
|
|
1114
1229
|
|
|
1115
1230
|
async def get_terminal_receipt(
|
|
1116
|
-
self,
|
|
1117
|
-
|
|
1231
|
+
self,
|
|
1232
|
+
interaction_id: str,
|
|
1233
|
+
*,
|
|
1234
|
+
tenant_id: str,
|
|
1235
|
+
agent_instance_id: str,
|
|
1236
|
+
session_id: str,
|
|
1237
|
+
run_id: str,
|
|
1118
1238
|
) -> InteractionReceipt | None:
|
|
1119
1239
|
"""Read the committed outcome inside a complete trusted scope.
|
|
1120
1240
|
|
|
1121
1241
|
Resolved alone does not mean approved. Pending/resolving records never
|
|
1122
1242
|
yield an authorization receipt; callers must still match the request.
|
|
1123
1243
|
"""
|
|
1124
|
-
if not all(
|
|
1125
|
-
|
|
1126
|
-
|
|
1244
|
+
if not all(
|
|
1245
|
+
isinstance(value, str) and value
|
|
1246
|
+
for value in (interaction_id, tenant_id, agent_instance_id, session_id, run_id)
|
|
1247
|
+
):
|
|
1127
1248
|
raise InvalidCommandError("interaction receipt requires a complete trusted scope")
|
|
1128
1249
|
row = await self._fetchone(
|
|
1129
1250
|
await self._connect(),
|
|
@@ -1134,8 +1255,11 @@ class SQLiteAgentKernelStore:
|
|
|
1134
1255
|
if row is None or not is_terminal(row["status"]):
|
|
1135
1256
|
return None
|
|
1136
1257
|
return InteractionReceipt(
|
|
1137
|
-
interaction_id=row["interaction_id"],
|
|
1138
|
-
|
|
1258
|
+
interaction_id=row["interaction_id"],
|
|
1259
|
+
revision=int(row["revision"]),
|
|
1260
|
+
status=row["status"],
|
|
1261
|
+
outcome=row["outcome"],
|
|
1262
|
+
event_id=row["event_id"],
|
|
1139
1263
|
accepted_seq=row["accepted_seq"],
|
|
1140
1264
|
)
|
|
1141
1265
|
|
|
@@ -1143,13 +1267,11 @@ class SQLiteAgentKernelStore:
|
|
|
1143
1267
|
self, tenant_id: str, session_id: str
|
|
1144
1268
|
) -> list[InteractionRecord]:
|
|
1145
1269
|
connection = await self._connect()
|
|
1146
|
-
|
|
1270
|
+
rows = await connection.execute_fetchall(
|
|
1147
1271
|
"SELECT * FROM kernel_interactions WHERE tenant_id=? AND session_id=?"
|
|
1148
1272
|
" AND status='pending' ORDER BY created_at",
|
|
1149
1273
|
(tenant_id, session_id),
|
|
1150
1274
|
)
|
|
1151
|
-
rows = await cursor.fetchall()
|
|
1152
|
-
await cursor.close()
|
|
1153
1275
|
records = [self._row_to_record(row) for row in rows]
|
|
1154
1276
|
return [r for r in records if r is not None]
|
|
1155
1277
|
|
|
@@ -1286,6 +1408,32 @@ class SQLiteAgentKernelStore:
|
|
|
1286
1408
|
await connection.rollback()
|
|
1287
1409
|
raise
|
|
1288
1410
|
|
|
1411
|
+
async def current_lease(
|
|
1412
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
1413
|
+
) -> ActivationLease | None:
|
|
1414
|
+
connection = await self._connect()
|
|
1415
|
+
sql = (
|
|
1416
|
+
"SELECT * FROM kernel_activations WHERE agent_instance_id=? "
|
|
1417
|
+
"AND released=0 AND lease_expires_at>?"
|
|
1418
|
+
)
|
|
1419
|
+
params: tuple[Any, ...] = (agent_instance_id, time.time())
|
|
1420
|
+
if session_id is not None:
|
|
1421
|
+
sql += " AND session_id=?"
|
|
1422
|
+
params += (session_id,)
|
|
1423
|
+
sql += " ORDER BY lease_expires_at DESC LIMIT 1"
|
|
1424
|
+
row = await self._fetchone(connection, sql, params)
|
|
1425
|
+
if row is None:
|
|
1426
|
+
return None
|
|
1427
|
+
return ActivationLease(
|
|
1428
|
+
agent_instance_id=row["agent_instance_id"],
|
|
1429
|
+
activation_id=row["activation_id"],
|
|
1430
|
+
fencing_token=int(row["fencing_token"]),
|
|
1431
|
+
lease_expires_at=row["lease_expires_at_iso"],
|
|
1432
|
+
bundle_digest=row["bundle_digest"],
|
|
1433
|
+
runtime_type=row["runtime_type"],
|
|
1434
|
+
capability_digest=row["capability_digest"],
|
|
1435
|
+
)
|
|
1436
|
+
|
|
1289
1437
|
# ------------------------------------------------------------------ events
|
|
1290
1438
|
|
|
1291
1439
|
async def append_event(
|
|
@@ -1315,23 +1463,24 @@ class SQLiteAgentKernelStore:
|
|
|
1315
1463
|
) -> dict[str, Any]:
|
|
1316
1464
|
connection = await self._connect()
|
|
1317
1465
|
if agent_instance_id is not None:
|
|
1318
|
-
row = self._activation_row(
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1466
|
+
row = self._activation_row(
|
|
1467
|
+
await self._fetchone(
|
|
1468
|
+
connection,
|
|
1469
|
+
"SELECT * FROM kernel_activations WHERE agent_instance_id=? AND session_id=?",
|
|
1470
|
+
(agent_instance_id, session_id),
|
|
1471
|
+
)
|
|
1472
|
+
)
|
|
1323
1473
|
if row is None:
|
|
1324
1474
|
raise StaleFenceError(
|
|
1325
1475
|
"no active activation lease",
|
|
1326
1476
|
details={"agent_instance_id": agent_instance_id, "session_id": session_id},
|
|
1327
1477
|
)
|
|
1328
1478
|
return row
|
|
1329
|
-
|
|
1479
|
+
records = await connection.execute_fetchall(
|
|
1330
1480
|
"SELECT * FROM kernel_activations WHERE session_id=? AND released=0",
|
|
1331
1481
|
(session_id,),
|
|
1332
1482
|
)
|
|
1333
|
-
rows = [self._activation_row(row) for row in
|
|
1334
|
-
await cursor.close()
|
|
1483
|
+
rows = [self._activation_row(row) for row in records]
|
|
1335
1484
|
rows = [row for row in rows if row is not None]
|
|
1336
1485
|
if len(rows) != 1:
|
|
1337
1486
|
raise StaleFenceError(
|
|
@@ -1342,6 +1491,19 @@ class SQLiteAgentKernelStore:
|
|
|
1342
1491
|
|
|
1343
1492
|
# -------------------------------------------------------------------- runs
|
|
1344
1493
|
|
|
1494
|
+
async def find_command_run(
|
|
1495
|
+
self, agent_instance_id: str, session_id: str, command_id: str
|
|
1496
|
+
) -> RunRecord | None:
|
|
1497
|
+
connection = await self._connect()
|
|
1498
|
+
rows = await connection.execute_fetchall(
|
|
1499
|
+
"SELECT run_id FROM kernel_runs WHERE agent_instance_id=? AND session_id=? "
|
|
1500
|
+
"AND json_extract(metadata_json, '$.command_id')=? LIMIT 2",
|
|
1501
|
+
(agent_instance_id, session_id, command_id),
|
|
1502
|
+
)
|
|
1503
|
+
if len(rows) > 1:
|
|
1504
|
+
raise InvalidCommandError("ambiguous runs for the same command")
|
|
1505
|
+
return await self.load_run(rows[0]["run_id"]) if rows else None
|
|
1506
|
+
|
|
1345
1507
|
async def load_run(self, run_id: str) -> RunRecord | None:
|
|
1346
1508
|
row = await self._fetchone(
|
|
1347
1509
|
await self._connect(), "SELECT * FROM kernel_runs WHERE run_id=?", (run_id,)
|
|
@@ -1359,9 +1521,52 @@ class SQLiteAgentKernelStore:
|
|
|
1359
1521
|
metadata=json.loads(row["metadata_json"]),
|
|
1360
1522
|
)
|
|
1361
1523
|
|
|
1362
|
-
async def
|
|
1363
|
-
self,
|
|
1364
|
-
) -> RunRecord:
|
|
1524
|
+
async def find_active_run(
|
|
1525
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
1526
|
+
) -> RunRecord | None:
|
|
1527
|
+
connection = await self._connect()
|
|
1528
|
+
sql = (
|
|
1529
|
+
"SELECT run_id FROM kernel_runs WHERE agent_instance_id=? "
|
|
1530
|
+
"AND state IN ('running','paused','waiting')"
|
|
1531
|
+
)
|
|
1532
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
1533
|
+
if session_id is not None:
|
|
1534
|
+
sql += " AND session_id=?"
|
|
1535
|
+
params += (session_id,)
|
|
1536
|
+
sql += " ORDER BY created_at LIMIT 1"
|
|
1537
|
+
row = await self._fetchone(connection, sql, params)
|
|
1538
|
+
return await self.load_run(row["run_id"]) if row is not None else None
|
|
1539
|
+
|
|
1540
|
+
async def save_runtime_checkpoint(
|
|
1541
|
+
self, run_id: str, checkpoint: dict, *, agent_instance_id: str,
|
|
1542
|
+
session_id: str, guard: ActivationWriteGuard,
|
|
1543
|
+
) -> None:
|
|
1544
|
+
from ksadk.kernel.runtime_checkpoint import checkpoint_copy, require_checkpoint_owner
|
|
1545
|
+
|
|
1546
|
+
checkpoint = checkpoint_copy(checkpoint)
|
|
1547
|
+
async with self._write_lock:
|
|
1548
|
+
connection = await self._begin()
|
|
1549
|
+
try:
|
|
1550
|
+
activation = await self._check_fence(
|
|
1551
|
+
connection, agent_instance_id, session_id, guard.fencing_token,
|
|
1552
|
+
)
|
|
1553
|
+
if activation["activation_id"] != guard.activation_id:
|
|
1554
|
+
raise StaleFenceError("runtime checkpoint activation mismatch")
|
|
1555
|
+
run = await self.load_run(run_id)
|
|
1556
|
+
require_checkpoint_owner(
|
|
1557
|
+
run, agent_instance_id=agent_instance_id, session_id=session_id,
|
|
1558
|
+
)
|
|
1559
|
+
metadata = dict(run.metadata, runtime_checkpoint=checkpoint)
|
|
1560
|
+
await connection.execute(
|
|
1561
|
+
"UPDATE kernel_runs SET metadata_json=?, updated_at=? WHERE run_id=?",
|
|
1562
|
+
(json.dumps(metadata, ensure_ascii=False), now_iso(), run_id),
|
|
1563
|
+
)
|
|
1564
|
+
await connection.commit()
|
|
1565
|
+
except BaseException:
|
|
1566
|
+
await connection.rollback()
|
|
1567
|
+
raise
|
|
1568
|
+
|
|
1569
|
+
async def save_run_transition(self, run: RunRecord, *, expected_fence: int) -> RunRecord:
|
|
1365
1570
|
async with self._write_lock:
|
|
1366
1571
|
connection = await self._begin()
|
|
1367
1572
|
try:
|
|
@@ -1369,6 +1574,11 @@ class SQLiteAgentKernelStore:
|
|
|
1369
1574
|
connection, run.agent_instance_id, run.session_id, expected_fence
|
|
1370
1575
|
)
|
|
1371
1576
|
existing = await self.load_run(run.run_id)
|
|
1577
|
+
from ksadk.kernel.runtime_checkpoint import preserve_runtime_checkpoint
|
|
1578
|
+
|
|
1579
|
+
run = run.model_copy(update={"metadata": preserve_runtime_checkpoint(
|
|
1580
|
+
run.metadata, existing.metadata if existing else None,
|
|
1581
|
+
)})
|
|
1372
1582
|
assert_run_transition(existing.state if existing else None, run.state)
|
|
1373
1583
|
if is_active_run(run.state):
|
|
1374
1584
|
cursor = await connection.execute(
|