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,106 @@
|
|
|
1
|
+
"""LangGraph 图状态读取的唯一入口。
|
|
2
|
+
|
|
3
|
+
审批探测(goal-18)、checkpoint 元数据、usage 提取、可恢复性校验共用同一套
|
|
4
|
+
读取与 interrupt 解析逻辑;除本模块外不得直接调用 ``aget_state``/``get_state``。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import inspect
|
|
10
|
+
import logging
|
|
11
|
+
from collections.abc import Mapping
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
_MAX_NESTED_DEPTH = 4
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def graph_state_reader(agent: Any) -> Any | None:
|
|
20
|
+
"""返回该图的 state 读取函数(async 优先),没有则 None。"""
|
|
21
|
+
return getattr(agent, "aget_state", None) or getattr(agent, "get_state", None)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
async def read_graph_state(
|
|
25
|
+
agent: Any,
|
|
26
|
+
config: Mapping[str, Any],
|
|
27
|
+
*,
|
|
28
|
+
include_subgraphs: bool = False,
|
|
29
|
+
) -> tuple[Any | None, Exception | None]:
|
|
30
|
+
"""统一的图状态读取入口。
|
|
31
|
+
|
|
32
|
+
返回 ``(state, error)``;读取失败时 ``error`` 非 None。调用方按语义决定后续:
|
|
33
|
+
usage / metadata / 可恢复性这类旁路读取可以降级;审批判定必须显性失败。
|
|
34
|
+
任何情况下都不静默吞掉异常——至少留一条 warning 日志。
|
|
35
|
+
|
|
36
|
+
``include_subgraphs=True`` 会把子图状态一并取回,供 interrupt 探测遍历嵌套暂停点。
|
|
37
|
+
"""
|
|
38
|
+
reader = graph_state_reader(agent)
|
|
39
|
+
if reader is None:
|
|
40
|
+
return None, None
|
|
41
|
+
try:
|
|
42
|
+
if include_subgraphs:
|
|
43
|
+
try:
|
|
44
|
+
state = reader(config, subgraphs=True)
|
|
45
|
+
except TypeError:
|
|
46
|
+
# 老版本 graph 不接受 subgraphs 关键字。
|
|
47
|
+
state = reader(config)
|
|
48
|
+
else:
|
|
49
|
+
state = reader(config)
|
|
50
|
+
if inspect.isawaitable(state):
|
|
51
|
+
state = await state
|
|
52
|
+
except Exception as exc:
|
|
53
|
+
logger.warning("LangGraph state read failed: %r", exc)
|
|
54
|
+
return None, exc
|
|
55
|
+
return state, None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def interrupt_info_from_state(state: Any, *, _depth: int = 0) -> dict:
|
|
59
|
+
"""从 state 中获取 interrupt 信息(含子图嵌套任务)"""
|
|
60
|
+
if state is None or _depth > _MAX_NESTED_DEPTH:
|
|
61
|
+
return {}
|
|
62
|
+
tasks = getattr(state, "tasks", None)
|
|
63
|
+
for task in tasks or ():
|
|
64
|
+
interrupts = getattr(task, "interrupts", None)
|
|
65
|
+
for intr in interrupts or ():
|
|
66
|
+
if hasattr(intr, "value"):
|
|
67
|
+
return _interrupt_info_from_value(intr)
|
|
68
|
+
# subgraphs=True 时子图快照挂在 task.state 上,递归下钻。
|
|
69
|
+
nested = getattr(task, "state", None)
|
|
70
|
+
if nested is not None:
|
|
71
|
+
info = interrupt_info_from_state(nested, _depth=_depth + 1)
|
|
72
|
+
if info:
|
|
73
|
+
return info
|
|
74
|
+
return {}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _interrupt_info_from_value(intr: Any) -> dict:
|
|
78
|
+
value = intr.value
|
|
79
|
+
info = dict(value) if isinstance(value, Mapping) else {"value": value}
|
|
80
|
+
interrupt_id = str(getattr(intr, "id", "") or "")
|
|
81
|
+
if interrupt_id:
|
|
82
|
+
info.setdefault("approval_request_id", interrupt_id)
|
|
83
|
+
# HumanInTheLoopMiddleware 的 interrupt value 把 tool_name/arguments 嵌在
|
|
84
|
+
# action_requests[0] 里;下游期望顶层字段,这里提取并保留原 action_requests。
|
|
85
|
+
action_requests = info.get("action_requests")
|
|
86
|
+
if isinstance(action_requests, list) and action_requests:
|
|
87
|
+
first = action_requests[0]
|
|
88
|
+
if isinstance(first, Mapping):
|
|
89
|
+
info.setdefault("tool_name", str(first.get("name") or ""))
|
|
90
|
+
raw_args = first.get("args") or first.get("arguments")
|
|
91
|
+
if raw_args is not None:
|
|
92
|
+
info.setdefault("arguments", raw_args)
|
|
93
|
+
if first.get("description") is not None:
|
|
94
|
+
info.setdefault("description", str(first.get("description")))
|
|
95
|
+
return info
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def known_subgraph_namespaces(agent: Any) -> set[str]:
|
|
99
|
+
"""当前图里真实存在的子图 namespace 集合(无法探测时返回空集)。"""
|
|
100
|
+
get_subgraphs = getattr(agent, "get_subgraphs", None)
|
|
101
|
+
if not callable(get_subgraphs):
|
|
102
|
+
return set()
|
|
103
|
+
try:
|
|
104
|
+
return {str(ns) for ns, _ in get_subgraphs()}
|
|
105
|
+
except Exception:
|
|
106
|
+
return set()
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"""Framework-native session bindings for verified platform identities."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import inspect
|
|
7
|
+
from collections.abc import Mapping
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from ksadk.runtime_context import get_current_invocation_context
|
|
11
|
+
from ksadk.sessions import resolve_session_service
|
|
12
|
+
from ksadk.sessions.continuity import ConversationSessionCore
|
|
13
|
+
from ksadk.sessions.invocation_identity import (
|
|
14
|
+
identity_native_user_id,
|
|
15
|
+
identity_scope_ref,
|
|
16
|
+
identity_session_is_legacy,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ADKSessionIdentityMixin:
|
|
21
|
+
"""Bind canonical sessions to ADK's native ``user_id`` and session id."""
|
|
22
|
+
|
|
23
|
+
def _invocation_session_owner(self) -> tuple[str, str]:
|
|
24
|
+
context = get_current_invocation_context()
|
|
25
|
+
if context is None or context.identity.is_empty:
|
|
26
|
+
return "ksadk_user", ""
|
|
27
|
+
if not context.identity.is_complete:
|
|
28
|
+
raise ValueError("Incomplete trusted business identity context")
|
|
29
|
+
return (
|
|
30
|
+
str(context.user_id or identity_native_user_id(context.identity)),
|
|
31
|
+
identity_scope_ref(context.identity),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def _invocation_uses_legacy_session(native_user_id: str) -> bool:
|
|
36
|
+
context = get_current_invocation_context()
|
|
37
|
+
if context is None or context.identity.is_empty or not context.identity.is_complete:
|
|
38
|
+
return False
|
|
39
|
+
return identity_session_is_legacy(context.identity, native_user_id)
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _session_cache_key(external_session_id: str, owner_scope_ref: str) -> str:
|
|
43
|
+
return (
|
|
44
|
+
f"{owner_scope_ref}:{external_session_id}" if owner_scope_ref else external_session_id
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
async def _get_adk_session(self, *, user_id: str, session_id: str) -> Any | None:
|
|
48
|
+
if self._session_service is None or not session_id:
|
|
49
|
+
return None
|
|
50
|
+
try:
|
|
51
|
+
return await self._session_service.get_session(
|
|
52
|
+
app_name=self._agent.name,
|
|
53
|
+
user_id=user_id,
|
|
54
|
+
session_id=session_id,
|
|
55
|
+
)
|
|
56
|
+
except Exception:
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
async def _create_adk_session(
|
|
60
|
+
self,
|
|
61
|
+
*,
|
|
62
|
+
user_id: str,
|
|
63
|
+
session_id: str = "",
|
|
64
|
+
preserve_requested_id: bool = False,
|
|
65
|
+
) -> Any:
|
|
66
|
+
if self._short_term_memory:
|
|
67
|
+
session = await self._short_term_memory.create_session(
|
|
68
|
+
app_name=self._agent.name,
|
|
69
|
+
user_id=user_id,
|
|
70
|
+
session_id=session_id,
|
|
71
|
+
)
|
|
72
|
+
else:
|
|
73
|
+
if self._session_service is None:
|
|
74
|
+
raise RuntimeError("ADK session service is not initialized")
|
|
75
|
+
create_kwargs: dict[str, Any] = {
|
|
76
|
+
"app_name": self._agent.name,
|
|
77
|
+
"user_id": user_id,
|
|
78
|
+
}
|
|
79
|
+
if session_id and preserve_requested_id:
|
|
80
|
+
create_kwargs["session_id"] = session_id
|
|
81
|
+
try:
|
|
82
|
+
session = await self._session_service.create_session(**create_kwargs)
|
|
83
|
+
except TypeError:
|
|
84
|
+
# Older ADK in-memory services did not accept session_id.
|
|
85
|
+
create_kwargs.pop("session_id", None)
|
|
86
|
+
session = await self._session_service.create_session(**create_kwargs)
|
|
87
|
+
if session is None:
|
|
88
|
+
raise RuntimeError("Failed to create ADK session")
|
|
89
|
+
return session
|
|
90
|
+
|
|
91
|
+
async def _ensure_session(self, external_session_id: str | None = None) -> str:
|
|
92
|
+
native_user_id, owner_scope_ref = self._invocation_session_owner()
|
|
93
|
+
if external_session_id:
|
|
94
|
+
cache_key = self._session_cache_key(external_session_id, owner_scope_ref)
|
|
95
|
+
if cache_key in self._session_map:
|
|
96
|
+
return self._session_map[cache_key]
|
|
97
|
+
|
|
98
|
+
core = ConversationSessionCore(resolve_session_service())
|
|
99
|
+
binding = await core.get_binding_by_session_id(external_session_id, "adk")
|
|
100
|
+
bound_scope_ref = str(binding.get("owner_scope_ref") or "")
|
|
101
|
+
if bound_scope_ref and bound_scope_ref != owner_scope_ref:
|
|
102
|
+
raise ValueError("ADK session belongs to a different business identity")
|
|
103
|
+
|
|
104
|
+
internal_session_id = str(binding.get("internal_session_id") or "")
|
|
105
|
+
bound_user_id = str(binding.get("native_user_id") or "")
|
|
106
|
+
if binding:
|
|
107
|
+
native_user_id = bound_user_id or "ksadk_user"
|
|
108
|
+
elif owner_scope_ref and self._invocation_uses_legacy_session(native_user_id):
|
|
109
|
+
# Canonical preprocessing has already proved that this exact
|
|
110
|
+
# platform session is an authorized legacy row.
|
|
111
|
+
legacy_session = await self._get_adk_session(
|
|
112
|
+
user_id="ksadk_user",
|
|
113
|
+
session_id=external_session_id,
|
|
114
|
+
)
|
|
115
|
+
if legacy_session is not None:
|
|
116
|
+
native_user_id = "ksadk_user"
|
|
117
|
+
internal_session_id = str(legacy_session.id)
|
|
118
|
+
|
|
119
|
+
session = None
|
|
120
|
+
if internal_session_id:
|
|
121
|
+
session = await self._get_adk_session(
|
|
122
|
+
user_id=native_user_id,
|
|
123
|
+
session_id=internal_session_id,
|
|
124
|
+
)
|
|
125
|
+
if session is None:
|
|
126
|
+
session = await self._create_adk_session(
|
|
127
|
+
user_id=native_user_id,
|
|
128
|
+
session_id=internal_session_id or external_session_id,
|
|
129
|
+
preserve_requested_id=bool(owner_scope_ref or internal_session_id),
|
|
130
|
+
)
|
|
131
|
+
internal_session_id = str(session.id)
|
|
132
|
+
self._session_map[cache_key] = internal_session_id
|
|
133
|
+
self._session_user_map[cache_key] = native_user_id
|
|
134
|
+
await core.set_binding_by_session_id(
|
|
135
|
+
external_session_id,
|
|
136
|
+
"adk",
|
|
137
|
+
{
|
|
138
|
+
"external_session_id": str(external_session_id),
|
|
139
|
+
"internal_session_id": internal_session_id,
|
|
140
|
+
"native_user_id": native_user_id,
|
|
141
|
+
"owner_scope_ref": owner_scope_ref,
|
|
142
|
+
},
|
|
143
|
+
)
|
|
144
|
+
return internal_session_id
|
|
145
|
+
|
|
146
|
+
# Identity-aware requests normally receive a canonical external id
|
|
147
|
+
# before reaching a runner. Keep this fallback isolated as well.
|
|
148
|
+
if owner_scope_ref:
|
|
149
|
+
cache_key = self._session_cache_key("__default__", owner_scope_ref)
|
|
150
|
+
if cache_key not in self._session_map:
|
|
151
|
+
session = await self._create_adk_session(user_id=native_user_id)
|
|
152
|
+
self._session_map[cache_key] = str(session.id)
|
|
153
|
+
self._session_user_map[cache_key] = native_user_id
|
|
154
|
+
return self._session_map[cache_key]
|
|
155
|
+
|
|
156
|
+
if self._default_session_id is None:
|
|
157
|
+
session = await self._create_adk_session(user_id=native_user_id)
|
|
158
|
+
self._default_session_id = session.id
|
|
159
|
+
return str(self._default_session_id)
|
|
160
|
+
|
|
161
|
+
def _native_user_for_session(self, external_session_id: str | None) -> str:
|
|
162
|
+
native_user_id, owner_scope_ref = self._invocation_session_owner()
|
|
163
|
+
if not external_session_id:
|
|
164
|
+
return native_user_id
|
|
165
|
+
cache_key = self._session_cache_key(str(external_session_id), owner_scope_ref)
|
|
166
|
+
return self._session_user_map.get(cache_key, native_user_id)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class LangGraphSessionIdentityMixin:
|
|
170
|
+
"""Bind canonical sessions to LangGraph thread/checkpoint addresses."""
|
|
171
|
+
|
|
172
|
+
def _invocation_identity_scope_ref(self) -> str:
|
|
173
|
+
context = get_current_invocation_context()
|
|
174
|
+
if context is None or context.identity.is_empty:
|
|
175
|
+
return ""
|
|
176
|
+
if not context.identity.is_complete:
|
|
177
|
+
raise ValueError("Incomplete trusted business identity context")
|
|
178
|
+
return identity_scope_ref(context.identity)
|
|
179
|
+
|
|
180
|
+
@staticmethod
|
|
181
|
+
def _invocation_uses_legacy_session() -> bool:
|
|
182
|
+
context = get_current_invocation_context()
|
|
183
|
+
if context is None or context.identity.is_empty or not context.identity.is_complete:
|
|
184
|
+
return False
|
|
185
|
+
return identity_session_is_legacy(context.identity, context.user_id)
|
|
186
|
+
|
|
187
|
+
@staticmethod
|
|
188
|
+
def _invocation_agent_scope_ref() -> str:
|
|
189
|
+
context = get_current_invocation_context()
|
|
190
|
+
if context is None:
|
|
191
|
+
return ""
|
|
192
|
+
return str(getattr(context, "agent_id", "") or "")
|
|
193
|
+
|
|
194
|
+
@classmethod
|
|
195
|
+
def _identity_thread_id(
|
|
196
|
+
cls, session_id: str, owner_scope_ref: str, agent_scope_ref: str = ""
|
|
197
|
+
) -> str:
|
|
198
|
+
# 隔离口径:业务身份 + agent + 外部 session 共同决定 thread。
|
|
199
|
+
# agent 必须参与哈希——共享 checkpoint 库下,同租户的不同 agent 若复用
|
|
200
|
+
# 同一个 external_session_id,缺 agent 维度会落到同一个 thread 互相覆盖。
|
|
201
|
+
digest = hashlib.sha256(
|
|
202
|
+
f"{owner_scope_ref}\0{agent_scope_ref}\0{session_id}".encode()
|
|
203
|
+
).hexdigest()
|
|
204
|
+
return f"lgt_{digest}"
|
|
205
|
+
|
|
206
|
+
async def _thread_has_checkpoint(self, thread_id: str) -> bool:
|
|
207
|
+
get_state = getattr(self._agent, "aget_state", None) or getattr(
|
|
208
|
+
self._agent, "get_state", None
|
|
209
|
+
)
|
|
210
|
+
if not callable(get_state):
|
|
211
|
+
return False
|
|
212
|
+
try:
|
|
213
|
+
state = get_state(self._get_config(thread_id))
|
|
214
|
+
if inspect.isawaitable(state):
|
|
215
|
+
state = await state
|
|
216
|
+
except Exception:
|
|
217
|
+
return False
|
|
218
|
+
config = (
|
|
219
|
+
state.get("config") if isinstance(state, Mapping) else getattr(state, "config", None)
|
|
220
|
+
)
|
|
221
|
+
values = (
|
|
222
|
+
state.get("values") if isinstance(state, Mapping) else getattr(state, "values", None)
|
|
223
|
+
)
|
|
224
|
+
metadata = (
|
|
225
|
+
state.get("metadata")
|
|
226
|
+
if isinstance(state, Mapping)
|
|
227
|
+
else getattr(state, "metadata", None)
|
|
228
|
+
)
|
|
229
|
+
created_at = (
|
|
230
|
+
state.get("created_at")
|
|
231
|
+
if isinstance(state, Mapping)
|
|
232
|
+
else getattr(state, "created_at", None)
|
|
233
|
+
)
|
|
234
|
+
if values or metadata or created_at:
|
|
235
|
+
return True
|
|
236
|
+
configurable = config.get("configurable") if isinstance(config, Mapping) else None
|
|
237
|
+
return bool(
|
|
238
|
+
isinstance(configurable, Mapping)
|
|
239
|
+
and str(configurable.get("checkpoint_id") or "").strip()
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
async def _get_session_config(self, session_id: str) -> dict[str, Any]:
|
|
243
|
+
owner_scope_ref = self._invocation_identity_scope_ref()
|
|
244
|
+
if not owner_scope_ref:
|
|
245
|
+
return self._get_config(session_id)
|
|
246
|
+
|
|
247
|
+
cache_key = f"{owner_scope_ref}:{session_id}"
|
|
248
|
+
cached = self._identity_thread_bindings.get(cache_key)
|
|
249
|
+
if cached:
|
|
250
|
+
return self._get_config(cached)
|
|
251
|
+
|
|
252
|
+
async with self._identity_thread_lock:
|
|
253
|
+
cached = self._identity_thread_bindings.get(cache_key)
|
|
254
|
+
if cached:
|
|
255
|
+
return self._get_config(cached)
|
|
256
|
+
|
|
257
|
+
core = ConversationSessionCore(resolve_session_service())
|
|
258
|
+
binding = await core.get_binding_by_session_id(session_id, "langgraph")
|
|
259
|
+
bound_scope_ref = str(binding.get("owner_scope_ref") or "")
|
|
260
|
+
if bound_scope_ref and bound_scope_ref != owner_scope_ref:
|
|
261
|
+
raise ValueError("LangGraph session belongs to a different business identity")
|
|
262
|
+
|
|
263
|
+
thread_id = str(binding.get("thread_id") or "")
|
|
264
|
+
if not thread_id:
|
|
265
|
+
thread_id = self._identity_thread_id(
|
|
266
|
+
session_id,
|
|
267
|
+
owner_scope_ref,
|
|
268
|
+
self._invocation_agent_scope_ref(),
|
|
269
|
+
)
|
|
270
|
+
if self._invocation_uses_legacy_session() and await self._thread_has_checkpoint(
|
|
271
|
+
session_id
|
|
272
|
+
):
|
|
273
|
+
thread_id = session_id
|
|
274
|
+
|
|
275
|
+
await core.set_binding_by_session_id(
|
|
276
|
+
session_id,
|
|
277
|
+
"langgraph",
|
|
278
|
+
{
|
|
279
|
+
"external_session_id": session_id,
|
|
280
|
+
"thread_id": thread_id,
|
|
281
|
+
"owner_scope_ref": owner_scope_ref,
|
|
282
|
+
},
|
|
283
|
+
)
|
|
284
|
+
self._identity_thread_bindings[cache_key] = thread_id
|
|
285
|
+
return self._get_config(thread_id)
|
ksadk/runners/adk_runner.py
CHANGED
|
@@ -21,6 +21,7 @@ from opentelemetry import trace
|
|
|
21
21
|
from ksadk.compat.adk_compat import genai_types as types
|
|
22
22
|
from ksadk.conversations.attachments import classify_attachment_kind, read_attachment_uri_bytes
|
|
23
23
|
from ksadk.conversations.model_context import supports_native_image_input
|
|
24
|
+
from ksadk.runners._session_identity import ADKSessionIdentityMixin
|
|
24
25
|
from ksadk.runners.base_runner import BaseRunner
|
|
25
26
|
from ksadk.runners.usage_accumulator import accumulate_usage
|
|
26
27
|
from ksadk.runners.utils import load_agent_module
|
|
@@ -45,7 +46,7 @@ def _part_metadata_flag(part: Any, key: str) -> bool:
|
|
|
45
46
|
return False
|
|
46
47
|
|
|
47
48
|
|
|
48
|
-
class ADKRunner(BaseRunner):
|
|
49
|
+
class ADKRunner(ADKSessionIdentityMixin, BaseRunner):
|
|
49
50
|
"""ADK 框架运行时"""
|
|
50
51
|
|
|
51
52
|
def __init__(self, detection_result: Any, project_dir: str):
|
|
@@ -54,6 +55,7 @@ class ADKRunner(BaseRunner):
|
|
|
54
55
|
self._session_service: Any = None
|
|
55
56
|
# Map external session_ids (e.g. from run_interactive or web) to ADK internal session IDs
|
|
56
57
|
self._session_map: Dict[str, str] = {}
|
|
58
|
+
self._session_user_map: Dict[str, str] = {}
|
|
57
59
|
# Fallback default session
|
|
58
60
|
self._default_session_id: Optional[str] = None
|
|
59
61
|
# Memory integration
|
|
@@ -304,9 +306,7 @@ class ADKRunner(BaseRunner):
|
|
|
304
306
|
if self._short_term_memory is None:
|
|
305
307
|
self._short_term_memory = self._init_short_term_memory()
|
|
306
308
|
if self._short_term_memory is not None and self._session_service is None:
|
|
307
|
-
self._session_service = getattr(
|
|
308
|
-
self._short_term_memory, "session_service", None
|
|
309
|
-
)
|
|
309
|
+
self._session_service = getattr(self._short_term_memory, "session_service", None)
|
|
310
310
|
resumable = self._resolve_resumability()
|
|
311
311
|
self._resume_disabled_reason = None
|
|
312
312
|
self._resume_disabled_reason_code = None
|
|
@@ -645,7 +645,7 @@ class ADKRunner(BaseRunner):
|
|
|
645
645
|
|
|
646
646
|
agent_name = self._agent.name if self._agent else "default"
|
|
647
647
|
ltm = LongTermMemory.from_env(app_name=agent_name)
|
|
648
|
-
logger.info(f"LongTermMemory initialized: backend={backend},
|
|
648
|
+
logger.info(f"LongTermMemory initialized: backend={backend}, app_name={agent_name}")
|
|
649
649
|
return ltm
|
|
650
650
|
except Exception as e:
|
|
651
651
|
logger.warning(f"Failed to init LongTermMemory: {e}.")
|
|
@@ -669,7 +669,7 @@ class ADKRunner(BaseRunner):
|
|
|
669
669
|
|
|
670
670
|
kb = KnowledgeBaseClient.from_env()
|
|
671
671
|
logger.info(
|
|
672
|
-
f"KnowledgeBase initialized: dataset_id={kb.dataset_id},
|
|
672
|
+
f"KnowledgeBase initialized: dataset_id={kb.dataset_id}, region={kb.region}"
|
|
673
673
|
)
|
|
674
674
|
return kb
|
|
675
675
|
except ImportError:
|
|
@@ -1197,49 +1197,6 @@ class ADKRunner(BaseRunner):
|
|
|
1197
1197
|
|
|
1198
1198
|
return prepare_trace_metadata(detection_result=getattr(self, "detection_result", None))
|
|
1199
1199
|
|
|
1200
|
-
async def _ensure_session(self, external_session_id: Optional[str] = None) -> str:
|
|
1201
|
-
"""Get or create ADK session ID based on external ID
|
|
1202
|
-
|
|
1203
|
-
When ShortTermMemory is configured, uses its create_session method
|
|
1204
|
-
which supports session retrieval (if session_id already exists).
|
|
1205
|
-
"""
|
|
1206
|
-
# Case 1: External ID provided
|
|
1207
|
-
if external_session_id:
|
|
1208
|
-
if external_session_id in self._session_map:
|
|
1209
|
-
return self._session_map[external_session_id]
|
|
1210
|
-
|
|
1211
|
-
# Create new ADK session and map it
|
|
1212
|
-
if self._short_term_memory:
|
|
1213
|
-
session = await self._short_term_memory.create_session(
|
|
1214
|
-
app_name=self._agent.name,
|
|
1215
|
-
user_id="ksadk_user",
|
|
1216
|
-
session_id=external_session_id,
|
|
1217
|
-
)
|
|
1218
|
-
else:
|
|
1219
|
-
if self._session_service is None:
|
|
1220
|
-
raise RuntimeError("ADK session service is not initialized")
|
|
1221
|
-
session = await self._session_service.create_session(
|
|
1222
|
-
app_name=self._agent.name, user_id="ksadk_user"
|
|
1223
|
-
)
|
|
1224
|
-
self._session_map[external_session_id] = session.id
|
|
1225
|
-
return str(session.id)
|
|
1226
|
-
|
|
1227
|
-
# Case 2: No external ID (use default singleton)
|
|
1228
|
-
if self._default_session_id is None:
|
|
1229
|
-
if self._short_term_memory:
|
|
1230
|
-
session = await self._short_term_memory.create_session(
|
|
1231
|
-
app_name=self._agent.name,
|
|
1232
|
-
user_id="ksadk_user",
|
|
1233
|
-
)
|
|
1234
|
-
else:
|
|
1235
|
-
if self._session_service is None:
|
|
1236
|
-
raise RuntimeError("ADK session service is not initialized")
|
|
1237
|
-
session = await self._session_service.create_session(
|
|
1238
|
-
app_name=self._agent.name, user_id="ksadk_user"
|
|
1239
|
-
)
|
|
1240
|
-
self._default_session_id = session.id
|
|
1241
|
-
return str(self._default_session_id)
|
|
1242
|
-
|
|
1243
1200
|
async def save_session_to_long_term_memory(
|
|
1244
1201
|
self, session_id: str, user_id: str = "ksadk_user"
|
|
1245
1202
|
) -> bool:
|
|
@@ -1482,7 +1439,7 @@ class ADKRunner(BaseRunner):
|
|
|
1482
1439
|
return max_seq
|
|
1483
1440
|
except Exception as exc:
|
|
1484
1441
|
logger.warning(
|
|
1485
|
-
"ADKRunner: failed to query max checkpoint_seq
|
|
1442
|
+
"ADKRunner: failed to query max checkpoint_seq for run_id=%s: %s",
|
|
1486
1443
|
run_id,
|
|
1487
1444
|
exc,
|
|
1488
1445
|
)
|
|
@@ -1589,8 +1546,14 @@ class ADKRunner(BaseRunner):
|
|
|
1589
1546
|
session_id,
|
|
1590
1547
|
"adk",
|
|
1591
1548
|
{
|
|
1592
|
-
"external_session_id": str(
|
|
1593
|
-
|
|
1549
|
+
"external_session_id": str(
|
|
1550
|
+
binding.get("external_session_id") or session_id
|
|
1551
|
+
),
|
|
1552
|
+
"internal_session_id": str(
|
|
1553
|
+
binding.get("internal_session_id") or session_id
|
|
1554
|
+
),
|
|
1555
|
+
"native_user_id": str(binding.get("native_user_id") or "ksadk_user"),
|
|
1556
|
+
"owner_scope_ref": str(binding.get("owner_scope_ref") or ""),
|
|
1594
1557
|
"invocation_map": invocation_map,
|
|
1595
1558
|
},
|
|
1596
1559
|
)
|
|
@@ -1752,7 +1715,7 @@ class ADKRunner(BaseRunner):
|
|
|
1752
1715
|
metadata=metadata,
|
|
1753
1716
|
)
|
|
1754
1717
|
logger.debug(
|
|
1755
|
-
"ADKRunner: wrote checkpoint adk-ckpt-%d at boundary
|
|
1718
|
+
"ADKRunner: wrote checkpoint adk-ckpt-%d at boundary (session=%s, invocation_id=%s)",
|
|
1756
1719
|
checkpoint_seq,
|
|
1757
1720
|
session_id,
|
|
1758
1721
|
adk_invocation_id,
|
|
@@ -1793,9 +1756,7 @@ class ADKRunner(BaseRunner):
|
|
|
1793
1756
|
persistence_degraded = bool(
|
|
1794
1757
|
shared_across_pods and getattr(session_service, "degraded", False)
|
|
1795
1758
|
)
|
|
1796
|
-
platform_resumable =
|
|
1797
|
-
self._resumable and shared_across_pods and not persistence_degraded
|
|
1798
|
-
)
|
|
1759
|
+
platform_resumable = self._resumable and shared_across_pods and not persistence_degraded
|
|
1799
1760
|
metadata["is_resumable"] = platform_resumable
|
|
1800
1761
|
metadata["resume_status"] = "resumable" if platform_resumable else "disabled"
|
|
1801
1762
|
metadata["backend"] = stm_backend or "in_memory"
|
|
@@ -1810,8 +1771,7 @@ class ADKRunner(BaseRunner):
|
|
|
1810
1771
|
self._resume_disabled_reason
|
|
1811
1772
|
if not self._resumable and self._resume_disabled_reason
|
|
1812
1773
|
else (
|
|
1813
|
-
"ADK database session persistence was degraded when this checkpoint "
|
|
1814
|
-
"was written"
|
|
1774
|
+
"ADK database session persistence was degraded when this checkpoint was written"
|
|
1815
1775
|
)
|
|
1816
1776
|
if persistence_degraded
|
|
1817
1777
|
else "ADK checkpoint uses an in-memory or local-only session backend; "
|
|
@@ -1852,7 +1812,7 @@ class ADKRunner(BaseRunner):
|
|
|
1852
1812
|
)
|
|
1853
1813
|
if not adk_invocation_id:
|
|
1854
1814
|
logger.error(
|
|
1855
|
-
"Resume requested but ADK invocation_id not found for
|
|
1815
|
+
"Resume requested but ADK invocation_id not found for session=%s ksadk_inv=%s",
|
|
1856
1816
|
session_id,
|
|
1857
1817
|
ksadk_invocation_id,
|
|
1858
1818
|
)
|
|
@@ -1869,6 +1829,7 @@ class ADKRunner(BaseRunner):
|
|
|
1869
1829
|
*,
|
|
1870
1830
|
input_data: Dict[str, Any],
|
|
1871
1831
|
session_id: str,
|
|
1832
|
+
native_user_id: str = "ksadk_user",
|
|
1872
1833
|
user_input: str,
|
|
1873
1834
|
is_resume: bool,
|
|
1874
1835
|
run_config: Optional[Any] = None,
|
|
@@ -1898,7 +1859,7 @@ class ADKRunner(BaseRunner):
|
|
|
1898
1859
|
|
|
1899
1860
|
run_kwargs: Dict[str, Any] = {
|
|
1900
1861
|
"session_id": session_id,
|
|
1901
|
-
"user_id":
|
|
1862
|
+
"user_id": native_user_id,
|
|
1902
1863
|
}
|
|
1903
1864
|
if run_config is not None:
|
|
1904
1865
|
run_kwargs["run_config"] = run_config
|
|
@@ -1968,6 +1929,7 @@ class ADKRunner(BaseRunner):
|
|
|
1968
1929
|
# Use external session ID if provided
|
|
1969
1930
|
req_session_id = input_data.get("session_id")
|
|
1970
1931
|
session_id = await self._ensure_session(req_session_id)
|
|
1932
|
+
native_user_id = self._native_user_for_session(req_session_id)
|
|
1971
1933
|
|
|
1972
1934
|
# 准备 Metadata 并设置 Span Attributes
|
|
1973
1935
|
# Langfuse Exporter 会读取这些 span attributes
|
|
@@ -1982,6 +1944,7 @@ class ADKRunner(BaseRunner):
|
|
|
1982
1944
|
wrapped_async = await self._prepare_run_events(
|
|
1983
1945
|
input_data=input_data,
|
|
1984
1946
|
session_id=session_id,
|
|
1947
|
+
native_user_id=native_user_id,
|
|
1985
1948
|
user_input=user_input,
|
|
1986
1949
|
is_resume=is_resume,
|
|
1987
1950
|
)
|
|
@@ -2073,6 +2036,7 @@ class ADKRunner(BaseRunner):
|
|
|
2073
2036
|
# Use external session ID if provided
|
|
2074
2037
|
req_session_id = input_data.get("session_id")
|
|
2075
2038
|
session_id = await self._ensure_session(req_session_id)
|
|
2039
|
+
native_user_id = self._native_user_for_session(req_session_id)
|
|
2076
2040
|
|
|
2077
2041
|
# 准备 Metadata 并设置 Span Attributes
|
|
2078
2042
|
agent_user_id, tags, _, _ = self._prepare_trace_metadata(session_id)
|
|
@@ -2087,6 +2051,7 @@ class ADKRunner(BaseRunner):
|
|
|
2087
2051
|
wrapped_async = await self._prepare_run_events(
|
|
2088
2052
|
input_data=input_data,
|
|
2089
2053
|
session_id=session_id,
|
|
2054
|
+
native_user_id=native_user_id,
|
|
2090
2055
|
user_input=user_input,
|
|
2091
2056
|
is_resume=is_resume,
|
|
2092
2057
|
run_config=run_config,
|