agentengine-sdk-python 0.8.3__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.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +13 -9
- agentengine_sdk_python-0.8.5.dist-info/RECORD +1296 -0
- 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 +111 -91
- ksadk/builders/code_builder.py +74 -21
- ksadk/builders/framework_requirements.py +22 -3
- ksadk/builders/ks3_uploader.py +36 -7
- ksadk/builders/managed_runtime_builder.py +1 -0
- ksadk/cli/__init__.py +68 -3
- 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_managed_runtime.py +13 -1
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +76 -13
- ksadk/cli/cmd_studio.py +64 -16
- ksadk/cli/cmd_web.py +2 -5
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/cli/runtime_bootstrap.py +23 -1
- ksadk/codex/client.py +425 -96
- ksadk/codex/projection.py +24 -0
- ksadk/codex/runtime.py +56 -298
- ksadk/common/auth.py +16 -10
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +153 -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 +133 -21
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +4 -6
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_invocation.py +22 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +9 -0
- ksadk/conversations/runtime_persistence.py +105 -9
- ksadk/conversations/runtime_preparation.py +42 -33
- ksadk/conversations/runtime_resume.py +50 -2
- ksadk/conversations/runtime_stream_events.py +34 -35
- ksadk/conversations/runtime_streaming.py +33 -7
- ksadk/deployment/env_forward.py +2 -2
- ksadk/deployment/providers/serverless.py +1 -1
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_codex_validators.py +18 -7
- ksadk/events/adapters/_langgraph_support.py +34 -0
- ksadk/events/adapters/langgraph.py +15 -1
- ksadk/events/canonical_store.py +3 -1
- ksadk/events/projections.py +1 -1
- 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/config.py +2 -2
- 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 +171 -136
- 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/tools.py +38 -13
- 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 +2 -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 +2 -1
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +114 -106
- 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 +42 -29
- 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 +331 -25
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +72 -2
- ksadk/kernel/worker.py +144 -51
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +47 -0
- ksadk/knowledge_base/client.py +57 -27
- ksadk/mcp_runtime/__init__.py +12 -4
- ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
- ksadk/memory/adk/resilient_session_service.py +25 -17
- ksadk/memory/adk/short_term_memory.py +26 -9
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +40 -1
- ksadk/memory/models.py +84 -5
- ksadk/memory/provider_resolver.py +8 -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 +14 -7
- ksadk/model_proxy/transform.py +40 -2
- ksadk/plugins/__init__.py +5 -1
- ksadk/plugins/artifacts.py +275 -0
- ksadk/plugins/bridges/__init__.py +4 -2
- ksadk/plugins/bridges/codex.py +120 -13
- ksadk/plugins/bridges/dsh.py +351 -156
- ksadk/plugins/builtins.py +72 -35
- ksadk/plugins/bundle_security.py +28 -4
- ksadk/plugins/codex_manifest.py +983 -0
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/composition.py +8 -0
- ksadk/plugins/contracts.py +119 -1
- ksadk/plugins/delivery.py +153 -0
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_installation_digest.py +71 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +203 -32
- ksadk/plugins/ecosystem_probe.py +6 -6
- ksadk/plugins/execution_host.py +99 -0
- ksadk/plugins/host.py +102 -39
- ksadk/plugins/kernel_adapter.py +205 -0
- ksadk/plugins/providers/__init__.py +23 -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/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
- ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
- 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/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +920 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
- 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 +115 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +19 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +344 -70
- ksadk/plugins/providers/codex_native.py +368 -0
- ksadk/plugins/providers/codex_turn.py +301 -0
- ksadk/plugins/providers/dsh_capabilities.py +1450 -0
- ksadk/plugins/providers/dsh_mcp.py +467 -0
- ksadk/plugins/providers/harness.py +294 -141
- 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/mcp_projection.py +150 -0
- ksadk/plugins/providers/platform_resources.py +657 -0
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/resolver.py +8 -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/resource_runtime/__init__.py +4 -0
- ksadk/resource_runtime/broker.py +616 -0
- ksadk/resource_runtime/build_artifacts.py +165 -0
- ksadk/resource_runtime/contracts.py +138 -0
- ksadk/resource_runtime/discovery_receipts.py +100 -0
- ksadk/resource_runtime/discovery_skills.py +172 -0
- ksadk/resource_runtime/errors.py +6 -0
- ksadk/resource_runtime/ipc.py +142 -0
- ksadk/resource_runtime/kernel_approval.py +165 -0
- ksadk/resource_runtime/knowledge.py +114 -0
- ksadk/resource_runtime/langgraph.py +94 -0
- ksadk/resource_runtime/leases.py +191 -0
- ksadk/resource_runtime/managed_projection.py +186 -0
- ksadk/resource_runtime/mcp_server.py +138 -0
- ksadk/resource_runtime/memory_provider.py +318 -0
- ksadk/resource_runtime/memory_receipts.py +34 -0
- ksadk/resource_runtime/operation_ledger.py +211 -0
- ksadk/resource_runtime/plugin_config.py +48 -0
- ksadk/resource_runtime/policy_authorization.py +54 -0
- ksadk/resource_runtime/process.py +110 -0
- ksadk/resource_runtime/skill_artifacts.py +153 -0
- ksadk/resource_runtime/skill_runtime.py +42 -0
- ksadk/resource_runtime/skill_workspace.py +118 -0
- ksadk/resource_runtime/skills.py +215 -0
- ksadk/resource_runtime/snapshots.py +180 -0
- ksadk/resource_runtime/socket_server.py +103 -0
- ksadk/resource_runtime/supervisor.py +380 -0
- ksadk/resource_runtime/worker.py +504 -0
- ksadk/runners/_langgraph_runner_streams.py +182 -38
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +166 -63
- ksadk/runners/base_runner.py +29 -1
- ksadk/runners/langgraph_runner.py +542 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runtime/_runner_adapter/stream_mapping.py +194 -20
- ksadk/runtime/adapter.py +2 -0
- ksadk/runtime/conversation_execution.py +117 -17
- ksadk/runtime/executor.py +87 -3
- ksadk/runtime/factory.py +65 -274
- ksadk/runtime/framework_adapters.py +23 -0
- ksadk/runtime/preprocessing.py +21 -5
- ksadk/runtime/runner_adapter.py +106 -18
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +142 -2
- ksadk/sandbox/backends/e2b.py +288 -25
- ksadk/sandbox/backends/local_process.py +72 -39
- ksadk/sandbox/base.py +64 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +66 -0
- ksadk/sandbox/local_controls.py +746 -0
- ksadk/sandbox/local_launcher.py +90 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/scheduler/sqlite_store.py +18 -0
- ksadk/server/composition.py +2 -0
- ksadk/server/factory.py +5 -0
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/persistence_capability.py +516 -0
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +271 -52
- ksadk/server/routes/dependencies.py +16 -0
- ksadk/server/routes/kernel_ingress.py +9 -1
- ksadk/server/routes/misc.py +233 -25
- ksadk/server/routes/models.py +47 -4
- ksadk/server/routes/openai_compat.py +76 -13
- ksadk/server/routes/projection.py +252 -12
- ksadk/server/routes/run.py +106 -35
- ksadk/server/routes/sessions.py +491 -138
- ksadk/server/routes/streaming.py +43 -9
- ksadk/server/routes/workspace.py +130 -21
- ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-DHuAWfr5.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
- ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-DeBkbJvI.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
- ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-C35w-pn1.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.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-bZ7ws-8m.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.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-CkonRdAS.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
- ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-B7nCawed.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
- ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
- ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-1nXCdsej.js} +1 -1
- ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-2vL2sAdF.js} +1 -1
- ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-B3bA05-e.js} +1 -1
- ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-BLpRy_Yx.js} +1 -1
- ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-BO_UwatH.js} +1 -1
- ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-BdNFAney.js} +1 -1
- ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-C0J5_3qM.js} +1 -1
- ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-CGt_UGeO.js} +1 -1
- ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CIRMvUM4.js} +1 -1
- ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-CIpWk_5f.js} +1 -1
- ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-CPyieXEf.js} +1 -1
- ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-D-92S-Fd.js} +1 -1
- ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-DNKuMzWc.js} +1 -1
- ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-DWfdmz9s.js} +2 -2
- ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DppE_r-D.js} +1 -1
- ksadk/server/static/assets/{dist-C71CsujO.js → dist-DyG6Ya-z.js} +1 -1
- ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-M-SrdhhZ.js} +1 -1
- ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-mqD5TZup.js} +1 -1
- ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-n3n6t_FO.js} +1 -1
- ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-qe8xjesy.js} +1 -1
- ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-t6MzE0jU.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.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-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.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-CgoyWiDR.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
- ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-mtjOi4KM.js} +1 -1
- ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-BETqsxE_.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-DPWrvs90.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.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-BQVc9ia_.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.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-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.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-EnNl0DE7.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/session_context.py +66 -0
- ksadk/sessions/__init__.py +11 -21
- ksadk/sessions/_local_service_sync.py +263 -1
- ksadk/sessions/base.py +176 -0
- ksadk/sessions/errors.py +4 -0
- ksadk/sessions/in_memory.py +309 -19
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/sessions/local_service.py +83 -1
- ksadk/sessions/persistence.py +275 -0
- ksadk/sessions/postgres_service.py +358 -0
- ksadk/sessions/resilience.py +8 -0
- ksadk/sessions/resilient.py +362 -4
- ksadk/sessions/topology.py +135 -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 +37 -4
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +261 -40
- ksadk/skills/runtime/agent.py +67 -9
- ksadk/skills/runtime/artifact_delivery.py +139 -0
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +460 -27
- ksadk/skills/runtime/backends/local.py +629 -62
- ksadk/skills/runtime/base.py +81 -7
- ksadk/skills/runtime/executor.py +268 -1
- ksadk/skills/runtime/loader.py +118 -5
- ksadk/skills/runtime/pinned.py +114 -0
- ksadk/skills/runtime/request.py +49 -0
- ksadk/skills/service_client.py +167 -28
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/api.py +810 -93
- ksadk/studio/api_catalog_routes.py +18 -0
- ksadk/studio/api_contracts.py +8 -2
- ksadk/studio/api_plugin_routes.py +562 -104
- ksadk/studio/api_resource_connections.py +221 -0
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +23 -16
- ksadk/studio/builder.py +88 -0
- ksadk/studio/capabilities.py +23 -6
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +370 -112
- ksadk/studio/cloud_shared_web.py +638 -0
- ksadk/studio/codex_agent_service.py +130 -28
- ksadk/studio/codex_builder.py +242 -3
- ksadk/studio/codex_credentials.py +90 -0
- ksadk/studio/codex_manifest.py +31 -4
- ksadk/studio/codex_plugin_store.py +746 -0
- ksadk/studio/codex_provider_build.py +231 -0
- ksadk/studio/codex_run.py +190 -26
- ksadk/studio/compatibility_report.py +12 -1
- ksadk/studio/compiler.py +88 -14
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contracts.py +165 -11
- ksadk/studio/dsh_application.py +247 -0
- ksadk/studio/dsh_capability_service.py +1374 -0
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_models.py +59 -0
- ksadk/studio/dsh_provider_registration.py +367 -21
- 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 +89 -14
- ksadk/studio/kernel_registry.py +418 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/mcp_runtime.py +11 -3
- ksadk/studio/model_client.py +1180 -66
- ksadk/studio/model_profile_service.py +26 -11
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/plugin_composition.py +202 -24
- ksadk/studio/plugin_kernel_adapter.py +21 -106
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_runtime.py +448 -56
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +664 -0
- ksadk/studio/resource_binding_validation.py +77 -0
- ksadk/studio/resource_build_admission.py +196 -0
- ksadk/studio/resource_build_materializer.py +149 -0
- ksadk/studio/resource_catalog.py +149 -2
- ksadk/studio/resource_connections.py +220 -0
- ksadk/studio/run_activity.py +895 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +789 -83
- ksadk/studio/runtime_catalog.py +53 -10
- ksadk/studio/runtime_source.py +16 -8
- ksadk/studio/scheduler_assistant.py +317 -0
- ksadk/studio/scheduler_runtime.py +32 -280
- ksadk/studio/scheduler_service.py +3 -0
- ksadk/studio/service.py +861 -120
- ksadk/studio/shared_web.py +579 -82
- 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/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-BEOyPC3w.css +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/arc-Pry-7G1_.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/array-BifhSqXX.js +1 -0
- ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CLB4L11u.js +129 -0
- ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BOma_Z_F.js +38 -0
- 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-2Q5K7J3B-C1jixKkw.js +1 -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-DVtDP4rm.js +62 -0
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -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-CpEZCUgg.js +128 -0
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
- ksadk/studio/static/assets/chunk-GMAD6QVW-DE_8H717.js +72 -0
- 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-D38axYOR.js +231 -0
- ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- 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-DiCQjx9b.js +10 -0
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/chunk-P2QGCYS3-VdhKmfYq.js +1 -0
- 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-DsCFnRVE.js +168 -0
- ksadk/studio/static/assets/chunk-SVP7TREG-DljApgRX.js +88 -0
- ksadk/studio/static/assets/chunk-TICWLB2K-DWqRtyqa.js +206 -0
- 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/chunk-Y2CYZVJY-DsF7k-Jl.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/cytoscape.esm-CGd-uY3x.js +321 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
- ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
- ksadk/studio/static/assets/diagram-S7CK7UJ4-C6aH78c4.js +30 -0
- 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/dist-v5Q1xZ2K.js +1 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/erDiagram-RLTQ6QDP-CGthTMmJ.js +99 -0
- 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/graphlib-DS17s2tU.js +1 -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/init-C-OQMol4.js +1 -0
- ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-BUGEl8cO.js +70 -0
- ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-Ch2ZYxvr.js +139 -0
- ksadk/studio/static/assets/kanban-definition-UXKFOSKX-Da-Fp4vC.js +89 -0
- ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/line-BDaeq300.js +1 -0
- 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-CvlsVQ38.js +96 -0
- ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/path-fybaL0A-.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-DlrWiSOv.js +39 -0
- 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-BA3hpUZM.js +7 -0
- 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-E-Ge0FcV.js +84 -0
- ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
- ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-CcElXGg4.js +162 -0
- ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- 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-CIuYhNy3.js +120 -0
- 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-CMJiaedy.js +78 -0
- ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-BdgtMvW2.js +7 -0
- 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
- agentengine_sdk_python-0.8.3.dist-info/RECORD +0 -833
- ksadk/server/static/assets/MathMessageMarkdown-D9uB55Oh.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +0 -1
- ksadk/server/static/assets/channel-s354Yo6o.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +0 -1
- ksadk/server/static/assets/dist-DdRBIceA.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +0 -1
- ksadk/server/static/assets/index-B2k_urY8.js +0 -241
- ksadk/server/static/assets/index-ILPt6IWF.css +0 -2
- ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +0 -1
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
- ksadk/studio/static/assets/index-DXs1Eq4M.css +0 -1
- ksadk/studio/static/assets/index-DeDqwTsD.js +0 -283
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""SQLite grants share BEGIN IMMEDIATE with admission and Inbox claim.
|
|
2
|
+
|
|
3
|
+
Receipts live in this same database, so a lost acknowledgement is resolved by
|
|
4
|
+
the original mutation key even after another transition or a process restart.
|
|
5
|
+
SessionEvent publication is not the authority for a grant barrier.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from ksadk.kernel.contracts import AgentControlCommand
|
|
11
|
+
from ksadk.kernel.errors import InvalidCommandError
|
|
12
|
+
from ksadk.kernel.execution_grants import (
|
|
13
|
+
ExecutionGrantBarrier,
|
|
14
|
+
ExecutionGrantBlocked,
|
|
15
|
+
ExecutionGrantRecord,
|
|
16
|
+
ExecutionGrantSpec,
|
|
17
|
+
GrantState,
|
|
18
|
+
command_grant_error,
|
|
19
|
+
execution_grant_id,
|
|
20
|
+
grant_operation_digest,
|
|
21
|
+
make_grant_barrier,
|
|
22
|
+
require_grant_scope,
|
|
23
|
+
transition_grant,
|
|
24
|
+
)
|
|
25
|
+
from ksadk.kernel.store import now_iso
|
|
26
|
+
|
|
27
|
+
EXECUTION_GRANT_SCHEMA = """
|
|
28
|
+
CREATE TABLE IF NOT EXISTS kernel_execution_grants (
|
|
29
|
+
grant_id TEXT PRIMARY KEY,
|
|
30
|
+
tenant_id TEXT NOT NULL,
|
|
31
|
+
agent_instance_id TEXT NOT NULL,
|
|
32
|
+
session_id TEXT NOT NULL,
|
|
33
|
+
owner_ref TEXT NOT NULL,
|
|
34
|
+
state TEXT NOT NULL CHECK (state IN ('active','suspended','revoked')),
|
|
35
|
+
revision INTEGER NOT NULL CHECK (revision > 0),
|
|
36
|
+
created_at TEXT NOT NULL,
|
|
37
|
+
updated_at TEXT NOT NULL
|
|
38
|
+
);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_kernel_execution_grants_scope
|
|
40
|
+
ON kernel_execution_grants (tenant_id, agent_instance_id, session_id);
|
|
41
|
+
CREATE TABLE IF NOT EXISTS kernel_execution_grant_operations (
|
|
42
|
+
grant_id TEXT NOT NULL,
|
|
43
|
+
idempotency_key TEXT NOT NULL,
|
|
44
|
+
request_digest TEXT NOT NULL,
|
|
45
|
+
receipt_json TEXT NOT NULL,
|
|
46
|
+
PRIMARY KEY (grant_id, idempotency_key)
|
|
47
|
+
);
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class SQLiteExecutionGrantMixin:
|
|
52
|
+
async def _sqlite_grant_record(self, connection, grant_id: str) -> ExecutionGrantRecord | None:
|
|
53
|
+
row = await self._fetchone(
|
|
54
|
+
connection, "SELECT * FROM kernel_execution_grants WHERE grant_id=?", (grant_id,)
|
|
55
|
+
)
|
|
56
|
+
return ExecutionGrantRecord.model_validate(dict(row)) if row is not None else None
|
|
57
|
+
|
|
58
|
+
async def ensure_execution_grant(self, spec: ExecutionGrantSpec) -> ExecutionGrantRecord:
|
|
59
|
+
async with self._write_lock:
|
|
60
|
+
connection = await self._begin()
|
|
61
|
+
try:
|
|
62
|
+
record = await self._sqlite_grant_record(connection, spec.grant_id)
|
|
63
|
+
if record is not None:
|
|
64
|
+
require_grant_scope(record, spec)
|
|
65
|
+
else:
|
|
66
|
+
record = ExecutionGrantRecord(
|
|
67
|
+
**spec.model_dump(), created_at=now_iso(), updated_at=now_iso()
|
|
68
|
+
)
|
|
69
|
+
await connection.execute(
|
|
70
|
+
"INSERT INTO kernel_execution_grants (grant_id, tenant_id, "
|
|
71
|
+
"agent_instance_id, "
|
|
72
|
+
"session_id, owner_ref, state, revision, created_at, updated_at) VALUES "
|
|
73
|
+
"(?,?,?,?,?,?,?,?,?)",
|
|
74
|
+
tuple(record.model_dump().values()),
|
|
75
|
+
)
|
|
76
|
+
await connection.commit()
|
|
77
|
+
return record
|
|
78
|
+
except BaseException:
|
|
79
|
+
await connection.rollback()
|
|
80
|
+
raise
|
|
81
|
+
|
|
82
|
+
async def _sqlite_grant_barrier(self, connection, record) -> ExecutionGrantBarrier:
|
|
83
|
+
cursor = await connection.execute(
|
|
84
|
+
"SELECT message_id FROM kernel_inbox WHERE agent_instance_id=? AND session_id=? "
|
|
85
|
+
"ORDER BY accepted_seq",
|
|
86
|
+
(record.agent_instance_id, record.session_id),
|
|
87
|
+
)
|
|
88
|
+
rows = await cursor.fetchall()
|
|
89
|
+
await cursor.close()
|
|
90
|
+
messages = [await self.load_message(row["message_id"]) for row in rows]
|
|
91
|
+
cursor = await connection.execute(
|
|
92
|
+
"SELECT run_id FROM kernel_runs WHERE agent_instance_id=? AND session_id=?",
|
|
93
|
+
(record.agent_instance_id, record.session_id),
|
|
94
|
+
)
|
|
95
|
+
rows = await cursor.fetchall()
|
|
96
|
+
await cursor.close()
|
|
97
|
+
runs = [await self.load_run(row["run_id"]) for row in rows]
|
|
98
|
+
return make_grant_barrier(record, [m for m in messages if m], [r for r in runs if r])
|
|
99
|
+
|
|
100
|
+
async def get_execution_grant(self, spec: ExecutionGrantSpec) -> ExecutionGrantBarrier | None:
|
|
101
|
+
async with self._write_lock:
|
|
102
|
+
connection = await self._begin()
|
|
103
|
+
try:
|
|
104
|
+
record = await self._sqlite_grant_record(connection, spec.grant_id)
|
|
105
|
+
if record is None:
|
|
106
|
+
await connection.commit()
|
|
107
|
+
return None
|
|
108
|
+
require_grant_scope(record, spec)
|
|
109
|
+
barrier = await self._sqlite_grant_barrier(connection, record)
|
|
110
|
+
await connection.commit()
|
|
111
|
+
return barrier
|
|
112
|
+
except BaseException:
|
|
113
|
+
await connection.rollback()
|
|
114
|
+
raise
|
|
115
|
+
|
|
116
|
+
async def set_execution_grant_state(
|
|
117
|
+
self,
|
|
118
|
+
spec: ExecutionGrantSpec,
|
|
119
|
+
state: GrantState,
|
|
120
|
+
*,
|
|
121
|
+
expected_revision: int,
|
|
122
|
+
idempotency_key: str,
|
|
123
|
+
) -> ExecutionGrantBarrier:
|
|
124
|
+
if not idempotency_key or not idempotency_key.strip():
|
|
125
|
+
raise InvalidCommandError("grant mutation requires idempotency_key")
|
|
126
|
+
digest = grant_operation_digest(spec, state, expected_revision)
|
|
127
|
+
async with self._write_lock:
|
|
128
|
+
connection = await self._begin()
|
|
129
|
+
try:
|
|
130
|
+
record = await self._sqlite_grant_record(connection, spec.grant_id)
|
|
131
|
+
if record is None:
|
|
132
|
+
raise InvalidCommandError("execution grant not found")
|
|
133
|
+
require_grant_scope(record, spec)
|
|
134
|
+
previous = await self._fetchone(
|
|
135
|
+
connection,
|
|
136
|
+
"SELECT * FROM kernel_execution_grant_operations WHERE grant_id=? AND "
|
|
137
|
+
"idempotency_key=?",
|
|
138
|
+
(spec.grant_id, idempotency_key),
|
|
139
|
+
)
|
|
140
|
+
if previous is not None:
|
|
141
|
+
if previous["request_digest"] != digest:
|
|
142
|
+
raise InvalidCommandError("execution grant idempotency conflict")
|
|
143
|
+
await connection.commit()
|
|
144
|
+
return ExecutionGrantBarrier.model_validate_json(previous["receipt_json"])
|
|
145
|
+
updated = transition_grant(record, state, expected_revision, now_iso())
|
|
146
|
+
await connection.execute(
|
|
147
|
+
"UPDATE kernel_execution_grants SET state=?, revision=?, updated_at=? WHERE "
|
|
148
|
+
"grant_id=?",
|
|
149
|
+
(updated.state, updated.revision, updated.updated_at, spec.grant_id),
|
|
150
|
+
)
|
|
151
|
+
if state == "revoked":
|
|
152
|
+
await connection.execute(
|
|
153
|
+
"UPDATE kernel_inbox SET status='discarded' WHERE agent_instance_id=? "
|
|
154
|
+
"AND session_id=? "
|
|
155
|
+
"AND status='accepted' AND json_extract(payload_json, "
|
|
156
|
+
"'$.command_type')='enqueue' "
|
|
157
|
+
"AND json_extract(payload_json, '$.payload.execution_grant_id')=?",
|
|
158
|
+
(spec.agent_instance_id, spec.session_id, spec.grant_id),
|
|
159
|
+
)
|
|
160
|
+
barrier = await self._sqlite_grant_barrier(connection, updated)
|
|
161
|
+
await connection.execute(
|
|
162
|
+
"INSERT INTO kernel_execution_grant_operations "
|
|
163
|
+
"(grant_id, idempotency_key, request_digest, receipt_json) VALUES (?,?,?,?)",
|
|
164
|
+
(spec.grant_id, idempotency_key, digest, barrier.model_dump_json()),
|
|
165
|
+
)
|
|
166
|
+
await connection.commit()
|
|
167
|
+
return barrier
|
|
168
|
+
except BaseException:
|
|
169
|
+
await connection.rollback()
|
|
170
|
+
raise
|
|
171
|
+
|
|
172
|
+
async def _sqlite_admission_grant_error(self, connection, command) -> str | None:
|
|
173
|
+
grant_id = execution_grant_id(command)
|
|
174
|
+
if not grant_id:
|
|
175
|
+
return None
|
|
176
|
+
return command_grant_error(command, await self._sqlite_grant_record(connection, grant_id))
|
|
177
|
+
|
|
178
|
+
async def _sqlite_require_claim_grant(self, connection, row) -> None:
|
|
179
|
+
command = AgentControlCommand.model_validate_json(row["payload_json"])
|
|
180
|
+
grant_id = execution_grant_id(command)
|
|
181
|
+
if not grant_id:
|
|
182
|
+
return
|
|
183
|
+
record = await self._sqlite_grant_record(connection, grant_id)
|
|
184
|
+
error = command_grant_error(command, record)
|
|
185
|
+
if row["status"] == "claimed" and error in (None, "execution_grant_revoked"):
|
|
186
|
+
return
|
|
187
|
+
if error:
|
|
188
|
+
raise ExecutionGrantBlocked(
|
|
189
|
+
error.removeprefix("execution_grant_"), message_id=row["message_id"]
|
|
190
|
+
)
|
|
191
|
+
if record.state == "suspended":
|
|
192
|
+
raise ExecutionGrantBlocked("suspended", message_id=row["message_id"])
|
|
193
|
+
earlier = await self._fetchone(
|
|
194
|
+
connection,
|
|
195
|
+
"SELECT 1 FROM kernel_inbox WHERE agent_instance_id=? AND session_id=? "
|
|
196
|
+
"AND accepted_seq < ? AND status IN ('accepted','claimed') "
|
|
197
|
+
"AND json_extract(payload_json, '$.command_type')='enqueue' LIMIT 1",
|
|
198
|
+
(row["agent_instance_id"], row["session_id"], row["accepted_seq"]),
|
|
199
|
+
)
|
|
200
|
+
busy = await self._fetchone(
|
|
201
|
+
connection,
|
|
202
|
+
"SELECT 1 FROM kernel_runs WHERE agent_instance_id=? AND session_id=? "
|
|
203
|
+
"AND state IN ('pending','running','paused','waiting') LIMIT 1",
|
|
204
|
+
(row["agent_instance_id"], row["session_id"]),
|
|
205
|
+
)
|
|
206
|
+
if earlier or busy:
|
|
207
|
+
raise ExecutionGrantBlocked(
|
|
208
|
+
"queued" if earlier else "busy", message_id=row["message_id"]
|
|
209
|
+
)
|
ksadk/kernel/ingress.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""Agent Kernel ingress 收敛层(
|
|
2
|
+
"""Agent Kernel ingress 收敛层(Kernel Task 8)。
|
|
3
3
|
|
|
4
4
|
把 KsADK 现有五个入口(RunAgent / Responses / AG-UI / A2A / Studio)的
|
|
5
5
|
mutation 统一收敛到 ``AgentKernel.submit``:
|
|
@@ -20,6 +20,7 @@ mutation 统一收敛到 ``AgentKernel.submit``:
|
|
|
20
20
|
kernel 路径下命令的实际执行由 ``AgentWorker``(Task 6/7 交付)认领并驱动
|
|
21
21
|
RuntimeAdapter;ingress 只 submit + 订阅投影,不直接触碰 RuntimeExecutor。
|
|
22
22
|
"""
|
|
23
|
+
|
|
23
24
|
from __future__ import annotations
|
|
24
25
|
|
|
25
26
|
import hashlib
|
|
@@ -94,9 +95,22 @@ def get_agent_kernel() -> Any | None:
|
|
|
94
95
|
|
|
95
96
|
|
|
96
97
|
def kernel_route_active() -> bool:
|
|
97
|
-
"""
|
|
98
|
+
"""Whether public compatibility routes may self-admit through the kernel.
|
|
99
|
+
|
|
100
|
+
A hosted Runtime accepts AgentControl commands only with a permit issued by
|
|
101
|
+
Server. The public ``/v1/responses`` / legacy ``RunAgent`` routes do not
|
|
102
|
+
carry that permit, so routing them through ``trusted_context`` would create
|
|
103
|
+
a process-local signature that the hosted verifier must reject. Keep those
|
|
104
|
+
authenticated compatibility routes on their established executor path;
|
|
105
|
+
Server continues to use the dedicated ``/agent-kernel/v1/*`` ingress, which
|
|
106
|
+
validates the Server-issued permit independently of this selector.
|
|
107
|
+
"""
|
|
98
108
|
|
|
99
|
-
return
|
|
109
|
+
return (
|
|
110
|
+
kernel_ingress_enabled()
|
|
111
|
+
and get_agent_kernel() is not None
|
|
112
|
+
and authority_mode() != _AUTHORITY_HOSTED
|
|
113
|
+
)
|
|
100
114
|
|
|
101
115
|
|
|
102
116
|
# ---------------------------------------------------------------------------
|
|
@@ -207,15 +221,11 @@ def trusted_context(
|
|
|
207
221
|
# mode the local signature remains unverifiable against Server JWKS, so
|
|
208
222
|
# this does not create a Server-admission bypass.
|
|
209
223
|
if agent_instance_id == "local-agent":
|
|
210
|
-
agent_instance_id = (
|
|
211
|
-
os.environ.get("AGENT_INSTANCE_ID", "").strip() or agent_instance_id
|
|
212
|
-
)
|
|
224
|
+
agent_instance_id = os.environ.get("AGENT_INSTANCE_ID", "").strip() or agent_instance_id
|
|
213
225
|
if launch_context is not None:
|
|
214
226
|
config = getattr(launch_context, "config", None) or {}
|
|
215
227
|
tenant_id = str(config.get("tenant_id") or tenant_id)
|
|
216
|
-
agent_instance_id = str(
|
|
217
|
-
config.get("agent_instance_id") or agent_instance_id
|
|
218
|
-
)
|
|
228
|
+
agent_instance_id = str(config.get("agent_instance_id") or agent_instance_id)
|
|
219
229
|
issuer = issuer or _default_issuer()
|
|
220
230
|
permit = issuer.issue(
|
|
221
231
|
tenant_id=tenant_id,
|
|
@@ -517,9 +527,7 @@ async def subscribe_projected(
|
|
|
517
527
|
subscribe_kwargs["should_stop"] = should_stop
|
|
518
528
|
if "timeout" in _params:
|
|
519
529
|
subscribe_kwargs["timeout"] = timeout
|
|
520
|
-
async for envelope in kernel.subscribe(
|
|
521
|
-
subscription, permit=trusted.permit, **subscribe_kwargs
|
|
522
|
-
):
|
|
530
|
+
async for envelope in kernel.subscribe(subscription, permit=trusted.permit, **subscribe_kwargs):
|
|
523
531
|
projected = envelope if projector is None else projector(envelope)
|
|
524
532
|
if projected is None:
|
|
525
533
|
continue
|
|
@@ -659,7 +667,9 @@ async def bootstrap_agent_kernel_from_env() -> Any | None:
|
|
|
659
667
|
tenant_id=session_service.tenant_id,
|
|
660
668
|
workspace_id=session_service.workspace_id,
|
|
661
669
|
)
|
|
662
|
-
store = PostgresAgentKernelStore(
|
|
670
|
+
store = PostgresAgentKernelStore(
|
|
671
|
+
pool, event_log, tenant_id=session_service.tenant_id, owns_pool=True
|
|
672
|
+
)
|
|
663
673
|
# typed RuntimeEvent 写路径走 fenced store:ActivationWriteGuard
|
|
664
674
|
# append 与 activation 行验证同一事务(Task 4 Step 5)。
|
|
665
675
|
events = PostgresFencedSessionEventStore(store)
|
|
@@ -733,6 +743,7 @@ def _env_permit_verifier(*, nonce_store: Any = None) -> Any:
|
|
|
733
743
|
jwks_url = os.environ.get(ENV_JWKS_URL, "").strip()
|
|
734
744
|
if jwks_url:
|
|
735
745
|
from ksadk.kernel.authorization import AgentControlPermitVerifier
|
|
746
|
+
|
|
736
747
|
source = _remote_jwks_source(jwks_url)
|
|
737
748
|
if _is_hosted():
|
|
738
749
|
# hosted 模式:server JWKS 是唯一信任源,绝不合并本地公钥。
|
|
@@ -770,12 +781,21 @@ async def _ensure_shared_log_session(command: Any) -> None:
|
|
|
770
781
|
if service is None:
|
|
771
782
|
return
|
|
772
783
|
try:
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
784
|
+
from ksadk.conversations.runtime_persistence import ensure_conversation_session
|
|
785
|
+
|
|
786
|
+
payload = getattr(command, "payload", {})
|
|
787
|
+
identity = payload.get("invocation_identity") if isinstance(payload, Mapping) else None
|
|
788
|
+
agent_id = str(getattr(command, "agent_instance_id", "") or "runtime")
|
|
789
|
+
existing = await service.get_session_metadata(session_id)
|
|
790
|
+
if existing is not None and str(existing.agent_id or "").strip():
|
|
791
|
+
agent_id = str(existing.agent_id)
|
|
792
|
+
await ensure_conversation_session(
|
|
793
|
+
agent_id=agent_id,
|
|
794
|
+
user_id=str(getattr(command, "tenant_id", "") or "tenant"),
|
|
795
|
+
session_id=session_id,
|
|
796
|
+
session_service_provider=lambda: service,
|
|
797
|
+
invocation_identity=identity,
|
|
798
|
+
)
|
|
779
799
|
except Exception:
|
|
780
800
|
pass
|
|
781
801
|
|
|
@@ -936,9 +956,7 @@ def _build_kernel_router() -> Any:
|
|
|
936
956
|
)
|
|
937
957
|
# local 仅为开发便利自签,query 的 authorization_ref 必须同 permit
|
|
938
958
|
# 本体一致,避免错误地用 caller 自报值触发恒 fail-closed。
|
|
939
|
-
query = query.model_copy(
|
|
940
|
-
update={"authorization_ref": trusted.permit.permit_id}
|
|
941
|
-
)
|
|
959
|
+
query = query.model_copy(update={"authorization_ref": trusted.permit.permit_id})
|
|
942
960
|
permit = trusted.permit
|
|
943
961
|
snapshot = await kernel.status(query, permit=permit)
|
|
944
962
|
return JSONResponse(json.loads(snapshot.model_dump_json()))
|
|
@@ -968,10 +986,7 @@ def _build_kernel_router() -> Any:
|
|
|
968
986
|
content={
|
|
969
987
|
"error": {
|
|
970
988
|
"Code": "missing_resource_identity",
|
|
971
|
-
"Message": (
|
|
972
|
-
"hosted subscription requires tenant_id and "
|
|
973
|
-
"agent_instance_id"
|
|
974
|
-
),
|
|
989
|
+
"Message": ("hosted subscription requires tenant_id and agent_instance_id"),
|
|
975
990
|
}
|
|
976
991
|
},
|
|
977
992
|
)
|
|
@@ -1035,9 +1050,7 @@ def _build_kernel_router() -> Any:
|
|
|
1035
1050
|
frame.setdefault("seq", seq)
|
|
1036
1051
|
if not isinstance(envelope, dict):
|
|
1037
1052
|
frame.setdefault("family", getattr(envelope, "family", None))
|
|
1038
|
-
frame.setdefault(
|
|
1039
|
-
"family_version", getattr(envelope, "family_version", None)
|
|
1040
|
-
)
|
|
1053
|
+
frame.setdefault("family_version", getattr(envelope, "family_version", None))
|
|
1041
1054
|
frame.setdefault("event_type", getattr(envelope, "event_type", None))
|
|
1042
1055
|
if getattr(envelope, "run_id", None):
|
|
1043
1056
|
frame.setdefault("run_id", envelope.run_id)
|
ksadk/kernel/mapping.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""command -> RuntimeAdapter 方法映射与 capability 判定(
|
|
2
|
+
"""command -> RuntimeAdapter 方法映射与 capability 判定(Kernel Task 6 Step 5)。
|
|
3
3
|
|
|
4
4
|
映射表是唯一事实来源:enqueue 只在没有 active Run 时执行 start;
|
|
5
5
|
steer/inject 只传给 native adapter method;每条命令产生的
|
ksadk/kernel/memory_store.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""InMemory ``AgentKernelStore``(
|
|
2
|
+
"""InMemory ``AgentKernelStore``(Kernel Task 3 Step 4)。
|
|
3
3
|
|
|
4
4
|
只用于单进程开发与 conformance 测试,不宣称跨进程 durable。
|
|
5
5
|
以 per-(agent, session) asyncio lock 保证 accept/claim/transition 的原子语义;
|
|
@@ -16,15 +16,15 @@ from uuid import uuid4
|
|
|
16
16
|
|
|
17
17
|
from ksadk.events.session_event import SessionEventStore
|
|
18
18
|
from ksadk.interaction.contracts import (
|
|
19
|
-
InteractionRecord,
|
|
20
19
|
InteractionReceipt,
|
|
20
|
+
InteractionRecord,
|
|
21
21
|
InteractionSubmission,
|
|
22
22
|
is_terminal,
|
|
23
23
|
)
|
|
24
24
|
from ksadk.interaction.ledger import (
|
|
25
25
|
ALREADY_RESOLVED,
|
|
26
|
-
REVISION_MISMATCH,
|
|
27
26
|
REQUEST_CONFLICT,
|
|
27
|
+
REVISION_MISMATCH,
|
|
28
28
|
interaction_event,
|
|
29
29
|
request_digest,
|
|
30
30
|
requested_event_payload,
|
|
@@ -41,6 +41,7 @@ from ksadk.kernel.contracts import (
|
|
|
41
41
|
SessionEventEnvelope,
|
|
42
42
|
)
|
|
43
43
|
from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
|
|
44
|
+
from ksadk.kernel.execution_grants_memory import MemoryExecutionGrantMixin
|
|
44
45
|
from ksadk.kernel.state import (
|
|
45
46
|
InboxState,
|
|
46
47
|
assert_inbox_transition,
|
|
@@ -58,7 +59,7 @@ from ksadk.kernel.store import (
|
|
|
58
59
|
)
|
|
59
60
|
|
|
60
61
|
|
|
61
|
-
class InMemoryAgentKernelStore:
|
|
62
|
+
class InMemoryAgentKernelStore(MemoryExecutionGrantMixin):
|
|
62
63
|
def __init__(self, session_event_store: SessionEventStore) -> None:
|
|
63
64
|
self._events = session_event_store
|
|
64
65
|
self._locks: dict[tuple[str, str], asyncio.Lock] = {}
|
|
@@ -67,6 +68,8 @@ class InMemoryAgentKernelStore:
|
|
|
67
68
|
self._accepted_seq: dict[str, int] = {}
|
|
68
69
|
self._activations: dict[tuple[str, str], dict[str, Any]] = {}
|
|
69
70
|
self._runs: dict[str, RunRecord] = {}
|
|
71
|
+
self._execution_grants = {}
|
|
72
|
+
self._execution_grant_operations = {}
|
|
70
73
|
# Interaction ledger(Task 5):(tenant_id, interaction_id) -> row。
|
|
71
74
|
self._interactions: dict[tuple[str, str], dict[str, Any]] = {}
|
|
72
75
|
self._interaction_submissions: dict[tuple[str, str, str], dict[str, Any]] = {}
|
|
@@ -91,7 +94,9 @@ class InMemoryAgentKernelStore:
|
|
|
91
94
|
def _lease_expired(row: dict[str, Any]) -> bool:
|
|
92
95
|
return row["lease_expires_at"] <= time.time()
|
|
93
96
|
|
|
94
|
-
def _check_fence(
|
|
97
|
+
def _check_fence(
|
|
98
|
+
self, agent_instance_id: str, session_id: str, expected_fence: int
|
|
99
|
+
) -> dict[str, Any]:
|
|
95
100
|
row = self._activation_row(agent_instance_id, session_id)
|
|
96
101
|
if (
|
|
97
102
|
row is None
|
|
@@ -204,6 +209,12 @@ class InMemoryAgentKernelStore:
|
|
|
204
209
|
accepted_seq=existing["accepted_seq"],
|
|
205
210
|
)
|
|
206
211
|
|
|
212
|
+
grant_error = self._memory_admission_grant_error(command)
|
|
213
|
+
if grant_error:
|
|
214
|
+
return await self.reject_command(
|
|
215
|
+
command, status="rejected", code=grant_error, message=grant_error,
|
|
216
|
+
)
|
|
217
|
+
|
|
207
218
|
depth = sum(
|
|
208
219
|
1
|
|
209
220
|
for row in self._messages.values()
|
|
@@ -356,7 +367,6 @@ class InMemoryAgentKernelStore:
|
|
|
356
367
|
elif (
|
|
357
368
|
fencing_token is not None
|
|
358
369
|
and row["status"] == InboxState.CLAIMED
|
|
359
|
-
and row["claimed_fence"] == int(fencing_token)
|
|
360
370
|
):
|
|
361
371
|
rows.append(row)
|
|
362
372
|
rows.sort(key=lambda row: row["accepted_seq"])
|
|
@@ -371,19 +381,21 @@ class InMemoryAgentKernelStore:
|
|
|
371
381
|
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
372
382
|
async with self._lock(row["agent_instance_id"], row["session_id"]):
|
|
373
383
|
fresh = self._messages[str(message_id)]
|
|
384
|
+
activation = self._check_fence(
|
|
385
|
+
fresh["agent_instance_id"], fresh["session_id"], fencing_token
|
|
386
|
+
)
|
|
387
|
+
self._memory_require_claim_grant(fresh)
|
|
374
388
|
if (
|
|
375
389
|
fresh["status"] == InboxState.CLAIMED
|
|
376
390
|
and fresh["claimed_fence"] == int(fencing_token)
|
|
377
391
|
):
|
|
378
392
|
return self._to_message(fresh)
|
|
379
|
-
|
|
380
|
-
fresh["agent_instance_id"], fresh["session_id"], fencing_token
|
|
381
|
-
)
|
|
382
|
-
if fresh["status"] != InboxState.ACCEPTED:
|
|
393
|
+
if fresh["status"] not in (InboxState.ACCEPTED, InboxState.CLAIMED):
|
|
383
394
|
raise InvalidCommandError(
|
|
384
395
|
f"message {message_id!r} is not claimable at status {fresh['status']}"
|
|
385
396
|
)
|
|
386
|
-
|
|
397
|
+
if fresh["status"] == InboxState.ACCEPTED:
|
|
398
|
+
assert_inbox_transition(InboxState(fresh["status"]), InboxState.CLAIMED)
|
|
387
399
|
fresh["status"] = InboxState.CLAIMED
|
|
388
400
|
fresh["claimed_fence"] = int(fencing_token)
|
|
389
401
|
await self._emit(
|
|
@@ -513,6 +525,7 @@ class InMemoryAgentKernelStore:
|
|
|
513
525
|
if not candidates:
|
|
514
526
|
return None
|
|
515
527
|
row = candidates[0]
|
|
528
|
+
self._memory_require_claim_grant(row)
|
|
516
529
|
if row["status"] == InboxState.ACCEPTED:
|
|
517
530
|
assert_inbox_transition(InboxState(row["status"]), InboxState.CLAIMED)
|
|
518
531
|
row["status"] = InboxState.CLAIMED
|
ksadk/kernel/postgres_store.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""PostgreSQL ``AgentKernelStore``(
|
|
2
|
+
"""PostgreSQL ``AgentKernelStore``(Kernel Task 4)。
|
|
3
3
|
|
|
4
4
|
预发多写者 durable Inbox / Run / ActivationLease 存储:
|
|
5
5
|
- schema 见 ``ksadk/kernel/sql/001_agent_kernel.sql``(BIGINT fencing_token、
|
|
@@ -31,15 +31,15 @@ from ksadk.events.session_event import (
|
|
|
31
31
|
validate_write_guard,
|
|
32
32
|
)
|
|
33
33
|
from ksadk.interaction.contracts import (
|
|
34
|
-
InteractionRecord,
|
|
35
34
|
InteractionReceipt,
|
|
35
|
+
InteractionRecord,
|
|
36
36
|
InteractionSubmission,
|
|
37
37
|
is_terminal,
|
|
38
38
|
)
|
|
39
39
|
from ksadk.interaction.ledger import (
|
|
40
40
|
ALREADY_RESOLVED,
|
|
41
|
-
REVISION_MISMATCH,
|
|
42
41
|
REQUEST_CONFLICT,
|
|
42
|
+
REVISION_MISMATCH,
|
|
43
43
|
interaction_event,
|
|
44
44
|
request_digest,
|
|
45
45
|
requested_event_payload,
|
|
@@ -56,6 +56,8 @@ from ksadk.kernel.contracts import (
|
|
|
56
56
|
SessionEventEnvelope,
|
|
57
57
|
)
|
|
58
58
|
from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
|
|
59
|
+
from ksadk.kernel.execution_grants import execution_grant_id
|
|
60
|
+
from ksadk.kernel.execution_grants_postgres import PostgresExecutionGrantMixin
|
|
59
61
|
from ksadk.kernel.state import (
|
|
60
62
|
InboxState,
|
|
61
63
|
RunState,
|
|
@@ -310,7 +312,7 @@ class PostgresNonceStore:
|
|
|
310
312
|
)
|
|
311
313
|
|
|
312
314
|
|
|
313
|
-
class PostgresAgentKernelStore:
|
|
315
|
+
class PostgresAgentKernelStore(PostgresExecutionGrantMixin):
|
|
314
316
|
def __init__(
|
|
315
317
|
self,
|
|
316
318
|
pool: Any,
|
|
@@ -345,6 +347,8 @@ class PostgresAgentKernelStore:
|
|
|
345
347
|
"DELETE FROM kernel_inbox; DELETE FROM kernel_runs;"
|
|
346
348
|
" DELETE FROM kernel_activations; DELETE FROM kernel_accepted_seq;"
|
|
347
349
|
" DELETE FROM kernel_interactions; DELETE FROM kernel_interaction_submissions;"
|
|
350
|
+
" DELETE FROM kernel_execution_grant_operations;"
|
|
351
|
+
" DELETE FROM kernel_execution_grants;"
|
|
348
352
|
" DELETE FROM ksadk_events WHERE namespace = 'default';"
|
|
349
353
|
)
|
|
350
354
|
|
|
@@ -433,6 +437,8 @@ class PostgresAgentKernelStore:
|
|
|
433
437
|
raise InvalidCommandError("queue_limit must be positive")
|
|
434
438
|
async with self._connection() as connection:
|
|
435
439
|
async with connection.transaction():
|
|
440
|
+
if execution_grant_id(command):
|
|
441
|
+
await self._postgres_lock_command_grant(connection, command)
|
|
436
442
|
existing = await connection.fetchrow(
|
|
437
443
|
"SELECT message_id, accepted_seq, request_digest FROM kernel_inbox"
|
|
438
444
|
" WHERE tenant_id=$1 AND session_id=$2 AND idempotency_key=$3",
|
|
@@ -474,6 +480,19 @@ class PostgresAgentKernelStore:
|
|
|
474
480
|
accepted_seq=int(existing["accepted_seq"]),
|
|
475
481
|
)
|
|
476
482
|
|
|
483
|
+
grant_error = await self._postgres_admission_grant_error(connection, command)
|
|
484
|
+
if grant_error:
|
|
485
|
+
await self._append_admission(connection, command, control_event(
|
|
486
|
+
session_id=command.session_id, event_type="control.command_rejected",
|
|
487
|
+
payload={
|
|
488
|
+
"command_id": str(command.command_id), "status": "rejected",
|
|
489
|
+
"reason": grant_error,
|
|
490
|
+
},
|
|
491
|
+
))
|
|
492
|
+
return self._receipt(command, "rejected", error=ControlError(
|
|
493
|
+
code=grant_error, message=grant_error, retryable=False,
|
|
494
|
+
))
|
|
495
|
+
|
|
477
496
|
depth = await connection.fetchval(
|
|
478
497
|
"SELECT COUNT(*) FROM kernel_inbox WHERE tenant_id=$1"
|
|
479
498
|
" AND agent_instance_id=$2 AND session_id=$3 AND status='accepted'",
|
|
@@ -686,23 +705,29 @@ class PostgresAgentKernelStore:
|
|
|
686
705
|
message_id = str(message_id)
|
|
687
706
|
async with self._connection() as connection:
|
|
688
707
|
async with connection.transaction():
|
|
708
|
+
# Lock grant before Inbox, matching the revocation lock order.
|
|
709
|
+
candidate = await connection.fetchrow(
|
|
710
|
+
"SELECT payload FROM kernel_inbox WHERE message_id=$1::uuid", message_id,
|
|
711
|
+
)
|
|
712
|
+
if candidate is None:
|
|
713
|
+
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
714
|
+
command = AgentControlCommand.model_validate_json(candidate["payload"])
|
|
715
|
+
grant = await self._postgres_lock_command_grant(connection, command)
|
|
689
716
|
row = await connection.fetchrow(
|
|
690
717
|
"SELECT * FROM kernel_inbox WHERE message_id=$1::uuid FOR UPDATE",
|
|
691
718
|
message_id,
|
|
692
719
|
)
|
|
693
720
|
if row is None:
|
|
694
721
|
raise InvalidCommandError(f"unknown message_id {message_id!r}")
|
|
722
|
+
activation = await self._assert_fence(
|
|
723
|
+
connection, row["agent_instance_id"], row["session_id"], fencing_token,
|
|
724
|
+
)
|
|
725
|
+
await self._postgres_require_claim_grant(connection, row, command, grant)
|
|
695
726
|
if (
|
|
696
727
|
row["status"] == InboxState.CLAIMED.value
|
|
697
728
|
and int(row["claimed_fence"]) == int(fencing_token)
|
|
698
729
|
):
|
|
699
|
-
return self._row_to_message(row)
|
|
700
|
-
activation = await self._assert_fence(
|
|
701
|
-
connection,
|
|
702
|
-
row["agent_instance_id"],
|
|
703
|
-
row["session_id"],
|
|
704
|
-
fencing_token,
|
|
705
|
-
)
|
|
730
|
+
return self._row_to_message(row)
|
|
706
731
|
if row["status"] not in (
|
|
707
732
|
InboxState.ACCEPTED.value,
|
|
708
733
|
InboxState.CLAIMED.value,
|
|
@@ -876,7 +901,7 @@ class PostgresAgentKernelStore:
|
|
|
876
901
|
connection, agent_instance_id, session_id, fencing_token
|
|
877
902
|
)
|
|
878
903
|
row = await connection.fetchrow(
|
|
879
|
-
"SELECT
|
|
904
|
+
"SELECT * FROM kernel_inbox"
|
|
880
905
|
" WHERE agent_instance_id=$1 AND session_id=$2"
|
|
881
906
|
" AND (status='accepted' OR (status='claimed' AND claimed_fence <> $3))"
|
|
882
907
|
" ORDER BY accepted_seq"
|
|
@@ -888,27 +913,32 @@ class PostgresAgentKernelStore:
|
|
|
888
913
|
)
|
|
889
914
|
if row is None:
|
|
890
915
|
return None
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
"
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
"
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
916
|
+
command = AgentControlCommand.model_validate_json(row["payload"])
|
|
917
|
+
grant_qualified_path = execution_grant_id(command) is not None
|
|
918
|
+
if not grant_qualified_path:
|
|
919
|
+
if row["status"] == InboxState.ACCEPTED.value:
|
|
920
|
+
assert_inbox_transition(InboxState(row["status"]), InboxState.CLAIMED)
|
|
921
|
+
await connection.execute(
|
|
922
|
+
"UPDATE kernel_inbox SET status='claimed', claimed_fence=$1"
|
|
923
|
+
" WHERE message_id=$2::uuid",
|
|
924
|
+
int(fencing_token),
|
|
925
|
+
str(row["message_id"]),
|
|
926
|
+
)
|
|
927
|
+
await self._append_activation_fact(
|
|
928
|
+
connection,
|
|
929
|
+
control_event(
|
|
930
|
+
session_id=session_id,
|
|
931
|
+
event_type="control.message_claimed",
|
|
932
|
+
payload={
|
|
933
|
+
"message_id": str(row["message_id"]),
|
|
934
|
+
"fencing_token": int(fencing_token),
|
|
935
|
+
},
|
|
936
|
+
),
|
|
937
|
+
activation,
|
|
938
|
+
fencing_token,
|
|
939
|
+
)
|
|
940
|
+
if grant_qualified_path:
|
|
941
|
+
return await self.claim_message(str(row["message_id"]), fencing_token)
|
|
912
942
|
return await self.load_message(row["message_id"])
|
|
913
943
|
|
|
914
944
|
async def complete_claim(self, message_id: str, *, expected_fence: int) -> None:
|