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
ksadk/kernel/bootstrap.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""生产 composition root(
|
|
2
|
+
"""生产 composition root(Kernel Task 4 Step 4)。
|
|
3
3
|
|
|
4
4
|
``build_agent_kernel_runtime(config) -> AgentKernelRuntime`` 把 AgentKernel
|
|
5
5
|
栈的全部运行时角色组装成一个可启动 / 可关闭的单元:
|
|
@@ -18,6 +18,7 @@ RuntimeAdapter provider、contract digest 或 durable nonce store 时
|
|
|
18
18
|
``build_agent_kernel_runtime`` 直接抛 ``RuntimeError``,绝不静默降级到
|
|
19
19
|
内存栈或本地自签 authority。
|
|
20
20
|
"""
|
|
21
|
+
|
|
21
22
|
from __future__ import annotations
|
|
22
23
|
|
|
23
24
|
import asyncio
|
|
@@ -39,7 +40,7 @@ from ksadk.kernel.contract_fingerprints import (
|
|
|
39
40
|
)
|
|
40
41
|
from ksadk.kernel.contracts import RuntimeCapabilityMatrix
|
|
41
42
|
from ksadk.kernel.control import AgentKernel, default_capability_matrix
|
|
42
|
-
from ksadk.kernel.errors import InvalidCommandError
|
|
43
|
+
from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
|
|
43
44
|
from ksadk.kernel.recovery import RecoveryCoordinator
|
|
44
45
|
from ksadk.kernel.runtime_identity import runtime_identity
|
|
45
46
|
from ksadk.kernel.store import AgentKernelStore, now_utc
|
|
@@ -190,9 +191,7 @@ class AgentKernelReadiness:
|
|
|
190
191
|
store_ok = False
|
|
191
192
|
try:
|
|
192
193
|
# 真实 store 查询(PG driver 即真实 SQL round-trip)。
|
|
193
|
-
await self.runtime.kernel_store.list_messages(
|
|
194
|
-
config.agent_instance_id
|
|
195
|
-
)
|
|
194
|
+
await self.runtime.kernel_store.list_messages(config.agent_instance_id)
|
|
196
195
|
store_ok = True
|
|
197
196
|
except Exception:
|
|
198
197
|
store_ok = False
|
|
@@ -219,9 +218,7 @@ class AgentKernelReadiness:
|
|
|
219
218
|
try:
|
|
220
219
|
from datetime import datetime
|
|
221
220
|
|
|
222
|
-
expires_at = datetime.fromisoformat(
|
|
223
|
-
str(expires).replace("Z", "+00:00")
|
|
224
|
-
)
|
|
221
|
+
expires_at = datetime.fromisoformat(str(expires).replace("Z", "+00:00"))
|
|
225
222
|
if expires_at <= datetime.now(expires_at.tzinfo):
|
|
226
223
|
lease_healthy = False
|
|
227
224
|
except ValueError:
|
|
@@ -244,10 +241,7 @@ class AgentKernelReadiness:
|
|
|
244
241
|
config.bundle_digest,
|
|
245
242
|
)
|
|
246
243
|
)
|
|
247
|
-
ready =
|
|
248
|
-
store_ok and worker_running and lease_healthy and digests_match
|
|
249
|
-
and not degraded
|
|
250
|
-
)
|
|
244
|
+
ready = store_ok and worker_running and lease_healthy and digests_match and not degraded
|
|
251
245
|
health = {
|
|
252
246
|
"ready": ready,
|
|
253
247
|
"store_ok": store_ok,
|
|
@@ -283,9 +277,7 @@ class AgentKernelReadiness:
|
|
|
283
277
|
if degraded:
|
|
284
278
|
health["degradation_reason"] = self.runtime._degradation_reason
|
|
285
279
|
health["degraded_at"] = self.runtime._degraded_at
|
|
286
|
-
health["degradation_last_error"] =
|
|
287
|
-
self.runtime._degraded_last_error
|
|
288
|
-
)
|
|
280
|
+
health["degradation_last_error"] = self.runtime._degraded_last_error
|
|
289
281
|
return health
|
|
290
282
|
|
|
291
283
|
|
|
@@ -303,6 +295,7 @@ class AgentKernelRuntime:
|
|
|
303
295
|
session_events: Any = field(repr=False)
|
|
304
296
|
_owns_pool: bool = field(default=False, repr=False)
|
|
305
297
|
_pool: Any = field(default=None, repr=False)
|
|
298
|
+
_owns_store: bool = field(default=False, repr=False)
|
|
306
299
|
|
|
307
300
|
def __post_init__(self) -> None:
|
|
308
301
|
self._tasks: list[asyncio.Task] = []
|
|
@@ -322,17 +315,13 @@ class AgentKernelRuntime:
|
|
|
322
315
|
|
|
323
316
|
# ------------------------------------------------------------ degradation
|
|
324
317
|
|
|
325
|
-
def _mark_degraded(
|
|
326
|
-
self, reason: str, exc: BaseException | None = None
|
|
327
|
-
) -> None:
|
|
318
|
+
def _mark_degraded(self, reason: str, exc: BaseException | None = None) -> None:
|
|
328
319
|
"""统一降级入口:醒目 ERROR 日志 + 可供 health 端点回读的诊断状态。"""
|
|
329
320
|
|
|
330
321
|
self._degraded = True
|
|
331
322
|
if self._degradation_reason is None:
|
|
332
323
|
self._degradation_reason = reason
|
|
333
|
-
last_error = (
|
|
334
|
-
f"{type(exc).__name__}: {exc}" if exc is not None else "n/a"
|
|
335
|
-
)
|
|
324
|
+
last_error = f"{type(exc).__name__}: {exc}" if exc is not None else "n/a"
|
|
336
325
|
self._degraded_last_error = last_error
|
|
337
326
|
try:
|
|
338
327
|
self._degraded_at = self.config.clock().isoformat()
|
|
@@ -377,14 +366,14 @@ class AgentKernelRuntime:
|
|
|
377
366
|
async def start(self) -> None:
|
|
378
367
|
if self._tasks:
|
|
379
368
|
return
|
|
369
|
+
if hasattr(self.kernel_store, "ensure_schema"):
|
|
370
|
+
await self.kernel_store.ensure_schema() # type: ignore[attr-defined]
|
|
380
371
|
self._worker_running = True
|
|
381
372
|
self._tasks.append(asyncio.create_task(self._run_loop(), name="kernel-runtime"))
|
|
382
373
|
# 心跳续约必须是独立任务:run loop 可能长时间阻塞在某个 session 的
|
|
383
374
|
# adapter.start()(hosted pod 上 codex 握手可超过 lease TTL),内联
|
|
384
375
|
# 续约会把其它已持有 lease 的 session 拖过期(stream guard StaleFence)。
|
|
385
|
-
self._tasks.append(
|
|
386
|
-
asyncio.create_task(self._heartbeat_loop(), name="kernel-heartbeat")
|
|
387
|
-
)
|
|
376
|
+
self._tasks.append(asyncio.create_task(self._heartbeat_loop(), name="kernel-heartbeat"))
|
|
388
377
|
|
|
389
378
|
async def close(self) -> None:
|
|
390
379
|
for task in self._tasks:
|
|
@@ -403,9 +392,7 @@ class AgentKernelRuntime:
|
|
|
403
392
|
lease = await self.kernel_store.current_lease(
|
|
404
393
|
self.config.agent_instance_id, session_id
|
|
405
394
|
)
|
|
406
|
-
if lease is not None and self.lease_heartbeat.owns_lease(
|
|
407
|
-
session_id, lease
|
|
408
|
-
):
|
|
395
|
+
if lease is not None and self.lease_heartbeat.owns_lease(session_id, lease):
|
|
409
396
|
await self.kernel_store.release_activation(
|
|
410
397
|
lease.activation_id, expected_fence=lease.fencing_token
|
|
411
398
|
)
|
|
@@ -419,6 +406,11 @@ class AgentKernelRuntime:
|
|
|
419
406
|
await self._pool.close()
|
|
420
407
|
except Exception:
|
|
421
408
|
pass
|
|
409
|
+
if self._owns_store and hasattr(self.kernel_store, "close"):
|
|
410
|
+
try:
|
|
411
|
+
await self.kernel_store.close() # type: ignore[attr-defined]
|
|
412
|
+
except Exception:
|
|
413
|
+
pass
|
|
422
414
|
|
|
423
415
|
# ------------------------------------------------------------- run loop
|
|
424
416
|
|
|
@@ -436,9 +428,7 @@ class AgentKernelRuntime:
|
|
|
436
428
|
# 隔离中的 session:不 claim inbox、不恢复、
|
|
437
429
|
# 不写任何 canonical 事件(等待人工清理)。
|
|
438
430
|
continue
|
|
439
|
-
lease, took_over = await self.lease_heartbeat.ensure_lease(
|
|
440
|
-
session_id
|
|
441
|
-
)
|
|
431
|
+
lease, took_over = await self.lease_heartbeat.ensure_lease(session_id)
|
|
442
432
|
if lease is None:
|
|
443
433
|
continue
|
|
444
434
|
self._heartbeat_sessions.add(session_id)
|
|
@@ -451,13 +441,9 @@ class AgentKernelRuntime:
|
|
|
451
441
|
# session 并上报,其余 session 继续服务;只有
|
|
452
442
|
# 全局性故障(store 不可达或失败扩散到阈值)
|
|
453
443
|
# 才进程级 degraded。
|
|
454
|
-
failure = await self._recover_safely(
|
|
455
|
-
lease, session_id
|
|
456
|
-
)
|
|
444
|
+
failure = await self._recover_safely(lease, session_id)
|
|
457
445
|
if failure is not None:
|
|
458
|
-
if not await self._quarantine_session(
|
|
459
|
-
session_id, failure
|
|
460
|
-
):
|
|
446
|
+
if not await self._quarantine_session(session_id, failure):
|
|
461
447
|
return
|
|
462
448
|
continue
|
|
463
449
|
result = await self.worker.run_once(
|
|
@@ -465,20 +451,42 @@ class AgentKernelRuntime:
|
|
|
465
451
|
lease,
|
|
466
452
|
session_id=session_id,
|
|
467
453
|
)
|
|
468
|
-
if result.outcome
|
|
454
|
+
if result.outcome in {"claimed", "completed"}:
|
|
469
455
|
progressed = True
|
|
456
|
+
elif result.outcome == "terminal_failure":
|
|
457
|
+
if isinstance(result.error, StaleFenceError):
|
|
458
|
+
# 当前 activation 已失去 fence,不能继续触碰该
|
|
459
|
+
# session,也不应把正常 takeover 误判为坏数据。
|
|
460
|
+
self._heartbeat_sessions.discard(session_id)
|
|
461
|
+
self._last_renewed.pop(session_id, None)
|
|
462
|
+
self.lease_heartbeat.forget(session_id)
|
|
463
|
+
continue
|
|
464
|
+
failure = result.error or RuntimeError(
|
|
465
|
+
"agent kernel command failed without an error detail"
|
|
466
|
+
)
|
|
467
|
+
if not await self._quarantine_session(
|
|
468
|
+
session_id,
|
|
469
|
+
failure,
|
|
470
|
+
context="command execution",
|
|
471
|
+
):
|
|
472
|
+
return
|
|
470
473
|
self._store_failures = 0
|
|
471
474
|
except asyncio.CancelledError:
|
|
472
475
|
raise
|
|
473
|
-
except Exception:
|
|
476
|
+
except Exception as exc:
|
|
474
477
|
self._store_failures += 1
|
|
478
|
+
logger.exception(
|
|
479
|
+
"agent kernel poll failed: agent_instance_id=%s "
|
|
480
|
+
"consecutive_failures=%d",
|
|
481
|
+
self.config.agent_instance_id,
|
|
482
|
+
self._store_failures,
|
|
483
|
+
)
|
|
475
484
|
if (
|
|
476
|
-
self._store_failures
|
|
477
|
-
>= self.config.store_failure_degrade_threshold
|
|
485
|
+
self._store_failures >= self.config.store_failure_degrade_threshold
|
|
478
486
|
and not await self._store_reachable()
|
|
479
487
|
):
|
|
480
488
|
# store 持续不可达是全局性故障:宁降级不静默。
|
|
481
|
-
self._mark_degraded("store_unreachable")
|
|
489
|
+
self._mark_degraded("store_unreachable", exc)
|
|
482
490
|
return
|
|
483
491
|
await asyncio.sleep(self.config.poll_interval * 4)
|
|
484
492
|
continue
|
|
@@ -490,9 +498,7 @@ class AgentKernelRuntime:
|
|
|
490
498
|
async def _heartbeat_loop(self) -> None:
|
|
491
499
|
"""独立心跳任务:按 TTL/3 节奏续约所有已持有的 lease。"""
|
|
492
500
|
|
|
493
|
-
interval = max(
|
|
494
|
-
self.config.lease_ttl_seconds / 3.0, self.config.poll_interval
|
|
495
|
-
)
|
|
501
|
+
interval = max(self.config.lease_ttl_seconds / 3.0, self.config.poll_interval)
|
|
496
502
|
while True:
|
|
497
503
|
await asyncio.sleep(interval / 2.0)
|
|
498
504
|
await self._renew_leased_sessions()
|
|
@@ -509,9 +515,7 @@ class AgentKernelRuntime:
|
|
|
509
515
|
activation lease 仍由本 runtime 持有,就以 TTL/3 的节奏幂等续约。
|
|
510
516
|
"""
|
|
511
517
|
|
|
512
|
-
interval = max(
|
|
513
|
-
self.config.lease_ttl_seconds / 3.0, self.config.poll_interval
|
|
514
|
-
)
|
|
518
|
+
interval = max(self.config.lease_ttl_seconds / 3.0, self.config.poll_interval)
|
|
515
519
|
now = time.monotonic()
|
|
516
520
|
for session_id in sorted(self._heartbeat_sessions):
|
|
517
521
|
if session_id in self._quarantined:
|
|
@@ -520,9 +524,7 @@ class AgentKernelRuntime:
|
|
|
520
524
|
continue
|
|
521
525
|
self._last_renewed[session_id] = now
|
|
522
526
|
try:
|
|
523
|
-
lease, took_over = await self.lease_heartbeat.ensure_lease(
|
|
524
|
-
session_id
|
|
525
|
-
)
|
|
527
|
+
lease, took_over = await self.lease_heartbeat.ensure_lease(session_id)
|
|
526
528
|
except asyncio.CancelledError:
|
|
527
529
|
raise
|
|
528
530
|
except Exception:
|
|
@@ -538,14 +540,10 @@ class AgentKernelRuntime:
|
|
|
538
540
|
if failure is not None:
|
|
539
541
|
if not await self._quarantine_session(session_id, failure):
|
|
540
542
|
if not self._degraded:
|
|
541
|
-
self._mark_degraded(
|
|
542
|
-
"renew_recovery_failure", failure
|
|
543
|
-
)
|
|
543
|
+
self._mark_degraded("renew_recovery_failure", failure)
|
|
544
544
|
return
|
|
545
545
|
|
|
546
|
-
async def _recover_safely(
|
|
547
|
-
self, lease, session_id: str | None = None
|
|
548
|
-
) -> Exception | None:
|
|
546
|
+
async def _recover_safely(self, lease, session_id: str | None = None) -> Exception | None:
|
|
549
547
|
"""takeover 后的安全恢复:失败必须持久化收口,否则返回失败原因。
|
|
550
548
|
|
|
551
549
|
返回 None 表示恢复路径已收口(含 durable interrupted 兜底),
|
|
@@ -554,7 +552,9 @@ class AgentKernelRuntime:
|
|
|
554
552
|
"""
|
|
555
553
|
|
|
556
554
|
try:
|
|
557
|
-
await self.recovery.recover(
|
|
555
|
+
await self.recovery.recover(
|
|
556
|
+
self.config.agent_instance_id, lease, session_id=session_id
|
|
557
|
+
)
|
|
558
558
|
return None
|
|
559
559
|
except Exception as exc:
|
|
560
560
|
first_failure = exc
|
|
@@ -572,7 +572,7 @@ class AgentKernelRuntime:
|
|
|
572
572
|
)
|
|
573
573
|
try:
|
|
574
574
|
await self.recovery.settle_interrupted(
|
|
575
|
-
self.config.agent_instance_id, lease
|
|
575
|
+
self.config.agent_instance_id, lease, session_id=session_id
|
|
576
576
|
)
|
|
577
577
|
# 主恢复失败但 durable interrupted 兜底收口成功:半恢复状态,
|
|
578
578
|
# 运维需要可见(事件流里会出现确定性的 interrupted 收口)。
|
|
@@ -609,7 +609,13 @@ class AgentKernelRuntime:
|
|
|
609
609
|
return False
|
|
610
610
|
return True
|
|
611
611
|
|
|
612
|
-
async def _quarantine_session(
|
|
612
|
+
async def _quarantine_session(
|
|
613
|
+
self,
|
|
614
|
+
session_id: str,
|
|
615
|
+
exc: Exception,
|
|
616
|
+
*,
|
|
617
|
+
context: str = "takeover recovery",
|
|
618
|
+
) -> bool:
|
|
613
619
|
"""隔离一个恢复失败的 session;返回 False 表示已触发进程级降级。
|
|
614
620
|
|
|
615
621
|
被隔离的 session 不再被本 runtime claim / 恢复 / 续约,其 inbox
|
|
@@ -621,9 +627,7 @@ class AgentKernelRuntime:
|
|
|
621
627
|
|
|
622
628
|
if not await self._store_reachable():
|
|
623
629
|
# store 本身不可达:这不是单个 session 的问题。
|
|
624
|
-
self._mark_degraded(
|
|
625
|
-
"store_unreachable_during_recovery", exc
|
|
626
|
-
)
|
|
630
|
+
self._mark_degraded("store_unreachable_during_recovery", exc)
|
|
627
631
|
return False
|
|
628
632
|
self._quarantined.add(session_id)
|
|
629
633
|
self._recovery_failed_sessions.add(session_id)
|
|
@@ -631,35 +635,42 @@ class AgentKernelRuntime:
|
|
|
631
635
|
self._last_renewed.pop(session_id, None)
|
|
632
636
|
self.lease_heartbeat.forget(session_id)
|
|
633
637
|
logger.warning(
|
|
634
|
-
"agent kernel session %s quarantined after
|
|
638
|
+
"agent kernel session %s quarantined after %s "
|
|
635
639
|
"failed: agent_instance_id=%s error=%s: %s",
|
|
636
640
|
session_id,
|
|
641
|
+
context,
|
|
637
642
|
self.config.agent_instance_id,
|
|
638
643
|
type(exc).__name__,
|
|
639
644
|
exc,
|
|
640
645
|
)
|
|
641
|
-
if (
|
|
642
|
-
len(self._recovery_failed_sessions)
|
|
643
|
-
>= self.config.quarantine_degrade_threshold
|
|
644
|
-
):
|
|
646
|
+
if len(self._recovery_failed_sessions) >= self.config.quarantine_degrade_threshold:
|
|
645
647
|
self._mark_degraded(
|
|
646
|
-
"recovery_failures_spread_to_%d_sessions" % len(
|
|
647
|
-
self._recovery_failed_sessions
|
|
648
|
-
),
|
|
648
|
+
"recovery_failures_spread_to_%d_sessions" % len(self._recovery_failed_sessions),
|
|
649
649
|
exc,
|
|
650
650
|
)
|
|
651
651
|
return False
|
|
652
652
|
return True
|
|
653
653
|
|
|
654
654
|
async def _pending_sessions(self) -> set[str]:
|
|
655
|
-
messages = await self.kernel_store.list_messages(
|
|
656
|
-
self.config.agent_instance_id
|
|
657
|
-
)
|
|
655
|
+
messages = await self.kernel_store.list_messages(self.config.agent_instance_id)
|
|
658
656
|
inbox_sessions = {
|
|
659
657
|
message.session_id
|
|
660
658
|
for message in messages
|
|
661
659
|
if message.status.value in ("accepted", "claimed")
|
|
662
660
|
}
|
|
661
|
+
# A process may die after the Inbox claim is completed but before the
|
|
662
|
+
# Runtime run reaches a terminal state. On restart there is then no
|
|
663
|
+
# pending Inbox row to discover the session from; scan sessions seen in
|
|
664
|
+
# the durable Inbox and retain those with an open Run for takeover.
|
|
665
|
+
known_sessions = {message.session_id for message in messages}
|
|
666
|
+
open_run_sessions = {
|
|
667
|
+
session_id
|
|
668
|
+
for session_id in known_sessions
|
|
669
|
+
if await self.kernel_store.find_active_run(
|
|
670
|
+
self.config.agent_instance_id, session_id
|
|
671
|
+
)
|
|
672
|
+
is not None
|
|
673
|
+
}
|
|
663
674
|
# Inbox is completed as soon as a stream is launched. Keep renewing
|
|
664
675
|
# the owning lease after the independent live execution finishes too:
|
|
665
676
|
# this runtime remains the session's activation owner while the Pod is
|
|
@@ -668,7 +679,7 @@ class AgentKernelRuntime:
|
|
|
668
679
|
# releases the retained leases; an ungraceful stop lets their TTL
|
|
669
680
|
# expire for recovery by a new activation.
|
|
670
681
|
active_sessions = self.worker.active_session_ids()
|
|
671
|
-
return inbox_sessions | active_sessions
|
|
682
|
+
return inbox_sessions | open_run_sessions | active_sessions
|
|
672
683
|
|
|
673
684
|
|
|
674
685
|
# ---------------------------------------------------------------------------
|
|
@@ -752,6 +763,7 @@ def build_agent_kernel_runtime(
|
|
|
752
763
|
session_events = config.session_events
|
|
753
764
|
session_service = config.session_service
|
|
754
765
|
owns_pool = config.owns_pool
|
|
766
|
+
owns_store = False
|
|
755
767
|
pool = config.pool
|
|
756
768
|
|
|
757
769
|
if store is None or session_events is None:
|
|
@@ -764,9 +776,7 @@ def build_agent_kernel_runtime(
|
|
|
764
776
|
from ksadk.sessions.postgres_service import PostgresSessionService
|
|
765
777
|
|
|
766
778
|
if not config.dsn:
|
|
767
|
-
raise RuntimeError(
|
|
768
|
-
"postgres agent kernel runtime requires a store DSN"
|
|
769
|
-
)
|
|
779
|
+
raise RuntimeError("postgres agent kernel runtime requires a store DSN")
|
|
770
780
|
if session_service is None:
|
|
771
781
|
session_service = PostgresSessionService(
|
|
772
782
|
dsn=config.dsn,
|
|
@@ -782,11 +792,23 @@ def build_agent_kernel_runtime(
|
|
|
782
792
|
workspace_id=session_service.workspace_id,
|
|
783
793
|
)
|
|
784
794
|
kernel_store: AgentKernelStore = PostgresAgentKernelStore(
|
|
785
|
-
pool, event_log
|
|
795
|
+
pool, event_log, tenant_id=session_service.tenant_id
|
|
786
796
|
)
|
|
787
797
|
# typed RuntimeEvent 写路径走 fenced store:每个
|
|
788
798
|
# ActivationWriteGuard append 在同一事务验证 activation 行。
|
|
789
799
|
events = PostgresFencedSessionEventStore(kernel_store) # type: ignore[arg-type]
|
|
800
|
+
elif config.driver == "sqlite":
|
|
801
|
+
from ksadk.kernel.sqlite_store import SQLiteAgentKernelStore
|
|
802
|
+
from ksadk.sessions.in_memory import InMemorySessionService
|
|
803
|
+
|
|
804
|
+
if not config.dsn:
|
|
805
|
+
raise RuntimeError("sqlite agent kernel runtime requires a database path")
|
|
806
|
+
if session_service is None:
|
|
807
|
+
session_service = InMemorySessionService()
|
|
808
|
+
base_events = SessionServiceEventStore(session_service)
|
|
809
|
+
kernel_store = SQLiteAgentKernelStore(config.dsn, base_events)
|
|
810
|
+
events = base_events
|
|
811
|
+
owns_store = True
|
|
790
812
|
else:
|
|
791
813
|
from ksadk.kernel.memory_store import InMemoryAgentKernelStore
|
|
792
814
|
from ksadk.sessions.in_memory import InMemorySessionService
|
|
@@ -821,9 +843,7 @@ def build_agent_kernel_runtime(
|
|
|
821
843
|
raise RuntimeError(
|
|
822
844
|
"hosted agent kernel runtime cannot determine adapter capabilities"
|
|
823
845
|
) from exc
|
|
824
|
-
computed_capability_digest = runtime_capability_matrix_digest(
|
|
825
|
-
capability_snapshot
|
|
826
|
-
)
|
|
846
|
+
computed_capability_digest = runtime_capability_matrix_digest(capability_snapshot)
|
|
827
847
|
if config.capability_digest != computed_capability_digest:
|
|
828
848
|
raise RuntimeError(
|
|
829
849
|
"capability_digest_mismatch: hosted adapter capabilities do not "
|
|
@@ -854,6 +874,7 @@ def build_agent_kernel_runtime(
|
|
|
854
874
|
store,
|
|
855
875
|
adapter_factory=adapter_provider,
|
|
856
876
|
session_events=session_events,
|
|
877
|
+
session_service=session_service,
|
|
857
878
|
start_request_defaults=config.start_request_defaults,
|
|
858
879
|
)
|
|
859
880
|
recovery = RecoveryCoordinator(
|
|
@@ -870,8 +891,7 @@ def build_agent_kernel_runtime(
|
|
|
870
891
|
heartbeat = LeaseHeartbeat(
|
|
871
892
|
store,
|
|
872
893
|
agent_instance_id=config.agent_instance_id,
|
|
873
|
-
activation_id=config.activation_id
|
|
874
|
-
or f"{config.agent_instance_id}:kernel-runtime",
|
|
894
|
+
activation_id=config.activation_id or f"{config.agent_instance_id}:kernel-runtime",
|
|
875
895
|
runtime_type=config.runtime_type,
|
|
876
896
|
bundle_digest=config.bundle_digest,
|
|
877
897
|
# Lease metadata must represent the exact matrix this owner executes,
|
|
@@ -890,6 +910,7 @@ def build_agent_kernel_runtime(
|
|
|
890
910
|
session_events=session_events,
|
|
891
911
|
_owns_pool=owns_pool,
|
|
892
912
|
_pool=pool,
|
|
913
|
+
_owns_store=owns_store,
|
|
893
914
|
)
|
|
894
915
|
runtime.readiness.runtime = runtime
|
|
895
916
|
return runtime
|
|
@@ -934,13 +955,9 @@ async def bootstrap_agent_kernel_runtime_from_env(
|
|
|
934
955
|
driver = os.environ.get("AGENT_KERNEL_STORE_DRIVER", "memory").strip().lower()
|
|
935
956
|
dsn = os.environ.get("AGENT_KERNEL_STORE_DSN", "").strip()
|
|
936
957
|
jwks_url = os.environ.get(ENV_JWKS_URL, "").strip()
|
|
937
|
-
session_namespace = (
|
|
938
|
-
os.environ.get("KSADK_SESSION_NAMESPACE", "default").strip() or "default"
|
|
939
|
-
)
|
|
958
|
+
session_namespace = os.environ.get("KSADK_SESSION_NAMESPACE", "default").strip() or "default"
|
|
940
959
|
tenant_id = (
|
|
941
|
-
os.environ.get("KSADK_TENANT_ID")
|
|
942
|
-
or os.environ.get("AGENTENGINE_TENANT_ID")
|
|
943
|
-
or "default"
|
|
960
|
+
os.environ.get("KSADK_TENANT_ID") or os.environ.get("AGENTENGINE_TENANT_ID") or "default"
|
|
944
961
|
).strip()
|
|
945
962
|
workspace_id = (
|
|
946
963
|
os.environ.get("KSADK_WORKSPACE_ID")
|
|
@@ -948,16 +965,11 @@ async def bootstrap_agent_kernel_runtime_from_env(
|
|
|
948
965
|
or "default"
|
|
949
966
|
).strip()
|
|
950
967
|
mode: AuthorityMode = authority_mode() # type: ignore[assignment]
|
|
951
|
-
durability_tier: DurabilityTier =
|
|
952
|
-
"AGENT_KERNEL_DURABILITY_TIER", "durable"
|
|
953
|
-
)
|
|
954
|
-
injected_contract_digest = os.environ.get(
|
|
955
|
-
|
|
956
|
-
).strip()
|
|
957
|
-
if (
|
|
958
|
-
mode == "hosted"
|
|
959
|
-
and injected_contract_digest != AGENT_KERNEL_V1_AGGREGATE_DIGEST
|
|
960
|
-
):
|
|
968
|
+
durability_tier: DurabilityTier = (
|
|
969
|
+
os.environ.get("AGENT_KERNEL_DURABILITY_TIER", "durable").strip().lower()
|
|
970
|
+
) # type: ignore[assignment]
|
|
971
|
+
injected_contract_digest = os.environ.get("AGENT_KERNEL_CONTRACT_DIGEST", "").strip()
|
|
972
|
+
if mode == "hosted" and injected_contract_digest != AGENT_KERNEL_V1_AGGREGATE_DIGEST:
|
|
961
973
|
raise RuntimeError(
|
|
962
974
|
"contract_digest_mismatch: hosted agent kernel runtime image "
|
|
963
975
|
"does not support the control-plane contract digest"
|
|
@@ -991,7 +1003,7 @@ async def bootstrap_agent_kernel_runtime_from_env(
|
|
|
991
1003
|
workspace_id=session_service.workspace_id,
|
|
992
1004
|
)
|
|
993
1005
|
store: AgentKernelStore = PostgresAgentKernelStore(
|
|
994
|
-
pool, event_log, owns_pool=True
|
|
1006
|
+
pool, event_log, tenant_id=session_service.tenant_id, owns_pool=True
|
|
995
1007
|
)
|
|
996
1008
|
await store.ensure_schema()
|
|
997
1009
|
session_events: Any = PostgresFencedSessionEventStore(store)
|
|
@@ -1030,9 +1042,7 @@ async def bootstrap_agent_kernel_runtime_from_env(
|
|
|
1030
1042
|
adapter_provider=adapter_provider,
|
|
1031
1043
|
start_request_defaults=dict(start_request_defaults or {}),
|
|
1032
1044
|
contract_digest=(
|
|
1033
|
-
AGENT_KERNEL_V1_AGGREGATE_DIGEST
|
|
1034
|
-
if mode == "hosted"
|
|
1035
|
-
else injected_contract_digest
|
|
1045
|
+
AGENT_KERNEL_V1_AGGREGATE_DIGEST if mode == "hosted" else injected_contract_digest
|
|
1036
1046
|
),
|
|
1037
1047
|
capability_digest=os.environ.get("AGENT_KERNEL_CAPABILITY_DIGEST", ""),
|
|
1038
1048
|
bundle_digest=os.environ.get("AGENT_BUNDLE_DIGEST", ""),
|
|
@@ -1050,9 +1060,7 @@ async def bootstrap_agent_kernel_runtime_from_env(
|
|
|
1050
1060
|
# 组合才是 activation owner;hosted 少了它必须拒绝启动,不能退回到
|
|
1051
1061
|
# 所有副本共享的固定字符串。
|
|
1052
1062
|
activation_id=f"{agent_instance_id}:{pod_uid}" if pod_uid else None,
|
|
1053
|
-
lease_ttl_seconds=float(
|
|
1054
|
-
os.environ.get("AGENT_KERNEL_LEASE_TTL_SECONDS", "60") or "60"
|
|
1055
|
-
),
|
|
1063
|
+
lease_ttl_seconds=float(os.environ.get("AGENT_KERNEL_LEASE_TTL_SECONDS", "60") or "60"),
|
|
1056
1064
|
)
|
|
1057
1065
|
runtime = build_agent_kernel_runtime(config)
|
|
1058
1066
|
await runtime.start()
|
|
@@ -29,7 +29,7 @@ def runtime_capability_matrix_wire_value(matrix: Any) -> dict[str, Any]:
|
|
|
29
29
|
"""
|
|
30
30
|
|
|
31
31
|
dump = matrix.model_dump(mode="json")
|
|
32
|
-
for key in ("interaction_mode", "goal", "loop", "plan"):
|
|
32
|
+
for key in ("interaction_mode", "goal", "loop", "plan", "execution_policy"):
|
|
33
33
|
if dump.get(key) is None:
|
|
34
34
|
dump.pop(key, None)
|
|
35
35
|
return dump
|
ksadk/kernel/contracts.py
CHANGED
|
@@ -55,6 +55,9 @@ class WireModel(BaseModel):
|
|
|
55
55
|
class EnqueuePayload(WireModel):
|
|
56
56
|
content: JsonValue
|
|
57
57
|
reply_to: str | None = None
|
|
58
|
+
# Optional execution-grants/v1 extension. AgentControlCommand retains the
|
|
59
|
+
# caller's original payload, so old command digests are unchanged.
|
|
60
|
+
execution_grant_id: str | None = Field(default=None, min_length=1, max_length=512, strict=True)
|
|
58
61
|
|
|
59
62
|
|
|
60
63
|
class SteerPayload(WireModel):
|
|
@@ -325,6 +328,8 @@ class RuntimeCapabilityMatrix(WireModel):
|
|
|
325
328
|
goal: RuntimeCapability | None = None
|
|
326
329
|
loop: RuntimeCapability | None = None
|
|
327
330
|
plan: RuntimeCapability | None = None
|
|
331
|
+
# Trusted host policy injection is independent of prompt/tool availability.
|
|
332
|
+
execution_policy: RuntimeCapability | None = None
|
|
328
333
|
|
|
329
334
|
|
|
330
335
|
class AgentStatusSnapshot(WireModel):
|
ksadk/kernel/control.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
"""深模块 AgentKernel control facade(
|
|
2
|
+
"""深模块 AgentKernel control facade(Kernel Task 6 Step 3)。
|
|
3
3
|
|
|
4
4
|
小接口 ``submit`` / ``status`` / ``subscribe``:
|
|
5
5
|
|
|
@@ -33,6 +33,12 @@ from ksadk.kernel.contracts import (
|
|
|
33
33
|
SessionEventSubscription,
|
|
34
34
|
)
|
|
35
35
|
from ksadk.kernel.errors import InvalidPermitError
|
|
36
|
+
from ksadk.kernel.execution_grants import (
|
|
37
|
+
ExecutionGrantBarrier,
|
|
38
|
+
ExecutionGrantRecord,
|
|
39
|
+
ExecutionGrantSpec,
|
|
40
|
+
GrantState,
|
|
41
|
+
)
|
|
36
42
|
from ksadk.kernel.mapping import (
|
|
37
43
|
CapabilityProvider,
|
|
38
44
|
capability_of,
|
|
@@ -89,6 +95,31 @@ class AgentKernel:
|
|
|
89
95
|
|
|
90
96
|
return self._capabilities()
|
|
91
97
|
|
|
98
|
+
async def ensure_execution_grant(self, spec: ExecutionGrantSpec) -> ExecutionGrantRecord:
|
|
99
|
+
"""Trusted host port; the host MUST authorize the owner and exact scope.
|
|
100
|
+
|
|
101
|
+
A grant does not replace AgentControlPermit. Existing sessions may have
|
|
102
|
+
several independent grants, e.g. distinct scheduled occurrences.
|
|
103
|
+
"""
|
|
104
|
+
return await self._store.ensure_execution_grant(spec)
|
|
105
|
+
|
|
106
|
+
async def get_execution_grant(self, spec: ExecutionGrantSpec) -> ExecutionGrantBarrier | None:
|
|
107
|
+
"""Read current durable state for an already-authorized host scope."""
|
|
108
|
+
return await self._store.get_execution_grant(spec)
|
|
109
|
+
|
|
110
|
+
async def set_execution_grant_state(
|
|
111
|
+
self, spec: ExecutionGrantSpec, state: GrantState, *,
|
|
112
|
+
expected_revision: int, idempotency_key: str,
|
|
113
|
+
) -> ExecutionGrantBarrier:
|
|
114
|
+
"""Serialize suspension/revocation with start qualification.
|
|
115
|
+
|
|
116
|
+
The returned receipt is durable and idempotent. A revoked grant is
|
|
117
|
+
irreversible; qualified commands still require normal Run control.
|
|
118
|
+
"""
|
|
119
|
+
return await self._store.set_execution_grant_state(
|
|
120
|
+
spec, state, expected_revision=expected_revision, idempotency_key=idempotency_key,
|
|
121
|
+
)
|
|
122
|
+
|
|
92
123
|
# ---------------------------------------------------------------- submit
|
|
93
124
|
|
|
94
125
|
async def submit(
|