agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +6 -3
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/RECORD +591 -365
- ksadk/_build_provenance.json +1 -1
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +6 -0
- ksadk/builders/code_builder.py +38 -12
- ksadk/builders/framework_requirements.py +20 -2
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +28 -5
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +64 -16
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/codex/client.py +3 -2
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +125 -31
- ksadk/configs/env_registry_studio.py +86 -0
- ksadk/configs/global_config.py +1 -1
- ksadk/configs/settings.py +3 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +16 -5
- ksadk/conversations/message_projection.py +23 -32
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +8 -0
- ksadk/conversations/runtime_persistence.py +105 -9
- ksadk/conversations/runtime_preparation.py +13 -7
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +34 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +14 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_store.py +213 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_runtime.py +237 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +122 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +506 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +403 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_tuning.py +168 -0
- ksadk/harness/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +42 -0
- ksadk/harness/engine/context_pipeline.py +579 -0
- ksadk/harness/engine/graph_builder.py +859 -0
- ksadk/harness/engine/langgraph.py +931 -0
- ksadk/harness/engine/mcp_disclosure.py +750 -0
- ksadk/harness/engine/policy_runtime.py +70 -0
- ksadk/harness/engine/postgres_checkpointer.py +63 -0
- ksadk/harness/engine/run_control_bridge.py +80 -0
- ksadk/harness/engine/run_types.py +88 -0
- ksadk/harness/engine/skill_disclosure.py +189 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/subagents.py +343 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +144 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +461 -0
- ksadk/harness/execution_policy.py +94 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +454 -0
- ksadk/harness/loop/tools.py +762 -0
- ksadk/harness/managed_runtime.py +884 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_runtime.py +471 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -0
- ksadk/harness/model_capability.py +253 -0
- ksadk/harness/model_provider.py +220 -0
- ksadk/harness/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/prompt_cache.py +70 -0
- ksadk/harness/public_activity.py +154 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +466 -13
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/run_control.py +668 -0
- ksadk/harness/runtime.py +146 -111
- ksadk/harness/runtime_capabilities.py +158 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +530 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/session_store.py +243 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +259 -0
- ksadk/harness/spec.py +332 -0
- ksadk/harness/state.py +153 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +253 -0
- ksadk/harness/tool_policy.py +131 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -0
- ksadk/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +1 -1
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +86 -102
- ksadk/kernel/contract_fingerprints.py +1 -1
- ksadk/kernel/contracts.py +5 -0
- ksadk/kernel/control.py +32 -1
- ksadk/kernel/execution_grants.py +221 -0
- ksadk/kernel/execution_grants_memory.py +133 -0
- ksadk/kernel/execution_grants_postgres.py +217 -0
- ksadk/kernel/execution_grants_sqlite.py +209 -0
- ksadk/kernel/ingress.py +27 -27
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +24 -11
- ksadk/kernel/postgres_store.py +63 -33
- ksadk/kernel/recovery.py +78 -14
- ksadk/kernel/sql/001_agent_kernel.sql +23 -0
- ksadk/kernel/sqlite_store.py +304 -25
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +69 -2
- ksadk/kernel/worker.py +79 -41
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +47 -0
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +40 -1
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +42 -3
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +4 -2
- ksadk/model_proxy/transform.py +40 -2
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +11 -0
- ksadk/plugins/builtins.py +40 -2
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +101 -19
- ksadk/plugins/execution_host.py +99 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +10 -2
- ksadk/plugins/providers/dsh_capabilities.py +61 -0
- ksadk/plugins/providers/harness.py +181 -33
- ksadk/plugins/providers/harness_delegation.py +593 -0
- ksadk/plugins/providers/harness_managed.py +456 -0
- ksadk/plugins/providers/harness_tools.py +326 -0
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +680 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1427 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +138 -0
- ksadk/plugins/teams/runtime.py +777 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +311 -0
- ksadk/plugins/teams/task_decisions.py +423 -0
- ksadk/plugins/teams/transport.py +91 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/runners/_langgraph_runner_streams.py +121 -45
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +25 -60
- ksadk/runners/langgraph_runner.py +128 -111
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runtime/_runner_adapter/stream_mapping.py +52 -2
- ksadk/runtime/conversation_execution.py +25 -1
- ksadk/runtime/executor.py +9 -1
- ksadk/runtime/factory.py +36 -1
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +38 -9
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +103 -1
- ksadk/sandbox/backends/e2b.py +245 -23
- ksadk/sandbox/backends/local_process.py +63 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/local_controls.py +746 -0
- ksadk/sandbox/local_launcher.py +90 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +64 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/kernel_ingress.py +9 -1
- ksadk/server/routes/misc.py +233 -25
- ksadk/server/routes/models.py +3 -3
- ksadk/server/routes/openai_compat.py +76 -13
- ksadk/server/routes/run.py +106 -35
- ksadk/server/routes/sessions.py +244 -68
- ksadk/server/routes/workspace.py +130 -21
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-DHuAWfr5.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-DeBkbJvI.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-C35w-pn1.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-BCtGGkhN.js} +1 -1
- ksadk/server/static/assets/channel-_KDifNys.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-Bx1jS-X-.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-B7nCawed.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
- ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-1nXCdsej.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-2vL2sAdF.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B3bA05-e.js} +1 -1
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BLpRy_Yx.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-BO_UwatH.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-BdNFAney.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-C0J5_3qM.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-CGt_UGeO.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-CIRMvUM4.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-CIpWk_5f.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-CPyieXEf.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-D-92S-Fd.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-DNKuMzWc.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-DWfdmz9s.js} +2 -2
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-DppE_r-D.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-DyG6Ya-z.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-M-SrdhhZ.js} +1 -1
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-mqD5TZup.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-n3n6t_FO.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-qe8xjesy.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-t6MzE0jU.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Dpz9_0zn.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DcxzRwYC.js} +1 -1
- ksadk/server/static/assets/index-BMd2mucF.css +2 -0
- ksadk/server/static/assets/index-D5qyyhTH.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-mtjOi4KM.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-BETqsxE_.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DPWrvs90.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-CJG2mfBP.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-4d78KiEY.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-CMD3x_U_.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +393 -52
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/api.py +592 -57
- ksadk/studio/api_contracts.py +8 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/builder.py +12 -0
- ksadk/studio/capabilities.py +23 -6
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +30 -10
- ksadk/studio/cloud_shared_web.py +75 -2
- ksadk/studio/codex_agent_service.py +2 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +10 -0
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contracts.py +33 -5
- ksadk/studio/dsh_application.py +135 -25
- ksadk/studio/dsh_capability_service.py +287 -20
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +36 -5
- ksadk/studio/execution_host.py +525 -0
- ksadk/studio/framework_run.py +32 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/kernel_registry.py +418 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/model_client.py +1178 -64
- ksadk/studio/model_profile_service.py +26 -11
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/plugin_composition.py +13 -2
- ksadk/studio/plugin_kernel_adapter.py +15 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_runtime.py +230 -17
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +59 -32
- ksadk/studio/resource_catalog.py +6 -0
- ksadk/studio/run_activity.py +895 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +329 -33
- ksadk/studio/runtime_catalog.py +53 -10
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +398 -103
- ksadk/studio/shared_web.py +149 -36
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-UIqo-BPW.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-OhNwH4K9.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-g0I-I4dD.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-CfEnms6Y.css +2 -0
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +133 -0
- ksadk/studio/teams_installation.py +214 -0
- ksadk/studio/teams_node.py +545 -0
- ksadk/studio/teams_node_runner.py +69 -0
- ksadk/studio/teams_remote.py +274 -0
- ksadk/studio/templates.py +40 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +136 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/toolsets/__init__.py +11 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/workspace.py +3 -3
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +26 -13
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/studio/framework_run.py
CHANGED
|
@@ -110,10 +110,10 @@ class FrameworkRunSpecResolver:
|
|
|
110
110
|
) -> StudioRunSpec:
|
|
111
111
|
build = self.builds.get(build_id)
|
|
112
112
|
runtime_type = build.runtime_type.strip().lower()
|
|
113
|
-
if runtime_type not in {"adk", "langgraph"}:
|
|
113
|
+
if runtime_type not in {"harness", "adk", "langgraph"}:
|
|
114
114
|
raise StudioError(
|
|
115
115
|
"BUILD_RUNTIME_UNSUPPORTED",
|
|
116
|
-
"Build 没有可由 RuntimeAdapter 启动的 ADK/LangGraph Runtime",
|
|
116
|
+
"Build 没有可由 RuntimeAdapter 启动的 KsADK Harness/ADK/LangGraph Runtime",
|
|
117
117
|
status_code=422,
|
|
118
118
|
details={"buildId": build_id, "runtimeType": runtime_type},
|
|
119
119
|
)
|
|
@@ -127,27 +127,36 @@ class FrameworkRunSpecResolver:
|
|
|
127
127
|
# execution, including an externally restored but integrity-valid ZIP.
|
|
128
128
|
self._verify_bundle_security(bundle_root)
|
|
129
129
|
project_dir = bundle_root / "runtime"
|
|
130
|
-
if not project_dir.is_dir():
|
|
130
|
+
if runtime_type != "harness" and not project_dir.is_dir():
|
|
131
131
|
raise StudioError(
|
|
132
132
|
"BUILD_RUNTIME_SOURCE_MISSING",
|
|
133
133
|
"Build 缺少不可变 Runtime 源码快照",
|
|
134
134
|
status_code=500,
|
|
135
135
|
)
|
|
136
|
-
detection =
|
|
137
|
-
|
|
136
|
+
detection = (
|
|
137
|
+
None if runtime_type == "harness" else FrameworkDetector(str(project_dir)).detect()
|
|
138
|
+
)
|
|
139
|
+
if runtime_type != "harness" and (
|
|
140
|
+
not detection.is_valid or detection.type.value != runtime_type
|
|
141
|
+
):
|
|
138
142
|
raise StudioError(
|
|
139
143
|
"BUILD_RUNTIME_DETECTION_MISMATCH",
|
|
140
144
|
"Build 中的 Runtime 源码与 Runtime Lock 不一致",
|
|
141
145
|
status_code=422,
|
|
142
146
|
details={
|
|
143
147
|
"expected": runtime_type,
|
|
144
|
-
"detected": detection.type.value,
|
|
148
|
+
"detected": detection.type.value if detection is not None else "",
|
|
145
149
|
},
|
|
146
150
|
)
|
|
147
151
|
selected_model = self._select_model(build.runtime_lock, model)
|
|
148
152
|
resolved_path = bundle_root / "resolved-agent-spec.json"
|
|
149
153
|
resolved = json.loads(resolved_path.read_text(encoding="utf-8"))
|
|
150
154
|
instructions = resolved.get("instructions") if isinstance(resolved, dict) else {}
|
|
155
|
+
model_spec = resolved.get("model") if isinstance(resolved, dict) else {}
|
|
156
|
+
endpoint_url = str((model_spec or {}).get("endpointUrl") or "").strip()
|
|
157
|
+
base_url = str((model_spec or {}).get("baseUrl") or "").strip()
|
|
158
|
+
if not base_url and endpoint_url.endswith("/chat/completions"):
|
|
159
|
+
base_url = endpoint_url[: -len("/chat/completions")]
|
|
151
160
|
request_config = {
|
|
152
161
|
"base_instructions": str((instructions or {}).get("system") or ""),
|
|
153
162
|
# Preserve system/task as separate PCM sources while keeping the
|
|
@@ -166,8 +175,8 @@ class FrameworkRunSpecResolver:
|
|
|
166
175
|
"memory_write_mode": _resolved_memory_write_mode(resolved),
|
|
167
176
|
"flush_before_compaction": _resolved_memory_flush_before_compaction(resolved),
|
|
168
177
|
"provider_ref": _resolved_memory_provider_ref(resolved),
|
|
169
|
-
"entry_point": detection.entry_point,
|
|
170
|
-
"agent_variable": detection.agent_variable,
|
|
178
|
+
"entry_point": detection.entry_point if detection is not None else "",
|
|
179
|
+
"agent_variable": detection.agent_variable if detection is not None else "",
|
|
171
180
|
}
|
|
172
181
|
# AgentVersion 的 ContextSpec 预算传到 Planner(方案 §8.2)
|
|
173
182
|
context_spec = resolved.get("context") if isinstance(resolved, dict) else {}
|
|
@@ -185,9 +194,22 @@ class FrameworkRunSpecResolver:
|
|
|
185
194
|
return StudioRunSpec(
|
|
186
195
|
launch_context=RuntimeLaunchContext(
|
|
187
196
|
runtime_type=runtime_type,
|
|
188
|
-
project_dir=project_dir,
|
|
197
|
+
project_dir=project_dir if project_dir.is_dir() else bundle_root,
|
|
189
198
|
detection=detection,
|
|
190
|
-
config=
|
|
199
|
+
config={
|
|
200
|
+
**(dict(detection.raw_config or {}) if detection is not None else {}),
|
|
201
|
+
"model": selected_model,
|
|
202
|
+
"base_url": base_url,
|
|
203
|
+
"prompt": "\n\n".join(
|
|
204
|
+
value
|
|
205
|
+
for value in (
|
|
206
|
+
str((instructions or {}).get("system") or "").strip(),
|
|
207
|
+
str((instructions or {}).get("task") or "").strip(),
|
|
208
|
+
)
|
|
209
|
+
if value
|
|
210
|
+
),
|
|
211
|
+
"agent_id": build.agent_id,
|
|
212
|
+
},
|
|
191
213
|
),
|
|
192
214
|
build_id=build.id,
|
|
193
215
|
agent_id=build.agent_id,
|
ksadk/studio/hosted_kernel.py
CHANGED
|
@@ -26,7 +26,7 @@ HOSTED_KERNEL_REQUIREMENTS_PATH = "hosted-kernel-requirements.json"
|
|
|
26
26
|
HOSTED_KERNEL_REQUIREMENTS_FORMAT = "agentkit.hosted-kernel-requirements/v1"
|
|
27
27
|
HOSTED_KERNEL_RUNTIME_CONTRACT = "agentkit.runtime/v1"
|
|
28
28
|
HOSTED_KERNEL_BUNDLE_FORMAT = "agentkit.bundle/v2"
|
|
29
|
-
_RUNTIME_TYPES = frozenset({"adk", "codex", "langgraph"})
|
|
29
|
+
_RUNTIME_TYPES = frozenset({"adk", "codex", "harness", "langgraph"})
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
@dataclass(frozen=True)
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"""Shared immutable Build -> Kernel registry for trusted Studio ingress.
|
|
2
|
+
|
|
3
|
+
One Build owns one RuntimeAdapter factory and one Kernel admission/event log.
|
|
4
|
+
Consumers provide their own session display metadata and trusted permits; this
|
|
5
|
+
module does not own scheduler, conversation, or domain policy.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import hashlib
|
|
12
|
+
from collections.abc import Callable, Mapping
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from uuid import uuid4
|
|
16
|
+
|
|
17
|
+
from ksadk.kernel.bootstrap import (
|
|
18
|
+
AgentKernelRuntime,
|
|
19
|
+
AgentKernelRuntimeConfig,
|
|
20
|
+
build_agent_kernel_runtime,
|
|
21
|
+
)
|
|
22
|
+
from ksadk.kernel.contracts import (
|
|
23
|
+
AgentControlCommand,
|
|
24
|
+
AgentControlPermit,
|
|
25
|
+
AgentControlReceipt,
|
|
26
|
+
)
|
|
27
|
+
from ksadk.runtime import RuntimeAdapter
|
|
28
|
+
from ksadk.sessions.base import BaseSessionService, Session
|
|
29
|
+
from ksadk.sessions.local_service import LocalSessionService
|
|
30
|
+
from ksadk.studio.kernel_sqlite_migration import KernelMigrationError, migrate_legacy_kernel
|
|
31
|
+
from ksadk.studio.run_service import StudioRunSpec
|
|
32
|
+
|
|
33
|
+
ResolveBuild = Callable[[str], StudioRunSpec]
|
|
34
|
+
ResolveAdapterProvider = Callable[[StudioRunSpec], Callable[[], RuntimeAdapter]]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class StudioBuildKernelError(RuntimeError):
|
|
38
|
+
"""Stable failure from the local Build registry."""
|
|
39
|
+
|
|
40
|
+
def __init__(self, code: str, message: str) -> None:
|
|
41
|
+
super().__init__(message)
|
|
42
|
+
self.code = code
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True)
|
|
46
|
+
class StudioBuildRuntimeTarget:
|
|
47
|
+
"""Server-owned immutable Build routing facts."""
|
|
48
|
+
|
|
49
|
+
build_id: str
|
|
50
|
+
agent_id: str
|
|
51
|
+
tenant_id: str
|
|
52
|
+
agent_instance_id: str
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass
|
|
56
|
+
class _RuntimeEntry:
|
|
57
|
+
target: StudioBuildRuntimeTarget
|
|
58
|
+
spec: StudioRunSpec
|
|
59
|
+
runtime: AgentKernelRuntime
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class StudioBuildKernelRegistry:
|
|
63
|
+
"""Own exact per-Build Kernel runtimes for one Studio process.
|
|
64
|
+
|
|
65
|
+
The registry does not register anything in ``ksadk.kernel.ingress`` and
|
|
66
|
+
therefore cannot redirect normal conversations or hosted HTTP traffic.
|
|
67
|
+
Consumers dispatch through :meth:`submit_control`, crossing the frozen
|
|
68
|
+
AgentControl permit/admission boundary.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def __init__(
|
|
72
|
+
self,
|
|
73
|
+
*,
|
|
74
|
+
resolve_build: ResolveBuild,
|
|
75
|
+
resolve_adapter_provider: ResolveAdapterProvider,
|
|
76
|
+
session_service: BaseSessionService,
|
|
77
|
+
runtime_executor: object | None = None,
|
|
78
|
+
state_dir: str | Path | None = None,
|
|
79
|
+
tenant_id: str = "local-studio",
|
|
80
|
+
workspace_id: str = "studio-scheduler",
|
|
81
|
+
poll_interval: float = 0.05,
|
|
82
|
+
lease_ttl_seconds: float = 30.0,
|
|
83
|
+
) -> None:
|
|
84
|
+
self._resolve_build = resolve_build
|
|
85
|
+
self._resolve_adapter_provider = resolve_adapter_provider
|
|
86
|
+
self._session_service = session_service
|
|
87
|
+
self._runtime_executor = runtime_executor
|
|
88
|
+
self._state_dir = Path(state_dir).resolve() if state_dir is not None else None
|
|
89
|
+
self._tenant_id = tenant_id
|
|
90
|
+
self._workspace_id = workspace_id
|
|
91
|
+
self._poll_interval = poll_interval
|
|
92
|
+
self._lease_ttl_seconds = lease_ttl_seconds
|
|
93
|
+
self._owner_id = uuid4().hex
|
|
94
|
+
self._entries_by_build: dict[str, _RuntimeEntry] = {}
|
|
95
|
+
self._build_by_instance: dict[str, str] = {}
|
|
96
|
+
self._lock = asyncio.Lock()
|
|
97
|
+
self._session_lock = asyncio.Lock()
|
|
98
|
+
self._admission_lock = asyncio.Lock()
|
|
99
|
+
self._admission_open = True
|
|
100
|
+
self._started = False
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def started(self) -> bool:
|
|
104
|
+
return self._started
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def active_runtime_count(self) -> int:
|
|
108
|
+
return len(self._entries_by_build)
|
|
109
|
+
|
|
110
|
+
async def unsettled_sessions(self) -> tuple[str, ...]:
|
|
111
|
+
"""Current command/Run facts for a host maintenance admission check."""
|
|
112
|
+
pending: set[str] = set()
|
|
113
|
+
for entry in tuple(self._entries_by_build.values()):
|
|
114
|
+
messages = await entry.runtime.kernel_store.list_messages(
|
|
115
|
+
entry.target.agent_instance_id
|
|
116
|
+
)
|
|
117
|
+
for session_id in {message.session_id for message in messages}:
|
|
118
|
+
active = await entry.runtime.kernel_store.find_active_run(
|
|
119
|
+
entry.target.agent_instance_id, session_id
|
|
120
|
+
)
|
|
121
|
+
if active or any(
|
|
122
|
+
message.session_id == session_id and message.status in {"accepted", "claimed"}
|
|
123
|
+
for message in messages
|
|
124
|
+
):
|
|
125
|
+
pending.add(session_id)
|
|
126
|
+
return tuple(sorted(pending))
|
|
127
|
+
|
|
128
|
+
async def start(self) -> None:
|
|
129
|
+
self._started = True
|
|
130
|
+
|
|
131
|
+
async def set_admission_open(self, enabled: bool) -> None:
|
|
132
|
+
"""Fence new ingress and finish prior admission before maintenance."""
|
|
133
|
+
async with self._admission_lock:
|
|
134
|
+
async with self._lock:
|
|
135
|
+
self._admission_open = enabled
|
|
136
|
+
|
|
137
|
+
async def ensure_build(
|
|
138
|
+
self,
|
|
139
|
+
build_id: str,
|
|
140
|
+
*,
|
|
141
|
+
expected_agent_id: str | None = None,
|
|
142
|
+
) -> StudioBuildRuntimeTarget:
|
|
143
|
+
"""Start or return the exact Runtime owned by one immutable Build."""
|
|
144
|
+
|
|
145
|
+
normalized = str(build_id).strip()
|
|
146
|
+
if not normalized:
|
|
147
|
+
raise self._error(
|
|
148
|
+
"BUILD_REQUIRED",
|
|
149
|
+
"缺少不可变 Build 标识",
|
|
150
|
+
)
|
|
151
|
+
if not self._started:
|
|
152
|
+
raise self._error(
|
|
153
|
+
"RUNTIME_NOT_STARTED",
|
|
154
|
+
"Studio Build Kernel 尚未启动",
|
|
155
|
+
)
|
|
156
|
+
existing = self._entries_by_build.get(normalized)
|
|
157
|
+
if existing is not None:
|
|
158
|
+
self._require_agent(existing.spec, expected_agent_id)
|
|
159
|
+
return existing.target
|
|
160
|
+
|
|
161
|
+
async with self._lock:
|
|
162
|
+
existing = self._entries_by_build.get(normalized)
|
|
163
|
+
if existing is not None:
|
|
164
|
+
self._require_agent(existing.spec, expected_agent_id)
|
|
165
|
+
return existing.target
|
|
166
|
+
if not self._admission_open:
|
|
167
|
+
raise self._error("MAINTENANCE", "插件宿主正在维护,暂不启动新的 Build Kernel")
|
|
168
|
+
try:
|
|
169
|
+
spec = self._resolve_build(normalized)
|
|
170
|
+
except Exception as error:
|
|
171
|
+
raise self._error(
|
|
172
|
+
"BUILD_UNAVAILABLE",
|
|
173
|
+
f"绑定的 Build {normalized!r} 不可用",
|
|
174
|
+
) from error
|
|
175
|
+
if spec.build_id != normalized:
|
|
176
|
+
raise self._error(
|
|
177
|
+
"BUILD_MISMATCH",
|
|
178
|
+
"Build 解析结果与绑定不一致",
|
|
179
|
+
)
|
|
180
|
+
self._require_agent(spec, expected_agent_id)
|
|
181
|
+
try:
|
|
182
|
+
adapter_provider = self._resolve_adapter_provider(spec)
|
|
183
|
+
except Exception as error:
|
|
184
|
+
raise self._error(
|
|
185
|
+
"PROVIDER_UNAVAILABLE",
|
|
186
|
+
f"Build {normalized!r} 的 AgentProvider 不可用",
|
|
187
|
+
) from error
|
|
188
|
+
|
|
189
|
+
# ``build_agent_kernel_runtime`` asks the provider once to snapshot
|
|
190
|
+
# capabilities. Retain that exact adapter for the first worker or
|
|
191
|
+
# recovery acquisition instead of constructing and discarding a
|
|
192
|
+
# resource-owning Codex/Harness adapter during registration.
|
|
193
|
+
retained_first_adapter: RuntimeAdapter | None = None
|
|
194
|
+
first_adapter_borrowed = False
|
|
195
|
+
|
|
196
|
+
def checked_adapter_provider() -> RuntimeAdapter:
|
|
197
|
+
nonlocal retained_first_adapter, first_adapter_borrowed
|
|
198
|
+
if retained_first_adapter is not None and not first_adapter_borrowed:
|
|
199
|
+
first_adapter_borrowed = True
|
|
200
|
+
adapter = retained_first_adapter
|
|
201
|
+
retained_first_adapter = None
|
|
202
|
+
return adapter
|
|
203
|
+
adapter = adapter_provider()
|
|
204
|
+
if not isinstance(adapter, RuntimeAdapter):
|
|
205
|
+
raise self._error(
|
|
206
|
+
"PROVIDER_INVALID",
|
|
207
|
+
"AgentProvider 没有返回 RuntimeAdapter",
|
|
208
|
+
)
|
|
209
|
+
if retained_first_adapter is None and not first_adapter_borrowed:
|
|
210
|
+
retained_first_adapter = adapter
|
|
211
|
+
return adapter
|
|
212
|
+
|
|
213
|
+
instance_id = self._instance_id(normalized)
|
|
214
|
+
kernel_db = (
|
|
215
|
+
self._state_dir / "kernel" / f"{instance_id}.sqlite"
|
|
216
|
+
if self._state_dir is not None
|
|
217
|
+
else None
|
|
218
|
+
)
|
|
219
|
+
if isinstance(self._session_service, LocalSessionService):
|
|
220
|
+
shared_db = self._session_service.db_path
|
|
221
|
+
if kernel_db is not None:
|
|
222
|
+
try:
|
|
223
|
+
await asyncio.to_thread(
|
|
224
|
+
migrate_legacy_kernel, kernel_db, shared_db, instance_id
|
|
225
|
+
)
|
|
226
|
+
except KernelMigrationError as error:
|
|
227
|
+
raise self._error("MIGRATION_REQUIRED", str(error)) from error
|
|
228
|
+
kernel_db = shared_db
|
|
229
|
+
config = AgentKernelRuntimeConfig(
|
|
230
|
+
agent_instance_id=instance_id,
|
|
231
|
+
authority_mode="local",
|
|
232
|
+
driver="sqlite" if kernel_db is not None else "memory",
|
|
233
|
+
durability_tier="durable" if kernel_db is not None else "ephemeral",
|
|
234
|
+
dsn=str(kernel_db) if kernel_db is not None else "",
|
|
235
|
+
adapter_provider=checked_adapter_provider,
|
|
236
|
+
session_service=self._session_service,
|
|
237
|
+
runtime_executor=self._runtime_executor,
|
|
238
|
+
launch_context=spec.launch_context,
|
|
239
|
+
start_request_defaults=self._start_defaults(spec),
|
|
240
|
+
tenant_id=self._tenant_id,
|
|
241
|
+
workspace_id=self._workspace_id,
|
|
242
|
+
poll_interval=self._poll_interval,
|
|
243
|
+
lease_ttl_seconds=self._lease_ttl_seconds,
|
|
244
|
+
activation_id=f"studio-scheduler:{self._owner_id}:{instance_id}",
|
|
245
|
+
runtime_type=spec.launch_context.runtime_type,
|
|
246
|
+
bundle_digest=spec.manifest_sha256 or normalized,
|
|
247
|
+
)
|
|
248
|
+
runtime = build_agent_kernel_runtime(config)
|
|
249
|
+
try:
|
|
250
|
+
await runtime.start()
|
|
251
|
+
except Exception:
|
|
252
|
+
await runtime.close()
|
|
253
|
+
raise
|
|
254
|
+
target = StudioBuildRuntimeTarget(
|
|
255
|
+
build_id=normalized,
|
|
256
|
+
agent_id=spec.agent_id,
|
|
257
|
+
tenant_id=self._tenant_id,
|
|
258
|
+
agent_instance_id=instance_id,
|
|
259
|
+
)
|
|
260
|
+
self._entries_by_build[normalized] = _RuntimeEntry(
|
|
261
|
+
target=target,
|
|
262
|
+
spec=spec,
|
|
263
|
+
runtime=runtime,
|
|
264
|
+
)
|
|
265
|
+
self._build_by_instance[instance_id] = normalized
|
|
266
|
+
return target
|
|
267
|
+
|
|
268
|
+
def runtime_for_build(self, build_id: str) -> AgentKernelRuntime:
|
|
269
|
+
entry = self._entries_by_build.get(str(build_id))
|
|
270
|
+
if entry is None:
|
|
271
|
+
raise self._error(
|
|
272
|
+
"TARGET_UNAVAILABLE",
|
|
273
|
+
"目标 Build Kernel 未注册",
|
|
274
|
+
)
|
|
275
|
+
return entry.runtime
|
|
276
|
+
|
|
277
|
+
def spec_for_build(self, build_id: str) -> StudioRunSpec:
|
|
278
|
+
"""Return the exact spec already pinned by :meth:`ensure_build`."""
|
|
279
|
+
|
|
280
|
+
entry = self._entries_by_build.get(str(build_id))
|
|
281
|
+
if entry is None:
|
|
282
|
+
raise self._error("TARGET_UNAVAILABLE", "目标 Build Kernel 未注册")
|
|
283
|
+
return entry.spec
|
|
284
|
+
|
|
285
|
+
async def ensure_session(
|
|
286
|
+
self,
|
|
287
|
+
build_id: str,
|
|
288
|
+
session_id: str,
|
|
289
|
+
owner_subject: str,
|
|
290
|
+
*,
|
|
291
|
+
title: str | None = None,
|
|
292
|
+
metadata: Mapping[str, str | None] | None = None,
|
|
293
|
+
) -> Session:
|
|
294
|
+
"""Create a session or verify its owner and Agent without retitling it.
|
|
295
|
+
|
|
296
|
+
Metadata is limited to display fields. It never authorizes execution;
|
|
297
|
+
callers still pass a trusted AgentControl permit to submit_control.
|
|
298
|
+
"""
|
|
299
|
+
|
|
300
|
+
if not session_id or not owner_subject:
|
|
301
|
+
raise self._error("SESSION_IDENTITY_REQUIRED", "会话与所有者标识不能为空")
|
|
302
|
+
display = dict(metadata or {})
|
|
303
|
+
allowed = {"title_source", "summary", "first_prompt", "last_prompt"}
|
|
304
|
+
if (
|
|
305
|
+
set(display) - allowed
|
|
306
|
+
or any(value is not None and not isinstance(value, str) for value in display.values())
|
|
307
|
+
or (title is not None and not isinstance(title, str))
|
|
308
|
+
):
|
|
309
|
+
raise self._error("SESSION_METADATA_INVALID", "会话 metadata 只接受展示字段")
|
|
310
|
+
target = await self.ensure_build(build_id)
|
|
311
|
+
async with self._session_lock:
|
|
312
|
+
session = await self._session_service.get_session_metadata(session_id)
|
|
313
|
+
created = session is None
|
|
314
|
+
if session is None:
|
|
315
|
+
session = await self._session_service.create_session(
|
|
316
|
+
agent_id=target.agent_id,
|
|
317
|
+
user_id=owner_subject,
|
|
318
|
+
session_id=session_id,
|
|
319
|
+
)
|
|
320
|
+
# create_session may return an existing record after an external
|
|
321
|
+
# create race, so fence its result as well as the initial lookup.
|
|
322
|
+
if session.user_id != owner_subject or session.agent_id != target.agent_id:
|
|
323
|
+
raise self._error("SESSION_OWNER_MISMATCH", "会话不属于当前所有者和 Agent")
|
|
324
|
+
if created and (title is not None or display):
|
|
325
|
+
session = await self._session_service.update_session_metadata(
|
|
326
|
+
session_id,
|
|
327
|
+
title=title,
|
|
328
|
+
**display,
|
|
329
|
+
)
|
|
330
|
+
return session
|
|
331
|
+
|
|
332
|
+
async def submit_control(
|
|
333
|
+
self,
|
|
334
|
+
command: AgentControlCommand,
|
|
335
|
+
permit: AgentControlPermit,
|
|
336
|
+
) -> AgentControlReceipt:
|
|
337
|
+
"""Submit to the pinned Kernel; no scheduler/session metadata is inferred."""
|
|
338
|
+
|
|
339
|
+
async with self._admission_lock:
|
|
340
|
+
if not self._admission_open:
|
|
341
|
+
raise self._error("MAINTENANCE", "插件宿主正在维护,暂不接受新执行")
|
|
342
|
+
return await self._submit_control(command, permit)
|
|
343
|
+
|
|
344
|
+
async def _submit_control(
|
|
345
|
+
self, command: AgentControlCommand, permit: AgentControlPermit
|
|
346
|
+
) -> AgentControlReceipt:
|
|
347
|
+
|
|
348
|
+
entry = self._entry_for_instance(command.agent_instance_id)
|
|
349
|
+
if command.tenant_id != entry.target.tenant_id:
|
|
350
|
+
raise self._error("TARGET_MISMATCH", "AgentControl tenant 与 Build Kernel 不一致")
|
|
351
|
+
session = await self._session_service.get_session_metadata(command.session_id)
|
|
352
|
+
if session is None or session.agent_id != entry.target.agent_id:
|
|
353
|
+
raise self._error("SESSION_UNAVAILABLE", "Build Kernel 会话尚未注册或 Agent 不匹配")
|
|
354
|
+
return await entry.runtime.kernel.submit(command, permit=permit)
|
|
355
|
+
|
|
356
|
+
@classmethod
|
|
357
|
+
def _error(cls, code: str, message: str) -> StudioBuildKernelError:
|
|
358
|
+
return StudioBuildKernelError(f"STUDIO_KERNEL_{code}", message)
|
|
359
|
+
|
|
360
|
+
async def close(self) -> None:
|
|
361
|
+
async with self._lock:
|
|
362
|
+
entries = list(self._entries_by_build.values())
|
|
363
|
+
self._entries_by_build.clear()
|
|
364
|
+
self._build_by_instance.clear()
|
|
365
|
+
self._started = False
|
|
366
|
+
first_error: BaseException | None = None
|
|
367
|
+
for entry in reversed(entries):
|
|
368
|
+
try:
|
|
369
|
+
await entry.runtime.close()
|
|
370
|
+
except BaseException as error: # cleanup must continue for other Builds
|
|
371
|
+
if first_error is None:
|
|
372
|
+
first_error = error
|
|
373
|
+
if first_error is not None:
|
|
374
|
+
raise first_error
|
|
375
|
+
|
|
376
|
+
def _entry_for_instance(self, instance_id: str) -> _RuntimeEntry:
|
|
377
|
+
build_id = self._build_by_instance.get(str(instance_id))
|
|
378
|
+
entry = self._entries_by_build.get(build_id or "")
|
|
379
|
+
if entry is None:
|
|
380
|
+
raise self._error(
|
|
381
|
+
"TARGET_UNAVAILABLE",
|
|
382
|
+
"目标 Build Kernel 未注册",
|
|
383
|
+
)
|
|
384
|
+
return entry
|
|
385
|
+
|
|
386
|
+
def _instance_id(self, build_id: str) -> str:
|
|
387
|
+
digest = hashlib.sha256(build_id.encode("utf-8")).hexdigest()[:24]
|
|
388
|
+
# Preserve existing Scheduler SQLite/AgentInstance identities when
|
|
389
|
+
# its registry is shared by additional trusted Studio consumers.
|
|
390
|
+
return f"studio-schedule-{digest}"
|
|
391
|
+
|
|
392
|
+
@classmethod
|
|
393
|
+
def _require_agent(cls, spec: StudioRunSpec, expected_agent_id: str | None) -> None:
|
|
394
|
+
if expected_agent_id and spec.agent_id != expected_agent_id:
|
|
395
|
+
raise cls._error(
|
|
396
|
+
"AGENT_MISMATCH",
|
|
397
|
+
"Agent 与不可变 Build 不一致",
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
@staticmethod
|
|
401
|
+
def _start_defaults(spec: StudioRunSpec) -> dict[str, object]:
|
|
402
|
+
defaults: dict[str, object] = {
|
|
403
|
+
"agent_id": spec.agent_id,
|
|
404
|
+
"config": dict(spec.request_config),
|
|
405
|
+
}
|
|
406
|
+
if spec.model:
|
|
407
|
+
defaults["model"] = spec.model
|
|
408
|
+
defaults["allowed_models"] = [spec.model]
|
|
409
|
+
return defaults
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
__all__ = [
|
|
413
|
+
"ResolveAdapterProvider",
|
|
414
|
+
"ResolveBuild",
|
|
415
|
+
"StudioBuildKernelError",
|
|
416
|
+
"StudioBuildKernelRegistry",
|
|
417
|
+
"StudioBuildRuntimeTarget",
|
|
418
|
+
]
|