agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +6 -3
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/RECORD +591 -365
- ksadk/_build_provenance.json +1 -1
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +6 -0
- ksadk/builders/code_builder.py +38 -12
- ksadk/builders/framework_requirements.py +20 -2
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +28 -5
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +64 -16
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/codex/client.py +3 -2
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +125 -31
- ksadk/configs/env_registry_studio.py +86 -0
- ksadk/configs/global_config.py +1 -1
- ksadk/configs/settings.py +3 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +16 -5
- ksadk/conversations/message_projection.py +23 -32
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +8 -0
- ksadk/conversations/runtime_persistence.py +105 -9
- ksadk/conversations/runtime_preparation.py +13 -7
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +34 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +14 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_store.py +213 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_runtime.py +237 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +122 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +506 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +403 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_tuning.py +168 -0
- ksadk/harness/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +42 -0
- ksadk/harness/engine/context_pipeline.py +579 -0
- ksadk/harness/engine/graph_builder.py +859 -0
- ksadk/harness/engine/langgraph.py +931 -0
- ksadk/harness/engine/mcp_disclosure.py +750 -0
- ksadk/harness/engine/policy_runtime.py +70 -0
- ksadk/harness/engine/postgres_checkpointer.py +63 -0
- ksadk/harness/engine/run_control_bridge.py +80 -0
- ksadk/harness/engine/run_types.py +88 -0
- ksadk/harness/engine/skill_disclosure.py +189 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/subagents.py +343 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +144 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +461 -0
- ksadk/harness/execution_policy.py +94 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +454 -0
- ksadk/harness/loop/tools.py +762 -0
- ksadk/harness/managed_runtime.py +884 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_runtime.py +471 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -0
- ksadk/harness/model_capability.py +253 -0
- ksadk/harness/model_provider.py +220 -0
- ksadk/harness/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/prompt_cache.py +70 -0
- ksadk/harness/public_activity.py +154 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +466 -13
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/run_control.py +668 -0
- ksadk/harness/runtime.py +146 -111
- ksadk/harness/runtime_capabilities.py +158 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +530 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/session_store.py +243 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +259 -0
- ksadk/harness/spec.py +332 -0
- ksadk/harness/state.py +153 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +253 -0
- ksadk/harness/tool_policy.py +131 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -0
- ksadk/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +1 -1
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +86 -102
- ksadk/kernel/contract_fingerprints.py +1 -1
- ksadk/kernel/contracts.py +5 -0
- ksadk/kernel/control.py +32 -1
- ksadk/kernel/execution_grants.py +221 -0
- ksadk/kernel/execution_grants_memory.py +133 -0
- ksadk/kernel/execution_grants_postgres.py +217 -0
- ksadk/kernel/execution_grants_sqlite.py +209 -0
- ksadk/kernel/ingress.py +27 -27
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +24 -11
- ksadk/kernel/postgres_store.py +63 -33
- ksadk/kernel/recovery.py +78 -14
- ksadk/kernel/sql/001_agent_kernel.sql +23 -0
- ksadk/kernel/sqlite_store.py +304 -25
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +69 -2
- ksadk/kernel/worker.py +79 -41
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +47 -0
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +40 -1
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +42 -3
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +4 -2
- ksadk/model_proxy/transform.py +40 -2
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +11 -0
- ksadk/plugins/builtins.py +40 -2
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +101 -19
- ksadk/plugins/execution_host.py +99 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +10 -2
- ksadk/plugins/providers/dsh_capabilities.py +61 -0
- ksadk/plugins/providers/harness.py +181 -33
- ksadk/plugins/providers/harness_delegation.py +593 -0
- ksadk/plugins/providers/harness_managed.py +456 -0
- ksadk/plugins/providers/harness_tools.py +326 -0
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +680 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1427 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +138 -0
- ksadk/plugins/teams/runtime.py +777 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +311 -0
- ksadk/plugins/teams/task_decisions.py +423 -0
- ksadk/plugins/teams/transport.py +91 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/runners/_langgraph_runner_streams.py +121 -45
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +25 -60
- ksadk/runners/langgraph_runner.py +128 -111
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runtime/_runner_adapter/stream_mapping.py +52 -2
- ksadk/runtime/conversation_execution.py +25 -1
- ksadk/runtime/executor.py +9 -1
- ksadk/runtime/factory.py +36 -1
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +38 -9
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +103 -1
- ksadk/sandbox/backends/e2b.py +245 -23
- ksadk/sandbox/backends/local_process.py +63 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/local_controls.py +746 -0
- ksadk/sandbox/local_launcher.py +90 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +64 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/kernel_ingress.py +9 -1
- ksadk/server/routes/misc.py +233 -25
- ksadk/server/routes/models.py +3 -3
- ksadk/server/routes/openai_compat.py +76 -13
- ksadk/server/routes/run.py +106 -35
- ksadk/server/routes/sessions.py +244 -68
- ksadk/server/routes/workspace.py +130 -21
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-DHuAWfr5.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-DeBkbJvI.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-C35w-pn1.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-BCtGGkhN.js} +1 -1
- ksadk/server/static/assets/channel-_KDifNys.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-Bx1jS-X-.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-B7nCawed.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
- ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-1nXCdsej.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-2vL2sAdF.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B3bA05-e.js} +1 -1
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BLpRy_Yx.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-BO_UwatH.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-BdNFAney.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-C0J5_3qM.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-CGt_UGeO.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-CIRMvUM4.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-CIpWk_5f.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-CPyieXEf.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-D-92S-Fd.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-DNKuMzWc.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-DWfdmz9s.js} +2 -2
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-DppE_r-D.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-DyG6Ya-z.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-M-SrdhhZ.js} +1 -1
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-mqD5TZup.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-n3n6t_FO.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-qe8xjesy.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-t6MzE0jU.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Dpz9_0zn.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DcxzRwYC.js} +1 -1
- ksadk/server/static/assets/index-BMd2mucF.css +2 -0
- ksadk/server/static/assets/index-D5qyyhTH.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-mtjOi4KM.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-BETqsxE_.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DPWrvs90.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-CJG2mfBP.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-4d78KiEY.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-CMD3x_U_.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +393 -52
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/api.py +592 -57
- ksadk/studio/api_contracts.py +8 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/builder.py +12 -0
- ksadk/studio/capabilities.py +23 -6
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +30 -10
- ksadk/studio/cloud_shared_web.py +75 -2
- ksadk/studio/codex_agent_service.py +2 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +10 -0
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contracts.py +33 -5
- ksadk/studio/dsh_application.py +135 -25
- ksadk/studio/dsh_capability_service.py +287 -20
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +36 -5
- ksadk/studio/execution_host.py +525 -0
- ksadk/studio/framework_run.py +32 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/kernel_registry.py +418 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/model_client.py +1178 -64
- ksadk/studio/model_profile_service.py +26 -11
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/plugin_composition.py +13 -2
- ksadk/studio/plugin_kernel_adapter.py +15 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_runtime.py +230 -17
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +59 -32
- ksadk/studio/resource_catalog.py +6 -0
- ksadk/studio/run_activity.py +895 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +329 -33
- ksadk/studio/runtime_catalog.py +53 -10
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +398 -103
- ksadk/studio/shared_web.py +149 -36
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-UIqo-BPW.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-OhNwH4K9.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-g0I-I4dD.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-CfEnms6Y.css +2 -0
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +133 -0
- ksadk/studio/teams_installation.py +214 -0
- ksadk/studio/teams_node.py +545 -0
- ksadk/studio/teams_node_runner.py +69 -0
- ksadk/studio/teams_remote.py +274 -0
- ksadk/studio/templates.py +40 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +136 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/toolsets/__init__.py +11 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/workspace.py +3 -3
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +26 -13
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
"""Control-plane journal contract for recoverable Sandbox commands.
|
|
2
|
+
|
|
3
|
+
The authoritative implementation belongs to ``agentengine-server``. KsADK
|
|
4
|
+
defines the credential-free wire record and coordinates the adapter calls; it
|
|
5
|
+
does not use a local file or SQLite database as a cloud recovery fact source.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import time
|
|
14
|
+
from dataclasses import dataclass, replace
|
|
15
|
+
from enum import Enum
|
|
16
|
+
from typing import Any, Protocol
|
|
17
|
+
|
|
18
|
+
from ksadk.harness.sandbox_adapters import (
|
|
19
|
+
SessionSandboxBackendAdapter,
|
|
20
|
+
SessionSandboxCommand,
|
|
21
|
+
SessionSandboxHandle,
|
|
22
|
+
)
|
|
23
|
+
from ksadk.harness.sandbox_backend import (
|
|
24
|
+
ExecuteRequest,
|
|
25
|
+
ExecuteResult,
|
|
26
|
+
SandboxCommandResumeToken,
|
|
27
|
+
SandboxResumeToken,
|
|
28
|
+
SandboxSpec,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SandboxCommandJournalConflict(RuntimeError):
|
|
33
|
+
"""A create-only or optimistic-version journal write lost a race."""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class SandboxCommandJournalUnavailable(RuntimeError):
|
|
37
|
+
"""The authoritative journal could not durably accept an update."""
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class SandboxCommandJournalNotFound(KeyError):
|
|
41
|
+
"""The scoped authoritative journal record does not exist."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class SandboxCommandAlreadyTerminal(SandboxCommandJournalConflict):
|
|
45
|
+
"""Recovery raced with, or was requested after, terminal completion."""
|
|
46
|
+
|
|
47
|
+
def __init__(self, record: SandboxCommandJournalRecord) -> None:
|
|
48
|
+
self.record = record
|
|
49
|
+
super().__init__(f"Sandbox 命令已处于终态: {record.state.value}")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class SandboxCommandRecoveryInputMismatch(SandboxCommandJournalConflict):
|
|
53
|
+
"""Immutable recovery input differs from the journal fact."""
|
|
54
|
+
|
|
55
|
+
def __init__(self, reason_code: str, message: str) -> None:
|
|
56
|
+
self.reason_code = reason_code
|
|
57
|
+
super().__init__(message)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class SandboxCommandJournalState(str, Enum):
|
|
61
|
+
RUNNING = "running"
|
|
62
|
+
SUCCEEDED = "succeeded"
|
|
63
|
+
FAILED = "failed"
|
|
64
|
+
CANCELLED = "cancelled"
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def terminal(self) -> bool:
|
|
68
|
+
return self is not SandboxCommandJournalState.RUNNING
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True)
|
|
72
|
+
class SandboxCommandJournalScope:
|
|
73
|
+
"""Tenant/workspace boundary for every journal mutation and lookup."""
|
|
74
|
+
|
|
75
|
+
tenant_id: str
|
|
76
|
+
workspace_id: str
|
|
77
|
+
|
|
78
|
+
def __post_init__(self) -> None:
|
|
79
|
+
if not self.tenant_id.strip() or not self.workspace_id.strip():
|
|
80
|
+
raise ValueError("Journal tenant_id 和 workspace_id 不能为空")
|
|
81
|
+
|
|
82
|
+
def to_dict(self) -> dict[str, str]:
|
|
83
|
+
return {
|
|
84
|
+
"tenantId": self.tenant_id,
|
|
85
|
+
"workspaceId": self.workspace_id,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@classmethod
|
|
89
|
+
def from_dict(cls, value: dict[str, Any]) -> SandboxCommandJournalScope:
|
|
90
|
+
return cls(
|
|
91
|
+
tenant_id=str(value.get("tenantId", "")),
|
|
92
|
+
workspace_id=str(value.get("workspaceId", "")),
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@dataclass(frozen=True)
|
|
97
|
+
class SandboxCommandJournalRecord:
|
|
98
|
+
"""Credential-free state needed to reconnect one in-flight command.
|
|
99
|
+
|
|
100
|
+
``execution_ref`` must identify an immutable Revision/Bundle operation in
|
|
101
|
+
the control plane. The command and environment are intentionally absent;
|
|
102
|
+
recovery reconstructs them from that fact source and verifies the public
|
|
103
|
+
policy fingerprint before reconnecting.
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
operation_id: str
|
|
107
|
+
scope: SandboxCommandJournalScope
|
|
108
|
+
execution_ref: str
|
|
109
|
+
run_id: str
|
|
110
|
+
sandbox_token: SandboxResumeToken
|
|
111
|
+
command_token: SandboxCommandResumeToken
|
|
112
|
+
spec_fingerprint: str
|
|
113
|
+
request_fingerprint: str
|
|
114
|
+
timeout_seconds: float
|
|
115
|
+
started_at: float
|
|
116
|
+
state: SandboxCommandJournalState = SandboxCommandJournalState.RUNNING
|
|
117
|
+
version: int = 1
|
|
118
|
+
exit_code: int | None = None
|
|
119
|
+
|
|
120
|
+
def __post_init__(self) -> None:
|
|
121
|
+
if not self.operation_id.strip() or not self.execution_ref.strip():
|
|
122
|
+
raise ValueError("operation_id 和 execution_ref 不能为空")
|
|
123
|
+
if not self.run_id.strip():
|
|
124
|
+
raise ValueError("run_id 不能为空")
|
|
125
|
+
if self.timeout_seconds <= 0 or self.started_at <= 0 or self.version <= 0:
|
|
126
|
+
raise ValueError("Journal 时间与版本字段必须大于 0")
|
|
127
|
+
if not self.spec_fingerprint or not self.request_fingerprint:
|
|
128
|
+
raise ValueError("Journal 缺少配置指纹")
|
|
129
|
+
if self.state.terminal != (self.exit_code is not None):
|
|
130
|
+
raise ValueError("终态 Journal 必须记录 exit_code,运行态不得记录")
|
|
131
|
+
|
|
132
|
+
def to_dict(self) -> dict[str, Any]:
|
|
133
|
+
return {
|
|
134
|
+
"schemaVersion": 1,
|
|
135
|
+
"operationId": self.operation_id,
|
|
136
|
+
"scope": self.scope.to_dict(),
|
|
137
|
+
"executionRef": self.execution_ref,
|
|
138
|
+
"runId": self.run_id,
|
|
139
|
+
"sandboxToken": self.sandbox_token.to_dict(),
|
|
140
|
+
"commandToken": self.command_token.to_dict(),
|
|
141
|
+
"specFingerprint": self.spec_fingerprint,
|
|
142
|
+
"requestFingerprint": self.request_fingerprint,
|
|
143
|
+
"timeoutSeconds": self.timeout_seconds,
|
|
144
|
+
"startedAt": self.started_at,
|
|
145
|
+
"state": self.state.value,
|
|
146
|
+
"version": self.version,
|
|
147
|
+
"exitCode": self.exit_code,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@classmethod
|
|
151
|
+
def from_dict(cls, value: dict[str, Any]) -> SandboxCommandJournalRecord:
|
|
152
|
+
if value.get("schemaVersion") != 1:
|
|
153
|
+
raise ValueError("Sandbox Command Journal schemaVersion 不支持")
|
|
154
|
+
try:
|
|
155
|
+
state = SandboxCommandJournalState(str(value.get("state", "")))
|
|
156
|
+
raw_exit_code = value.get("exitCode")
|
|
157
|
+
return cls(
|
|
158
|
+
operation_id=str(value.get("operationId", "")),
|
|
159
|
+
scope=SandboxCommandJournalScope.from_dict(dict(value["scope"])),
|
|
160
|
+
execution_ref=str(value.get("executionRef", "")),
|
|
161
|
+
run_id=str(value.get("runId", "")),
|
|
162
|
+
sandbox_token=SandboxResumeToken.from_dict(dict(value["sandboxToken"])),
|
|
163
|
+
command_token=SandboxCommandResumeToken.from_dict(
|
|
164
|
+
dict(value["commandToken"])
|
|
165
|
+
),
|
|
166
|
+
spec_fingerprint=str(value.get("specFingerprint", "")),
|
|
167
|
+
request_fingerprint=str(value.get("requestFingerprint", "")),
|
|
168
|
+
timeout_seconds=float(value.get("timeoutSeconds", 0)),
|
|
169
|
+
started_at=float(value.get("startedAt", 0)),
|
|
170
|
+
state=state,
|
|
171
|
+
version=int(value.get("version", 0)),
|
|
172
|
+
exit_code=None if raw_exit_code is None else int(raw_exit_code),
|
|
173
|
+
)
|
|
174
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
175
|
+
if isinstance(exc, ValueError) and "Journal" in str(exc):
|
|
176
|
+
raise
|
|
177
|
+
raise ValueError("Sandbox Command Journal 记录无效") from exc
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class SandboxCommandJournalProvider(Protocol):
|
|
181
|
+
"""Authoritative durable journal implemented by the control plane.
|
|
182
|
+
|
|
183
|
+
``create_running`` is create-only and may return only after the record is
|
|
184
|
+
durable. ``finish`` is optimistic: implementations must reject a stale
|
|
185
|
+
``expected_version`` and any attempt to overwrite a terminal record with
|
|
186
|
+
:class:`SandboxCommandJournalConflict`. All reads and writes are scoped by
|
|
187
|
+
tenant/workspace; a cross-scope load must behave as not found.
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
async def create_running(
|
|
191
|
+
self,
|
|
192
|
+
record: SandboxCommandJournalRecord,
|
|
193
|
+
) -> SandboxCommandJournalRecord: ...
|
|
194
|
+
|
|
195
|
+
async def load(
|
|
196
|
+
self,
|
|
197
|
+
operation_id: str,
|
|
198
|
+
*,
|
|
199
|
+
scope: SandboxCommandJournalScope,
|
|
200
|
+
) -> SandboxCommandJournalRecord | None: ...
|
|
201
|
+
|
|
202
|
+
async def finish(
|
|
203
|
+
self,
|
|
204
|
+
operation_id: str,
|
|
205
|
+
*,
|
|
206
|
+
scope: SandboxCommandJournalScope,
|
|
207
|
+
expected_version: int,
|
|
208
|
+
state: SandboxCommandJournalState,
|
|
209
|
+
exit_code: int,
|
|
210
|
+
) -> SandboxCommandJournalRecord: ...
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
@dataclass(frozen=True)
|
|
214
|
+
class RecoveredSandboxCommandExecution:
|
|
215
|
+
sandbox: SessionSandboxHandle
|
|
216
|
+
result: ExecuteResult
|
|
217
|
+
journal: SandboxCommandJournalRecord
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
@dataclass(frozen=True)
|
|
221
|
+
class StartedRecoverableSandboxCommand:
|
|
222
|
+
"""A live command whose reconnect tokens are already durable.
|
|
223
|
+
|
|
224
|
+
The object is intentionally process-local because it contains a live
|
|
225
|
+
adapter command handle. A replacement worker reconstructs its state from
|
|
226
|
+
``journal`` through :meth:`recover_and_wait`, never by serializing this
|
|
227
|
+
wrapper.
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
command: SessionSandboxCommand
|
|
231
|
+
journal: SandboxCommandJournalRecord
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
class RecoverableSandboxCommandCoordinator:
|
|
235
|
+
"""Compose command reconnect primitives with an authoritative journal."""
|
|
236
|
+
|
|
237
|
+
def __init__(
|
|
238
|
+
self,
|
|
239
|
+
adapter: SessionSandboxBackendAdapter,
|
|
240
|
+
journal: SandboxCommandJournalProvider,
|
|
241
|
+
*,
|
|
242
|
+
scope: SandboxCommandJournalScope,
|
|
243
|
+
) -> None:
|
|
244
|
+
if not adapter.capabilities.command_reconnect:
|
|
245
|
+
raise ValueError("Recoverable coordinator 需要 command_reconnect 能力")
|
|
246
|
+
self._adapter = adapter
|
|
247
|
+
self._journal = journal
|
|
248
|
+
self._scope = scope
|
|
249
|
+
|
|
250
|
+
async def start_and_wait(
|
|
251
|
+
self,
|
|
252
|
+
handle: SessionSandboxHandle,
|
|
253
|
+
request: ExecuteRequest,
|
|
254
|
+
*,
|
|
255
|
+
operation_id: str,
|
|
256
|
+
execution_ref: str,
|
|
257
|
+
) -> ExecuteResult:
|
|
258
|
+
started = await self.start(
|
|
259
|
+
handle,
|
|
260
|
+
request,
|
|
261
|
+
operation_id=operation_id,
|
|
262
|
+
execution_ref=execution_ref,
|
|
263
|
+
)
|
|
264
|
+
return await self.wait(started)
|
|
265
|
+
|
|
266
|
+
async def start(
|
|
267
|
+
self,
|
|
268
|
+
handle: SessionSandboxHandle,
|
|
269
|
+
request: ExecuteRequest,
|
|
270
|
+
*,
|
|
271
|
+
operation_id: str,
|
|
272
|
+
execution_ref: str,
|
|
273
|
+
) -> StartedRecoverableSandboxCommand:
|
|
274
|
+
"""Start a command and durably publish its recovery tokens.
|
|
275
|
+
|
|
276
|
+
Returning from this method is the recoverability boundary: callers
|
|
277
|
+
may lose the current worker afterwards and a replacement worker can
|
|
278
|
+
continue with :meth:`recover_and_wait`.
|
|
279
|
+
"""
|
|
280
|
+
|
|
281
|
+
command = await self._adapter.start_execute(handle, request)
|
|
282
|
+
record = self._build_running_record(
|
|
283
|
+
command,
|
|
284
|
+
operation_id=operation_id,
|
|
285
|
+
execution_ref=execution_ref,
|
|
286
|
+
)
|
|
287
|
+
try:
|
|
288
|
+
durable = await self._journal.create_running(record)
|
|
289
|
+
self._validate_created_record(record, durable)
|
|
290
|
+
except asyncio.CancelledError:
|
|
291
|
+
# Task cancellation is a BaseException on supported Python
|
|
292
|
+
# versions, so it must be handled separately from provider
|
|
293
|
+
# failures. No durable token means the remote side effect must not
|
|
294
|
+
# survive the cancelled worker.
|
|
295
|
+
await asyncio.shield(self._adapter.cancel_command(command))
|
|
296
|
+
raise
|
|
297
|
+
except Exception as exc:
|
|
298
|
+
# No durable token means no recoverability. Stop the remote process
|
|
299
|
+
# rather than letting an untracked side effect continue.
|
|
300
|
+
await self._adapter.cancel_command(command)
|
|
301
|
+
raise SandboxCommandJournalUnavailable(
|
|
302
|
+
"Sandbox 命令恢复记录未持久化,已 fail-closed 取消命令"
|
|
303
|
+
) from exc
|
|
304
|
+
|
|
305
|
+
return StartedRecoverableSandboxCommand(command=command, journal=durable)
|
|
306
|
+
|
|
307
|
+
async def wait(self, started: StartedRecoverableSandboxCommand) -> ExecuteResult:
|
|
308
|
+
"""Wait for a previously started command and persist its terminal state."""
|
|
309
|
+
|
|
310
|
+
self._validate_started_command(started)
|
|
311
|
+
|
|
312
|
+
try:
|
|
313
|
+
result = await self._adapter.wait_command(started.command)
|
|
314
|
+
except asyncio.CancelledError:
|
|
315
|
+
await self._finish_cancelled(started.journal)
|
|
316
|
+
raise
|
|
317
|
+
await self._finish_result(started.journal, result)
|
|
318
|
+
return result
|
|
319
|
+
|
|
320
|
+
def _validate_started_command(self, started: StartedRecoverableSandboxCommand) -> None:
|
|
321
|
+
command = started.command
|
|
322
|
+
record = started.journal
|
|
323
|
+
if record.scope != self._scope:
|
|
324
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
325
|
+
"scope_mismatch",
|
|
326
|
+
"tenant/workspace 与已启动命令不匹配",
|
|
327
|
+
)
|
|
328
|
+
if record.state is not SandboxCommandJournalState.RUNNING:
|
|
329
|
+
raise SandboxCommandAlreadyTerminal(record)
|
|
330
|
+
if record.run_id != command.request.run_id:
|
|
331
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
332
|
+
"run_id_mismatch",
|
|
333
|
+
"run_id 与已启动命令不匹配",
|
|
334
|
+
)
|
|
335
|
+
if record.sandbox_token != self._adapter.export_resume_token(command.sandbox):
|
|
336
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
337
|
+
"sandbox_token_mismatch",
|
|
338
|
+
"Sandbox Token 与已启动命令不匹配",
|
|
339
|
+
)
|
|
340
|
+
if record.command_token != self._adapter.export_command_resume_token(command):
|
|
341
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
342
|
+
"command_token_mismatch",
|
|
343
|
+
"Command Token 与已启动命令不匹配",
|
|
344
|
+
)
|
|
345
|
+
if record.spec_fingerprint != _spec_fingerprint(command.sandbox.spec):
|
|
346
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
347
|
+
"spec_fingerprint_mismatch",
|
|
348
|
+
"Sandbox 策略与已启动命令不匹配",
|
|
349
|
+
)
|
|
350
|
+
if record.request_fingerprint != _request_fingerprint(
|
|
351
|
+
execution_ref=record.execution_ref,
|
|
352
|
+
request=command.request,
|
|
353
|
+
):
|
|
354
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
355
|
+
"request_fingerprint_mismatch",
|
|
356
|
+
"执行请求与已启动命令不匹配",
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
async def recover_and_wait(
|
|
360
|
+
self,
|
|
361
|
+
operation_id: str,
|
|
362
|
+
*,
|
|
363
|
+
execution_ref: str,
|
|
364
|
+
spec: SandboxSpec,
|
|
365
|
+
request: ExecuteRequest,
|
|
366
|
+
) -> RecoveredSandboxCommandExecution:
|
|
367
|
+
record = await self._journal.load(operation_id, scope=self._scope)
|
|
368
|
+
if record is None:
|
|
369
|
+
raise SandboxCommandJournalNotFound(
|
|
370
|
+
f"Sandbox Command Journal 不存在: {operation_id}"
|
|
371
|
+
)
|
|
372
|
+
if record.state is not SandboxCommandJournalState.RUNNING:
|
|
373
|
+
raise SandboxCommandAlreadyTerminal(record)
|
|
374
|
+
self._validate_recovery_input(
|
|
375
|
+
record,
|
|
376
|
+
execution_ref=execution_ref,
|
|
377
|
+
spec=spec,
|
|
378
|
+
request=request,
|
|
379
|
+
)
|
|
380
|
+
sandbox = await self._adapter.reconnect(record.sandbox_token, spec=spec)
|
|
381
|
+
try:
|
|
382
|
+
command = await self._adapter.reconnect_command(
|
|
383
|
+
sandbox,
|
|
384
|
+
record.command_token,
|
|
385
|
+
request=request,
|
|
386
|
+
)
|
|
387
|
+
result = await self._adapter.wait_command(command)
|
|
388
|
+
completed = await self._finish_result(record, result)
|
|
389
|
+
except asyncio.CancelledError:
|
|
390
|
+
# ``wait_command`` cancels the remote process before propagating
|
|
391
|
+
# cancellation. Keep the authoritative journal aligned with that
|
|
392
|
+
# terminal outcome so reconciliation never retries a dead PID.
|
|
393
|
+
await self._finish_cancelled(record)
|
|
394
|
+
await self._release_recovery_handle(sandbox)
|
|
395
|
+
raise
|
|
396
|
+
except BaseException:
|
|
397
|
+
# The acquired lease remains the authoritative fencing boundary.
|
|
398
|
+
# Release this process' ownership without killing a command whose
|
|
399
|
+
# result may still be recoverable by a later worker.
|
|
400
|
+
await self._release_recovery_handle(sandbox)
|
|
401
|
+
raise
|
|
402
|
+
return RecoveredSandboxCommandExecution(
|
|
403
|
+
sandbox=sandbox,
|
|
404
|
+
result=result,
|
|
405
|
+
journal=completed,
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
def _build_running_record(
|
|
409
|
+
self,
|
|
410
|
+
command: SessionSandboxCommand,
|
|
411
|
+
*,
|
|
412
|
+
operation_id: str,
|
|
413
|
+
execution_ref: str,
|
|
414
|
+
) -> SandboxCommandJournalRecord:
|
|
415
|
+
request = command.request
|
|
416
|
+
return SandboxCommandJournalRecord(
|
|
417
|
+
operation_id=operation_id,
|
|
418
|
+
scope=self._scope,
|
|
419
|
+
execution_ref=execution_ref,
|
|
420
|
+
run_id=request.run_id,
|
|
421
|
+
sandbox_token=self._adapter.export_resume_token(command.sandbox),
|
|
422
|
+
command_token=self._adapter.export_command_resume_token(command),
|
|
423
|
+
spec_fingerprint=_spec_fingerprint(command.sandbox.spec),
|
|
424
|
+
request_fingerprint=_request_fingerprint(
|
|
425
|
+
execution_ref=execution_ref,
|
|
426
|
+
request=request,
|
|
427
|
+
),
|
|
428
|
+
timeout_seconds=request.timeout_seconds,
|
|
429
|
+
started_at=time.time(),
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
async def _finish_result(
|
|
433
|
+
self,
|
|
434
|
+
record: SandboxCommandJournalRecord,
|
|
435
|
+
result: ExecuteResult,
|
|
436
|
+
) -> SandboxCommandJournalRecord:
|
|
437
|
+
state = (
|
|
438
|
+
SandboxCommandJournalState.SUCCEEDED
|
|
439
|
+
if result.ok
|
|
440
|
+
else SandboxCommandJournalState.FAILED
|
|
441
|
+
)
|
|
442
|
+
try:
|
|
443
|
+
return await self._journal.finish(
|
|
444
|
+
record.operation_id,
|
|
445
|
+
scope=self._scope,
|
|
446
|
+
expected_version=record.version,
|
|
447
|
+
state=state,
|
|
448
|
+
exit_code=result.exit_code,
|
|
449
|
+
)
|
|
450
|
+
except Exception as exc:
|
|
451
|
+
raise SandboxCommandJournalUnavailable(
|
|
452
|
+
"Sandbox 命令已结束,但 Journal 终态写入失败"
|
|
453
|
+
) from exc
|
|
454
|
+
|
|
455
|
+
async def _finish_cancelled(self, record: SandboxCommandJournalRecord) -> None:
|
|
456
|
+
try:
|
|
457
|
+
await asyncio.shield(
|
|
458
|
+
self._journal.finish(
|
|
459
|
+
record.operation_id,
|
|
460
|
+
scope=self._scope,
|
|
461
|
+
expected_version=record.version,
|
|
462
|
+
state=SandboxCommandJournalState.CANCELLED,
|
|
463
|
+
exit_code=130,
|
|
464
|
+
)
|
|
465
|
+
)
|
|
466
|
+
except Exception:
|
|
467
|
+
# Preserve task cancellation. The journal remains RUNNING and can
|
|
468
|
+
# be reconciled by the control plane using the process token.
|
|
469
|
+
return
|
|
470
|
+
|
|
471
|
+
@staticmethod
|
|
472
|
+
def _validate_created_record(
|
|
473
|
+
expected: SandboxCommandJournalRecord,
|
|
474
|
+
actual: SandboxCommandJournalRecord,
|
|
475
|
+
) -> None:
|
|
476
|
+
if actual != expected:
|
|
477
|
+
raise SandboxCommandJournalConflict(
|
|
478
|
+
"Journal create_running 返回了不同的恢复记录"
|
|
479
|
+
)
|
|
480
|
+
|
|
481
|
+
def _validate_recovery_input(
|
|
482
|
+
self,
|
|
483
|
+
record: SandboxCommandJournalRecord,
|
|
484
|
+
*,
|
|
485
|
+
execution_ref: str,
|
|
486
|
+
spec: SandboxSpec,
|
|
487
|
+
request: ExecuteRequest,
|
|
488
|
+
) -> None:
|
|
489
|
+
if record.execution_ref != execution_ref:
|
|
490
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
491
|
+
"execution_ref_mismatch",
|
|
492
|
+
"execution_ref 与 Journal 不匹配",
|
|
493
|
+
)
|
|
494
|
+
if record.scope != self._scope:
|
|
495
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
496
|
+
"scope_mismatch",
|
|
497
|
+
"tenant/workspace 与 Journal 不匹配",
|
|
498
|
+
)
|
|
499
|
+
if record.run_id != request.run_id:
|
|
500
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
501
|
+
"run_id_mismatch",
|
|
502
|
+
"run_id 与 Journal 不匹配",
|
|
503
|
+
)
|
|
504
|
+
if record.spec_fingerprint != _spec_fingerprint(spec):
|
|
505
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
506
|
+
"spec_fingerprint_mismatch",
|
|
507
|
+
"Sandbox 策略与 Journal 不匹配",
|
|
508
|
+
)
|
|
509
|
+
if record.request_fingerprint != _request_fingerprint(
|
|
510
|
+
execution_ref=execution_ref,
|
|
511
|
+
request=request,
|
|
512
|
+
):
|
|
513
|
+
raise SandboxCommandRecoveryInputMismatch(
|
|
514
|
+
"request_fingerprint_mismatch",
|
|
515
|
+
"执行请求与 Journal 不匹配",
|
|
516
|
+
)
|
|
517
|
+
|
|
518
|
+
async def _release_recovery_handle(self, sandbox: SessionSandboxHandle) -> None:
|
|
519
|
+
# ``close`` would kill the remote Sandbox. An unsuccessful reconnect
|
|
520
|
+
# must only relinquish this worker's lease. This adapter-private call
|
|
521
|
+
# is intentionally kept here until the platform lifecycle owns the
|
|
522
|
+
# outer Sandbox cleanup operation.
|
|
523
|
+
await self._adapter.detach(sandbox)
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def _spec_fingerprint(spec: SandboxSpec) -> str:
|
|
527
|
+
public_policy = {
|
|
528
|
+
"workspaceRoot": spec.workspace_root,
|
|
529
|
+
"readOnly": spec.read_only,
|
|
530
|
+
"networkEgress": sorted(spec.network_egress),
|
|
531
|
+
# Values are Secret material and may rotate between recovery attempts.
|
|
532
|
+
"envKeys": sorted(spec.env),
|
|
533
|
+
}
|
|
534
|
+
return _digest(public_policy)
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def _request_fingerprint(*, execution_ref: str, request: ExecuteRequest) -> str:
|
|
538
|
+
# The immutable execution_ref is the command fact source. The command text
|
|
539
|
+
# itself is deliberately not persisted or hashed into the journal.
|
|
540
|
+
return _digest(
|
|
541
|
+
{
|
|
542
|
+
"executionRef": execution_ref,
|
|
543
|
+
"runId": request.run_id,
|
|
544
|
+
"timeoutSeconds": request.timeout_seconds,
|
|
545
|
+
}
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
def _digest(value: dict[str, Any]) -> str:
|
|
550
|
+
payload = json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
|
|
551
|
+
return f"sha256:{hashlib.sha256(payload.encode('utf-8')).hexdigest()}"
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def complete_journal_record(
|
|
555
|
+
record: SandboxCommandJournalRecord,
|
|
556
|
+
*,
|
|
557
|
+
state: SandboxCommandJournalState,
|
|
558
|
+
exit_code: int,
|
|
559
|
+
) -> SandboxCommandJournalRecord:
|
|
560
|
+
"""Helper for control-plane provider tests and lightweight adapters."""
|
|
561
|
+
|
|
562
|
+
if not state.terminal:
|
|
563
|
+
raise ValueError("finish 只能写入终态")
|
|
564
|
+
return replace(
|
|
565
|
+
record,
|
|
566
|
+
state=state,
|
|
567
|
+
version=record.version + 1,
|
|
568
|
+
exit_code=exit_code,
|
|
569
|
+
)
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
__all__ = [
|
|
573
|
+
"RecoverableSandboxCommandCoordinator",
|
|
574
|
+
"RecoveredSandboxCommandExecution",
|
|
575
|
+
"StartedRecoverableSandboxCommand",
|
|
576
|
+
"SandboxCommandAlreadyTerminal",
|
|
577
|
+
"SandboxCommandJournalConflict",
|
|
578
|
+
"SandboxCommandJournalNotFound",
|
|
579
|
+
"SandboxCommandJournalProvider",
|
|
580
|
+
"SandboxCommandJournalRecord",
|
|
581
|
+
"SandboxCommandJournalScope",
|
|
582
|
+
"SandboxCommandJournalState",
|
|
583
|
+
"SandboxCommandJournalUnavailable",
|
|
584
|
+
"SandboxCommandRecoveryInputMismatch",
|
|
585
|
+
"complete_journal_record",
|
|
586
|
+
]
|