agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.5__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.5.dist-info}/METADATA +6 -3
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/RECORD +591 -365
- ksadk/_build_provenance.json +1 -1
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +6 -0
- ksadk/builders/code_builder.py +38 -12
- ksadk/builders/framework_requirements.py +20 -2
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +28 -5
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +64 -16
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/codex/client.py +3 -2
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +125 -31
- ksadk/configs/env_registry_studio.py +86 -0
- ksadk/configs/global_config.py +1 -1
- ksadk/configs/settings.py +3 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +16 -5
- ksadk/conversations/message_projection.py +23 -32
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +8 -0
- ksadk/conversations/runtime_persistence.py +105 -9
- ksadk/conversations/runtime_preparation.py +13 -7
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +34 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +14 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_store.py +213 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_runtime.py +237 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +122 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +506 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +403 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_tuning.py +168 -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 +42 -0
- ksadk/harness/engine/context_pipeline.py +579 -0
- ksadk/harness/engine/graph_builder.py +859 -0
- ksadk/harness/engine/langgraph.py +931 -0
- ksadk/harness/engine/mcp_disclosure.py +750 -0
- ksadk/harness/engine/policy_runtime.py +70 -0
- ksadk/harness/engine/postgres_checkpointer.py +63 -0
- ksadk/harness/engine/run_control_bridge.py +80 -0
- ksadk/harness/engine/run_types.py +88 -0
- ksadk/harness/engine/skill_disclosure.py +189 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/subagents.py +343 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +144 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +461 -0
- ksadk/harness/execution_policy.py +94 -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 +454 -0
- ksadk/harness/loop/tools.py +762 -0
- ksadk/harness/managed_runtime.py +884 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_runtime.py +471 -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/model_capability.py +253 -0
- ksadk/harness/model_provider.py +220 -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/prompt_cache.py +70 -0
- ksadk/harness/public_activity.py +154 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +466 -13
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/run_control.py +668 -0
- ksadk/harness/runtime.py +146 -111
- ksadk/harness/runtime_capabilities.py +158 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +530 -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/session_store.py +243 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +259 -0
- ksadk/harness/spec.py +332 -0
- ksadk/harness/state.py +153 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +253 -0
- ksadk/harness/tool_policy.py +131 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -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 +1 -1
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +86 -102
- ksadk/kernel/contract_fingerprints.py +1 -1
- ksadk/kernel/contracts.py +5 -0
- ksadk/kernel/control.py +32 -1
- ksadk/kernel/execution_grants.py +221 -0
- ksadk/kernel/execution_grants_memory.py +133 -0
- ksadk/kernel/execution_grants_postgres.py +217 -0
- ksadk/kernel/execution_grants_sqlite.py +209 -0
- ksadk/kernel/ingress.py +27 -27
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +24 -11
- ksadk/kernel/postgres_store.py +63 -33
- ksadk/kernel/recovery.py +78 -14
- ksadk/kernel/sql/001_agent_kernel.sql +23 -0
- ksadk/kernel/sqlite_store.py +304 -25
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +69 -2
- ksadk/kernel/worker.py +79 -41
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +47 -0
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +40 -1
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +42 -3
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +4 -2
- ksadk/model_proxy/transform.py +40 -2
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +11 -0
- ksadk/plugins/builtins.py +40 -2
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +101 -19
- ksadk/plugins/execution_host.py +99 -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/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 +10 -2
- ksadk/plugins/providers/dsh_capabilities.py +61 -0
- ksadk/plugins/providers/harness.py +181 -33
- ksadk/plugins/providers/harness_delegation.py +593 -0
- ksadk/plugins/providers/harness_managed.py +456 -0
- ksadk/plugins/providers/harness_tools.py +326 -0
- 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 +680 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1427 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +138 -0
- ksadk/plugins/teams/runtime.py +777 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +311 -0
- ksadk/plugins/teams/task_decisions.py +423 -0
- ksadk/plugins/teams/transport.py +91 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/runners/_langgraph_runner_streams.py +121 -45
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +25 -60
- ksadk/runners/langgraph_runner.py +128 -111
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runtime/_runner_adapter/stream_mapping.py +52 -2
- ksadk/runtime/conversation_execution.py +25 -1
- ksadk/runtime/executor.py +9 -1
- ksadk/runtime/factory.py +36 -1
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +38 -9
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +103 -1
- ksadk/sandbox/backends/e2b.py +245 -23
- ksadk/sandbox/backends/local_process.py +63 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/local_controls.py +746 -0
- ksadk/sandbox/local_launcher.py +90 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +64 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/kernel_ingress.py +9 -1
- ksadk/server/routes/misc.py +233 -25
- ksadk/server/routes/models.py +3 -3
- ksadk/server/routes/openai_compat.py +76 -13
- ksadk/server/routes/run.py +106 -35
- ksadk/server/routes/sessions.py +244 -68
- ksadk/server/routes/workspace.py +130 -21
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-DHuAWfr5.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-DeBkbJvI.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-C35w-pn1.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-BCtGGkhN.js} +1 -1
- ksadk/server/static/assets/channel-_KDifNys.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-Bx1jS-X-.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-B7nCawed.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
- ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-1nXCdsej.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-2vL2sAdF.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B3bA05-e.js} +1 -1
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BLpRy_Yx.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-BO_UwatH.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-BdNFAney.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-C0J5_3qM.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-CGt_UGeO.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-CIRMvUM4.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-CIpWk_5f.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-CPyieXEf.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-D-92S-Fd.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-DNKuMzWc.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-DWfdmz9s.js} +2 -2
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-DppE_r-D.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-DyG6Ya-z.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-M-SrdhhZ.js} +1 -1
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-mqD5TZup.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-n3n6t_FO.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-qe8xjesy.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-t6MzE0jU.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Dpz9_0zn.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DcxzRwYC.js} +1 -1
- ksadk/server/static/assets/index-BMd2mucF.css +2 -0
- ksadk/server/static/assets/index-D5qyyhTH.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-mtjOi4KM.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-BETqsxE_.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DPWrvs90.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-CJG2mfBP.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-4d78KiEY.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-CMD3x_U_.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- 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 +393 -52
- 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/tool_defs.py +108 -3
- ksadk/studio/api.py +592 -57
- ksadk/studio/api_contracts.py +8 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/builder.py +12 -0
- ksadk/studio/capabilities.py +23 -6
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +30 -10
- ksadk/studio/cloud_shared_web.py +75 -2
- ksadk/studio/codex_agent_service.py +2 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +10 -0
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contracts.py +33 -5
- ksadk/studio/dsh_application.py +135 -25
- ksadk/studio/dsh_capability_service.py +287 -20
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +36 -5
- ksadk/studio/execution_host.py +525 -0
- ksadk/studio/framework_run.py +32 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/kernel_registry.py +418 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/model_client.py +1178 -64
- ksadk/studio/model_profile_service.py +26 -11
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/plugin_composition.py +13 -2
- ksadk/studio/plugin_kernel_adapter.py +15 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_runtime.py +230 -17
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +59 -32
- ksadk/studio/resource_catalog.py +6 -0
- ksadk/studio/run_activity.py +895 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +329 -33
- ksadk/studio/runtime_catalog.py +53 -10
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +398 -103
- ksadk/studio/shared_web.py +149 -36
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-UIqo-BPW.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-OhNwH4K9.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-g0I-I4dD.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.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-CfEnms6Y.css +2 -0
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -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 +133 -0
- ksadk/studio/teams_installation.py +214 -0
- ksadk/studio/teams_node.py +545 -0
- ksadk/studio/teams_node_runner.py +69 -0
- ksadk/studio/teams_remote.py +274 -0
- ksadk/studio/templates.py +40 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +136 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/toolsets/__init__.py +11 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/workspace.py +3 -3
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/version.py +1 -1
- 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 +26 -13
- 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.5.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/kernel/recovery.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""冷恢复决策表:RecoveryCoordinator(
|
|
2
|
+
"""冷恢复决策表:RecoveryCoordinator(Kernel Task 7)。
|
|
3
3
|
|
|
4
4
|
接管一个 agent_instance 的 open run 时按固定决策表收口:
|
|
5
5
|
|
|
@@ -31,6 +31,7 @@ from ksadk.kernel.contracts import (
|
|
|
31
31
|
RuntimeCapabilityMatrix,
|
|
32
32
|
WriteContext,
|
|
33
33
|
)
|
|
34
|
+
from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
|
|
34
35
|
from ksadk.kernel.state import RunState, is_terminal_run
|
|
35
36
|
from ksadk.kernel.store import AgentKernelStore, RunRecord, control_event
|
|
36
37
|
|
|
@@ -100,12 +101,15 @@ class RecoveryCoordinator:
|
|
|
100
101
|
activation: ActivationLease,
|
|
101
102
|
*,
|
|
102
103
|
run_id: str | None = None,
|
|
104
|
+
session_id: str | None = None,
|
|
103
105
|
) -> RecoveryReport:
|
|
104
106
|
fence = activation.fencing_token
|
|
105
107
|
guard: WriteContext = ActivationWriteGuard(
|
|
106
108
|
activation_id=activation.activation_id, fencing_token=fence
|
|
107
109
|
)
|
|
108
|
-
run = await self._load_run(agent_instance_id, run_id)
|
|
110
|
+
run = await self._load_run(agent_instance_id, run_id, session_id=session_id)
|
|
111
|
+
if run is not None:
|
|
112
|
+
await self._require_session_lease(run, activation)
|
|
109
113
|
if run is None or is_terminal_run(run.state):
|
|
110
114
|
return await self._decide(
|
|
111
115
|
agent_instance_id,
|
|
@@ -131,11 +135,36 @@ class RecoveryCoordinator:
|
|
|
131
135
|
capabilities.attach.supported
|
|
132
136
|
and capabilities.durable_restore.supported
|
|
133
137
|
and handle_digest_valid
|
|
134
|
-
and
|
|
135
|
-
|
|
138
|
+
and (
|
|
139
|
+
self._adapter_factory is not None
|
|
140
|
+
or (self._executor is not None and self._launch_context is not None)
|
|
141
|
+
)
|
|
136
142
|
):
|
|
137
143
|
try:
|
|
138
|
-
|
|
144
|
+
from ksadk.runtime.adapter import RunHandle
|
|
145
|
+
|
|
146
|
+
persisted_handle = RunHandle.model_validate(handle_dump)
|
|
147
|
+
if self._adapter_factory is not None:
|
|
148
|
+
# PluginHost/DSH builds must recover through their pinned
|
|
149
|
+
# provider adapter. Going through the global RuntimeExecutor
|
|
150
|
+
# would create a different direct runtime and bypass the
|
|
151
|
+
# provider's checkpoint, capabilities and resources.
|
|
152
|
+
adapter = self._adapter_factory()
|
|
153
|
+
handle = await adapter.durable_restore(persisted_handle)
|
|
154
|
+
if handle != persisted_handle:
|
|
155
|
+
raise ValueError(
|
|
156
|
+
"adapter durable_restore must preserve persisted handle identity"
|
|
157
|
+
)
|
|
158
|
+
stream_owner = adapter
|
|
159
|
+
else:
|
|
160
|
+
assert self._executor is not None
|
|
161
|
+
assert self._launch_context is not None
|
|
162
|
+
handle = await self._executor.attach_record(run, self._launch_context)
|
|
163
|
+
adapter = getattr(self._executor, "adapter", None)
|
|
164
|
+
stream_owner = self._executor
|
|
165
|
+
|
|
166
|
+
def stream(): # type: ignore[no-untyped-def]
|
|
167
|
+
return stream_owner.stream(handle)
|
|
139
168
|
except Exception as error:
|
|
140
169
|
return await self._decide(
|
|
141
170
|
agent_instance_id,
|
|
@@ -150,13 +179,26 @@ class RecoveryCoordinator:
|
|
|
150
179
|
self._register_execution(
|
|
151
180
|
run.run_id,
|
|
152
181
|
handle.run_id,
|
|
153
|
-
|
|
182
|
+
adapter,
|
|
154
183
|
handle,
|
|
155
184
|
)
|
|
185
|
+
if run.state is RunState.WAITING:
|
|
186
|
+
# A durable interaction checkpoint has no remaining events
|
|
187
|
+
# until a user/approver replies. Empty stream output here is
|
|
188
|
+
# not completion: retain WAITING and the attached execution so
|
|
189
|
+
# submit_interaction reaches the same provider instance.
|
|
190
|
+
return await self._decide(
|
|
191
|
+
agent_instance_id,
|
|
192
|
+
activation,
|
|
193
|
+
run,
|
|
194
|
+
outcome="attached",
|
|
195
|
+
reason="durable_interaction_attached",
|
|
196
|
+
guard=guard,
|
|
197
|
+
)
|
|
156
198
|
# attach 成功后重新消费剩余 stream:事实继续落库,自然结束收口。
|
|
157
199
|
try:
|
|
158
200
|
await self._consume_remaining_stream(
|
|
159
|
-
|
|
201
|
+
stream,
|
|
160
202
|
run,
|
|
161
203
|
guard,
|
|
162
204
|
)
|
|
@@ -203,6 +245,7 @@ class RecoveryCoordinator:
|
|
|
203
245
|
activation: ActivationLease,
|
|
204
246
|
*,
|
|
205
247
|
reason: str = "recover_error_settled_interrupted",
|
|
248
|
+
session_id: str | None = None,
|
|
206
249
|
) -> RecoveryReport:
|
|
207
250
|
"""P0-1 兜底收口:``recover`` 抛错后的确定性 interrupted 决策。
|
|
208
251
|
|
|
@@ -216,7 +259,9 @@ class RecoveryCoordinator:
|
|
|
216
259
|
activation_id=activation.activation_id,
|
|
217
260
|
fencing_token=activation.fencing_token,
|
|
218
261
|
)
|
|
219
|
-
run = await self._load_run(agent_instance_id, None)
|
|
262
|
+
run = await self._load_run(agent_instance_id, None, session_id=session_id)
|
|
263
|
+
if run is not None:
|
|
264
|
+
await self._require_session_lease(run, activation)
|
|
220
265
|
if run is None or is_terminal_run(run.state):
|
|
221
266
|
return await self._decide(
|
|
222
267
|
agent_instance_id,
|
|
@@ -346,14 +391,33 @@ class RecoveryCoordinator:
|
|
|
346
391
|
)
|
|
347
392
|
|
|
348
393
|
async def _load_run(
|
|
349
|
-
self, agent_instance_id: str, run_id: str | None
|
|
394
|
+
self, agent_instance_id: str, run_id: str | None, *, session_id: str | None
|
|
350
395
|
) -> RunRecord | None:
|
|
351
396
|
if run_id is not None:
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
397
|
+
run = await self._store.load_run(run_id)
|
|
398
|
+
else:
|
|
399
|
+
run = await self._store.find_active_run(agent_instance_id, session_id)
|
|
400
|
+
if run is not None and (
|
|
401
|
+
run.agent_instance_id != agent_instance_id
|
|
402
|
+
or (session_id is not None and run.session_id != session_id)
|
|
403
|
+
):
|
|
404
|
+
raise InvalidCommandError("Run does not belong to the requested recovery scope")
|
|
405
|
+
return run
|
|
406
|
+
|
|
407
|
+
async def _require_session_lease(
|
|
408
|
+
self, run: RunRecord, activation: ActivationLease
|
|
409
|
+
) -> None:
|
|
410
|
+
# Fencing counters are independent per session and commonly equal.
|
|
411
|
+
# Validate the activation identity before attaching a native execution;
|
|
412
|
+
# a matching integer alone cannot authorize another member's Run.
|
|
413
|
+
owned = await self._store.current_lease(run.agent_instance_id, run.session_id)
|
|
414
|
+
if (
|
|
415
|
+
activation.agent_instance_id != run.agent_instance_id
|
|
416
|
+
or owned is None
|
|
417
|
+
or owned.activation_id != activation.activation_id
|
|
418
|
+
or owned.fencing_token != activation.fencing_token
|
|
419
|
+
):
|
|
420
|
+
raise StaleFenceError("recovery requires the Run's current session lease")
|
|
357
421
|
|
|
358
422
|
async def _interrupt_deterministically(
|
|
359
423
|
self,
|
|
@@ -118,3 +118,26 @@ CREATE TABLE IF NOT EXISTS kernel_interaction_submissions (
|
|
|
118
118
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
119
119
|
PRIMARY KEY (tenant_id, interaction_id, idempotency_key)
|
|
120
120
|
);
|
|
121
|
+
|
|
122
|
+
-- Revocable execution-grants/v1 extension. Grant lock precedes Inbox lock.
|
|
123
|
+
-- Timestamps use the portable wire representation; receipts are stable JSON.
|
|
124
|
+
CREATE TABLE IF NOT EXISTS kernel_execution_grants (
|
|
125
|
+
grant_id TEXT PRIMARY KEY,
|
|
126
|
+
tenant_id TEXT NOT NULL,
|
|
127
|
+
agent_instance_id TEXT NOT NULL,
|
|
128
|
+
session_id TEXT NOT NULL,
|
|
129
|
+
owner_ref TEXT NOT NULL,
|
|
130
|
+
state TEXT NOT NULL CHECK (state IN ('active','suspended','revoked')),
|
|
131
|
+
revision BIGINT NOT NULL CHECK (revision > 0),
|
|
132
|
+
created_at TEXT NOT NULL,
|
|
133
|
+
updated_at TEXT NOT NULL
|
|
134
|
+
);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_kernel_execution_grants_scope
|
|
136
|
+
ON kernel_execution_grants (tenant_id, agent_instance_id, session_id);
|
|
137
|
+
CREATE TABLE IF NOT EXISTS kernel_execution_grant_operations (
|
|
138
|
+
grant_id TEXT NOT NULL,
|
|
139
|
+
idempotency_key TEXT NOT NULL,
|
|
140
|
+
request_digest TEXT NOT NULL,
|
|
141
|
+
receipt_json TEXT NOT NULL,
|
|
142
|
+
PRIMARY KEY (grant_id, idempotency_key)
|
|
143
|
+
);
|
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,7 +78,7 @@ 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 =
|
|
81
|
+
SCHEMA_VERSION = 3
|
|
83
82
|
|
|
84
83
|
_SCHEMA = """
|
|
85
84
|
CREATE TABLE IF NOT EXISTS kernel_inbox (
|
|
@@ -177,7 +176,7 @@ CREATE TABLE IF NOT EXISTS kernel_interaction_submissions (
|
|
|
177
176
|
"""
|
|
178
177
|
|
|
179
178
|
|
|
180
|
-
class SQLiteAgentKernelStore:
|
|
179
|
+
class SQLiteAgentKernelStore(SQLiteExecutionGrantMixin):
|
|
181
180
|
def __init__(
|
|
182
181
|
self,
|
|
183
182
|
db_path: str | Path,
|
|
@@ -204,7 +203,7 @@ class SQLiteAgentKernelStore:
|
|
|
204
203
|
connection = await self._connect()
|
|
205
204
|
async with self._write_lock:
|
|
206
205
|
# CREATE ... IF NOT EXISTS + 整数 user_version,重复启动幂等。
|
|
207
|
-
await connection.executescript(_SCHEMA)
|
|
206
|
+
await connection.executescript(_SCHEMA + EXECUTION_GRANT_SCHEMA)
|
|
208
207
|
await connection.execute(f"PRAGMA user_version={SCHEMA_VERSION}")
|
|
209
208
|
await connection.commit()
|
|
210
209
|
|
|
@@ -259,16 +258,20 @@ class SQLiteAgentKernelStore:
|
|
|
259
258
|
return activation
|
|
260
259
|
|
|
261
260
|
async def _emit_admission(
|
|
262
|
-
self, envelope: SessionEventEnvelope, command: AgentControlCommand
|
|
261
|
+
self, envelope: SessionEventEnvelope, command: AgentControlCommand,
|
|
262
|
+
*, connection: aiosqlite.Connection | None = None,
|
|
263
263
|
) -> None:
|
|
264
264
|
# admission 事实的 guard 绑定提交方 permit 引用与 command_id。
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
authorization_ref=command.authorization_ref,
|
|
269
|
-
command_id=command.command_id,
|
|
270
|
-
),
|
|
265
|
+
guard = AdmissionWriteGuard(
|
|
266
|
+
authorization_ref=command.authorization_ref,
|
|
267
|
+
command_id=command.command_id,
|
|
271
268
|
)
|
|
269
|
+
service = getattr(self._events, "session_service", None)
|
|
270
|
+
if (connection is not None and isinstance(service, LocalSessionService)
|
|
271
|
+
and service.db_path == self.db_path):
|
|
272
|
+
await self._append_interaction_event_on(connection, envelope, guard)
|
|
273
|
+
else:
|
|
274
|
+
await self._events.append(envelope, guard=guard)
|
|
272
275
|
|
|
273
276
|
async def _emit_activation(
|
|
274
277
|
self, envelope: SessionEventEnvelope, activation: dict[str, Any], fence: int
|
|
@@ -347,6 +350,13 @@ class SQLiteAgentKernelStore:
|
|
|
347
350
|
accepted_seq=existing["accepted_seq"],
|
|
348
351
|
)
|
|
349
352
|
|
|
353
|
+
grant_error = await self._sqlite_admission_grant_error(connection, command)
|
|
354
|
+
if grant_error:
|
|
355
|
+
await connection.commit()
|
|
356
|
+
return await self.reject_command(
|
|
357
|
+
command, status="rejected", code=grant_error, message=grant_error,
|
|
358
|
+
)
|
|
359
|
+
|
|
350
360
|
depth_row = await self._fetchone(
|
|
351
361
|
connection,
|
|
352
362
|
"SELECT COUNT(*) AS depth FROM kernel_inbox "
|
|
@@ -406,14 +416,9 @@ class SQLiteAgentKernelStore:
|
|
|
406
416
|
command.model_dump_json(),
|
|
407
417
|
),
|
|
408
418
|
)
|
|
409
|
-
#
|
|
410
|
-
#
|
|
411
|
-
#
|
|
412
|
-
# 不产生 "persisted-but-untracked" 半状态,客户端可安全重试。
|
|
413
|
-
# 残余窗口:事件已追加但 kernel commit 崩溃 -> 出现一条孤儿
|
|
414
|
-
# accepted 事件而无 Inbox 行;该窗口不返回 ack,重试会重新
|
|
415
|
-
# 走完整路径(seq 单调,可能产生一条重复 accepted 事件),
|
|
416
|
-
# 不存在已 ack 但未持久化的状态。
|
|
419
|
+
# Shared local storage appends the event through this same
|
|
420
|
+
# connection, atomically with Inbox admission. Legacy external
|
|
421
|
+
# event stores retain the pre-existing persist-before-ack path.
|
|
417
422
|
await self._emit_admission(
|
|
418
423
|
control_event(
|
|
419
424
|
session_id=command.session_id,
|
|
@@ -428,6 +433,7 @@ class SQLiteAgentKernelStore:
|
|
|
428
433
|
causation_id=str(command.command_id),
|
|
429
434
|
),
|
|
430
435
|
command,
|
|
436
|
+
connection=connection,
|
|
431
437
|
)
|
|
432
438
|
await connection.commit()
|
|
433
439
|
except BaseException:
|
|
@@ -456,6 +462,233 @@ class SQLiteAgentKernelStore:
|
|
|
456
462
|
command=AgentControlCommand.model_validate_json(row["payload_json"]),
|
|
457
463
|
)
|
|
458
464
|
|
|
465
|
+
async def load_by_idempotency(
|
|
466
|
+
self, session_id: str, idempotency_key: str
|
|
467
|
+
) -> InboxMessage | None:
|
|
468
|
+
connection = await self._connect()
|
|
469
|
+
row = await self._fetchone(
|
|
470
|
+
connection,
|
|
471
|
+
"SELECT message_id FROM kernel_inbox "
|
|
472
|
+
"WHERE session_id=? AND idempotency_key=?",
|
|
473
|
+
(session_id, idempotency_key),
|
|
474
|
+
)
|
|
475
|
+
return await self.load_message(row["message_id"]) if row is not None else None
|
|
476
|
+
|
|
477
|
+
async def reject_command(
|
|
478
|
+
self,
|
|
479
|
+
command: AgentControlCommand,
|
|
480
|
+
*,
|
|
481
|
+
status: str,
|
|
482
|
+
code: str,
|
|
483
|
+
message: str,
|
|
484
|
+
retryable: bool = False,
|
|
485
|
+
) -> AgentControlReceipt:
|
|
486
|
+
"""Persist a redacted admission rejection without creating Inbox work."""
|
|
487
|
+
|
|
488
|
+
await self._emit_admission(
|
|
489
|
+
control_event(
|
|
490
|
+
session_id=command.session_id,
|
|
491
|
+
event_type="control.command_rejected",
|
|
492
|
+
payload={
|
|
493
|
+
"command_id": str(command.command_id),
|
|
494
|
+
"status": status,
|
|
495
|
+
"reason": code,
|
|
496
|
+
},
|
|
497
|
+
causation_id=str(command.command_id),
|
|
498
|
+
),
|
|
499
|
+
command,
|
|
500
|
+
)
|
|
501
|
+
return self._receipt(
|
|
502
|
+
command,
|
|
503
|
+
status,
|
|
504
|
+
error=ControlError(code=code, message=message, retryable=retryable),
|
|
505
|
+
)
|
|
506
|
+
|
|
507
|
+
async def list_messages(
|
|
508
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
509
|
+
) -> list[InboxMessage]:
|
|
510
|
+
connection = await self._connect()
|
|
511
|
+
sql = "SELECT message_id FROM kernel_inbox WHERE agent_instance_id=?"
|
|
512
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
513
|
+
if session_id is not None:
|
|
514
|
+
sql += " AND session_id=?"
|
|
515
|
+
params += (session_id,)
|
|
516
|
+
sql += " ORDER BY accepted_seq"
|
|
517
|
+
cursor = await connection.execute(sql, params)
|
|
518
|
+
rows = await cursor.fetchall()
|
|
519
|
+
await cursor.close()
|
|
520
|
+
messages = [await self.load_message(row["message_id"]) for row in rows]
|
|
521
|
+
return [message for message in messages if message is not None]
|
|
522
|
+
|
|
523
|
+
async def list_pending(
|
|
524
|
+
self,
|
|
525
|
+
agent_instance_id: str,
|
|
526
|
+
session_id: str | None = None,
|
|
527
|
+
*,
|
|
528
|
+
fencing_token: int | None = None,
|
|
529
|
+
) -> list[InboxMessage]:
|
|
530
|
+
"""Return FIFO-visible Inbox rows for the current activation.
|
|
531
|
+
|
|
532
|
+
``accepted`` rows are always pending. When a fence is supplied,
|
|
533
|
+
``claimed`` rows are included as well so the same owner can retry and
|
|
534
|
+
a takeover owner can reclaim work left by an older process.
|
|
535
|
+
"""
|
|
536
|
+
|
|
537
|
+
connection = await self._connect()
|
|
538
|
+
sql = "SELECT message_id FROM kernel_inbox WHERE agent_instance_id=?"
|
|
539
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
540
|
+
if session_id is not None:
|
|
541
|
+
sql += " AND session_id=?"
|
|
542
|
+
params += (session_id,)
|
|
543
|
+
if fencing_token is None:
|
|
544
|
+
sql += " AND status='accepted'"
|
|
545
|
+
else:
|
|
546
|
+
sql += " AND status IN ('accepted','claimed')"
|
|
547
|
+
sql += " ORDER BY accepted_seq"
|
|
548
|
+
cursor = await connection.execute(sql, params)
|
|
549
|
+
rows = await cursor.fetchall()
|
|
550
|
+
await cursor.close()
|
|
551
|
+
messages = [await self.load_message(row["message_id"]) for row in rows]
|
|
552
|
+
return [message for message in messages if message is not None]
|
|
553
|
+
|
|
554
|
+
async def claim_message(
|
|
555
|
+
self, message_id: str, fencing_token: int
|
|
556
|
+
) -> InboxMessage:
|
|
557
|
+
"""Claim one selected message, idempotently for the same fence."""
|
|
558
|
+
|
|
559
|
+
message_id = str(message_id)
|
|
560
|
+
async with self._write_lock:
|
|
561
|
+
connection = await self._begin()
|
|
562
|
+
try:
|
|
563
|
+
row = await self._fetchone(
|
|
564
|
+
connection,
|
|
565
|
+
"SELECT * FROM kernel_inbox WHERE message_id=?",
|
|
566
|
+
(message_id,),
|
|
567
|
+
)
|
|
568
|
+
if row is None:
|
|
569
|
+
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
570
|
+
activation = await self._check_fence(
|
|
571
|
+
connection,
|
|
572
|
+
row["agent_instance_id"],
|
|
573
|
+
row["session_id"],
|
|
574
|
+
fencing_token,
|
|
575
|
+
)
|
|
576
|
+
await self._sqlite_require_claim_grant(connection, row)
|
|
577
|
+
if (
|
|
578
|
+
row["status"] == InboxState.CLAIMED.value
|
|
579
|
+
and row["claimed_fence"] == int(fencing_token)
|
|
580
|
+
):
|
|
581
|
+
await connection.commit()
|
|
582
|
+
message = await self.load_message(message_id)
|
|
583
|
+
assert message is not None
|
|
584
|
+
return message
|
|
585
|
+
if row["status"] not in (
|
|
586
|
+
InboxState.ACCEPTED.value,
|
|
587
|
+
InboxState.CLAIMED.value,
|
|
588
|
+
):
|
|
589
|
+
raise InvalidCommandError(
|
|
590
|
+
f"message {message_id!r} is not claimable at status "
|
|
591
|
+
f"{row['status']}"
|
|
592
|
+
)
|
|
593
|
+
if row["status"] == InboxState.ACCEPTED.value:
|
|
594
|
+
assert_inbox_transition(
|
|
595
|
+
InboxState(row["status"]), InboxState.CLAIMED
|
|
596
|
+
)
|
|
597
|
+
await connection.execute(
|
|
598
|
+
"UPDATE kernel_inbox SET status='claimed', claimed_fence=? "
|
|
599
|
+
"WHERE message_id=?",
|
|
600
|
+
(int(fencing_token), message_id),
|
|
601
|
+
)
|
|
602
|
+
await connection.commit()
|
|
603
|
+
except BaseException:
|
|
604
|
+
await connection.rollback()
|
|
605
|
+
raise
|
|
606
|
+
await self._emit_activation(
|
|
607
|
+
control_event(
|
|
608
|
+
session_id=row["session_id"],
|
|
609
|
+
event_type="control.message_claimed",
|
|
610
|
+
payload={
|
|
611
|
+
"message_id": message_id,
|
|
612
|
+
"accepted_seq": int(row["accepted_seq"]),
|
|
613
|
+
"fencing_token": int(fencing_token),
|
|
614
|
+
},
|
|
615
|
+
),
|
|
616
|
+
activation,
|
|
617
|
+
fencing_token,
|
|
618
|
+
)
|
|
619
|
+
message = await self.load_message(message_id)
|
|
620
|
+
assert message is not None
|
|
621
|
+
return message
|
|
622
|
+
|
|
623
|
+
async def discard_claim(
|
|
624
|
+
self, message_id: str, *, expected_fence: int
|
|
625
|
+
) -> None:
|
|
626
|
+
"""Settle a typed rejection as ``claimed -> discarded``."""
|
|
627
|
+
|
|
628
|
+
message_id = str(message_id)
|
|
629
|
+
async with self._write_lock:
|
|
630
|
+
connection = await self._begin()
|
|
631
|
+
try:
|
|
632
|
+
row = await self._fetchone(
|
|
633
|
+
connection,
|
|
634
|
+
"SELECT * FROM kernel_inbox WHERE message_id=?",
|
|
635
|
+
(message_id,),
|
|
636
|
+
)
|
|
637
|
+
if row is None:
|
|
638
|
+
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
639
|
+
activation = await self._check_fence(
|
|
640
|
+
connection,
|
|
641
|
+
row["agent_instance_id"],
|
|
642
|
+
row["session_id"],
|
|
643
|
+
expected_fence,
|
|
644
|
+
)
|
|
645
|
+
if (
|
|
646
|
+
row["status"] != InboxState.CLAIMED.value
|
|
647
|
+
or row["claimed_fence"] != int(expected_fence)
|
|
648
|
+
):
|
|
649
|
+
raise StaleFenceError(
|
|
650
|
+
f"message {message_id!r} is not claimed at fence "
|
|
651
|
+
f"{expected_fence}"
|
|
652
|
+
)
|
|
653
|
+
assert_inbox_transition(
|
|
654
|
+
InboxState(row["status"]), InboxState.DISCARDED
|
|
655
|
+
)
|
|
656
|
+
await connection.execute(
|
|
657
|
+
"UPDATE kernel_inbox SET status='discarded' WHERE message_id=?",
|
|
658
|
+
(message_id,),
|
|
659
|
+
)
|
|
660
|
+
await connection.commit()
|
|
661
|
+
except BaseException:
|
|
662
|
+
await connection.rollback()
|
|
663
|
+
raise
|
|
664
|
+
await self._emit_activation(
|
|
665
|
+
control_event(
|
|
666
|
+
session_id=row["session_id"],
|
|
667
|
+
event_type="control.message_discarded",
|
|
668
|
+
payload={
|
|
669
|
+
"message_id": message_id,
|
|
670
|
+
"fencing_token": int(expected_fence),
|
|
671
|
+
},
|
|
672
|
+
),
|
|
673
|
+
activation,
|
|
674
|
+
expected_fence,
|
|
675
|
+
)
|
|
676
|
+
|
|
677
|
+
async def inbox_depth(
|
|
678
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
679
|
+
) -> int:
|
|
680
|
+
connection = await self._connect()
|
|
681
|
+
sql = (
|
|
682
|
+
"SELECT COUNT(*) AS depth FROM kernel_inbox "
|
|
683
|
+
"WHERE agent_instance_id=? AND status='accepted'"
|
|
684
|
+
)
|
|
685
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
686
|
+
if session_id is not None:
|
|
687
|
+
sql += " AND session_id=?"
|
|
688
|
+
params += (session_id,)
|
|
689
|
+
row = await self._fetchone(connection, sql, params)
|
|
690
|
+
return int(row["depth"] if row is not None else 0)
|
|
691
|
+
|
|
459
692
|
async def claim_next(
|
|
460
693
|
self, agent_instance_id: str, session_id: str, fencing_token: int
|
|
461
694
|
) -> InboxMessage | None:
|
|
@@ -490,6 +723,7 @@ class SQLiteAgentKernelStore:
|
|
|
490
723
|
if row is None:
|
|
491
724
|
await connection.commit()
|
|
492
725
|
return None
|
|
726
|
+
await self._sqlite_require_claim_grant(connection, row)
|
|
493
727
|
if row["status"] == InboxState.ACCEPTED.value:
|
|
494
728
|
assert_inbox_transition(InboxState(row["status"]), InboxState.CLAIMED)
|
|
495
729
|
await connection.execute(
|
|
@@ -557,7 +791,7 @@ class SQLiteAgentKernelStore:
|
|
|
557
791
|
connection: aiosqlite.Connection,
|
|
558
792
|
agent_instance_id: str,
|
|
559
793
|
session_id: str,
|
|
560
|
-
guard: ActivationWriteGuard,
|
|
794
|
+
guard: ActivationWriteGuard | AdmissionWriteGuard,
|
|
561
795
|
) -> dict[str, Any]:
|
|
562
796
|
row = await self._fetchone(
|
|
563
797
|
connection,
|
|
@@ -598,7 +832,10 @@ class SQLiteAgentKernelStore:
|
|
|
598
832
|
if isinstance(self._events, SessionServiceEventStore)
|
|
599
833
|
else None
|
|
600
834
|
)
|
|
601
|
-
if
|
|
835
|
+
if (
|
|
836
|
+
not isinstance(service, LocalSessionService)
|
|
837
|
+
or service.db_path != self.db_path.resolve()
|
|
838
|
+
):
|
|
602
839
|
raise RuntimeError(
|
|
603
840
|
"SQLite InteractionLedger requires SessionEventStore backed by the "
|
|
604
841
|
"same SQLite database"
|
|
@@ -1286,6 +1523,32 @@ class SQLiteAgentKernelStore:
|
|
|
1286
1523
|
await connection.rollback()
|
|
1287
1524
|
raise
|
|
1288
1525
|
|
|
1526
|
+
async def current_lease(
|
|
1527
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
1528
|
+
) -> ActivationLease | None:
|
|
1529
|
+
connection = await self._connect()
|
|
1530
|
+
sql = (
|
|
1531
|
+
"SELECT * FROM kernel_activations WHERE agent_instance_id=? "
|
|
1532
|
+
"AND released=0 AND lease_expires_at>?"
|
|
1533
|
+
)
|
|
1534
|
+
params: tuple[Any, ...] = (agent_instance_id, time.time())
|
|
1535
|
+
if session_id is not None:
|
|
1536
|
+
sql += " AND session_id=?"
|
|
1537
|
+
params += (session_id,)
|
|
1538
|
+
sql += " ORDER BY lease_expires_at DESC LIMIT 1"
|
|
1539
|
+
row = await self._fetchone(connection, sql, params)
|
|
1540
|
+
if row is None:
|
|
1541
|
+
return None
|
|
1542
|
+
return ActivationLease(
|
|
1543
|
+
agent_instance_id=row["agent_instance_id"],
|
|
1544
|
+
activation_id=row["activation_id"],
|
|
1545
|
+
fencing_token=int(row["fencing_token"]),
|
|
1546
|
+
lease_expires_at=row["lease_expires_at_iso"],
|
|
1547
|
+
bundle_digest=row["bundle_digest"],
|
|
1548
|
+
runtime_type=row["runtime_type"],
|
|
1549
|
+
capability_digest=row["capability_digest"],
|
|
1550
|
+
)
|
|
1551
|
+
|
|
1289
1552
|
# ------------------------------------------------------------------ events
|
|
1290
1553
|
|
|
1291
1554
|
async def append_event(
|
|
@@ -1359,6 +1622,22 @@ class SQLiteAgentKernelStore:
|
|
|
1359
1622
|
metadata=json.loads(row["metadata_json"]),
|
|
1360
1623
|
)
|
|
1361
1624
|
|
|
1625
|
+
async def find_active_run(
|
|
1626
|
+
self, agent_instance_id: str, session_id: str | None = None
|
|
1627
|
+
) -> RunRecord | None:
|
|
1628
|
+
connection = await self._connect()
|
|
1629
|
+
sql = (
|
|
1630
|
+
"SELECT run_id FROM kernel_runs WHERE agent_instance_id=? "
|
|
1631
|
+
"AND state IN ('running','paused','waiting')"
|
|
1632
|
+
)
|
|
1633
|
+
params: tuple[Any, ...] = (agent_instance_id,)
|
|
1634
|
+
if session_id is not None:
|
|
1635
|
+
sql += " AND session_id=?"
|
|
1636
|
+
params += (session_id,)
|
|
1637
|
+
sql += " ORDER BY created_at LIMIT 1"
|
|
1638
|
+
row = await self._fetchone(connection, sql, params)
|
|
1639
|
+
return await self.load_run(row["run_id"]) if row is not None else None
|
|
1640
|
+
|
|
1362
1641
|
async def save_run_transition(
|
|
1363
1642
|
self, run: RunRecord, *, expected_fence: int
|
|
1364
1643
|
) -> RunRecord:
|
ksadk/kernel/state.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""Agent Kernel Inbox/Run 状态机与事务不变量(
|
|
2
|
+
"""Agent Kernel Inbox/Run 状态机与事务不变量(Kernel Task 3)。
|
|
3
3
|
|
|
4
4
|
Inbox 固定 ``accepted -> claimed -> completed|discarded``;
|
|
5
5
|
Run 固定 ``pending -> running -> paused|waiting|completed|failed|cancelled|interrupted``,
|
|
@@ -8,8 +8,7 @@ Run 固定 ``pending -> running -> paused|waiting|completed|failed|cancelled|int
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
-
from
|
|
12
|
-
|
|
11
|
+
from ksadk._str_enum import StrEnum
|
|
13
12
|
from ksadk.kernel.errors import InvalidCommandError
|
|
14
13
|
|
|
15
14
|
|