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
|
@@ -6,7 +6,6 @@ LangGraphRunner - LangGraph 框架运行时
|
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
8
8
|
import base64
|
|
9
|
-
import inspect
|
|
10
9
|
import os
|
|
11
10
|
import re
|
|
12
11
|
import sqlite3
|
|
@@ -17,13 +16,21 @@ from langgraph.types import Command
|
|
|
17
16
|
|
|
18
17
|
from ksadk.conversations.attachments import classify_attachment_kind, read_attachment_uri_bytes
|
|
19
18
|
from ksadk.runners._langgraph_runner_streams import _LangGraphStreamMixin
|
|
19
|
+
from ksadk.runners._langgraph_state_reader import (
|
|
20
|
+
interrupt_info_from_state,
|
|
21
|
+
known_subgraph_namespaces,
|
|
22
|
+
read_graph_state,
|
|
23
|
+
)
|
|
24
|
+
from ksadk.runners._session_identity import LangGraphSessionIdentityMixin
|
|
20
25
|
from ksadk.runners.base_runner import BaseRunner
|
|
21
26
|
from ksadk.runners.utils import load_agent_module
|
|
27
|
+
from ksadk.runtime.skill_eval_result import skill_eval_response_fields
|
|
28
|
+
from ksadk.runtime.timing import extract_timing
|
|
22
29
|
from ksadk.sessions import resolve_persistence_topology
|
|
23
30
|
from ksadk.sessions.continuity import LangGraphSessionAdapter
|
|
24
31
|
|
|
25
32
|
|
|
26
|
-
class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
33
|
+
class LangGraphRunner(LangGraphSessionIdentityMixin, _LangGraphStreamMixin, BaseRunner):
|
|
27
34
|
"""LangGraph 框架运行时
|
|
28
35
|
|
|
29
36
|
透传原生 LangGraph 功能,支持任意 State 格式
|
|
@@ -35,12 +42,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
35
42
|
|
|
36
43
|
def __init__(self, detection_result: Any, project_dir: str):
|
|
37
44
|
super().__init__(detection_result, project_dir)
|
|
45
|
+
self._module: Any = None
|
|
38
46
|
self._managed_checkpoint_lock = asyncio.Lock()
|
|
39
47
|
self._managed_checkpoint_prepared = False
|
|
40
48
|
self._managed_checkpoint_state = "uninitialized"
|
|
41
49
|
self._managed_checkpoint_error: tuple[str, str] | None = None
|
|
42
50
|
self._managed_checkpoint_pool: Any = None
|
|
43
|
-
self.
|
|
51
|
+
self._identity_thread_bindings: dict[str, str] = {}
|
|
52
|
+
self._identity_thread_lock = asyncio.Lock()
|
|
44
53
|
|
|
45
54
|
def load_agent(self) -> None:
|
|
46
55
|
self._load_agent(force_reload=False)
|
|
@@ -133,8 +142,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
133
142
|
return "unknown"
|
|
134
143
|
try:
|
|
135
144
|
closed_values = {
|
|
136
|
-
name: cell.cell_contents
|
|
137
|
-
for name, cell in zip(code.co_freevars, closure)
|
|
145
|
+
name: cell.cell_contents for name, cell in zip(code.co_freevars, closure)
|
|
138
146
|
}
|
|
139
147
|
except (AttributeError, ValueError):
|
|
140
148
|
return "unknown"
|
|
@@ -199,8 +207,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
199
207
|
"ResumeMode": "none",
|
|
200
208
|
"ReasonCode": "CHECKPOINTER_NOT_DURABLE",
|
|
201
209
|
"Reason": (
|
|
202
|
-
"In-memory checkpoint cannot be recovered after process restart "
|
|
203
|
-
"or across pods"
|
|
210
|
+
"In-memory checkpoint cannot be recovered after process restart or across pods"
|
|
204
211
|
),
|
|
205
212
|
}
|
|
206
213
|
return {
|
|
@@ -326,18 +333,6 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
326
333
|
"on",
|
|
327
334
|
}
|
|
328
335
|
|
|
329
|
-
@staticmethod
|
|
330
|
-
def _resolve_checkpoint_namespace() -> str:
|
|
331
|
-
session_namespace = str(os.getenv("KSADK_SESSION_NAMESPACE") or "").strip()
|
|
332
|
-
if session_namespace:
|
|
333
|
-
return session_namespace
|
|
334
|
-
agent_id = str(
|
|
335
|
-
os.getenv("AGENTENGINE_AGENT_ID")
|
|
336
|
-
or os.getenv("KSADK_AGENT_ID")
|
|
337
|
-
or "default"
|
|
338
|
-
).strip()
|
|
339
|
-
return f"agent:{agent_id}"
|
|
340
|
-
|
|
341
336
|
async def _create_managed_postgres_saver(self, dsn: str) -> tuple[Any, Any]:
|
|
342
337
|
from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
|
|
343
338
|
from psycopg.rows import dict_row
|
|
@@ -390,20 +385,12 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
390
385
|
)
|
|
391
386
|
checkpoint_id = str(
|
|
392
387
|
native_ref.get("checkpoint_id")
|
|
393
|
-
or (
|
|
394
|
-
langgraph_ref.get("checkpoint_id")
|
|
395
|
-
if isinstance(langgraph_ref, Mapping)
|
|
396
|
-
else ""
|
|
397
|
-
)
|
|
388
|
+
or (langgraph_ref.get("checkpoint_id") if isinstance(langgraph_ref, Mapping) else "")
|
|
398
389
|
or ""
|
|
399
390
|
).strip()
|
|
400
391
|
thread_id = str(
|
|
401
392
|
native_ref.get("thread_id")
|
|
402
|
-
or (
|
|
403
|
-
langgraph_ref.get("thread_id")
|
|
404
|
-
if isinstance(langgraph_ref, Mapping)
|
|
405
|
-
else ""
|
|
406
|
-
)
|
|
393
|
+
or (langgraph_ref.get("thread_id") if isinstance(langgraph_ref, Mapping) else "")
|
|
407
394
|
or ""
|
|
408
395
|
).strip()
|
|
409
396
|
if not checkpoint_id or not thread_id:
|
|
@@ -424,11 +411,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
424
411
|
}
|
|
425
412
|
checkpoint_ns = str(
|
|
426
413
|
native_ref.get("checkpoint_ns")
|
|
427
|
-
or (
|
|
428
|
-
langgraph_ref.get("checkpoint_ns")
|
|
429
|
-
if isinstance(langgraph_ref, Mapping)
|
|
430
|
-
else ""
|
|
431
|
-
)
|
|
414
|
+
or (langgraph_ref.get("checkpoint_ns") if isinstance(langgraph_ref, Mapping) else "")
|
|
432
415
|
or ""
|
|
433
416
|
).strip()
|
|
434
417
|
if checkpoint_ns:
|
|
@@ -436,8 +419,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
436
419
|
config = {"configurable": configurable}
|
|
437
420
|
|
|
438
421
|
if callable(
|
|
439
|
-
getattr(self._agent, "aget_state", None)
|
|
440
|
-
or getattr(self._agent, "get_state", None)
|
|
422
|
+
getattr(self._agent, "aget_state", None) or getattr(self._agent, "get_state", None)
|
|
441
423
|
):
|
|
442
424
|
return await self._checkpoint_state_resolves(
|
|
443
425
|
config,
|
|
@@ -470,14 +452,9 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
470
452
|
) -> bool:
|
|
471
453
|
"""Confirm one exact persisted checkpoint through the active graph."""
|
|
472
454
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
)
|
|
476
|
-
if not callable(get_state):
|
|
455
|
+
state, _error = await self._read_graph_state(config)
|
|
456
|
+
if state is None:
|
|
477
457
|
return False
|
|
478
|
-
state = get_state(config)
|
|
479
|
-
if inspect.isawaitable(state):
|
|
480
|
-
state = await state
|
|
481
458
|
state_created_at = (
|
|
482
459
|
state.get("created_at")
|
|
483
460
|
if isinstance(state, Mapping)
|
|
@@ -509,19 +486,13 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
509
486
|
async with self._managed_checkpoint_lock:
|
|
510
487
|
if self._managed_checkpoint_state in {"ready", "terminal_failure"}:
|
|
511
488
|
return
|
|
512
|
-
if
|
|
513
|
-
self._managed_checkpoint_state == "transient_failure"
|
|
514
|
-
and not allow_transient_retry
|
|
515
|
-
):
|
|
489
|
+
if self._managed_checkpoint_state == "transient_failure" and not allow_transient_retry:
|
|
516
490
|
return
|
|
517
491
|
|
|
518
492
|
checkpointer = getattr(self._agent, "checkpointer", None)
|
|
519
493
|
if checkpointer is None:
|
|
520
494
|
checkpointer = getattr(self._agent, "_checkpointer", None)
|
|
521
495
|
if self._checkpoint_backend_from_saver(checkpointer) == "postgres":
|
|
522
|
-
self._managed_checkpoint_namespace = (
|
|
523
|
-
self._resolve_checkpoint_namespace()
|
|
524
|
-
)
|
|
525
496
|
self._managed_checkpoint_prepared = True
|
|
526
497
|
self._managed_checkpoint_state = "ready"
|
|
527
498
|
return
|
|
@@ -537,6 +508,13 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
537
508
|
self._managed_checkpoint_state = "terminal_failure"
|
|
538
509
|
return
|
|
539
510
|
|
|
511
|
+
# 探测路径可能先于首个 chat 请求 probe(本地调试与手动部署形态的
|
|
512
|
+
# capability adapter 均未 preflight)。此时驻留图还没加载,先完成
|
|
513
|
+
# 模块加载:既避免把"未加载"误判为"无 durable checkpointer",
|
|
514
|
+
# 也避免对未初始化的 _module 抛 AttributeError 被静默吞掉。
|
|
515
|
+
if self._agent is None:
|
|
516
|
+
self.load_agent()
|
|
517
|
+
|
|
540
518
|
factory = getattr(self._module, "ksadk_graph_factory", None)
|
|
541
519
|
if not callable(factory):
|
|
542
520
|
self._managed_checkpoint_error = (
|
|
@@ -548,6 +526,23 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
548
526
|
self._managed_checkpoint_state = "terminal_failure"
|
|
549
527
|
return
|
|
550
528
|
|
|
529
|
+
# 托管 checkpointer 从 checkpoint 恢复 messages(append-only reducer)。
|
|
530
|
+
# 若接入方未导出 ksadk_prepare_state,runner 走 _to_state 把 history 再注入
|
|
531
|
+
# 一遍,与 checkpointer 恢复的 messages 双重叠加。托管 checkpoint 必须同时
|
|
532
|
+
# 提供 hook,否则 fail-closed,避免生产 auto checkpoint 下静默双重注入。
|
|
533
|
+
prepare_state_hook = getattr(self._module, "ksadk_prepare_state", None)
|
|
534
|
+
if not callable(prepare_state_hook):
|
|
535
|
+
self._managed_checkpoint_error = (
|
|
536
|
+
"PREPARE_STATE_HOOK_REQUIRED",
|
|
537
|
+
"Managed PostgreSQL checkpoint requires ksadk_prepare_state hook to "
|
|
538
|
+
"avoid double history injection (checkpointer messages restore + "
|
|
539
|
+
"_to_state history). Export ksadk_prepare_state(payload, "
|
|
540
|
+
"session_context) in the agent module.",
|
|
541
|
+
)
|
|
542
|
+
self._managed_checkpoint_prepared = True
|
|
543
|
+
self._managed_checkpoint_state = "terminal_failure"
|
|
544
|
+
return
|
|
545
|
+
|
|
551
546
|
pool = None
|
|
552
547
|
try:
|
|
553
548
|
saver, pool = await self._create_managed_postgres_saver(checkpoint_target.dsn)
|
|
@@ -556,9 +551,6 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
556
551
|
raise TypeError("ksadk_graph_factory must return a compiled LangGraph graph")
|
|
557
552
|
self._agent = managed_graph
|
|
558
553
|
self._managed_checkpoint_pool = pool
|
|
559
|
-
self._managed_checkpoint_namespace = (
|
|
560
|
-
self._resolve_checkpoint_namespace()
|
|
561
|
-
)
|
|
562
554
|
self._managed_checkpoint_error = None
|
|
563
555
|
self._managed_checkpoint_state = "ready"
|
|
564
556
|
except (ModuleNotFoundError, ImportError):
|
|
@@ -577,8 +569,10 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
577
569
|
permission_failure = any(
|
|
578
570
|
marker in error_name for marker in ("privilege", "permission")
|
|
579
571
|
)
|
|
580
|
-
terminal =
|
|
581
|
-
|
|
572
|
+
terminal = (
|
|
573
|
+
authentication_failure
|
|
574
|
+
or permission_failure
|
|
575
|
+
or isinstance(exc, (TypeError, ValueError))
|
|
582
576
|
)
|
|
583
577
|
reason_code = (
|
|
584
578
|
"AUTH_FAILED"
|
|
@@ -612,11 +606,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
612
606
|
await super().close()
|
|
613
607
|
|
|
614
608
|
def _get_config(self, session_id: str) -> dict:
|
|
615
|
-
"""获取运行配置
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
609
|
+
"""获取运行配置
|
|
610
|
+
|
|
611
|
+
只写 thread_id:checkpoint_ns 是 LangGraph 的子图寻址字段,不是租户
|
|
612
|
+
隔离字段。把租户/agent scope 塞进 configurable.checkpoint_ns 会让
|
|
613
|
+
Pregel 的 aget_state 走子图重定向并抛 "Subgraph <scope> not found",
|
|
614
|
+
静默打掉流式路径的待审批探测。租户隔离由 thread_id 承担。
|
|
615
|
+
"""
|
|
616
|
+
return {"configurable": {"thread_id": session_id}}
|
|
620
617
|
|
|
621
618
|
@staticmethod
|
|
622
619
|
def _extract_langgraph_checkpoint_ref(payload: Dict[str, Any]) -> dict[str, Any]:
|
|
@@ -628,19 +625,28 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
628
625
|
return {}
|
|
629
626
|
return dict(langgraph_ref)
|
|
630
627
|
|
|
631
|
-
|
|
628
|
+
def _known_subgraph_namespaces(self) -> set[str]:
|
|
629
|
+
"""当前图里真实存在的子图 namespace 集合(无法探测时返回空集)。"""
|
|
630
|
+
return known_subgraph_namespaces(self._agent)
|
|
631
|
+
|
|
632
632
|
def _apply_checkpoint_resume_config(
|
|
633
|
-
|
|
633
|
+
self,
|
|
634
634
|
config: dict[str, Any],
|
|
635
635
|
*,
|
|
636
636
|
session_id: str,
|
|
637
637
|
checkpoint_ref: dict[str, Any],
|
|
638
|
+
enforce_bound_thread: bool = False,
|
|
638
639
|
) -> dict[str, Any]:
|
|
639
640
|
checkpoint_id = str(checkpoint_ref.get("checkpoint_id") or "").strip()
|
|
640
641
|
if not checkpoint_id:
|
|
641
642
|
raise ValueError("checkpoint_resume requires framework_ref.langgraph.checkpoint_id")
|
|
642
643
|
|
|
643
|
-
|
|
644
|
+
configured = dict(config.get("configurable") or {})
|
|
645
|
+
bound_thread_id = str(configured.get("thread_id") or session_id or "").strip()
|
|
646
|
+
requested_thread_id = str(checkpoint_ref.get("thread_id") or "").strip()
|
|
647
|
+
if enforce_bound_thread and requested_thread_id and requested_thread_id != bound_thread_id:
|
|
648
|
+
raise ValueError("checkpoint_resume thread does not belong to this session")
|
|
649
|
+
thread_id = requested_thread_id or bound_thread_id
|
|
644
650
|
if not thread_id:
|
|
645
651
|
raise ValueError(
|
|
646
652
|
"checkpoint_resume requires session_id or framework_ref.langgraph.thread_id"
|
|
@@ -649,7 +655,23 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
649
655
|
next_config = dict(config)
|
|
650
656
|
configurable = dict(next_config.get("configurable") or {})
|
|
651
657
|
configurable["thread_id"] = thread_id
|
|
652
|
-
|
|
658
|
+
# checkpoint_ns 只承载 LangGraph 子图寻址语义。真实运行时 namespace 的
|
|
659
|
+
# 格式是 "<子图名>:<task_path>"(如 inner:<task-id>),get_subgraphs()
|
|
660
|
+
# 返回的是裸子图名——所以校验必须只比对首段,合法时保留原始完整
|
|
661
|
+
# namespace(带任务路径;否则 aget_state 定位不到对应 checkpoint)。
|
|
662
|
+
# 不匹配的地址(含历史租户/agent scope 残留)显性报错,绝不静默改写
|
|
663
|
+
# 成根地址——静默改写曾让恢复悄悄指向不存在的 checkpoint。
|
|
664
|
+
requested_namespace = str(checkpoint_ref.get("checkpoint_ns") or "").strip()
|
|
665
|
+
if requested_namespace:
|
|
666
|
+
known = self._known_subgraph_namespaces()
|
|
667
|
+
leading = requested_namespace.split(":", 1)[0]
|
|
668
|
+
if leading not in known:
|
|
669
|
+
raise ValueError(
|
|
670
|
+
"checkpoint_resume checkpoint_ns does not address any subgraph "
|
|
671
|
+
f"of this graph: {requested_namespace!r} "
|
|
672
|
+
f"(known subgraphs: {sorted(known) or 'none'})"
|
|
673
|
+
)
|
|
674
|
+
configurable["checkpoint_ns"] = requested_namespace
|
|
653
675
|
configurable["checkpoint_id"] = checkpoint_id
|
|
654
676
|
next_config["configurable"] = configurable
|
|
655
677
|
return next_config
|
|
@@ -754,13 +776,8 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
754
776
|
}
|
|
755
777
|
|
|
756
778
|
async def _latest_checkpoint_metadata(self, config: dict[str, Any]) -> dict[str, Any]:
|
|
757
|
-
state =
|
|
758
|
-
|
|
759
|
-
if callable(getattr(self._agent, "aget_state", None)):
|
|
760
|
-
state = await self._agent.aget_state(config)
|
|
761
|
-
elif callable(getattr(self._agent, "get_state", None)):
|
|
762
|
-
state = self._agent.get_state(config)
|
|
763
|
-
except Exception:
|
|
779
|
+
state, _error = await self._read_graph_state(config)
|
|
780
|
+
if state is None:
|
|
764
781
|
return {}
|
|
765
782
|
framework_ref = self._checkpoint_ref_from_state(state)
|
|
766
783
|
if not framework_ref:
|
|
@@ -796,13 +813,8 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
796
813
|
}
|
|
797
814
|
|
|
798
815
|
async def _latest_state_usage(self, config: dict[str, Any]) -> dict[str, Any]:
|
|
799
|
-
state =
|
|
800
|
-
|
|
801
|
-
if callable(getattr(self._agent, "aget_state", None)):
|
|
802
|
-
state = await self._agent.aget_state(config)
|
|
803
|
-
elif callable(getattr(self._agent, "get_state", None)):
|
|
804
|
-
state = self._agent.get_state(config)
|
|
805
|
-
except Exception:
|
|
816
|
+
state, _error = await self._read_graph_state(config)
|
|
817
|
+
if state is None:
|
|
806
818
|
return {}
|
|
807
819
|
values = getattr(state, "values", None)
|
|
808
820
|
if values is not None:
|
|
@@ -1091,10 +1103,15 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1091
1103
|
final_metadata = final_chunk.get("metadata")
|
|
1092
1104
|
if isinstance(final_metadata, Mapping):
|
|
1093
1105
|
metadata = {**dict(final_metadata), **metadata}
|
|
1094
|
-
result: dict[str, Any] = {
|
|
1106
|
+
result: dict[str, Any] = {
|
|
1107
|
+
"output": output_text, "raw": {"chunks": chunks},
|
|
1108
|
+
**skill_eval_response_fields(final_chunk),
|
|
1109
|
+
}
|
|
1095
1110
|
usage = final_chunk.get("usage")
|
|
1096
1111
|
if isinstance(usage, Mapping) and usage:
|
|
1097
1112
|
result["usage"] = dict(usage)
|
|
1113
|
+
if timing := extract_timing(final_chunk):
|
|
1114
|
+
result["timing"] = timing
|
|
1098
1115
|
if metadata:
|
|
1099
1116
|
result["metadata"] = metadata
|
|
1100
1117
|
return result
|
|
@@ -1126,12 +1143,13 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1126
1143
|
payload.get("platform_context"),
|
|
1127
1144
|
context_schema=getattr(self._agent, "context_schema", None),
|
|
1128
1145
|
)
|
|
1129
|
-
config = self.
|
|
1146
|
+
config = await self._get_session_config(session_id)
|
|
1130
1147
|
if is_checkpoint_resume:
|
|
1131
1148
|
config = self._apply_checkpoint_resume_config(
|
|
1132
1149
|
config,
|
|
1133
1150
|
session_id=session_id,
|
|
1134
1151
|
checkpoint_ref=checkpoint_ref,
|
|
1152
|
+
enforce_bound_thread=bool(self._invocation_identity_scope_ref()),
|
|
1135
1153
|
)
|
|
1136
1154
|
|
|
1137
1155
|
# 判断输入格式 / resume
|
|
@@ -1172,7 +1190,12 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1172
1190
|
context=native_context,
|
|
1173
1191
|
)
|
|
1174
1192
|
|
|
1175
|
-
output = {
|
|
1193
|
+
output = {
|
|
1194
|
+
"output": self._extract_output(result), "raw": result,
|
|
1195
|
+
**skill_eval_response_fields(result),
|
|
1196
|
+
}
|
|
1197
|
+
if timing := extract_timing(result):
|
|
1198
|
+
output["timing"] = timing
|
|
1176
1199
|
usage = self._extract_usage(result)
|
|
1177
1200
|
if usage:
|
|
1178
1201
|
output["usage"] = usage
|
|
@@ -1186,7 +1209,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1186
1209
|
|
|
1187
1210
|
except Exception as e:
|
|
1188
1211
|
if "Interrupt" in type(e).__name__:
|
|
1189
|
-
|
|
1212
|
+
state, error = await self._read_graph_state(config, include_subgraphs=True)
|
|
1213
|
+
if state is None:
|
|
1214
|
+
# 图已经抛出 interrupt,但状态读不回来:这里必须显性失败,
|
|
1215
|
+
# 不能返回空 interrupt_info,更不能伪装成正常完成。
|
|
1216
|
+
raise RuntimeError(
|
|
1217
|
+
"graph interrupted but its checkpoint state could not be read"
|
|
1218
|
+
) from error
|
|
1219
|
+
interrupt_info = self._get_interrupt_info(state)
|
|
1190
1220
|
return {
|
|
1191
1221
|
"type": "interrupt",
|
|
1192
1222
|
"interrupt_info": interrupt_info,
|
|
@@ -1221,35 +1251,20 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1221
1251
|
return str(content)
|
|
1222
1252
|
return str(result) if result else ""
|
|
1223
1253
|
|
|
1254
|
+
async def _read_graph_state(
|
|
1255
|
+
self,
|
|
1256
|
+
config: Mapping[str, Any],
|
|
1257
|
+
*,
|
|
1258
|
+
include_subgraphs: bool = False,
|
|
1259
|
+
) -> tuple[Any | None, Exception | None]:
|
|
1260
|
+
"""统一的图状态读取入口(实现在 `_langgraph_state_reader`,全仓唯一)。"""
|
|
1261
|
+
return await read_graph_state(
|
|
1262
|
+
self._agent, config, include_subgraphs=include_subgraphs
|
|
1263
|
+
)
|
|
1264
|
+
|
|
1224
1265
|
def _get_interrupt_info(self, state) -> dict:
|
|
1225
|
-
"""从 state 中获取 interrupt
|
|
1226
|
-
|
|
1227
|
-
for task in state.tasks:
|
|
1228
|
-
if hasattr(task, "interrupts") and task.interrupts:
|
|
1229
|
-
for intr in task.interrupts:
|
|
1230
|
-
if hasattr(intr, "value"):
|
|
1231
|
-
value = intr.value
|
|
1232
|
-
info = dict(value) if isinstance(value, Mapping) else {"value": value}
|
|
1233
|
-
interrupt_id = str(getattr(intr, "id", "") or "")
|
|
1234
|
-
if interrupt_id:
|
|
1235
|
-
info.setdefault("approval_request_id", interrupt_id)
|
|
1236
|
-
# HumanInTheLoopMiddleware 的 interrupt value 把
|
|
1237
|
-
# tool_name/arguments 嵌在 action_requests[0] 里;
|
|
1238
|
-
# 下游期望顶层字段,这里提取并保留原 action_requests。
|
|
1239
|
-
action_requests = info.get("action_requests")
|
|
1240
|
-
if isinstance(action_requests, list) and action_requests:
|
|
1241
|
-
first = action_requests[0]
|
|
1242
|
-
if isinstance(first, Mapping):
|
|
1243
|
-
info.setdefault("tool_name", str(first.get("name") or ""))
|
|
1244
|
-
raw_args = first.get("args") or first.get("arguments")
|
|
1245
|
-
if raw_args is not None:
|
|
1246
|
-
info.setdefault("arguments", raw_args)
|
|
1247
|
-
if first.get("description") is not None:
|
|
1248
|
-
info.setdefault(
|
|
1249
|
-
"description", str(first.get("description"))
|
|
1250
|
-
)
|
|
1251
|
-
return info
|
|
1252
|
-
return {}
|
|
1266
|
+
"""从 state 中获取 interrupt 信息(含子图嵌套任务)。"""
|
|
1267
|
+
return interrupt_info_from_state(state)
|
|
1253
1268
|
|
|
1254
1269
|
async def _stream_checkpoint_resume_updates(
|
|
1255
1270
|
self,
|
|
@@ -1293,6 +1308,7 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1293
1308
|
latest_config = self._latest_checkpoint_config(config)
|
|
1294
1309
|
state_usage = await self._latest_state_usage(latest_config)
|
|
1295
1310
|
state_output = ""
|
|
1311
|
+
result_fields: dict[str, Any] = {}
|
|
1296
1312
|
try:
|
|
1297
1313
|
state = None
|
|
1298
1314
|
if callable(getattr(self._agent, "aget_state", None)):
|
|
@@ -1302,12 +1318,14 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1302
1318
|
values = getattr(state, "values", None)
|
|
1303
1319
|
if values is not None:
|
|
1304
1320
|
state_output = self._extract_output(values)
|
|
1321
|
+
result_fields = skill_eval_response_fields(values)
|
|
1305
1322
|
except Exception:
|
|
1306
1323
|
state_output = ""
|
|
1307
1324
|
final_output = state_output or self._extract_output(latest_output)
|
|
1308
1325
|
yield {
|
|
1309
1326
|
"type": "final",
|
|
1310
1327
|
"output": final_output,
|
|
1328
|
+
**result_fields,
|
|
1311
1329
|
**({"usage": state_usage} if state_usage else {}),
|
|
1312
1330
|
**({"resume_noop": True} if not emitted_update else {}),
|
|
1313
1331
|
}
|
|
@@ -1386,7 +1404,6 @@ class LangGraphRunner(_LangGraphStreamMixin, BaseRunner):
|
|
|
1386
1404
|
)
|
|
1387
1405
|
return events
|
|
1388
1406
|
|
|
1389
|
-
|
|
1390
1407
|
def _filter_tool_tags(self, content: str) -> str:
|
|
1391
1408
|
"""过滤 <tool_call> 标签"""
|
|
1392
1409
|
if not isinstance(content, str):
|
ksadk/runners/patch_langchain.py
CHANGED
|
@@ -26,6 +26,12 @@ logger = logging.getLogger(__name__)
|
|
|
26
26
|
|
|
27
27
|
# Original function reference (to avoid recursion if patched multiple times)
|
|
28
28
|
_original_convert_delta = None
|
|
29
|
+
_original_convert_chunk_to_generation_chunk = None
|
|
30
|
+
|
|
31
|
+
# Dedup cache for upstream streams that return identical usage in both the
|
|
32
|
+
# finish chunk and the trailing choices=[] chunk. Keyed by response ID so
|
|
33
|
+
# concurrent streams don't interfere.
|
|
34
|
+
_usage_dedup_cache: dict[str, dict] = {}
|
|
29
35
|
|
|
30
36
|
|
|
31
37
|
def _patched_convert_delta_to_message_chunk(
|
|
@@ -154,10 +160,43 @@ def _patched_chat_get_request_payload(self, input_, *, stop=None, **kwargs):
|
|
|
154
160
|
return _merge_payload_options(payload, model_options_for_chat_completions(model_options))
|
|
155
161
|
|
|
156
162
|
|
|
163
|
+
def _patched_convert_chunk_to_generation_chunk(
|
|
164
|
+
self,
|
|
165
|
+
chunk: dict,
|
|
166
|
+
default_chunk_class: type,
|
|
167
|
+
base_generation_info: dict | None = None,
|
|
168
|
+
):
|
|
169
|
+
"""Suppress duplicate usage from upstream streams that return identical
|
|
170
|
+
usage in both the finish chunk and the trailing choices=[] chunk.
|
|
171
|
+
|
|
172
|
+
LangChain-core sums usage_metadata across chunks, so two identical usage
|
|
173
|
+
values produce a 2x result in Langfuse. This patch strips the second
|
|
174
|
+
occurrence before LangChain sees it, keyed by response ID.
|
|
175
|
+
"""
|
|
176
|
+
token_usage = chunk.get("usage")
|
|
177
|
+
response_id = str(chunk.get("id") or "")
|
|
178
|
+
if token_usage is not None and response_id:
|
|
179
|
+
cached = _usage_dedup_cache.get(response_id)
|
|
180
|
+
if cached is not None and cached == token_usage:
|
|
181
|
+
chunk = dict(chunk)
|
|
182
|
+
chunk.pop("usage", None)
|
|
183
|
+
else:
|
|
184
|
+
_usage_dedup_cache[response_id] = dict(token_usage)
|
|
185
|
+
if len(_usage_dedup_cache) > 1024:
|
|
186
|
+
_usage_dedup_cache.clear()
|
|
187
|
+
choices = chunk.get("choices") or []
|
|
188
|
+
if len(choices) == 0 and response_id:
|
|
189
|
+
_usage_dedup_cache.pop(response_id, None)
|
|
190
|
+
return _original_convert_chunk_to_generation_chunk(
|
|
191
|
+
self, chunk, default_chunk_class, base_generation_info
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
|
|
157
195
|
def apply_patch():
|
|
158
196
|
"""Apply the monkey patch to langchain_openai."""
|
|
159
197
|
global _original_convert_delta, _original_convert_message_to_dict
|
|
160
198
|
global _original_base_get_request_payload, _original_chat_get_request_payload
|
|
199
|
+
global _original_convert_chunk_to_generation_chunk
|
|
161
200
|
try:
|
|
162
201
|
import langchain_openai.chat_models.base as base_module
|
|
163
202
|
|
|
@@ -178,6 +217,14 @@ def apply_patch():
|
|
|
178
217
|
_original_chat_get_request_payload = base_module.ChatOpenAI._get_request_payload
|
|
179
218
|
base_module.ChatOpenAI._get_request_payload = _patched_chat_get_request_payload
|
|
180
219
|
|
|
220
|
+
# Patch 3: Deduplicate streaming usage to prevent Langfuse token doubling
|
|
221
|
+
_original_convert_chunk_to_generation_chunk = (
|
|
222
|
+
base_module.BaseChatOpenAI._convert_chunk_to_generation_chunk
|
|
223
|
+
)
|
|
224
|
+
base_module.BaseChatOpenAI._convert_chunk_to_generation_chunk = (
|
|
225
|
+
_patched_convert_chunk_to_generation_chunk
|
|
226
|
+
)
|
|
227
|
+
|
|
181
228
|
base_module._ksadk_patched = True
|
|
182
229
|
|
|
183
230
|
# logger.info("Applied langchain-openai patch for reasoning_content support")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""usage 累加工具:逐字段求和(
|
|
1
|
+
"""usage 累加工具:逐字段求和(主计数/canonical 明细 + details 子键)。
|
|
2
2
|
|
|
3
3
|
用于 runner 本轮内多次 LLM 调用的 usage 累积。input_tokens 各 provider 均含 cache
|
|
4
4
|
(Gemini prompt_token_count 含 cached_content_token_count;OpenAI prompt_tokens 含
|
|
@@ -11,7 +11,13 @@ from __future__ import annotations
|
|
|
11
11
|
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
_SCALAR_FIELDS = (
|
|
15
|
+
"input_tokens",
|
|
16
|
+
"output_tokens",
|
|
17
|
+
"total_tokens",
|
|
18
|
+
"cached_tokens",
|
|
19
|
+
"reasoning_tokens",
|
|
20
|
+
)
|
|
15
21
|
_DETAIL_FIELDS = ("input_token_details", "output_token_details")
|
|
16
22
|
|
|
17
23
|
|
|
@@ -20,7 +26,9 @@ def accumulate_usage(acc: dict[str, Any], delta: dict[str, Any]) -> dict[str, An
|
|
|
20
26
|
if not delta:
|
|
21
27
|
return dict(acc)
|
|
22
28
|
result = dict(acc)
|
|
23
|
-
for key in
|
|
29
|
+
for key in _SCALAR_FIELDS:
|
|
30
|
+
if key not in result and key not in delta:
|
|
31
|
+
continue
|
|
24
32
|
result[key] = int(result.get(key) or 0) + int(delta.get(key) or 0)
|
|
25
33
|
for detail_key in _DETAIL_FIELDS:
|
|
26
34
|
delta_details = delta.get(detail_key)
|