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,150 @@
|
|
|
1
|
+
"""LangGraph Store → MemoryProvider 适配层(长任务方案 §7.6 / P3)。
|
|
2
|
+
|
|
3
|
+
LangGraph ``BaseStore`` 语义映射到 KsADK MemoryProvider Protocol:
|
|
4
|
+
|
|
5
|
+
- namespace = ``(tenant_id, workspace_id, scope, scope_id)``(作用域隔离);
|
|
6
|
+
- key = ``memory_id``;
|
|
7
|
+
- value = MemoryRecord ``to_payload`` 形态的 dict(KsADK 公共协议,
|
|
8
|
+
Store 不感知 Harness 类型)。
|
|
9
|
+
|
|
10
|
+
KsADK ``MemoryRecord`` 和权限语义始终是公共协议;更换 Backend 不改变
|
|
11
|
+
HarnessSpec 与 RuntimeEvent(方案 §10 P3 验收)。
|
|
12
|
+
|
|
13
|
+
Store API 是 async(``aput/aget/asearch/adelete``);本适配器在同步
|
|
14
|
+
Protocol 方法内用 :func:`asyncio.run` 驱动(事件循环已运行时抛明确错误,
|
|
15
|
+
调用方应改走异步通道或独立线程)。
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import asyncio
|
|
21
|
+
import time
|
|
22
|
+
from dataclasses import asdict
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
from ksadk.memory.models import (
|
|
26
|
+
CoreMemoryRequest,
|
|
27
|
+
MemoryCapabilities,
|
|
28
|
+
MemoryDeleteRequest,
|
|
29
|
+
MemoryDeleteResult,
|
|
30
|
+
MemoryRecord,
|
|
31
|
+
MemorySearchRequest,
|
|
32
|
+
MemorySearchResult,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _run(coro: Any) -> Any:
|
|
37
|
+
try:
|
|
38
|
+
asyncio.get_running_loop()
|
|
39
|
+
except RuntimeError:
|
|
40
|
+
return asyncio.run(coro)
|
|
41
|
+
raise RuntimeError(
|
|
42
|
+
"LangGraphStoreAdapter 的同步方法不能在事件循环内调用"
|
|
43
|
+
"(请在线程/进程边界使用,或经 MemoryCoordinator 异步通道)"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class LangGraphStoreAdapter:
|
|
48
|
+
"""把 LangGraph ``BaseStore`` 适配为 MemoryProvider Protocol。"""
|
|
49
|
+
|
|
50
|
+
capabilities_def = MemoryCapabilities(
|
|
51
|
+
semantic_search=True, # Store 按 value 匹配语义(视实现而定)
|
|
52
|
+
keyword_search=False,
|
|
53
|
+
metadata_filter=True,
|
|
54
|
+
versioned_update=False,
|
|
55
|
+
hard_delete=True,
|
|
56
|
+
ttl=False,
|
|
57
|
+
max_record_chars=8192,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def __init__(self, store: Any, *, tenant_id: str = "local") -> None:
|
|
61
|
+
self._store = store
|
|
62
|
+
self._tenant_id = tenant_id
|
|
63
|
+
|
|
64
|
+
# ---- namespace 映射 ----
|
|
65
|
+
|
|
66
|
+
def _ns(self, scope: str, scope_id: str) -> tuple[str, ...]:
|
|
67
|
+
return (self._tenant_id, "store", scope, scope_id)
|
|
68
|
+
|
|
69
|
+
# ---- MemoryProvider Protocol ----
|
|
70
|
+
|
|
71
|
+
def capabilities(self) -> MemoryCapabilities:
|
|
72
|
+
return self.capabilities_def
|
|
73
|
+
|
|
74
|
+
async def _aget(self, memory_id: str, ns: tuple[str, ...]) -> MemoryRecord | None:
|
|
75
|
+
item = await self._store.aget(ns, memory_id)
|
|
76
|
+
return MemoryRecord(**item.value) if item else None
|
|
77
|
+
|
|
78
|
+
def get(self, memory_id: str) -> MemoryRecord | None:
|
|
79
|
+
# Store get 需要 namespace;扫描本适配器管理的 scope 前缀不现实,
|
|
80
|
+
# 调用方(Coordinator)经 search 定位。此处按最近一次 search 缓存解析。
|
|
81
|
+
raise NotImplementedError("请经 search(memory_id 过滤) 定位记录")
|
|
82
|
+
|
|
83
|
+
async def search_async(
|
|
84
|
+
self, request: MemorySearchRequest
|
|
85
|
+
) -> MemorySearchResult:
|
|
86
|
+
start = time.monotonic()
|
|
87
|
+
records: list[MemoryRecord] = []
|
|
88
|
+
for scope, scope_id in request.scopes:
|
|
89
|
+
items = await self._store.asearch(
|
|
90
|
+
self._ns(scope, scope_id), query=request.query or None,
|
|
91
|
+
limit=request.top_k,
|
|
92
|
+
)
|
|
93
|
+
for item in items:
|
|
94
|
+
try:
|
|
95
|
+
records.append(MemoryRecord(**dict(item.value)))
|
|
96
|
+
except TypeError:
|
|
97
|
+
continue
|
|
98
|
+
return MemorySearchResult(
|
|
99
|
+
status="ok",
|
|
100
|
+
records=records[: request.top_k],
|
|
101
|
+
error_code=None,
|
|
102
|
+
provider="langgraph-store",
|
|
103
|
+
latency_ms=int((time.monotonic() - start) * 1000),
|
|
104
|
+
accounting_accuracy="estimated",
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def search(self, request: MemorySearchRequest) -> MemorySearchResult:
|
|
108
|
+
return _run(self.search_async(request))
|
|
109
|
+
|
|
110
|
+
async def upsert_async(
|
|
111
|
+
self, record: MemoryRecord, *, expected_version: int | None
|
|
112
|
+
) -> MemoryRecord:
|
|
113
|
+
if expected_version is not None:
|
|
114
|
+
existing = await self._aget(record.memory_id, self._ns(record.scope, record.scope_id))
|
|
115
|
+
if existing is not None and existing.version != expected_version:
|
|
116
|
+
raise RuntimeError(
|
|
117
|
+
f"version_conflict:expected={expected_version},"
|
|
118
|
+
f"actual={existing.version}"
|
|
119
|
+
)
|
|
120
|
+
payload = asdict(record)
|
|
121
|
+
payload["source_artifact_refs"] = list(record.source_artifact_refs)
|
|
122
|
+
payload["source_artifacts"] = [asdict(item) for item in record.source_artifacts]
|
|
123
|
+
payload["supersedes"] = list(record.supersedes)
|
|
124
|
+
await self._store.aput(self._ns(record.scope, record.scope_id), record.memory_id, payload)
|
|
125
|
+
return record
|
|
126
|
+
|
|
127
|
+
def upsert(self, record: MemoryRecord, *, expected_version: int | None) -> MemoryRecord:
|
|
128
|
+
return _run(self.upsert_async(record, expected_version=expected_version))
|
|
129
|
+
|
|
130
|
+
async def delete_async(self, request: MemoryDeleteRequest) -> MemoryDeleteResult:
|
|
131
|
+
ns = self._ns(request.scope, request.scope_id)
|
|
132
|
+
existing = await self._aget(request.memory_id, ns)
|
|
133
|
+
if existing is None:
|
|
134
|
+
return MemoryDeleteResult(status="ok", deleted=False, error_code="not_found")
|
|
135
|
+
if request.hard:
|
|
136
|
+
await self._store.adelete(ns, request.memory_id)
|
|
137
|
+
else:
|
|
138
|
+
deleted = {**asdict(existing), "status": "deleted"}
|
|
139
|
+
await self._store.aput(ns, request.memory_id, deleted)
|
|
140
|
+
return MemoryDeleteResult(status="ok", deleted=True, error_code=None)
|
|
141
|
+
|
|
142
|
+
def delete(self, request: MemoryDeleteRequest) -> MemoryDeleteResult:
|
|
143
|
+
return _run(self.delete_async(request))
|
|
144
|
+
|
|
145
|
+
def list_core(self, request: CoreMemoryRequest) -> list[MemoryRecord]:
|
|
146
|
+
# Store 无常驻 Block 概念;Core Memory 交由 Coordinator 预算层。
|
|
147
|
+
return []
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
__all__ = ["LangGraphStoreAdapter"]
|
ksadk/model_policy.py
CHANGED
|
@@ -7,8 +7,8 @@ from typing import Any, Mapping
|
|
|
7
7
|
|
|
8
8
|
from ksadk.configs.settings import DEFAULT_MODEL_NAME
|
|
9
9
|
|
|
10
|
-
DEFAULT_MULTIMODAL_MODEL = "
|
|
11
|
-
DEFAULT_FALLBACK_MODEL = "
|
|
10
|
+
DEFAULT_MULTIMODAL_MODEL = "deepseek-v4.1-flash"
|
|
11
|
+
DEFAULT_FALLBACK_MODEL = "glm-5.3-flash"
|
|
12
12
|
|
|
13
13
|
DEFAULT_MODEL_POLICY: dict[str, Any] = {
|
|
14
14
|
"version": "v1",
|
ksadk/model_proxy/detect.py
CHANGED
|
@@ -44,6 +44,16 @@ class ModelCapabilities:
|
|
|
44
44
|
preferred_protocol: str = "chat" # "responses" | "chat":路由该走哪条
|
|
45
45
|
checked_at: float = 0.0
|
|
46
46
|
verdict: Verdict = "unknown" # 最近一次探测结论
|
|
47
|
+
# --- 以下为 opt-in 贵探测,默认 None(未探),由 probe_extended_capability 按需填充 ---
|
|
48
|
+
# store/previous_response_id 服务端会话链是否真生效(2026-09 实测 deepseek 系
|
|
49
|
+
# 返回 200 但静默丢历史=假支持)。False 时客户端必须每次带全量历史。
|
|
50
|
+
store_supported: bool | None = None
|
|
51
|
+
# 该模型 reasoning_effort 的合法值集合(2026-09 实测 glm-5.3-flash 只认
|
|
52
|
+
# low/high/max,medium/none/xhigh 全 400;且不能按 family 前缀推断,逐模型实测)。
|
|
53
|
+
reasoning_effort_values: frozenset[str] | None = None
|
|
54
|
+
# 非流式响应里 reasoning item 是否稳定出现(2026-09 实测 glm-5.3-flash
|
|
55
|
+
# 同 effort 下约半数响应只有 message 没有 reasoning item;流式不受影响)。
|
|
56
|
+
reasoning_item_reliable: bool | None = None
|
|
47
57
|
|
|
48
58
|
|
|
49
59
|
def _classify_responses_error(status: int, body: str) -> Verdict:
|
|
@@ -336,3 +346,247 @@ def _finalize(caps: ModelCapabilities) -> ModelCapabilities:
|
|
|
336
346
|
# 因为转换层对 chat 模型是确定可用的,而直连 responses 在 unknown 下有风险
|
|
337
347
|
caps.preferred_protocol = "chat"
|
|
338
348
|
return caps
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
# ---------------------------------------------------------------------------
|
|
352
|
+
# Opt-in 贵探测:store 会话链 / reasoning_effort 值域 / reasoning item 可靠性
|
|
353
|
+
# 这三个探测各需多次真实请求,默认不并入 probe_responses_capability,由调用方按需触发。
|
|
354
|
+
# 全部遵循同一铁律:只在确凿证据下置 True/False,故障/超时/不确定一律留 None(未探)。
|
|
355
|
+
# ---------------------------------------------------------------------------
|
|
356
|
+
|
|
357
|
+
# reasoning_effort 候选值,覆盖 OpenAI/Codex 主流档 + glm 的 max。
|
|
358
|
+
_EFFORT_CANDIDATES = ("none", "minimal", "low", "medium", "high", "xhigh", "max")
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def probe_extended_capability(
|
|
362
|
+
client: httpx.Client | httpx.AsyncClient,
|
|
363
|
+
base: str,
|
|
364
|
+
key: str,
|
|
365
|
+
model: str,
|
|
366
|
+
timeout: float = 60.0,
|
|
367
|
+
):
|
|
368
|
+
"""按需探测 store/reasoning 三项能力,返回填充了对应字段的 ModelCapabilities。
|
|
369
|
+
|
|
370
|
+
- ``store_supported``: store=true 拿 response_id,再用 previous_response_id
|
|
371
|
+
追问一个只有上一轮才知道的事实;答出=真支持,答不出=假支持(静默丢历史)。
|
|
372
|
+
- ``reasoning_effort_values``: 逐个候选值发最小请求,200=接受,400=拒绝;
|
|
373
|
+
其余(超时/5xx)不计入(故障≠值域缺失)。
|
|
374
|
+
- ``reasoning_item_reliable``: 非流式带 reasoning 请求,检查 output 是否含
|
|
375
|
+
reasoning item。单次缺席不足以判 False(可能模型本来没想),需 N 次全缺席才判。
|
|
376
|
+
|
|
377
|
+
按 client 类型分发:sync 返回 ModelCapabilities,async 返回 coroutine。
|
|
378
|
+
"""
|
|
379
|
+
if isinstance(client, httpx.AsyncClient):
|
|
380
|
+
return _probe_extended_async(client, base, key, model, timeout)
|
|
381
|
+
if isinstance(client, httpx.Client):
|
|
382
|
+
return _probe_extended_sync(client, base, key, model, timeout)
|
|
383
|
+
raise TypeError(f"client 必须是 httpx.Client/AsyncClient,不是 {type(client).__name__}")
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def _reasoning_item_present(data: Any) -> bool:
|
|
387
|
+
if not isinstance(data, dict):
|
|
388
|
+
return False
|
|
389
|
+
return any(
|
|
390
|
+
isinstance(item, dict) and item.get("type") == "reasoning"
|
|
391
|
+
for item in data.get("output", [])
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def _post_json(client, url, payload, headers, timeout):
|
|
396
|
+
"""统一 sync post + json 解析;返回 (status, data) 或 None(故障)。"""
|
|
397
|
+
try:
|
|
398
|
+
r = client.post(url, json=payload, headers=headers, timeout=timeout)
|
|
399
|
+
except (httpx.TimeoutException, httpx.ConnectError, httpx.HTTPError):
|
|
400
|
+
return None
|
|
401
|
+
try:
|
|
402
|
+
return r.status_code, r.json()
|
|
403
|
+
except ValueError:
|
|
404
|
+
return r.status_code, None
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
async def _post_json_async(client, url, payload, headers, timeout):
|
|
408
|
+
try:
|
|
409
|
+
r = await client.post(url, json=payload, headers=headers, timeout=timeout)
|
|
410
|
+
except (httpx.TimeoutException, httpx.ConnectError, httpx.HTTPError):
|
|
411
|
+
return None
|
|
412
|
+
try:
|
|
413
|
+
return r.status_code, r.json()
|
|
414
|
+
except ValueError:
|
|
415
|
+
return r.status_code, None
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
def _store_first_payload(model: str, marker: str) -> dict:
|
|
419
|
+
return {
|
|
420
|
+
"model": model,
|
|
421
|
+
"input": f"记住代号 {marker},只回 OK",
|
|
422
|
+
"max_output_tokens": 200,
|
|
423
|
+
"store": True,
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def _probe_store_sync(client, url, headers, model, timeout):
|
|
428
|
+
marker = "cobalt-9173"
|
|
429
|
+
first = _post_json(client, url, _store_first_payload(model, marker), headers, timeout)
|
|
430
|
+
if not first or first[0] != 200 or not isinstance(first[1], dict):
|
|
431
|
+
return None
|
|
432
|
+
rid = first[1].get("id")
|
|
433
|
+
if not rid:
|
|
434
|
+
return None
|
|
435
|
+
second = _post_json(
|
|
436
|
+
client,
|
|
437
|
+
url,
|
|
438
|
+
{"model": model, "input": "我刚才让你记的代号是什么?只回答代号",
|
|
439
|
+
"max_output_tokens": 200, "previous_response_id": rid},
|
|
440
|
+
headers,
|
|
441
|
+
timeout,
|
|
442
|
+
)
|
|
443
|
+
if not second or second[0] != 200 or not isinstance(second[1], dict):
|
|
444
|
+
return None
|
|
445
|
+
text = "".join(
|
|
446
|
+
c.get("text", "")
|
|
447
|
+
for item in second[1].get("output", [])
|
|
448
|
+
if isinstance(item, dict) and item.get("type") == "message"
|
|
449
|
+
for c in item.get("content", [])
|
|
450
|
+
if isinstance(c, dict)
|
|
451
|
+
)
|
|
452
|
+
return marker in text
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
async def _probe_store_async(client, url, headers, model, timeout):
|
|
456
|
+
marker = "cobalt-9173"
|
|
457
|
+
first = await _post_json_async(
|
|
458
|
+
client, url, _store_first_payload(model, marker), headers, timeout
|
|
459
|
+
)
|
|
460
|
+
if not first or first[0] != 200 or not isinstance(first[1], dict):
|
|
461
|
+
return None
|
|
462
|
+
rid = first[1].get("id")
|
|
463
|
+
if not rid:
|
|
464
|
+
return None
|
|
465
|
+
second = await _post_json_async(
|
|
466
|
+
client,
|
|
467
|
+
url,
|
|
468
|
+
{"model": model, "input": "我刚才让你记的代号是什么?只回答代号",
|
|
469
|
+
"max_output_tokens": 200, "previous_response_id": rid},
|
|
470
|
+
headers,
|
|
471
|
+
timeout,
|
|
472
|
+
)
|
|
473
|
+
if not second or second[0] != 200 or not isinstance(second[1], dict):
|
|
474
|
+
return None
|
|
475
|
+
text = "".join(
|
|
476
|
+
c.get("text", "")
|
|
477
|
+
for item in second[1].get("output", [])
|
|
478
|
+
if isinstance(item, dict) and item.get("type") == "message"
|
|
479
|
+
for c in item.get("content", [])
|
|
480
|
+
if isinstance(c, dict)
|
|
481
|
+
)
|
|
482
|
+
return marker in text
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
def _probe_effort_values_sync(client, url, headers, model, timeout):
|
|
486
|
+
accepted = set()
|
|
487
|
+
saw_any = False
|
|
488
|
+
for eff in _EFFORT_CANDIDATES:
|
|
489
|
+
res = _post_json(
|
|
490
|
+
client,
|
|
491
|
+
url,
|
|
492
|
+
{"model": model, "input": "hi", "max_output_tokens": 30,
|
|
493
|
+
"reasoning": {"effort": eff}},
|
|
494
|
+
headers,
|
|
495
|
+
timeout,
|
|
496
|
+
)
|
|
497
|
+
if res is None:
|
|
498
|
+
continue # 故障,不计入
|
|
499
|
+
status, _ = res
|
|
500
|
+
saw_any = True
|
|
501
|
+
if status == 200:
|
|
502
|
+
accepted.add(eff)
|
|
503
|
+
# 400 = 明确拒绝该值,不计入 accepted
|
|
504
|
+
return frozenset(accepted) if saw_any else None
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
async def _probe_effort_values_async(client, url, headers, model, timeout):
|
|
508
|
+
accepted = set()
|
|
509
|
+
saw_any = False
|
|
510
|
+
for eff in _EFFORT_CANDIDATES:
|
|
511
|
+
res = await _post_json_async(
|
|
512
|
+
client,
|
|
513
|
+
url,
|
|
514
|
+
{"model": model, "input": "hi", "max_output_tokens": 30,
|
|
515
|
+
"reasoning": {"effort": eff}},
|
|
516
|
+
headers,
|
|
517
|
+
timeout,
|
|
518
|
+
)
|
|
519
|
+
if res is None:
|
|
520
|
+
continue
|
|
521
|
+
status, _ = res
|
|
522
|
+
saw_any = True
|
|
523
|
+
if status == 200:
|
|
524
|
+
accepted.add(eff)
|
|
525
|
+
return frozenset(accepted) if saw_any else None
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def _probe_reasoning_reliable_sync(client, url, headers, model, timeout, trials=3):
|
|
529
|
+
"""N 次非流式全缺席 reasoning item 才判 False;任一故障或出现就留 None/True。"""
|
|
530
|
+
absences = 0
|
|
531
|
+
for _ in range(trials):
|
|
532
|
+
res = _post_json(
|
|
533
|
+
client,
|
|
534
|
+
url,
|
|
535
|
+
{"model": model, "input": "9.11 和 9.9 哪个大?", "max_output_tokens": 600,
|
|
536
|
+
"reasoning": {"effort": "low"}},
|
|
537
|
+
headers,
|
|
538
|
+
timeout,
|
|
539
|
+
)
|
|
540
|
+
if res is None or res[0] != 200:
|
|
541
|
+
return None # 故障,无法判定
|
|
542
|
+
if _reasoning_item_present(res[1]):
|
|
543
|
+
return True
|
|
544
|
+
absences += 1
|
|
545
|
+
return False if absences == trials else None
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
async def _probe_reasoning_reliable_async(client, url, headers, model, timeout, trials=3):
|
|
549
|
+
absences = 0
|
|
550
|
+
for _ in range(trials):
|
|
551
|
+
res = await _post_json_async(
|
|
552
|
+
client,
|
|
553
|
+
url,
|
|
554
|
+
{"model": model, "input": "9.11 和 9.9 哪个大?", "max_output_tokens": 600,
|
|
555
|
+
"reasoning": {"effort": "low"}},
|
|
556
|
+
headers,
|
|
557
|
+
timeout,
|
|
558
|
+
)
|
|
559
|
+
if res is None or res[0] != 200:
|
|
560
|
+
return None
|
|
561
|
+
if _reasoning_item_present(res[1]):
|
|
562
|
+
return True
|
|
563
|
+
absences += 1
|
|
564
|
+
return False if absences == trials else None
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
def _probe_extended_sync(client, base, key, model, timeout) -> ModelCapabilities:
|
|
568
|
+
caps = ModelCapabilities(checked_at=time.time(), verdict="unknown")
|
|
569
|
+
url = f"{base.rstrip('/')}/responses"
|
|
570
|
+
headers = {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
|
|
571
|
+
caps.store_supported = _probe_store_sync(client, url, headers, model, timeout)
|
|
572
|
+
caps.reasoning_effort_values = _probe_effort_values_sync(
|
|
573
|
+
client, url, headers, model, timeout
|
|
574
|
+
)
|
|
575
|
+
caps.reasoning_item_reliable = _probe_reasoning_reliable_sync(
|
|
576
|
+
client, url, headers, model, timeout
|
|
577
|
+
)
|
|
578
|
+
return caps
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
async def _probe_extended_async(client, base, key, model, timeout) -> ModelCapabilities:
|
|
582
|
+
caps = ModelCapabilities(checked_at=time.time(), verdict="unknown")
|
|
583
|
+
url = f"{base.rstrip('/')}/responses"
|
|
584
|
+
headers = {"Authorization": f"Bearer {key}", "Content-Type": "application/json"}
|
|
585
|
+
caps.store_supported = await _probe_store_async(client, url, headers, model, timeout)
|
|
586
|
+
caps.reasoning_effort_values = await _probe_effort_values_async(
|
|
587
|
+
client, url, headers, model, timeout
|
|
588
|
+
)
|
|
589
|
+
caps.reasoning_item_reliable = await _probe_reasoning_reliable_async(
|
|
590
|
+
client, url, headers, model, timeout
|
|
591
|
+
)
|
|
592
|
+
return caps
|
ksadk/model_proxy/server.py
CHANGED
|
@@ -248,9 +248,10 @@ def create_app(config: ProxyConfig) -> FastAPI:
|
|
|
248
248
|
async def _chat_passthrough_stream(config: ProxyConfig, base: str, headers: dict, body: dict):
|
|
249
249
|
"""chat SSE 字节级透传(不转换),让前缀缓存/流式格式与直连一致。"""
|
|
250
250
|
try:
|
|
251
|
+
stream_headers = {**headers, "Accept": "text/event-stream"}
|
|
251
252
|
async with httpx.AsyncClient(timeout=config.timeout) as c:
|
|
252
253
|
async with c.stream(
|
|
253
|
-
"POST", f"{base}/chat/completions", json=body, headers=
|
|
254
|
+
"POST", f"{base}/chat/completions", json=body, headers=stream_headers
|
|
254
255
|
) as r:
|
|
255
256
|
async for line in r.aiter_lines():
|
|
256
257
|
yield line + "\n"
|
|
@@ -275,10 +276,11 @@ async def _stream_gen(
|
|
|
275
276
|
for e in s.start():
|
|
276
277
|
yield e
|
|
277
278
|
try:
|
|
279
|
+
stream_headers = {**headers, "Accept": "text/event-stream"}
|
|
278
280
|
# 超时必须有界(config.timeout):无限超时的活动 SSE 会让 stop() 后线程仍存活
|
|
279
281
|
async with httpx.AsyncClient(timeout=config.timeout) as c:
|
|
280
282
|
async with c.stream(
|
|
281
|
-
"POST", f"{base}/chat/completions", json=chat_req, headers=
|
|
283
|
+
"POST", f"{base}/chat/completions", json=chat_req, headers=stream_headers
|
|
282
284
|
) as r:
|
|
283
285
|
config.emit(
|
|
284
286
|
"proxy.upstream",
|
ksadk/model_proxy/transform.py
CHANGED
|
@@ -234,13 +234,51 @@ _EFFORT_CAP_PREFIXES = (
|
|
|
234
234
|
("qwen3.5", "high"),
|
|
235
235
|
)
|
|
236
236
|
|
|
237
|
+
# 各上游模型的 reasoning_effort 合法值集合(2026-09 实测,见 tests/model_proxy)。
|
|
238
|
+
# 与 _EFFORT_CAP_PREFIXES 的区别:cap 是"单调钳顶"(qwen 超 cap 钳到 cap);
|
|
239
|
+
# 这里是"值域裁剪"——glm-5.3-flash 是始终思考模型,合法值只有 low/high/max,
|
|
240
|
+
# none/minimal/medium/xhigh 全部 400,无法用单调钳顶表达。
|
|
241
|
+
_EFFORT_ALLOWED_SETS = {
|
|
242
|
+
"glm-5.3-flash": ("low", "high", "max"),
|
|
243
|
+
}
|
|
244
|
+
# 值域裁剪用的档位表:max 视为与 xhigh 同级(5),仅在值域裁剪内部使用,
|
|
245
|
+
# 不改 _EFFORT_RANK(影响 cap 路径)。
|
|
246
|
+
_ALLOWED_RANK = {**_EFFORT_RANK, "max": 5}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def remap_reasoning_effort(model, effort):
|
|
250
|
+
"""把 reasoning_effort 向上取整到该模型的合法值集合(值域裁剪)。
|
|
251
|
+
|
|
252
|
+
规则:档位 >= 入参的最近合法档;无更高档则取集合最高档;未知档位取集合最低档。
|
|
253
|
+
未列出的模型/非字符串原样返回(不做发明式映射)。
|
|
254
|
+
|
|
255
|
+
实测:glm-5.3-flash 始终思考,medium/xhigh/none/minimal 全 400,
|
|
256
|
+
medium→high、xhigh→max、none/minimal→low。
|
|
257
|
+
"""
|
|
258
|
+
if not isinstance(model, str) or not isinstance(effort, str):
|
|
259
|
+
return effort
|
|
260
|
+
allowed = None
|
|
261
|
+
for prefix, vals in _EFFORT_ALLOWED_SETS.items():
|
|
262
|
+
if model.startswith(prefix):
|
|
263
|
+
allowed = vals
|
|
264
|
+
break
|
|
265
|
+
if not allowed or effort in allowed:
|
|
266
|
+
return effort
|
|
267
|
+
r = _ALLOWED_RANK.get(effort)
|
|
268
|
+
if r is None:
|
|
269
|
+
return allowed[0]
|
|
270
|
+
higher = [v for v in allowed if _ALLOWED_RANK[v] >= r]
|
|
271
|
+
return higher[0] if higher else allowed[-1]
|
|
272
|
+
|
|
237
273
|
|
|
238
274
|
def clamp_reasoning_effort(model, effort):
|
|
239
|
-
"""
|
|
275
|
+
"""把 reasoning_effort 适配到上游模型:先做值域裁剪,再做上限钳制。
|
|
240
276
|
|
|
241
|
-
|
|
277
|
+
值域裁剪(remap_reasoning_effort)处理非单调值域(如 glm-5.3-flash 只认
|
|
278
|
+
low/high/max);上限钳制处理单调超 cap(如 qwen3.7 xhigh→high)。
|
|
242
279
|
未知档位/未知模型族原样返回(不做发明式映射)。
|
|
243
280
|
"""
|
|
281
|
+
effort = remap_reasoning_effort(model, effort)
|
|
244
282
|
if not isinstance(effort, str) or effort not in _EFFORT_RANK:
|
|
245
283
|
return effort
|
|
246
284
|
for prefix, cap in _EFFORT_CAP_PREFIXES:
|
ksadk/plugins/__init__.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Versioned contracts for the
|
|
1
|
+
"""Versioned contracts for the Release plugin composition boundary.
|
|
2
2
|
|
|
3
3
|
This package models discovery, deterministic locking, and the controlled
|
|
4
4
|
PluginHost lifecycle. It does not create a second runtime/event store;
|
ksadk/plugins/bridges/dsh.py
CHANGED
|
@@ -998,6 +998,17 @@ class DshProfilePluginBridge:
|
|
|
998
998
|
def _prepare_source(self, source: str) -> _PreparedSource:
|
|
999
999
|
value = source.strip()
|
|
1000
1000
|
candidate = Path(value).expanduser()
|
|
1001
|
+
if not candidate.is_absolute():
|
|
1002
|
+
# dsh CLI 以 Profile 目录为 cwd 解析 add 的源参数;相对当前工作目录
|
|
1003
|
+
# 存在的本地源必须先绝对化,否则会被写成指向不存在位置的 link: 依赖。
|
|
1004
|
+
workspace_relative = self._cwd / candidate
|
|
1005
|
+
if workspace_relative.exists():
|
|
1006
|
+
candidate = workspace_relative
|
|
1007
|
+
elif value.endswith(".tgz"):
|
|
1008
|
+
raise DshPluginMutationError(
|
|
1009
|
+
f"local DSH plugin source does not exist: {value} "
|
|
1010
|
+
f"(resolved against {self._cwd})"
|
|
1011
|
+
)
|
|
1001
1012
|
if not candidate.is_absolute() or not candidate.exists():
|
|
1002
1013
|
return _PreparedSource(value, "", "tgz", "")
|
|
1003
1014
|
local = candidate.resolve()
|
ksadk/plugins/builtins.py
CHANGED
|
@@ -36,6 +36,7 @@ SQLITE_SESSION_STORE_PLUGIN_ID = "io.ksadk.session-store.sqlite"
|
|
|
36
36
|
WORKSPACE_MCP_PLUGIN_ID = "io.ksadk.mcp.workspace"
|
|
37
37
|
WORKSPACE_SKILL_PLUGIN_ID = "io.ksadk.skill.workspace"
|
|
38
38
|
READ_ONLY_CONTEXT_PLUGIN_ID = "io.ksadk.context.bundle-readonly"
|
|
39
|
+
LOCAL_MEMORY_PROVIDER_PLUGIN_ID = "io.ksadk.memory.local-default"
|
|
39
40
|
CORE_RENDERER_PLUGIN_ID = "io.ksadk.renderer.conversation-core"
|
|
40
41
|
|
|
41
42
|
SecretResolver = Callable[[str], str | None]
|
|
@@ -86,7 +87,7 @@ def _manifest(
|
|
|
86
87
|
|
|
87
88
|
|
|
88
89
|
def builtin_capability_manifests() -> tuple[PluginManifest, ...]:
|
|
89
|
-
"""Return the exact, deterministic
|
|
90
|
+
"""Return the exact, deterministic Release built-in capability catalog."""
|
|
90
91
|
|
|
91
92
|
return (
|
|
92
93
|
_manifest(
|
|
@@ -118,6 +119,12 @@ def builtin_capability_manifests() -> tuple[PluginManifest, ...]:
|
|
|
118
119
|
mode="multiple",
|
|
119
120
|
permissions=("filesystem:bundle-read",),
|
|
120
121
|
),
|
|
122
|
+
_manifest(
|
|
123
|
+
LOCAL_MEMORY_PROVIDER_PLUGIN_ID,
|
|
124
|
+
definition="memory.provider/v1",
|
|
125
|
+
slot="memory.primary",
|
|
126
|
+
mode="unique",
|
|
127
|
+
),
|
|
121
128
|
_manifest(
|
|
122
129
|
CORE_RENDERER_PLUGIN_ID,
|
|
123
130
|
definition="session.item.renderer/v1",
|
|
@@ -275,6 +282,27 @@ class WorkspaceMCPRuntime(_BuiltinRuntime):
|
|
|
275
282
|
resolved, "endpointUrl", code="builtin_mcp_endpoint_missing"
|
|
276
283
|
)
|
|
277
284
|
secret_ref = _optional_string(materializer.get("apiKeyRef"))
|
|
285
|
+
if secret_ref is None:
|
|
286
|
+
# 组合器只透传 binding.config;目录资源的凭据声明在合同
|
|
287
|
+
# envRefs 里(例如 Authorization: env://<API_KEY>)。
|
|
288
|
+
# materializer 未显式覆盖时回退读取资源自身 envRefs,
|
|
289
|
+
# 否则 http MCP 少鉴权头必然 401 transport_failed。
|
|
290
|
+
env_refs = resolved.get("envRefs")
|
|
291
|
+
if isinstance(env_refs, Mapping) and env_refs:
|
|
292
|
+
if len(env_refs) > 1:
|
|
293
|
+
raise PluginHostError(
|
|
294
|
+
"builtin_mcp_credentials_unsupported",
|
|
295
|
+
f"workspace MCP {resolved['name']!r} accepts at most "
|
|
296
|
+
"one Authorization credential",
|
|
297
|
+
)
|
|
298
|
+
header_name, reference = next(iter(env_refs.items()))
|
|
299
|
+
if str(header_name).strip().casefold() != "authorization":
|
|
300
|
+
raise PluginHostError(
|
|
301
|
+
"builtin_mcp_credentials_unsupported",
|
|
302
|
+
f"workspace MCP {resolved['name']!r} envRefs header "
|
|
303
|
+
f"{header_name!r} is not supported; use Authorization",
|
|
304
|
+
)
|
|
305
|
+
secret_ref = str(reference).strip()
|
|
278
306
|
api_key: str | None = None
|
|
279
307
|
if secret_ref is not None:
|
|
280
308
|
if not _is_secret_reference(secret_ref):
|
|
@@ -356,7 +384,13 @@ class WorkspaceSkillRuntime(_BuiltinRuntime):
|
|
|
356
384
|
instructions = _required_string(
|
|
357
385
|
item, "instructions", code="builtin_skill_instructions_missing"
|
|
358
386
|
)
|
|
359
|
-
contributions.append(
|
|
387
|
+
contributions.append(
|
|
388
|
+
HarnessSkillContribution(
|
|
389
|
+
name=name,
|
|
390
|
+
instructions=instructions,
|
|
391
|
+
resource_root=directory,
|
|
392
|
+
)
|
|
393
|
+
)
|
|
360
394
|
if not contributions:
|
|
361
395
|
raise PluginHostError(
|
|
362
396
|
"builtin_skill_resource_missing", "workspace Skill has no locked resource"
|
|
@@ -537,6 +571,9 @@ def builtin_capability_factories(
|
|
|
537
571
|
READ_ONLY_CONTEXT_PLUGIN_ID: _SimpleFactory(
|
|
538
572
|
READ_ONLY_CONTEXT_PLUGIN_ID, ReadOnlyBundleContextRuntime
|
|
539
573
|
),
|
|
574
|
+
LOCAL_MEMORY_PROVIDER_PLUGIN_ID: _SimpleFactory(
|
|
575
|
+
LOCAL_MEMORY_PROVIDER_PLUGIN_ID, _BuiltinRuntime
|
|
576
|
+
),
|
|
540
577
|
CORE_RENDERER_PLUGIN_ID: _SimpleFactory(
|
|
541
578
|
CORE_RENDERER_PLUGIN_ID, CoreConversationRendererRuntime
|
|
542
579
|
),
|
|
@@ -730,6 +767,7 @@ def _is_secret_reference(value: str) -> bool:
|
|
|
730
767
|
__all__ = [
|
|
731
768
|
"BUILTIN_PLUGIN_VERSION",
|
|
732
769
|
"CORE_RENDERER_PLUGIN_ID",
|
|
770
|
+
"LOCAL_MEMORY_PROVIDER_PLUGIN_ID",
|
|
733
771
|
"READ_ONLY_CONTEXT_PLUGIN_ID",
|
|
734
772
|
"SQLITE_SESSION_STORE_PLUGIN_ID",
|
|
735
773
|
"WORKSPACE_MCP_PLUGIN_ID",
|