agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +6 -3
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/RECORD +591 -365
- ksadk/_build_provenance.json +1 -1
- ksadk/_process.py +83 -0
- ksadk/_str_enum.py +17 -0
- ksadk/a2ui/core.py +3 -3
- ksadk/api/client.py +6 -0
- ksadk/builders/code_builder.py +38 -12
- ksadk/builders/framework_requirements.py +20 -2
- ksadk/cli/__init__.py +36 -0
- ksadk/cli/cmd_config.py +4 -4
- ksadk/cli/cmd_create.py +12 -12
- ksadk/cli/cmd_hermes.py +24 -2
- ksadk/cli/cmd_invoke.py +28 -5
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +70 -12
- ksadk/cli/cmd_studio.py +64 -16
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/codex/client.py +3 -2
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +125 -31
- ksadk/configs/env_registry_studio.py +86 -0
- ksadk/configs/global_config.py +1 -1
- ksadk/configs/settings.py +3 -3
- ksadk/connector/__init__.py +17 -0
- ksadk/connector/channel.py +477 -0
- ksadk/context_engine/capabilities.py +52 -4
- ksadk/conversations/attachment_storage.py +10 -3
- ksadk/conversations/attachments.py +16 -5
- ksadk/conversations/message_projection.py +23 -32
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_invocation.py +17 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +8 -0
- ksadk/conversations/runtime_persistence.py +105 -9
- ksadk/conversations/runtime_preparation.py +13 -7
- ksadk/conversations/runtime_stream_events.py +29 -35
- ksadk/conversations/runtime_streaming.py +8 -0
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_langgraph_support.py +34 -0
- ksadk/events/session_event.py +2 -2
- ksadk/harness/__init__.py +14 -0
- ksadk/harness/app.py +11 -0
- ksadk/harness/artifact_store.py +213 -0
- ksadk/harness/capabilities.py +115 -0
- ksadk/harness/capability_runtime.py +237 -0
- ksadk/harness/closure_contract.py +92 -0
- ksadk/harness/compaction_record.py +122 -0
- ksadk/harness/compiler.py +284 -0
- ksadk/harness/conformance/__init__.py +33 -0
- ksadk/harness/conformance/contract.py +506 -0
- ksadk/harness/conformance/fixtures.py +102 -0
- ksadk/harness/context_engine.py +403 -0
- ksadk/harness/context_maintenance.py +259 -0
- ksadk/harness/context_manifest.py +188 -0
- ksadk/harness/context_tuning.py +168 -0
- ksadk/harness/draft_runtime.py +322 -0
- ksadk/harness/engine/__init__.py +40 -0
- ksadk/harness/engine/base.py +122 -0
- ksadk/harness/engine/budgets.py +108 -0
- ksadk/harness/engine/capability_declarations.py +59 -0
- ksadk/harness/engine/completion_guard.py +42 -0
- ksadk/harness/engine/context_pipeline.py +579 -0
- ksadk/harness/engine/graph_builder.py +859 -0
- ksadk/harness/engine/langgraph.py +931 -0
- ksadk/harness/engine/mcp_disclosure.py +750 -0
- ksadk/harness/engine/policy_runtime.py +70 -0
- ksadk/harness/engine/postgres_checkpointer.py +63 -0
- ksadk/harness/engine/run_control_bridge.py +80 -0
- ksadk/harness/engine/run_types.py +88 -0
- ksadk/harness/engine/skill_disclosure.py +189 -0
- ksadk/harness/engine/spans.py +41 -0
- ksadk/harness/engine/subagents.py +343 -0
- ksadk/harness/engine/thread_ids.py +112 -0
- ksadk/harness/engine/tool_dispatch.py +144 -0
- ksadk/harness/event_tree.py +212 -0
- ksadk/harness/events.py +461 -0
- ksadk/harness/execution_policy.py +94 -0
- ksadk/harness/insights.py +210 -0
- ksadk/harness/lifecycle.py +578 -0
- ksadk/harness/lifecycle_conformance.py +233 -0
- ksadk/harness/lifecycle_local_plane.py +104 -0
- ksadk/harness/loop/__init__.py +44 -0
- ksadk/harness/loop/reason.py +454 -0
- ksadk/harness/loop/tools.py +762 -0
- ksadk/harness/managed_runtime.py +884 -0
- ksadk/harness/mcp_matrix.py +474 -0
- ksadk/harness/mcp_runtime.py +471 -0
- ksadk/harness/memory_consolidation.py +157 -0
- ksadk/harness/memory_loop.py +156 -0
- ksadk/harness/memory_runtime.py +541 -0
- ksadk/harness/metrics.py +90 -0
- ksadk/harness/model_capability.py +253 -0
- ksadk/harness/model_provider.py +220 -0
- ksadk/harness/observability/__init__.py +29 -0
- ksadk/harness/observability/inspection.py +528 -0
- ksadk/harness/observability/metrics.py +167 -0
- ksadk/harness/observability/otel_exporter.py +218 -0
- ksadk/harness/prompt_cache.py +70 -0
- ksadk/harness/public_activity.py +154 -0
- ksadk/harness/readiness.py +249 -0
- ksadk/harness/reasoner.py +466 -13
- ksadk/harness/release_readiness.py +140 -0
- ksadk/harness/resource_ref.py +69 -0
- ksadk/harness/run_control.py +668 -0
- ksadk/harness/runtime.py +146 -111
- ksadk/harness/runtime_capabilities.py +158 -0
- ksadk/harness/runtime_server.py +514 -0
- ksadk/harness/sandbox_adapters.py +739 -0
- ksadk/harness/sandbox_backend.py +530 -0
- ksadk/harness/sandbox_conformance.py +288 -0
- ksadk/harness/sandbox_lease.py +77 -0
- ksadk/harness/sandbox_lease_conformance.py +259 -0
- ksadk/harness/sandbox_matrix.py +170 -0
- ksadk/harness/sandbox_reconciliation.py +140 -0
- ksadk/harness/sandbox_recovery.py +586 -0
- ksadk/harness/sandbox_recovery_conformance.py +246 -0
- ksadk/harness/session_store.py +243 -0
- ksadk/harness/skill_composition.py +212 -0
- ksadk/harness/skill_feedback.py +123 -0
- ksadk/harness/skill_matrix.py +233 -0
- ksadk/harness/skill_runtime.py +259 -0
- ksadk/harness/spec.py +332 -0
- ksadk/harness/state.py +153 -0
- ksadk/harness/strategies.py +149 -0
- ksadk/harness/subagent.py +253 -0
- ksadk/harness/tool_policy.py +131 -0
- ksadk/harness/tool_receipts.py +96 -0
- ksadk/harness/tool_reliability.py +81 -0
- ksadk/harness/user_errors.py +69 -0
- ksadk/harness/working_context.py +81 -0
- ksadk/harness/working_context_patch.py +99 -0
- ksadk/identity/resolver.py +18 -0
- ksadk/interaction/__init__.py +1 -1
- ksadk/interaction/ledger.py +1 -1
- ksadk/interaction/provider.py +1 -1
- ksadk/interaction/providers/__init__.py +3 -1
- ksadk/interaction/providers/adk.py +1 -1
- ksadk/interaction/providers/codex.py +1 -1
- ksadk/interaction/providers/harness.py +50 -0
- ksadk/interaction/providers/langgraph.py +1 -1
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +86 -102
- ksadk/kernel/contract_fingerprints.py +1 -1
- ksadk/kernel/contracts.py +5 -0
- ksadk/kernel/control.py +32 -1
- ksadk/kernel/execution_grants.py +221 -0
- ksadk/kernel/execution_grants_memory.py +133 -0
- ksadk/kernel/execution_grants_postgres.py +217 -0
- ksadk/kernel/execution_grants_sqlite.py +209 -0
- ksadk/kernel/ingress.py +27 -27
- ksadk/kernel/mapping.py +1 -1
- ksadk/kernel/memory_store.py +24 -11
- ksadk/kernel/postgres_store.py +63 -33
- ksadk/kernel/recovery.py +78 -14
- ksadk/kernel/sql/001_agent_kernel.sql +23 -0
- ksadk/kernel/sqlite_store.py +304 -25
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +69 -2
- ksadk/kernel/worker.py +79 -41
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +47 -0
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +40 -1
- ksadk/memory/models.py +77 -1
- ksadk/memory/provider_resolver.py +5 -0
- ksadk/memory/providers/local_postgres.py +200 -0
- ksadk/memory/providers/local_sqlite.py +42 -3
- ksadk/memory/retrieval.py +189 -0
- ksadk/memory/store_adapter.py +150 -0
- ksadk/model_policy.py +2 -2
- ksadk/model_proxy/detect.py +254 -0
- ksadk/model_proxy/server.py +4 -2
- ksadk/model_proxy/transform.py +40 -2
- ksadk/plugins/__init__.py +1 -1
- ksadk/plugins/bridges/dsh.py +11 -0
- ksadk/plugins/builtins.py +40 -2
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/contracts.py +1 -1
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +101 -19
- ksadk/plugins/execution_host.py +99 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
- ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
- ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
- ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
- ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
- ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
- ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
- ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +10 -2
- ksadk/plugins/providers/dsh_capabilities.py +61 -0
- ksadk/plugins/providers/harness.py +181 -33
- ksadk/plugins/providers/harness_delegation.py +593 -0
- ksadk/plugins/providers/harness_managed.py +456 -0
- ksadk/plugins/providers/harness_tools.py +326 -0
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/subagent_providers/codex.py +28 -6
- ksadk/plugins/teams/__init__.py +5 -0
- ksadk/plugins/teams/api.py +405 -0
- ksadk/plugins/teams/application.py +680 -0
- ksadk/plugins/teams/artifacts.py +60 -0
- ksadk/plugins/teams/context.py +96 -0
- ksadk/plugins/teams/contracts.py +136 -0
- ksadk/plugins/teams/domain.py +1427 -0
- ksadk/plugins/teams/domain_values.py +24 -0
- ksadk/plugins/teams/errors.py +13 -0
- ksadk/plugins/teams/migration.py +311 -0
- ksadk/plugins/teams/migration_cli.py +322 -0
- ksadk/plugins/teams/postgres_store.py +138 -0
- ksadk/plugins/teams/runtime.py +777 -0
- ksadk/plugins/teams/source_projection.py +84 -0
- ksadk/plugins/teams/store.py +311 -0
- ksadk/plugins/teams/task_decisions.py +423 -0
- ksadk/plugins/teams/transport.py +91 -0
- ksadk/plugins/teams/workspaces.py +255 -0
- ksadk/runners/_langgraph_runner_streams.py +121 -45
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +25 -60
- ksadk/runners/langgraph_runner.py +128 -111
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runtime/_runner_adapter/stream_mapping.py +52 -2
- ksadk/runtime/conversation_execution.py +25 -1
- ksadk/runtime/executor.py +9 -1
- ksadk/runtime/factory.py +36 -1
- ksadk/runtime/preprocessing.py +11 -3
- ksadk/runtime/runner_adapter.py +38 -9
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +103 -1
- ksadk/sandbox/backends/e2b.py +245 -23
- ksadk/sandbox/backends/local_process.py +63 -39
- ksadk/sandbox/base.py +62 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/local_controls.py +746 -0
- ksadk/sandbox/local_launcher.py +90 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +64 -9
- ksadk/server/routes/dependencies.py +2 -1
- ksadk/server/routes/kernel_ingress.py +9 -1
- ksadk/server/routes/misc.py +233 -25
- ksadk/server/routes/models.py +3 -3
- ksadk/server/routes/openai_compat.py +76 -13
- ksadk/server/routes/run.py +106 -35
- ksadk/server/routes/sessions.py +244 -68
- ksadk/server/routes/workspace.py +130 -21
- ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-DHuAWfr5.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
- ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-DeBkbJvI.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
- ksadk/server/static/assets/{arc-bTohInsS.js → arc-C35w-pn1.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-BCtGGkhN.js} +1 -1
- ksadk/server/static/assets/channel-_KDifNys.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-Bx1jS-X-.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
- ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-B7nCawed.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
- ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
- ksadk/server/static/assets/{dist-DiixqL0J.js → dist-1nXCdsej.js} +1 -1
- ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-2vL2sAdF.js} +1 -1
- ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B3bA05-e.js} +1 -1
- ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BLpRy_Yx.js} +1 -1
- ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-BO_UwatH.js} +1 -1
- ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-BdNFAney.js} +1 -1
- ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-C0J5_3qM.js} +1 -1
- ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-CGt_UGeO.js} +1 -1
- ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-CIRMvUM4.js} +1 -1
- ksadk/server/static/assets/{dist-BgV_owcB.js → dist-CIpWk_5f.js} +1 -1
- ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-CPyieXEf.js} +1 -1
- ksadk/server/static/assets/{dist-btbmmX5O.js → dist-D-92S-Fd.js} +1 -1
- ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-DNKuMzWc.js} +1 -1
- ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-DWfdmz9s.js} +2 -2
- ksadk/server/static/assets/{dist-DVCOWtha.js → dist-DppE_r-D.js} +1 -1
- ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-DyG6Ya-z.js} +1 -1
- ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-M-SrdhhZ.js} +1 -1
- ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-mqD5TZup.js} +1 -1
- ksadk/server/static/assets/{dist-Cf125P_m.js → dist-n3n6t_FO.js} +1 -1
- ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-qe8xjesy.js} +1 -1
- ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-t6MzE0jU.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Dpz9_0zn.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DcxzRwYC.js} +1 -1
- ksadk/server/static/assets/index-BMd2mucF.css +2 -0
- ksadk/server/static/assets/index-D5qyyhTH.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
- ksadk/server/static/assets/{katex-B4weu383.js → katex-mtjOi4KM.js} +1 -1
- ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-BETqsxE_.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DPWrvs90.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-CJG2mfBP.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-4d78KiEY.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-CMD3x_U_.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/skills/__init__.py +26 -0
- ksadk/skills/events.py +464 -0
- ksadk/skills/manifest_cache.py +263 -0
- ksadk/skills/mcp_server/__init__.py +0 -0
- ksadk/skills/mcp_server/_registry.py +33 -0
- ksadk/skills/mcp_server/_routing.py +26 -0
- ksadk/skills/mcp_server/_workspace_files.py +160 -0
- ksadk/skills/mcp_server/register.py +415 -0
- ksadk/skills/mcp_server/server.py +218 -0
- ksadk/skills/models.py +11 -0
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +75 -2
- ksadk/skills/runtime/agent.py +38 -5
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +393 -52
- ksadk/skills/runtime/backends/local.py +621 -119
- ksadk/skills/runtime/base.py +78 -7
- ksadk/skills/runtime/executor.py +266 -1
- ksadk/skills/runtime/loader.py +108 -3
- ksadk/skills/runtime/request.py +18 -0
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/api.py +592 -57
- ksadk/studio/api_contracts.py +8 -2
- ksadk/studio/api_plugin_routes.py +39 -12
- ksadk/studio/api_resource_connections.py +79 -41
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +4 -2
- ksadk/studio/builder.py +12 -0
- ksadk/studio/capabilities.py +23 -6
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +30 -10
- ksadk/studio/cloud_shared_web.py +75 -2
- ksadk/studio/codex_agent_service.py +2 -2
- ksadk/studio/codex_builder.py +1 -1
- ksadk/studio/codex_run.py +6 -1
- ksadk/studio/compiler.py +10 -0
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contracts.py +33 -5
- ksadk/studio/dsh_application.py +135 -25
- ksadk/studio/dsh_capability_service.py +287 -20
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_provider_registration.py +55 -16
- ksadk/studio/entry.py +53 -0
- ksadk/studio/event_store.py +36 -5
- ksadk/studio/execution_host.py +525 -0
- ksadk/studio/framework_run.py +32 -10
- ksadk/studio/hosted_kernel.py +1 -1
- ksadk/studio/kernel_registry.py +418 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/model_client.py +1178 -64
- ksadk/studio/model_profile_service.py +26 -11
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/plugin_composition.py +13 -2
- ksadk/studio/plugin_kernel_adapter.py +15 -0
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_runtime.py +230 -17
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +59 -32
- ksadk/studio/resource_catalog.py +6 -0
- ksadk/studio/run_activity.py +895 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +329 -33
- ksadk/studio/runtime_catalog.py +53 -10
- ksadk/studio/runtime_source.py +1 -1
- ksadk/studio/scheduler_runtime.py +32 -289
- ksadk/studio/service.py +398 -103
- ksadk/studio/shared_web.py +149 -36
- ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +8 -0
- ksadk/studio/static/assets/CodeBlock-DMIf4h33-UIqo-BPW.js +44 -0
- ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-OhNwH4K9.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
- ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-g0I-I4dD.js +59 -0
- ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
- ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
- ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
- ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
- ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
- ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
- ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
- ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
- ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
- ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
- ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
- ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
- ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
- ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
- ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
- ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
- ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
- ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
- ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
- ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
- ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
- ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
- ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
- ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
- ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
- ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
- ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
- ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
- ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
- ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
- ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
- ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
- ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
- ksadk/studio/static/assets/index-CfEnms6Y.css +2 -0
- ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
- ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
- ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
- ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
- ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
- ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
- ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
- ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
- ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
- ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
- ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
- ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
- ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
- ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
- ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
- ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
- ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
- ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
- ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
- ksadk/studio/static/index.html +8 -2
- ksadk/studio/teams_catalog.py +133 -0
- ksadk/studio/teams_installation.py +214 -0
- ksadk/studio/teams_node.py +545 -0
- ksadk/studio/teams_node_runner.py +69 -0
- ksadk/studio/teams_remote.py +274 -0
- ksadk/studio/templates.py +40 -19
- ksadk/studio/validator.py +13 -0
- ksadk/studio/workspace.py +19 -4
- ksadk/studio/workspace_plugins.py +136 -0
- ksadk/studio/workspace_registry.py +286 -0
- ksadk/toolsets/__init__.py +11 -0
- ksadk/toolsets/skills.py +446 -378
- ksadk/toolsets/workspace.py +3 -3
- ksadk/toolsets/workspace_identity.py +15 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
- ksadk_runtime_common/workspace_files/router.py +26 -13
- ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
- ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
- ksadk/server/static/assets/index-DcTML1Up.css +0 -2
- ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
- ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
- ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
- ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
- ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
- ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
- /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/memory/models.py
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
from dataclasses import dataclass, field
|
|
22
|
-
from typing import Any, Literal
|
|
22
|
+
from typing import Any, Literal, Mapping
|
|
23
23
|
|
|
24
24
|
__all__ = [
|
|
25
25
|
"LongTermMemoryRecord",
|
|
@@ -195,6 +195,50 @@ SensitiveLabel = Literal[
|
|
|
195
195
|
"binary",
|
|
196
196
|
"none",
|
|
197
197
|
]
|
|
198
|
+
#: 敏感级别(长任务方案 §7.2):none=可跨作用域;low=限同作用域;high=禁止入长期 Memory。
|
|
199
|
+
SensitivityLevel = Literal["none", "low", "high"]
|
|
200
|
+
#: 写策略(长任务方案 §7.2):auto=管线自动提交;user_confirm=需用户确认;locked=只读。
|
|
201
|
+
WritePolicy = Literal["auto", "user_confirm", "locked"]
|
|
202
|
+
MemoryArtifactModality = Literal[
|
|
203
|
+
"text", "image", "audio", "video", "document", "binary"
|
|
204
|
+
]
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
@dataclass(frozen=True)
|
|
208
|
+
class MemoryArtifactRef:
|
|
209
|
+
"""长期记忆引用的多模态 Artifact 元数据。
|
|
210
|
+
|
|
211
|
+
这里只保存可审计的引用与内容指纹,绝不保存 base64、文件字节或签名下载
|
|
212
|
+
URL。真正的内容仍由 Artifact Store 按权限读取,默认不会进入 Prompt。
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
uri: str
|
|
216
|
+
mime_type: str
|
|
217
|
+
content_hash: str
|
|
218
|
+
size_bytes: int
|
|
219
|
+
modality: MemoryArtifactModality = "binary"
|
|
220
|
+
|
|
221
|
+
def __post_init__(self) -> None:
|
|
222
|
+
if not self.uri.startswith("artifact://"):
|
|
223
|
+
raise ValueError("Memory Artifact 必须使用 artifact:// 稳定引用")
|
|
224
|
+
if not self.mime_type or "/" not in self.mime_type:
|
|
225
|
+
raise ValueError("Memory Artifact 必须声明合法 MIME type")
|
|
226
|
+
if not self.content_hash or len(self.content_hash) < 16:
|
|
227
|
+
raise ValueError("Memory Artifact 必须携带内容哈希")
|
|
228
|
+
if self.size_bytes < 0:
|
|
229
|
+
raise ValueError("Memory Artifact size_bytes 不能为负数")
|
|
230
|
+
|
|
231
|
+
@classmethod
|
|
232
|
+
def from_value(cls, value: MemoryArtifactRef | Mapping[str, Any]) -> MemoryArtifactRef:
|
|
233
|
+
if isinstance(value, cls):
|
|
234
|
+
return value
|
|
235
|
+
return cls(
|
|
236
|
+
uri=str(value.get("uri") or ""),
|
|
237
|
+
mime_type=str(value.get("mime_type") or ""),
|
|
238
|
+
content_hash=str(value.get("content_hash") or ""),
|
|
239
|
+
size_bytes=int(value.get("size_bytes") or 0),
|
|
240
|
+
modality=str(value.get("modality") or "binary"), # type: ignore[arg-type]
|
|
241
|
+
)
|
|
198
242
|
|
|
199
243
|
|
|
200
244
|
@dataclass(frozen=True)
|
|
@@ -222,6 +266,21 @@ class MemoryRecord:
|
|
|
222
266
|
metadata: dict[str, Any] = field(default_factory=dict)
|
|
223
267
|
created_at: str = ""
|
|
224
268
|
updated_at: str = ""
|
|
269
|
+
# ---- 长任务方案 §7.2 兼容扩展(全部带默认值,additive) ----
|
|
270
|
+
#: 来源 Artifact 引用(大 Tool Result / 摘要正文不进正文,只留引用)。
|
|
271
|
+
source_artifact_refs: tuple[str, ...] = field(default=())
|
|
272
|
+
#: 多模态来源的结构化元数据。只含稳定引用,不含媒体正文或临时下载 URL。
|
|
273
|
+
source_artifacts: tuple[MemoryArtifactRef, ...] = field(default=())
|
|
274
|
+
#: 敏感级别:high 禁止入长期 Memory(须先脱敏);low 限同作用域。
|
|
275
|
+
sensitivity: SensitivityLevel = "none"
|
|
276
|
+
#: 写策略:locked 记录只能显式解锁后更新;user_confirm 需用户确认。
|
|
277
|
+
write_policy: WritePolicy = "auto"
|
|
278
|
+
#: 本记录 supersede 的旧记录(审计链)。
|
|
279
|
+
supersedes: tuple[str, ...] = field(default=())
|
|
280
|
+
|
|
281
|
+
def __post_init__(self) -> None:
|
|
282
|
+
normalized = tuple(MemoryArtifactRef.from_value(item) for item in self.source_artifacts)
|
|
283
|
+
object.__setattr__(self, "source_artifacts", normalized)
|
|
225
284
|
|
|
226
285
|
def is_active_now(self, *, now_iso: str = "") -> bool:
|
|
227
286
|
if self.status != "active":
|
|
@@ -248,6 +307,17 @@ class MemoryCandidate:
|
|
|
248
307
|
sensitive_labels: list[SensitiveLabel] = field(default_factory=list)
|
|
249
308
|
reason: str = ""
|
|
250
309
|
slot_key: str = ""
|
|
310
|
+
# ---- 长任务方案 §7.2 兼容扩展(additive) ----
|
|
311
|
+
source_artifact_refs: tuple[str, ...] = field(default=())
|
|
312
|
+
source_artifacts: tuple[MemoryArtifactRef, ...] = field(default=())
|
|
313
|
+
sensitivity: SensitivityLevel = "none"
|
|
314
|
+
write_policy: WritePolicy = "auto"
|
|
315
|
+
#: TTL(ISO 日期字符串;空 = 不过期)。时效数据必须有来源和 TTL(§7.3)。
|
|
316
|
+
expires_at: str = ""
|
|
317
|
+
|
|
318
|
+
def __post_init__(self) -> None:
|
|
319
|
+
normalized = tuple(MemoryArtifactRef.from_value(item) for item in self.source_artifacts)
|
|
320
|
+
object.__setattr__(self, "source_artifacts", normalized)
|
|
251
321
|
|
|
252
322
|
def is_hard_rejected(self) -> bool:
|
|
253
323
|
return any(label != "none" for label in self.sensitive_labels)
|
|
@@ -274,6 +344,12 @@ class MemorySearchResult:
|
|
|
274
344
|
latency_ms: int
|
|
275
345
|
accounting_accuracy: str
|
|
276
346
|
truncated_by_budget: bool = False
|
|
347
|
+
#: Harness-side retrieval projection. Additive fields keep Provider contracts
|
|
348
|
+
#: stable while making semantic fallback visible to Studio/observability.
|
|
349
|
+
retrieval_strategy: str = "provider"
|
|
350
|
+
reranker_status: str = "not_configured"
|
|
351
|
+
semantic_scorer_status: str = "not_configured"
|
|
352
|
+
dedicated_reranker_status: str = "not_configured"
|
|
277
353
|
|
|
278
354
|
|
|
279
355
|
@dataclass(frozen=True)
|
|
@@ -63,6 +63,11 @@ def resolve_memory_provider(provider_ref: str) -> MemoryProviderLike:
|
|
|
63
63
|
|
|
64
64
|
return LongTermMemoryService.from_env()
|
|
65
65
|
|
|
66
|
+
if ref in ("local-postgres", "postgres"):
|
|
67
|
+
from ksadk.memory.providers.local_postgres import PostgresMemoryProvider
|
|
68
|
+
|
|
69
|
+
return PostgresMemoryProvider()
|
|
70
|
+
|
|
66
71
|
# 默认:持久 SQLite(local-default / local-sqlite / 未知 ref)
|
|
67
72
|
from ksadk.memory.providers.local_sqlite import (
|
|
68
73
|
resolve_default_memory_provider,
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"""Postgres 长期记忆 Provider(分布式后端,plan §9 / 方案 P1)。
|
|
2
|
+
|
|
3
|
+
实现与 :class:`SqliteMemoryProvider` 相同的 MemoryProvider Protocol,
|
|
4
|
+
但用 psycopg 连接 Postgres,支持多副本共享。
|
|
5
|
+
|
|
6
|
+
依赖:``ksadk[postgres]`` extra(psycopg[binary])。缺依赖时显式报错。
|
|
7
|
+
|
|
8
|
+
配置:``KSADK_MEMORY_PROVIDER=local-postgres`` + ``KSADK_MEMORY_POSTGRES_DSN``
|
|
9
|
+
或 ``KSADK_CHECKPOINT_DSN``(复用同一连接串)。
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
import threading
|
|
16
|
+
import time
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from ksadk.memory.models import (
|
|
20
|
+
CoreMemoryRequest,
|
|
21
|
+
MemoryCapabilities,
|
|
22
|
+
MemoryDeleteRequest,
|
|
23
|
+
MemoryDeleteResult,
|
|
24
|
+
MemoryRecord,
|
|
25
|
+
MemorySearchRequest,
|
|
26
|
+
MemorySearchResult,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
_SCHEMA = """
|
|
30
|
+
CREATE TABLE IF NOT EXISTS memory_records (
|
|
31
|
+
memory_id TEXT PRIMARY KEY,
|
|
32
|
+
tenant_id TEXT NOT NULL,
|
|
33
|
+
workspace_id TEXT NOT NULL,
|
|
34
|
+
scope TEXT NOT NULL,
|
|
35
|
+
scope_id TEXT NOT NULL,
|
|
36
|
+
memory_type TEXT NOT NULL DEFAULT 'fact',
|
|
37
|
+
content TEXT NOT NULL,
|
|
38
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
39
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
40
|
+
source_event_ids TEXT NOT NULL DEFAULT '[]',
|
|
41
|
+
sensitive_labels TEXT NOT NULL DEFAULT '[]',
|
|
42
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
43
|
+
importance REAL NOT NULL DEFAULT 0.6,
|
|
44
|
+
created_at REAL NOT NULL,
|
|
45
|
+
updated_at REAL NOT NULL,
|
|
46
|
+
expires_at REAL
|
|
47
|
+
);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_memory_scope
|
|
49
|
+
ON memory_records (tenant_id, workspace_id, scope, scope_id);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_memory_status
|
|
51
|
+
ON memory_records (tenant_id, workspace_id, status);
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class PostgresMemoryProvider:
|
|
56
|
+
"""Postgres 长期记忆 Provider(多副本共享,实现 MemoryProviderLike Protocol)。
|
|
57
|
+
|
|
58
|
+
与 :class:`SqliteMemoryProvider` 接口一致,但用 Postgres 连接。
|
|
59
|
+
线程安全:单连接 + per-thread lock(与 SQLite 版相同策略)。
|
|
60
|
+
``last_error`` 供 Coordinator 区分"吞错返空"与"真无记忆"。
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
capabilities_def = MemoryCapabilities(
|
|
64
|
+
semantic_search=False,
|
|
65
|
+
keyword_search=True,
|
|
66
|
+
metadata_filter=True,
|
|
67
|
+
versioned_update=True,
|
|
68
|
+
hard_delete=True,
|
|
69
|
+
ttl=True,
|
|
70
|
+
max_record_chars=8192,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def __init__(
|
|
74
|
+
self,
|
|
75
|
+
*,
|
|
76
|
+
dsn: str | None = None,
|
|
77
|
+
tenant_id: str = "local",
|
|
78
|
+
workspace_id: str = "local",
|
|
79
|
+
) -> None:
|
|
80
|
+
self._dsn = (
|
|
81
|
+
dsn
|
|
82
|
+
or os.getenv("KSADK_MEMORY_POSTGRES_DSN")
|
|
83
|
+
or os.getenv("KSADK_CHECKPOINT_DSN", "")
|
|
84
|
+
)
|
|
85
|
+
if not self._dsn:
|
|
86
|
+
raise RuntimeError(
|
|
87
|
+
"PostgresMemoryProvider 需要 DSN"
|
|
88
|
+
"(KSADK_MEMORY_POSTGRES_DSN 或 KSADK_CHECKPOINT_DSN)"
|
|
89
|
+
)
|
|
90
|
+
try:
|
|
91
|
+
import psycopg # type: ignore[import-not-found]
|
|
92
|
+
except ImportError as exc:
|
|
93
|
+
raise RuntimeError(
|
|
94
|
+
"PostgresMemoryProvider 需要"
|
|
95
|
+
" ksadk[postgres] extra(psycopg[binary])"
|
|
96
|
+
) from exc
|
|
97
|
+
self._psycopg = psycopg
|
|
98
|
+
self._tenant_id = tenant_id
|
|
99
|
+
self._workspace_id = workspace_id
|
|
100
|
+
self._lock = threading.Lock()
|
|
101
|
+
self._conn = psycopg.connect(self._dsn, autocommit=True)
|
|
102
|
+
self._conn.execute(_SCHEMA)
|
|
103
|
+
self.last_error: str = ""
|
|
104
|
+
|
|
105
|
+
# ---- MemoryProvider Protocol ----
|
|
106
|
+
|
|
107
|
+
def capabilities(self) -> MemoryCapabilities:
|
|
108
|
+
return self.capabilities_def
|
|
109
|
+
|
|
110
|
+
def search(self, request: MemorySearchRequest) -> MemorySearchResult:
|
|
111
|
+
start = time.monotonic()
|
|
112
|
+
try:
|
|
113
|
+
with self._lock:
|
|
114
|
+
query = request.query.strip()
|
|
115
|
+
if not query:
|
|
116
|
+
return MemorySearchResult(
|
|
117
|
+
records=[],
|
|
118
|
+
elapsed_ms=int((time.monotonic() - start) * 1000),
|
|
119
|
+
)
|
|
120
|
+
# keyword search (ILIKE, Postgres 大小写不敏感)
|
|
121
|
+
pattern = f"%{query}%"
|
|
122
|
+
rows = self._conn.execute(
|
|
123
|
+
"""SELECT * FROM memory_records
|
|
124
|
+
WHERE tenant_id = %s AND workspace_id = %s
|
|
125
|
+
AND status = 'active'
|
|
126
|
+
AND (content ILIKE %s)
|
|
127
|
+
ORDER BY importance DESC, updated_at DESC
|
|
128
|
+
LIMIT %s""",
|
|
129
|
+
(self._tenant_id, self._workspace_id, pattern, request.top_k),
|
|
130
|
+
).fetchall()
|
|
131
|
+
records = [self._row_to_record(row) for row in rows]
|
|
132
|
+
return MemorySearchResult(
|
|
133
|
+
records=records,
|
|
134
|
+
elapsed_ms=int((time.monotonic() - start) * 1000),
|
|
135
|
+
)
|
|
136
|
+
except Exception as exc: # noqa: BLE001 - 不阻断主对话
|
|
137
|
+
self.last_error = str(exc)
|
|
138
|
+
return MemorySearchResult(records=[], elapsed_ms=int((time.monotonic() - start) * 1000))
|
|
139
|
+
|
|
140
|
+
def list_core(self, request: CoreMemoryRequest) -> list[MemoryRecord]:
|
|
141
|
+
try:
|
|
142
|
+
with self._lock:
|
|
143
|
+
rows = self._conn.execute(
|
|
144
|
+
"""SELECT * FROM memory_records
|
|
145
|
+
WHERE tenant_id = %s AND workspace_id = %s
|
|
146
|
+
AND status = 'active'
|
|
147
|
+
ORDER BY importance DESC, updated_at DESC
|
|
148
|
+
LIMIT %s""",
|
|
149
|
+
(self._tenant_id, self._workspace_id, request.max_blocks),
|
|
150
|
+
).fetchall()
|
|
151
|
+
return [self._row_to_record(row) for row in rows]
|
|
152
|
+
except Exception as exc: # noqa: BLE001
|
|
153
|
+
self.last_error = str(exc)
|
|
154
|
+
return []
|
|
155
|
+
|
|
156
|
+
def delete(self, request: MemoryDeleteRequest) -> MemoryDeleteResult:
|
|
157
|
+
try:
|
|
158
|
+
with self._lock:
|
|
159
|
+
self._conn.execute(
|
|
160
|
+
"DELETE FROM memory_records WHERE memory_id = %s"
|
|
161
|
+
" AND scope = %s AND scope_id = %s",
|
|
162
|
+
(request.memory_id, request.scope, request.scope_id),
|
|
163
|
+
)
|
|
164
|
+
return MemoryDeleteResult(deleted=True)
|
|
165
|
+
except Exception as exc: # noqa: BLE001
|
|
166
|
+
self.last_error = str(exc)
|
|
167
|
+
return MemoryDeleteResult(deleted=False)
|
|
168
|
+
|
|
169
|
+
def close(self) -> None:
|
|
170
|
+
with self._lock:
|
|
171
|
+
if self._conn:
|
|
172
|
+
self._conn.close()
|
|
173
|
+
|
|
174
|
+
# ---- helpers ----
|
|
175
|
+
|
|
176
|
+
def _row_to_record(self, row: Any) -> MemoryRecord:
|
|
177
|
+
# psycopg Row 可按列名访问
|
|
178
|
+
import json
|
|
179
|
+
|
|
180
|
+
return MemoryRecord(
|
|
181
|
+
memory_id=row["memory_id"],
|
|
182
|
+
tenant_id=row["tenant_id"],
|
|
183
|
+
workspace_id=row["workspace_id"],
|
|
184
|
+
scope=row["scope"],
|
|
185
|
+
scope_id=row["scope_id"],
|
|
186
|
+
memory_type=row["memory_type"],
|
|
187
|
+
content=row["content"],
|
|
188
|
+
version=row["version"],
|
|
189
|
+
status=row["status"],
|
|
190
|
+
source_event_ids=json.loads(row["source_event_ids"] or "[]"),
|
|
191
|
+
sensitive_labels=json.loads(row["sensitive_labels"] or "[]"),
|
|
192
|
+
confidence=row["confidence"],
|
|
193
|
+
importance=row["importance"],
|
|
194
|
+
created_at=row["created_at"],
|
|
195
|
+
updated_at=row["updated_at"],
|
|
196
|
+
expires_at=row["expires_at"],
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
__all__ = ["PostgresMemoryProvider"]
|
|
@@ -16,12 +16,14 @@ import re
|
|
|
16
16
|
import sqlite3
|
|
17
17
|
import threading
|
|
18
18
|
import time
|
|
19
|
+
from dataclasses import asdict
|
|
19
20
|
from datetime import datetime, timedelta, timezone
|
|
20
21
|
from pathlib import Path
|
|
21
22
|
from typing import Any
|
|
22
23
|
|
|
23
24
|
from ksadk.memory.models import (
|
|
24
25
|
CoreMemoryRequest,
|
|
26
|
+
MemoryArtifactRef,
|
|
25
27
|
MemoryCapabilities,
|
|
26
28
|
MemoryDeleteRequest,
|
|
27
29
|
MemoryDeleteResult,
|
|
@@ -82,6 +84,15 @@ def _row_to_record(row: sqlite3.Row) -> MemoryRecord:
|
|
|
82
84
|
metadata=json.loads(row["metadata"] or "{}"),
|
|
83
85
|
created_at=row["created_at"] or "",
|
|
84
86
|
updated_at=row["updated_at"] or "",
|
|
87
|
+
# 长任务方案 §7.2 扩展列(additive migration)。
|
|
88
|
+
source_artifact_refs=tuple(json.loads(row["source_artifact_refs"] or "[]")),
|
|
89
|
+
source_artifacts=tuple(
|
|
90
|
+
MemoryArtifactRef.from_value(item)
|
|
91
|
+
for item in json.loads(row["source_artifacts"] or "[]")
|
|
92
|
+
),
|
|
93
|
+
sensitivity=row["sensitivity"] or "none",
|
|
94
|
+
write_policy=row["write_policy"] or "auto",
|
|
95
|
+
supersedes=tuple(json.loads(row["supersedes"] or "[]")),
|
|
85
96
|
)
|
|
86
97
|
|
|
87
98
|
|
|
@@ -115,6 +126,23 @@ CREATE INDEX IF NOT EXISTS idx_scope ON memory_records(tenant_id, workspace_id,
|
|
|
115
126
|
CREATE INDEX IF NOT EXISTS idx_content_hash ON memory_records(content_hash);
|
|
116
127
|
"""
|
|
117
128
|
|
|
129
|
+
#: 长任务方案 §7.2 扩展列(additive;老库经 ALTER TABLE 补列)。
|
|
130
|
+
_EXTENSION_COLUMNS: tuple[tuple[str, str], ...] = (
|
|
131
|
+
("source_artifact_refs", "TEXT NOT NULL DEFAULT '[]'"),
|
|
132
|
+
("source_artifacts", "TEXT NOT NULL DEFAULT '[]'"),
|
|
133
|
+
("sensitivity", "TEXT NOT NULL DEFAULT 'none'"),
|
|
134
|
+
("write_policy", "TEXT NOT NULL DEFAULT 'auto'"),
|
|
135
|
+
("supersedes", "TEXT NOT NULL DEFAULT '[]'"),
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _migrate(conn: sqlite3.Connection) -> None:
|
|
140
|
+
"""给老库补扩展列(SQLite 无 IF NOT EXISTS for ADD COLUMN,逐列试加)。"""
|
|
141
|
+
existing = {r["name"] for r in conn.execute("PRAGMA table_info(memory_records)")}
|
|
142
|
+
for column, decl in _EXTENSION_COLUMNS:
|
|
143
|
+
if column not in existing:
|
|
144
|
+
conn.execute(f"ALTER TABLE memory_records ADD COLUMN {column} {decl}")
|
|
145
|
+
|
|
118
146
|
|
|
119
147
|
class SqliteMemoryProvider:
|
|
120
148
|
"""本地 SQLite 长期记忆 Provider。
|
|
@@ -154,6 +182,7 @@ class SqliteMemoryProvider:
|
|
|
154
182
|
self._conn = sqlite3.connect(self._db_path, check_same_thread=False)
|
|
155
183
|
self._conn.row_factory = sqlite3.Row
|
|
156
184
|
self._conn.executescript(_SCHEMA)
|
|
185
|
+
_migrate(self._conn)
|
|
157
186
|
self._conn.commit()
|
|
158
187
|
self.last_error: str = ""
|
|
159
188
|
# 每次 Provider 启动执行一次有界清理;不在每次 recall/upsert 热路径扫描全表。
|
|
@@ -230,8 +259,9 @@ class SqliteMemoryProvider:
|
|
|
230
259
|
memory_id, tenant_id, workspace_id, scope, scope_id, memory_type,
|
|
231
260
|
content, summary, status, confidence, importance, valid_from, valid_to,
|
|
232
261
|
expires_at, source_session_id, source_event_ids, source_seq_range,
|
|
233
|
-
content_hash, version, metadata, created_at, updated_at
|
|
234
|
-
|
|
262
|
+
content_hash, version, metadata, created_at, updated_at,
|
|
263
|
+
source_artifact_refs, source_artifacts, sensitivity, write_policy, supersedes
|
|
264
|
+
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
|
235
265
|
ON CONFLICT(memory_id) DO UPDATE SET
|
|
236
266
|
content=excluded.content, summary=excluded.summary, status=excluded.status,
|
|
237
267
|
confidence=excluded.confidence, importance=excluded.importance,
|
|
@@ -239,7 +269,11 @@ class SqliteMemoryProvider:
|
|
|
239
269
|
expires_at=excluded.expires_at, source_event_ids=excluded.source_event_ids,
|
|
240
270
|
source_seq_range=excluded.source_seq_range, content_hash=excluded.content_hash,
|
|
241
271
|
version=excluded.version, metadata=excluded.metadata,
|
|
242
|
-
updated_at=excluded.updated_at
|
|
272
|
+
updated_at=excluded.updated_at,
|
|
273
|
+
source_artifact_refs=excluded.source_artifact_refs,
|
|
274
|
+
source_artifacts=excluded.source_artifacts,
|
|
275
|
+
sensitivity=excluded.sensitivity, write_policy=excluded.write_policy,
|
|
276
|
+
supersedes=excluded.supersedes
|
|
243
277
|
""",
|
|
244
278
|
(
|
|
245
279
|
record.memory_id,
|
|
@@ -264,6 +298,11 @@ class SqliteMemoryProvider:
|
|
|
264
298
|
json.dumps(record.metadata, ensure_ascii=False),
|
|
265
299
|
created,
|
|
266
300
|
now,
|
|
301
|
+
json.dumps(list(record.source_artifact_refs)),
|
|
302
|
+
json.dumps([asdict(item) for item in record.source_artifacts]),
|
|
303
|
+
record.sensitivity,
|
|
304
|
+
record.write_policy,
|
|
305
|
+
json.dumps(list(record.supersedes)),
|
|
267
306
|
),
|
|
268
307
|
)
|
|
269
308
|
self._conn.commit()
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"""混合检索管线(长任务方案 §7.5 P2)。
|
|
2
|
+
|
|
3
|
+
检索策略分层(可插拔,KsADK MemoryRecord 始终是公共协议):
|
|
4
|
+
|
|
5
|
+
.. code-block:: text
|
|
6
|
+
|
|
7
|
+
Tenant / ACL / Scope Filter (Provider SQL 已完成)
|
|
8
|
+
-> Time / Status / TTL Filter(Coordinator.recall 已完成)
|
|
9
|
+
-> Keyword + Vector Search (keyword:词项覆盖率;vector:可选注入)
|
|
10
|
+
-> Rerank (分数融合:coverage 为主,vector 加权)
|
|
11
|
+
-> Deduplicate / Diversity (同 slot_key 只留最高分)
|
|
12
|
+
-> Token Budget Truncation (按分数顺序装箱)
|
|
13
|
+
|
|
14
|
+
本地 SQLite Provider 无向量索引,``vector_score`` 由外部注入(企业
|
|
15
|
+
Memory Service / 向量库适配器提供);缺失时退化为纯关键词管线,不阻塞。
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from typing import Callable, Mapping, Protocol, Sequence
|
|
22
|
+
|
|
23
|
+
from ksadk.memory.models import MemoryRecord
|
|
24
|
+
|
|
25
|
+
#: 多样性控制:同 slot_key 保留的最高分条数。
|
|
26
|
+
_PER_SLOT_LIMIT = 1
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MemorySemanticScorer(Protocol):
|
|
30
|
+
"""Optional semantic scoring boundary for a Memory Service or embedding backend.
|
|
31
|
+
|
|
32
|
+
Implementations return normalized scores in ``[0, 1]`` keyed by ``memory_id``.
|
|
33
|
+
The runtime treats the scorer as an optional enhancement: failures must degrade
|
|
34
|
+
to keyword retrieval instead of failing the conversation.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def score(
|
|
38
|
+
self, *, query: str, records: Sequence[MemoryRecord]
|
|
39
|
+
) -> Mapping[str, float]: ...
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class MemoryReranker(Protocol):
|
|
43
|
+
"""Optional second-stage reranker boundary.
|
|
44
|
+
|
|
45
|
+
A reranker receives the already filtered and cheaply ranked candidate set and
|
|
46
|
+
returns memory ids in preferred order. It may be backed by a cross-encoder,
|
|
47
|
+
a managed rerank API or an organization-specific policy model. The Harness
|
|
48
|
+
validates its output and degrades to the first-stage order on any failure.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def rerank(self, *, query: str, records: Sequence[MemoryRecord]) -> Sequence[str]: ...
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass(frozen=True)
|
|
55
|
+
class RetrievalConfig:
|
|
56
|
+
"""管线参数(Token 截断与多样性,避免硬编码全局常数)。"""
|
|
57
|
+
|
|
58
|
+
top_k: int = 8
|
|
59
|
+
max_tokens: int = 4000
|
|
60
|
+
#: vector 分数权重(0 = 纯关键词)。
|
|
61
|
+
vector_weight: float = 0.0
|
|
62
|
+
per_slot_limit: int = _PER_SLOT_LIMIT
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def keyword_coverage(query: str, content: str) -> float:
|
|
66
|
+
"""查询词项在内容中的覆盖率(0~1;ASCII 词 + CJK 2-gram)。"""
|
|
67
|
+
terms = _query_terms(query)
|
|
68
|
+
if not terms:
|
|
69
|
+
return 0.0
|
|
70
|
+
lowered = content.lower()
|
|
71
|
+
hits = sum(1 for t in terms if t in lowered)
|
|
72
|
+
return round(hits / len(terms), 4)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _query_terms(query: str) -> list[str]:
|
|
76
|
+
from ksadk.memory.providers.local_sqlite import _keyword_query_terms
|
|
77
|
+
|
|
78
|
+
ascii_terms, cjk_terms = _keyword_query_terms(query)
|
|
79
|
+
terms = [t.lower() for t in ascii_terms]
|
|
80
|
+
# CJK 词项直接作为覆盖判据(provider 侧已做 2-gram 切分)。
|
|
81
|
+
terms.extend(cjk_terms)
|
|
82
|
+
return terms
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def rerank_records(
|
|
86
|
+
records: Sequence[MemoryRecord],
|
|
87
|
+
*,
|
|
88
|
+
query: str,
|
|
89
|
+
config: RetrievalConfig | None = None,
|
|
90
|
+
vector_score: Callable[[MemoryRecord], float] | None = None,
|
|
91
|
+
) -> list[MemoryRecord]:
|
|
92
|
+
"""Rerank + 去重/多样性 + Token 截断(§7.5 默认管线)。
|
|
93
|
+
|
|
94
|
+
分数 = (1-w) * keyword_coverage + w * vector_score;无 vector 注入时
|
|
95
|
+
w 强制为 0(退化为纯关键词)。排序后按 slot_key 去重(保留最高分),
|
|
96
|
+
最后按分数顺序做 Token 装箱截断。
|
|
97
|
+
"""
|
|
98
|
+
cfg = config or RetrievalConfig()
|
|
99
|
+
weight = cfg.vector_weight if vector_score is not None else 0.0
|
|
100
|
+
|
|
101
|
+
scored: list[tuple[float, MemoryRecord]] = []
|
|
102
|
+
for record in records:
|
|
103
|
+
kw = keyword_coverage(query, record.content)
|
|
104
|
+
vec = vector_score(record) if vector_score is not None and weight > 0 else 0.0
|
|
105
|
+
score = round((1 - weight) * kw + weight * vec, 4)
|
|
106
|
+
# 综合重要性微调(同分时 importance 高者在前,不改变主序)。
|
|
107
|
+
scored.append((score + record.importance * 1e-6, record))
|
|
108
|
+
scored.sort(key=lambda pair: -pair[0])
|
|
109
|
+
|
|
110
|
+
# Deduplicate / Diversity:同 slot_key 只留最高分(slot_key 取 metadata)。
|
|
111
|
+
seen_slots: dict[str, int] = {}
|
|
112
|
+
diverse: list[MemoryRecord] = []
|
|
113
|
+
for score, record in scored:
|
|
114
|
+
slot = str(record.metadata.get("slot_key") or "")
|
|
115
|
+
if slot:
|
|
116
|
+
count = seen_slots.get(slot, 0)
|
|
117
|
+
if count >= cfg.per_slot_limit:
|
|
118
|
+
continue
|
|
119
|
+
seen_slots[slot] = count + 1
|
|
120
|
+
diverse.append(record)
|
|
121
|
+
if len(diverse) >= cfg.top_k:
|
|
122
|
+
break
|
|
123
|
+
|
|
124
|
+
return _box_by_tokens(diverse, cfg.max_tokens)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def select_ranked_records(
|
|
128
|
+
records: Sequence[MemoryRecord],
|
|
129
|
+
*,
|
|
130
|
+
ranked_ids: Sequence[str],
|
|
131
|
+
top_k: int,
|
|
132
|
+
max_tokens: int,
|
|
133
|
+
per_slot_limit: int = _PER_SLOT_LIMIT,
|
|
134
|
+
) -> list[MemoryRecord]:
|
|
135
|
+
"""Validate a reranker order, preserve diversity and enforce the token budget.
|
|
136
|
+
|
|
137
|
+
Unknown ids, duplicate ids and omitted candidates are rejected. Requiring a
|
|
138
|
+
full permutation prevents a faulty or compromised reranker from silently
|
|
139
|
+
dropping Memory facts. Callers should catch ``ValueError`` and retain the
|
|
140
|
+
first-stage result.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
by_id = {record.memory_id: record for record in records}
|
|
144
|
+
normalized = tuple(str(memory_id) for memory_id in ranked_ids)
|
|
145
|
+
if len(normalized) != len(set(normalized)):
|
|
146
|
+
raise ValueError("reranker returned duplicate memory ids")
|
|
147
|
+
if set(normalized) != set(by_id):
|
|
148
|
+
raise ValueError("reranker must return every candidate exactly once")
|
|
149
|
+
|
|
150
|
+
selected: list[MemoryRecord] = []
|
|
151
|
+
seen_slots: dict[str, int] = {}
|
|
152
|
+
for memory_id in normalized:
|
|
153
|
+
record = by_id[memory_id]
|
|
154
|
+
slot = str(record.metadata.get("slot_key") or "")
|
|
155
|
+
if slot:
|
|
156
|
+
count = seen_slots.get(slot, 0)
|
|
157
|
+
if count >= per_slot_limit:
|
|
158
|
+
continue
|
|
159
|
+
seen_slots[slot] = count + 1
|
|
160
|
+
selected.append(record)
|
|
161
|
+
if len(selected) >= top_k:
|
|
162
|
+
break
|
|
163
|
+
return _box_by_tokens(selected, max_tokens)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _box_by_tokens(records: list[MemoryRecord], max_tokens: int) -> list[MemoryRecord]:
|
|
167
|
+
"""按顺序装箱(§10.6:Token 预算截断)。"""
|
|
168
|
+
from ksadk.context_engine.tokenizer import get_default_token_counter
|
|
169
|
+
|
|
170
|
+
counter = get_default_token_counter()
|
|
171
|
+
total = 0
|
|
172
|
+
out: list[MemoryRecord] = []
|
|
173
|
+
for record in records:
|
|
174
|
+
n = counter.count_text(record.content)
|
|
175
|
+
if total + n > max_tokens:
|
|
176
|
+
break
|
|
177
|
+
total += n
|
|
178
|
+
out.append(record)
|
|
179
|
+
return out
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
__all__ = [
|
|
183
|
+
"MemoryReranker",
|
|
184
|
+
"MemorySemanticScorer",
|
|
185
|
+
"RetrievalConfig",
|
|
186
|
+
"keyword_coverage",
|
|
187
|
+
"rerank_records",
|
|
188
|
+
"select_ranked_records",
|
|
189
|
+
]
|