agentengine-sdk-python 0.8.3__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.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +13 -9
- agentengine_sdk_python-0.8.5.dist-info/RECORD +1296 -0
- 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 +111 -91
- ksadk/builders/code_builder.py +74 -21
- ksadk/builders/framework_requirements.py +22 -3
- ksadk/builders/ks3_uploader.py +36 -7
- ksadk/builders/managed_runtime_builder.py +1 -0
- ksadk/cli/__init__.py +68 -3
- 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_managed_runtime.py +13 -1
- ksadk/cli/cmd_openclaw.py +26 -1
- ksadk/cli/cmd_plugin.py +76 -13
- ksadk/cli/cmd_studio.py +64 -16
- ksadk/cli/cmd_web.py +2 -5
- ksadk/cli/openclaw_env.py +1 -1
- ksadk/cli/resource_common.py +26 -0
- ksadk/cli/runtime_bootstrap.py +23 -1
- ksadk/codex/client.py +425 -96
- ksadk/codex/projection.py +24 -0
- ksadk/codex/runtime.py +56 -298
- ksadk/common/auth.py +16 -10
- ksadk/configs/__init__.py +1 -1
- ksadk/configs/env_registry.py +153 -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 +133 -21
- ksadk/conversations/normalize.py +28 -10
- ksadk/conversations/projector.py +4 -6
- ksadk/conversations/runtime_baseline.py +37 -0
- ksadk/conversations/runtime_invocation.py +22 -4
- ksadk/conversations/runtime_observability.py +39 -10
- ksadk/conversations/runtime_payloads.py +9 -0
- ksadk/conversations/runtime_persistence.py +105 -9
- ksadk/conversations/runtime_preparation.py +42 -33
- ksadk/conversations/runtime_resume.py +50 -2
- ksadk/conversations/runtime_stream_events.py +34 -35
- ksadk/conversations/runtime_streaming.py +33 -7
- ksadk/deployment/env_forward.py +2 -2
- ksadk/deployment/providers/serverless.py +1 -1
- ksadk/events/adapters/_codex_items.py +16 -8
- ksadk/events/adapters/_codex_validators.py +18 -7
- ksadk/events/adapters/_langgraph_support.py +34 -0
- ksadk/events/adapters/langgraph.py +15 -1
- ksadk/events/canonical_store.py +3 -1
- ksadk/events/projections.py +1 -1
- 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/config.py +2 -2
- 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 +171 -136
- 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/tools.py +38 -13
- 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 +2 -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 +2 -1
- ksadk/kernel/__init__.py +10 -0
- ksadk/kernel/approval_presentation.py +91 -0
- ksadk/kernel/authorization.py +1 -1
- ksadk/kernel/bootstrap.py +114 -106
- 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 +42 -29
- 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 +331 -25
- ksadk/kernel/state.py +2 -3
- ksadk/kernel/store.py +72 -2
- ksadk/kernel/worker.py +144 -51
- ksadk/kernel/worker_history.py +72 -0
- ksadk/kernel/worker_identity.py +47 -0
- ksadk/knowledge_base/client.py +57 -27
- ksadk/mcp_runtime/__init__.py +12 -4
- ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
- ksadk/memory/adk/resilient_session_service.py +25 -17
- ksadk/memory/adk/short_term_memory.py +26 -9
- ksadk/memory/coordinator.py +22 -6
- ksadk/memory/extraction.py +40 -1
- ksadk/memory/models.py +84 -5
- ksadk/memory/provider_resolver.py +8 -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 +14 -7
- ksadk/model_proxy/transform.py +40 -2
- ksadk/plugins/__init__.py +5 -1
- ksadk/plugins/artifacts.py +275 -0
- ksadk/plugins/bridges/__init__.py +4 -2
- ksadk/plugins/bridges/codex.py +120 -13
- ksadk/plugins/bridges/dsh.py +351 -156
- ksadk/plugins/builtins.py +72 -35
- ksadk/plugins/bundle_security.py +28 -4
- ksadk/plugins/codex_manifest.py +983 -0
- ksadk/plugins/companion_artifacts.py +83 -0
- ksadk/plugins/companions.py +368 -0
- ksadk/plugins/composition.py +8 -0
- ksadk/plugins/contracts.py +119 -1
- ksadk/plugins/delivery.py +153 -0
- ksadk/plugins/dsh_channels.py +156 -0
- ksadk/plugins/dsh_home.py +140 -0
- ksadk/plugins/dsh_installation_digest.py +71 -0
- ksadk/plugins/dsh_teams.py +105 -0
- ksadk/plugins/dsh_toolchain.py +203 -32
- ksadk/plugins/ecosystem_probe.py +6 -6
- ksadk/plugins/execution_host.py +99 -0
- ksadk/plugins/host.py +102 -39
- ksadk/plugins/kernel_adapter.py +205 -0
- ksadk/plugins/providers/__init__.py +23 -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/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
- ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
- 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/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +920 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
- 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 +115 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +19 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
- ksadk/plugins/providers/codex.py +344 -70
- ksadk/plugins/providers/codex_native.py +368 -0
- ksadk/plugins/providers/codex_turn.py +301 -0
- ksadk/plugins/providers/dsh_capabilities.py +1450 -0
- ksadk/plugins/providers/dsh_mcp.py +467 -0
- ksadk/plugins/providers/harness.py +294 -141
- 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/mcp_projection.py +150 -0
- ksadk/plugins/providers/platform_resources.py +657 -0
- ksadk/plugins/providers/shipped_dsh.py +4 -1
- ksadk/plugins/resolver.py +8 -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/resource_runtime/__init__.py +4 -0
- ksadk/resource_runtime/broker.py +616 -0
- ksadk/resource_runtime/build_artifacts.py +165 -0
- ksadk/resource_runtime/contracts.py +138 -0
- ksadk/resource_runtime/discovery_receipts.py +100 -0
- ksadk/resource_runtime/discovery_skills.py +172 -0
- ksadk/resource_runtime/errors.py +6 -0
- ksadk/resource_runtime/ipc.py +142 -0
- ksadk/resource_runtime/kernel_approval.py +165 -0
- ksadk/resource_runtime/knowledge.py +114 -0
- ksadk/resource_runtime/langgraph.py +94 -0
- ksadk/resource_runtime/leases.py +191 -0
- ksadk/resource_runtime/managed_projection.py +186 -0
- ksadk/resource_runtime/mcp_server.py +138 -0
- ksadk/resource_runtime/memory_provider.py +318 -0
- ksadk/resource_runtime/memory_receipts.py +34 -0
- ksadk/resource_runtime/operation_ledger.py +211 -0
- ksadk/resource_runtime/plugin_config.py +48 -0
- ksadk/resource_runtime/policy_authorization.py +54 -0
- ksadk/resource_runtime/process.py +110 -0
- ksadk/resource_runtime/skill_artifacts.py +153 -0
- ksadk/resource_runtime/skill_runtime.py +42 -0
- ksadk/resource_runtime/skill_workspace.py +118 -0
- ksadk/resource_runtime/skills.py +215 -0
- ksadk/resource_runtime/snapshots.py +180 -0
- ksadk/resource_runtime/socket_server.py +103 -0
- ksadk/resource_runtime/supervisor.py +380 -0
- ksadk/resource_runtime/worker.py +504 -0
- ksadk/runners/_langgraph_runner_streams.py +182 -38
- ksadk/runners/_langgraph_state_reader.py +106 -0
- ksadk/runners/_session_identity.py +285 -0
- ksadk/runners/adk_runner.py +166 -63
- ksadk/runners/base_runner.py +29 -1
- ksadk/runners/langgraph_runner.py +542 -195
- ksadk/runners/patch_langchain.py +47 -0
- ksadk/runners/usage_accumulator.py +11 -3
- ksadk/runtime/_runner_adapter/stream_mapping.py +194 -20
- ksadk/runtime/adapter.py +2 -0
- ksadk/runtime/conversation_execution.py +117 -17
- ksadk/runtime/executor.py +87 -3
- ksadk/runtime/factory.py +65 -274
- ksadk/runtime/framework_adapters.py +23 -0
- ksadk/runtime/preprocessing.py +21 -5
- ksadk/runtime/runner_adapter.py +106 -18
- ksadk/runtime/skill_eval_result.py +36 -0
- ksadk/runtime/timing.py +46 -0
- ksadk/runtime/usage.py +49 -18
- ksadk/runtime_context.py +142 -2
- ksadk/sandbox/backends/e2b.py +288 -25
- ksadk/sandbox/backends/local_process.py +72 -39
- ksadk/sandbox/base.py +64 -1
- ksadk/sandbox/diagnostics.py +82 -0
- ksadk/sandbox/e2b_connection.py +66 -0
- ksadk/sandbox/local_controls.py +746 -0
- ksadk/sandbox/local_launcher.py +90 -0
- ksadk/scheduler/dispatcher.py +1 -1
- ksadk/scheduler/sqlite_store.py +18 -0
- ksadk/server/composition.py +2 -0
- ksadk/server/factory.py +5 -0
- ksadk/server/invocation_identity.py +118 -0
- ksadk/server/persistence_capability.py +516 -0
- ksadk/server/routes/common.py +32 -3
- ksadk/server/routes/control.py +271 -52
- ksadk/server/routes/dependencies.py +16 -0
- ksadk/server/routes/kernel_ingress.py +9 -1
- ksadk/server/routes/misc.py +233 -25
- ksadk/server/routes/models.py +47 -4
- ksadk/server/routes/openai_compat.py +76 -13
- ksadk/server/routes/projection.py +252 -12
- ksadk/server/routes/run.py +106 -35
- ksadk/server/routes/sessions.py +491 -138
- ksadk/server/routes/streaming.py +43 -9
- ksadk/server/routes/workspace.py +130 -21
- ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-DHuAWfr5.js} +10 -7
- ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
- ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-DeBkbJvI.js} +9 -9
- ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
- ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-C35w-pn1.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.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-bZ7ws-8m.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.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-CkonRdAS.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
- ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-B7nCawed.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
- ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
- ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-1nXCdsej.js} +1 -1
- ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-2vL2sAdF.js} +1 -1
- ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-B3bA05-e.js} +1 -1
- ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-BLpRy_Yx.js} +1 -1
- ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-BO_UwatH.js} +1 -1
- ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-BdNFAney.js} +1 -1
- ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-C0J5_3qM.js} +1 -1
- ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-CGt_UGeO.js} +1 -1
- ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CIRMvUM4.js} +1 -1
- ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-CIpWk_5f.js} +1 -1
- ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-CPyieXEf.js} +1 -1
- ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-D-92S-Fd.js} +1 -1
- ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-DNKuMzWc.js} +1 -1
- ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-DWfdmz9s.js} +2 -2
- ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DppE_r-D.js} +1 -1
- ksadk/server/static/assets/{dist-C71CsujO.js → dist-DyG6Ya-z.js} +1 -1
- ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-M-SrdhhZ.js} +1 -1
- ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-mqD5TZup.js} +1 -1
- ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-n3n6t_FO.js} +1 -1
- ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-qe8xjesy.js} +1 -1
- ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-t6MzE0jU.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.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-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.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-CgoyWiDR.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
- ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-mtjOi4KM.js} +1 -1
- ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-BETqsxE_.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-DPWrvs90.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.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-BQVc9ia_.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.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-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.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-EnNl0DE7.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/server/terminal_sessions.py +34 -2
- ksadk/session_context.py +66 -0
- ksadk/sessions/__init__.py +11 -21
- ksadk/sessions/_local_service_sync.py +263 -1
- ksadk/sessions/base.py +176 -0
- ksadk/sessions/errors.py +4 -0
- ksadk/sessions/in_memory.py +309 -19
- ksadk/sessions/invocation_identity.py +235 -0
- ksadk/sessions/local_service.py +83 -1
- ksadk/sessions/persistence.py +275 -0
- ksadk/sessions/postgres_service.py +358 -0
- ksadk/sessions/resilience.py +8 -0
- ksadk/sessions/resilient.py +362 -4
- ksadk/sessions/topology.py +135 -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 +37 -4
- ksadk/skills/observability.py +132 -0
- ksadk/skills/package_store.py +261 -40
- ksadk/skills/runtime/agent.py +67 -9
- ksadk/skills/runtime/artifact_delivery.py +139 -0
- ksadk/skills/runtime/artifacts.py +87 -0
- ksadk/skills/runtime/backends/e2b.py +460 -27
- ksadk/skills/runtime/backends/local.py +629 -62
- ksadk/skills/runtime/base.py +81 -7
- ksadk/skills/runtime/executor.py +268 -1
- ksadk/skills/runtime/loader.py +118 -5
- ksadk/skills/runtime/pinned.py +114 -0
- ksadk/skills/runtime/request.py +49 -0
- ksadk/skills/service_client.py +167 -28
- ksadk/skills/tool_defs.py +108 -3
- ksadk/studio/api.py +810 -93
- ksadk/studio/api_catalog_routes.py +18 -0
- ksadk/studio/api_contracts.py +8 -2
- ksadk/studio/api_plugin_routes.py +562 -104
- ksadk/studio/api_resource_connections.py +221 -0
- ksadk/studio/authoring.py +12 -6
- ksadk/studio/authoring_coordinator.py +23 -16
- ksadk/studio/builder.py +88 -0
- ksadk/studio/capabilities.py +23 -6
- ksadk/studio/channel_connections.py +333 -0
- ksadk/studio/cloud.py +370 -112
- ksadk/studio/cloud_shared_web.py +638 -0
- ksadk/studio/codex_agent_service.py +130 -28
- ksadk/studio/codex_builder.py +242 -3
- ksadk/studio/codex_credentials.py +90 -0
- ksadk/studio/codex_manifest.py +31 -4
- ksadk/studio/codex_plugin_store.py +746 -0
- ksadk/studio/codex_provider_build.py +231 -0
- ksadk/studio/codex_run.py +190 -26
- ksadk/studio/compatibility_report.py +12 -1
- ksadk/studio/compiler.py +88 -14
- ksadk/studio/configuration.py +182 -0
- ksadk/studio/contracts.py +165 -11
- ksadk/studio/dsh_application.py +247 -0
- ksadk/studio/dsh_capability_service.py +1374 -0
- ksadk/studio/dsh_lifecycle.py +58 -0
- ksadk/studio/dsh_models.py +59 -0
- ksadk/studio/dsh_provider_registration.py +367 -21
- 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 +89 -14
- ksadk/studio/kernel_registry.py +418 -0
- ksadk/studio/kernel_sqlite_migration.py +181 -0
- ksadk/studio/mcp_runtime.py +11 -3
- ksadk/studio/model_client.py +1180 -66
- ksadk/studio/model_profile_service.py +26 -11
- ksadk/studio/native_documents.py +172 -0
- ksadk/studio/plugin_composition.py +202 -24
- ksadk/studio/plugin_kernel_adapter.py +21 -106
- ksadk/studio/plugin_lifecycle.py +80 -0
- ksadk/studio/plugin_runtime.py +448 -56
- ksadk/studio/provider_recovery.py +59 -0
- ksadk/studio/recovery_page.py +70 -0
- ksadk/studio/resource_authority.py +664 -0
- ksadk/studio/resource_binding_validation.py +77 -0
- ksadk/studio/resource_build_admission.py +196 -0
- ksadk/studio/resource_build_materializer.py +149 -0
- ksadk/studio/resource_catalog.py +149 -2
- ksadk/studio/resource_connections.py +220 -0
- ksadk/studio/run_activity.py +895 -0
- ksadk/studio/run_documents.py +127 -0
- ksadk/studio/run_service.py +789 -83
- ksadk/studio/runtime_catalog.py +53 -10
- ksadk/studio/runtime_source.py +16 -8
- ksadk/studio/scheduler_assistant.py +317 -0
- ksadk/studio/scheduler_runtime.py +32 -280
- ksadk/studio/scheduler_service.py +3 -0
- ksadk/studio/service.py +861 -120
- ksadk/studio/shared_web.py +579 -82
- 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/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-BEOyPC3w.css +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/arc-Pry-7G1_.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/array-BifhSqXX.js +1 -0
- ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CLB4L11u.js +129 -0
- ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BOma_Z_F.js +38 -0
- 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-2Q5K7J3B-C1jixKkw.js +1 -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-DVtDP4rm.js +62 -0
- ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
- ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -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-CpEZCUgg.js +128 -0
- ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
- ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
- ksadk/studio/static/assets/chunk-GMAD6QVW-DE_8H717.js +72 -0
- 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-D38axYOR.js +231 -0
- ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- 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-DiCQjx9b.js +10 -0
- ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
- ksadk/studio/static/assets/chunk-P2QGCYS3-VdhKmfYq.js +1 -0
- 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-DsCFnRVE.js +168 -0
- ksadk/studio/static/assets/chunk-SVP7TREG-DljApgRX.js +88 -0
- ksadk/studio/static/assets/chunk-TICWLB2K-DWqRtyqa.js +206 -0
- 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/chunk-Y2CYZVJY-DsF7k-Jl.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/cytoscape.esm-CGd-uY3x.js +321 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
- ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
- ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
- ksadk/studio/static/assets/diagram-S7CK7UJ4-C6aH78c4.js +30 -0
- 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/dist-v5Q1xZ2K.js +1 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
- ksadk/studio/static/assets/erDiagram-RLTQ6QDP-CGthTMmJ.js +99 -0
- 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/graphlib-DS17s2tU.js +1 -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/init-C-OQMol4.js +1 -0
- ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-BUGEl8cO.js +70 -0
- ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-Ch2ZYxvr.js +139 -0
- ksadk/studio/static/assets/kanban-definition-UXKFOSKX-Da-Fp4vC.js +89 -0
- ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
- ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
- ksadk/studio/static/assets/line-BDaeq300.js +1 -0
- 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-CvlsVQ38.js +96 -0
- ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
- ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
- ksadk/studio/static/assets/path-fybaL0A-.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-DlrWiSOv.js +39 -0
- 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-BA3hpUZM.js +7 -0
- 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-E-Ge0FcV.js +84 -0
- ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
- ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
- ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-CcElXGg4.js +162 -0
- ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- 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-CIuYhNy3.js +120 -0
- 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-CMJiaedy.js +78 -0
- ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-BdgtMvW2.js +7 -0
- 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
- agentengine_sdk_python-0.8.3.dist-info/RECORD +0 -833
- ksadk/server/static/assets/MathMessageMarkdown-D9uB55Oh.js +0 -8
- ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +0 -1
- ksadk/server/static/assets/channel-s354Yo6o.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +0 -1
- ksadk/server/static/assets/dist-DdRBIceA.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +0 -1
- ksadk/server/static/assets/index-B2k_urY8.js +0 -241
- ksadk/server/static/assets/index-ILPt6IWF.css +0 -2
- ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +0 -1
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
- ksadk/studio/static/assets/index-DXs1Eq4M.css +0 -1
- ksadk/studio/static/assets/index-DeDqwTsD.js +0 -283
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
"""Skill Center MCP registration entry point.
|
|
2
|
+
|
|
3
|
+
Replaces inline Python in skill-center-mcp-register.sh.
|
|
4
|
+
Handles three registration paths:
|
|
5
|
+
1. mcporter (Hermes and other mcporter-aware runtimes)
|
|
6
|
+
2. OpenClaw config (openclaw.json -> mcp.servers)
|
|
7
|
+
3. Hermes config (config.yaml -> mcp_servers)
|
|
8
|
+
|
|
9
|
+
Also prefetches skill manifests and injects them into workspace context files
|
|
10
|
+
so the LLM can discover skills without calling list_skills first.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
import shutil
|
|
19
|
+
import sys
|
|
20
|
+
|
|
21
|
+
from ksadk.skills.mcp_server._routing import skill_routing_instructions
|
|
22
|
+
from ksadk.skills.mcp_server._workspace_files import (
|
|
23
|
+
cleanup_skills,
|
|
24
|
+
update_text,
|
|
25
|
+
write_skill,
|
|
26
|
+
)
|
|
27
|
+
from ksadk.skills.mcp_server._workspace_files import (
|
|
28
|
+
is_skill_name as _is_safe_single_segment,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger("ksadk.skills.mcp_server.register")
|
|
32
|
+
|
|
33
|
+
MCP_NAME = "ksadk-skill-center"
|
|
34
|
+
MCP_COMMAND = "python3 -m ksadk.skills.mcp_server.server"
|
|
35
|
+
|
|
36
|
+
ENV_VARS_TO_COLLECT = [
|
|
37
|
+
"SKILL_SPACE_ID",
|
|
38
|
+
"KSADK_SKILL_SERVICE_URL",
|
|
39
|
+
"KSADK_SKILL_SERVICE_REGION",
|
|
40
|
+
"KSADK_SKILL_SERVICE_ACCESS_KEY",
|
|
41
|
+
"KSADK_SKILL_SERVICE_SECRET_KEY",
|
|
42
|
+
"KSADK_SKILL_RUNTIME_BACKEND",
|
|
43
|
+
"KSADK_SANDBOX_TEMPLATE_ID",
|
|
44
|
+
"KSADK_SANDBOX_API_KEY",
|
|
45
|
+
"E2B_API_KEY",
|
|
46
|
+
"E2B_ACCESS_TOKEN",
|
|
47
|
+
"KSADK_SKILL_SERVICE_ENDPOINT",
|
|
48
|
+
"KSADK_SKILL_SERVICE_SCHEME",
|
|
49
|
+
"KSADK_AICP_ENDPOINT_MODE",
|
|
50
|
+
"KSADK_TOOL_APPROVAL_MODE",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
_SKILL_SERVICE_CREDENTIAL_FALLBACKS = {
|
|
55
|
+
"KSADK_SKILL_SERVICE_ACCESS_KEY": ("KSYUN_ACCESS_KEY", "KS3_ACCESS_KEY"),
|
|
56
|
+
"KSADK_SKILL_SERVICE_SECRET_KEY": ("KSYUN_SECRET_KEY", "KS3_SECRET_KEY"),
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _collect_env() -> dict[str, str]:
|
|
61
|
+
env_vars: dict[str, str] = {}
|
|
62
|
+
for key in ENV_VARS_TO_COLLECT:
|
|
63
|
+
val = os.environ.get(key, "").strip()
|
|
64
|
+
if val:
|
|
65
|
+
env_vars[key] = val
|
|
66
|
+
# Fallback: when KSADK_SKILL_SERVICE_ACCESS_KEY/SECRET_KEY are not set,
|
|
67
|
+
# use KSYUN_ACCESS_KEY/KSYUN_SECRET_KEY (forwarded to the pod by
|
|
68
|
+
# forward_shell_process_env) so users do not need to manually pass
|
|
69
|
+
# --env KSADK_SKILL_SERVICE_ACCESS_KEY=... --env KSADK_SKILL_SERVICE_SECRET_KEY=...
|
|
70
|
+
if env_vars.get("SKILL_SPACE_ID"):
|
|
71
|
+
for target, sources in _SKILL_SERVICE_CREDENTIAL_FALLBACKS.items():
|
|
72
|
+
if target in env_vars:
|
|
73
|
+
continue
|
|
74
|
+
for source in sources:
|
|
75
|
+
value = os.environ.get(source, "").strip()
|
|
76
|
+
if value:
|
|
77
|
+
env_vars[target] = value
|
|
78
|
+
break
|
|
79
|
+
if not env_vars.get("KSADK_SKILL_SERVICE_URL"):
|
|
80
|
+
try:
|
|
81
|
+
from ksadk.skills.service_env import resolve_skill_service_url
|
|
82
|
+
|
|
83
|
+
url = resolve_skill_service_url(require_spaces=False)
|
|
84
|
+
if url:
|
|
85
|
+
env_vars["KSADK_SKILL_SERVICE_URL"] = url
|
|
86
|
+
except Exception:
|
|
87
|
+
pass
|
|
88
|
+
return env_vars
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _hermes_home() -> str:
|
|
92
|
+
"""Return the Hermes home directory from env, falling back to sane defaults.
|
|
93
|
+
|
|
94
|
+
v2026.8.31 uses /opt/data; v2026.8.19 uses /home/node/.hermes.
|
|
95
|
+
"""
|
|
96
|
+
explicit = os.environ.get("HERMES_HOME")
|
|
97
|
+
if explicit:
|
|
98
|
+
return explicit
|
|
99
|
+
home = os.environ.get("HOME") or "/opt/data"
|
|
100
|
+
if home == "/opt/data":
|
|
101
|
+
return home
|
|
102
|
+
return os.path.join(home, ".hermes")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _split_command(cmd_str: str) -> dict[str, object]:
|
|
106
|
+
parts = cmd_str.split()
|
|
107
|
+
return {"command": parts[0], "args": parts[1:]}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _register_mcporter(env: dict[str, str]) -> None:
|
|
111
|
+
import subprocess
|
|
112
|
+
|
|
113
|
+
if not shutil.which("mcporter"):
|
|
114
|
+
return
|
|
115
|
+
subprocess.run(["mcporter", "config", "remove", MCP_NAME], capture_output=True)
|
|
116
|
+
cmd = ["mcporter", "config", "add", MCP_NAME, "--command", MCP_COMMAND, "--transport", "stdio"]
|
|
117
|
+
subprocess.run(cmd, capture_output=True)
|
|
118
|
+
logger.info("mcporter registration: %s", MCP_NAME)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _register_openclaw(env: dict[str, str]) -> None:
|
|
122
|
+
config_path = os.environ.get("OPENCLAW_CONFIG_PATH", "/home/node/.openclaw/openclaw.json")
|
|
123
|
+
if not os.path.isfile(config_path):
|
|
124
|
+
return
|
|
125
|
+
try:
|
|
126
|
+
with open(config_path) as f:
|
|
127
|
+
cfg = json.load(f)
|
|
128
|
+
gw = cfg.get("gateway", {})
|
|
129
|
+
gw.pop("mcpServers", None)
|
|
130
|
+
mcp = cfg.setdefault("mcp", {})
|
|
131
|
+
servers = mcp.setdefault("servers", {})
|
|
132
|
+
entry = _split_command(MCP_COMMAND)
|
|
133
|
+
if env:
|
|
134
|
+
entry["env"] = env
|
|
135
|
+
servers[MCP_NAME] = entry
|
|
136
|
+
with open(config_path, "w") as f:
|
|
137
|
+
json.dump(cfg, f, indent=2, ensure_ascii=False)
|
|
138
|
+
logger.info("OpenClaw config injection: %s -> %s", MCP_NAME, config_path)
|
|
139
|
+
except Exception as exc:
|
|
140
|
+
logger.warning("OpenClaw config injection failed: %s", exc)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _register_hermes(env: dict[str, str]) -> None:
|
|
144
|
+
try:
|
|
145
|
+
import yaml
|
|
146
|
+
except ImportError:
|
|
147
|
+
logger.warning("PyYAML not available; skipping Hermes config injection")
|
|
148
|
+
return
|
|
149
|
+
config_path = os.environ.get("HERMES_CONFIG_PATH", os.path.join(_hermes_home(), "config.yaml"))
|
|
150
|
+
if not os.path.isfile(config_path):
|
|
151
|
+
return
|
|
152
|
+
try:
|
|
153
|
+
with open(config_path) as f:
|
|
154
|
+
cfg = yaml.safe_load(f) or {}
|
|
155
|
+
servers = cfg.setdefault("mcp_servers", {})
|
|
156
|
+
servers.pop(MCP_NAME, None)
|
|
157
|
+
entry = _split_command(MCP_COMMAND)
|
|
158
|
+
entry["enabled"] = True
|
|
159
|
+
if env:
|
|
160
|
+
entry["env"] = env
|
|
161
|
+
servers[MCP_NAME] = entry
|
|
162
|
+
with open(config_path, "w") as f:
|
|
163
|
+
yaml.dump(cfg, f, default_flow_style=False, allow_unicode=True)
|
|
164
|
+
logger.info("Hermes config injection: %s -> %s", MCP_NAME, config_path)
|
|
165
|
+
except Exception as exc:
|
|
166
|
+
logger.warning("Hermes config injection failed: %s", exc)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _prefetch_manifest_to_workspace() -> None:
|
|
170
|
+
"""Prefetch skill manifests and inject into workspace context files.
|
|
171
|
+
|
|
172
|
+
For OpenClaw: appends a Skills section to TOOLS.md in the workspace.
|
|
173
|
+
For Hermes: creates a skill entry under ~/.hermes/skills/ so Hermes
|
|
174
|
+
includes Skill Center in the system-prompt block.
|
|
175
|
+
This lets the LLM discover available skills at startup without calling
|
|
176
|
+
list_skills first.
|
|
177
|
+
"""
|
|
178
|
+
skill_space_id = os.environ.get("SKILL_SPACE_ID", "").strip()
|
|
179
|
+
if not skill_space_id:
|
|
180
|
+
return
|
|
181
|
+
try:
|
|
182
|
+
from ksadk.skills.manifest_cache import get_manifest_cache
|
|
183
|
+
|
|
184
|
+
cache = get_manifest_cache()
|
|
185
|
+
items = cache.get_all()
|
|
186
|
+
instruction_text = cache.build_instruction_text() if items else ""
|
|
187
|
+
_inject_openclaw_workspace(instruction_text)
|
|
188
|
+
_inject_openclaw_skill_hub(instruction_text, items)
|
|
189
|
+
_inject_hermes_skill_hub(instruction_text, items)
|
|
190
|
+
if not items:
|
|
191
|
+
logger.info("Manifest prefetch: no skills found in space %s", skill_space_id)
|
|
192
|
+
else:
|
|
193
|
+
logger.info(
|
|
194
|
+
"Manifest prefetch completed for space %s (%d skills)", skill_space_id, len(items)
|
|
195
|
+
)
|
|
196
|
+
except Exception as exc:
|
|
197
|
+
logger.warning("Manifest prefetch failed: %s", exc)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _remove_managed_blocks(existing: str) -> str:
|
|
201
|
+
# Only exact, complete marker pairs establish ownership. Preserve old-format
|
|
202
|
+
# text and incomplete blocks because their end boundary is unknown.
|
|
203
|
+
kept: list[str] = []
|
|
204
|
+
pending: list[str] = []
|
|
205
|
+
for line in existing.splitlines(keepends=True):
|
|
206
|
+
marker = line.rstrip("\r\n")
|
|
207
|
+
if marker == "<!-- skill-center-start -->":
|
|
208
|
+
kept.extend(pending)
|
|
209
|
+
pending = [line]
|
|
210
|
+
elif marker == "<!-- skill-center-end -->" and pending:
|
|
211
|
+
pending = []
|
|
212
|
+
elif pending:
|
|
213
|
+
pending.append(line)
|
|
214
|
+
else:
|
|
215
|
+
kept.append(line)
|
|
216
|
+
kept.extend(pending)
|
|
217
|
+
return "".join(kept)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def _inject_openclaw_workspace(instruction_text: str) -> None:
|
|
221
|
+
tools_md = os.environ.get("OPENCLAW_TOOLS_MD", "/home/node/.openclaw/workspace/TOOLS.md")
|
|
222
|
+
|
|
223
|
+
def refresh(existing: str) -> str:
|
|
224
|
+
existing = _remove_managed_blocks(existing)
|
|
225
|
+
if not instruction_text.strip():
|
|
226
|
+
return existing
|
|
227
|
+
separator = (
|
|
228
|
+
""
|
|
229
|
+
if not existing or existing.endswith("\n\n")
|
|
230
|
+
else ("\n" if existing.endswith("\n") else "\n\n")
|
|
231
|
+
)
|
|
232
|
+
return (
|
|
233
|
+
existing
|
|
234
|
+
+ separator
|
|
235
|
+
+ "<!-- skill-center-start -->\n"
|
|
236
|
+
+ instruction_text.strip()
|
|
237
|
+
+ "\n<!-- skill-center-end -->\n"
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
try:
|
|
241
|
+
update_text(tools_md, refresh)
|
|
242
|
+
logger.info("OpenClaw workspace TOOLS.md updated with skill manifest")
|
|
243
|
+
except OSError as exc:
|
|
244
|
+
logger.warning("OpenClaw workspace injection failed: %s", exc)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
_HERMES_TOOL_NOTE = "## Hermes MCP Tool Calling Convention\n\n" + skill_routing_instructions(
|
|
248
|
+
"mcp__ksadk_skill_center__"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _inject_hermes_skill_hub(
|
|
253
|
+
instruction_text: str,
|
|
254
|
+
items: list | None = None,
|
|
255
|
+
) -> None:
|
|
256
|
+
"""Create individual Hermes skill entries for each Skill Center skill.
|
|
257
|
+
|
|
258
|
+
Instead of a single bridge entry, this creates one Hermes skill per
|
|
259
|
+
Skill Center skill under ~/.hermes/skills/<skill-name>/SKILL.md so that
|
|
260
|
+
each appears individually in the system-prompt <available_skills> block.
|
|
261
|
+
The agent can then match user tasks to specific skills (e.g.
|
|
262
|
+
"sports-results", "web-artifacts-builder") instead of a generic bridge.
|
|
263
|
+
"""
|
|
264
|
+
base_dir = os.environ.get("HERMES_SKILL_HUB_DIR", os.path.join(_hermes_home(), "skills"))
|
|
265
|
+
if not os.path.isdir(base_dir):
|
|
266
|
+
return
|
|
267
|
+
try:
|
|
268
|
+
if items is None:
|
|
269
|
+
items = []
|
|
270
|
+
_cleanup_stale_hermes_skills(base_dir, items)
|
|
271
|
+
if not items:
|
|
272
|
+
return
|
|
273
|
+
for item in items:
|
|
274
|
+
skill_name = getattr(item, "name", "")
|
|
275
|
+
if not skill_name:
|
|
276
|
+
continue
|
|
277
|
+
if not _is_safe_single_segment(skill_name):
|
|
278
|
+
logger.warning("Skipping unsafe skill name: %r", skill_name)
|
|
279
|
+
continue
|
|
280
|
+
skill_desc = getattr(item, "description", "") or "No description"
|
|
281
|
+
skill_md_content = (
|
|
282
|
+
"---\n"
|
|
283
|
+
f"name: {skill_name}\n"
|
|
284
|
+
"description: >\n"
|
|
285
|
+
f" {skill_desc}\n"
|
|
286
|
+
" Read its full instructions with\n"
|
|
287
|
+
" mcp__ksadk_skill_center__load_skill using\n"
|
|
288
|
+
f' skill_name="{skill_name}".\n'
|
|
289
|
+
"---\n\n"
|
|
290
|
+
f"# {skill_name}\n\n"
|
|
291
|
+
f"{skill_desc}\n\n" + _HERMES_TOOL_NOTE.strip() + "\n"
|
|
292
|
+
)
|
|
293
|
+
try:
|
|
294
|
+
write_skill(base_dir, skill_name, skill_md_content)
|
|
295
|
+
except OSError as exc:
|
|
296
|
+
logger.warning("Skipping Skill Center entry %s: %s", skill_name, exc)
|
|
297
|
+
logger.info("Hermes skill-hub entries created: %d skills under %s", len(items), base_dir)
|
|
298
|
+
except Exception as exc:
|
|
299
|
+
logger.warning("Hermes skill-hub injection failed: %s", exc)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def _cleanup_stale_hermes_skills(base_dir: str, current_items: list) -> None:
|
|
303
|
+
"""Remove generated Skill Center files, preserving local skills and sidecars."""
|
|
304
|
+
cleanup_skills(base_dir, {getattr(item, "name", "") for item in current_items})
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
_OPENCLAW_TOOL_NOTE = "## OpenClaw MCP Tool Calling Convention\n\n" + skill_routing_instructions(
|
|
308
|
+
"mcp__ksadk_skill_center__"
|
|
309
|
+
)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def _cleanup_stale_openclaw_skills(base_dir: str, current_items: list) -> None:
|
|
313
|
+
"""Remove generated Skill Center files, preserving local skills and sidecars."""
|
|
314
|
+
cleanup_skills(base_dir, {getattr(item, "name", "") for item in current_items})
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def _inject_openclaw_skill_hub(
|
|
318
|
+
instruction_text: str,
|
|
319
|
+
items: list | None = None,
|
|
320
|
+
) -> None:
|
|
321
|
+
"""Create individual OpenClaw skill entries for each Skill Center skill.
|
|
322
|
+
|
|
323
|
+
Creates one SKILL.md per Skill Center skill under ~/.openclaw/skills/<name>/
|
|
324
|
+
so that each appears individually in the OpenClaw Dashboard skill panel
|
|
325
|
+
and in the system-prompt available skills list.
|
|
326
|
+
"""
|
|
327
|
+
base_dir = os.environ.get(
|
|
328
|
+
"OPENCLAW_SKILL_HUB_DIR",
|
|
329
|
+
os.path.join(os.environ.get("OPENCLAW_STATE_DIR", "/home/node/.openclaw"), "skills"),
|
|
330
|
+
)
|
|
331
|
+
if not os.path.isdir(base_dir):
|
|
332
|
+
try:
|
|
333
|
+
os.makedirs(base_dir, exist_ok=True)
|
|
334
|
+
except Exception:
|
|
335
|
+
return
|
|
336
|
+
try:
|
|
337
|
+
if items is None:
|
|
338
|
+
items = []
|
|
339
|
+
_cleanup_stale_openclaw_skills(base_dir, items)
|
|
340
|
+
if not items:
|
|
341
|
+
return
|
|
342
|
+
for item in items:
|
|
343
|
+
skill_name = getattr(item, "name", "")
|
|
344
|
+
if not skill_name:
|
|
345
|
+
continue
|
|
346
|
+
if not _is_safe_single_segment(skill_name):
|
|
347
|
+
logger.warning("Skipping unsafe skill name: %r", skill_name)
|
|
348
|
+
continue
|
|
349
|
+
skill_desc = getattr(item, "description", "") or "No description"
|
|
350
|
+
skill_md_content = (
|
|
351
|
+
"---\n"
|
|
352
|
+
f"name: {skill_name}\n"
|
|
353
|
+
"description: >\n"
|
|
354
|
+
f" {skill_desc}\n"
|
|
355
|
+
" Read its full instructions with\n"
|
|
356
|
+
" mcp__ksadk_skill_center__load_skill using\n"
|
|
357
|
+
f' skill_name="{skill_name}".\n'
|
|
358
|
+
"---\n\n"
|
|
359
|
+
f"# {skill_name}\n\n"
|
|
360
|
+
f"{skill_desc}\n\n" + _OPENCLAW_TOOL_NOTE.strip() + "\n"
|
|
361
|
+
)
|
|
362
|
+
try:
|
|
363
|
+
write_skill(base_dir, skill_name, skill_md_content)
|
|
364
|
+
except OSError as exc:
|
|
365
|
+
logger.warning("Skipping Skill Center entry %s: %s", skill_name, exc)
|
|
366
|
+
logger.info("OpenClaw skill-hub entries created: %d skills under %s", len(items), base_dir)
|
|
367
|
+
except Exception as exc:
|
|
368
|
+
logger.warning("OpenClaw skill-hub injection failed: %s", exc)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def register_skill_center_mcp() -> None:
|
|
372
|
+
"""Main entry point called from shell scripts during bootstrap."""
|
|
373
|
+
logging.basicConfig(
|
|
374
|
+
level=logging.INFO,
|
|
375
|
+
stream=sys.stderr,
|
|
376
|
+
format="[skill-center] %(message)s",
|
|
377
|
+
)
|
|
378
|
+
skill_space_id = os.environ.get("SKILL_SPACE_ID", "").strip()
|
|
379
|
+
if not skill_space_id:
|
|
380
|
+
return
|
|
381
|
+
if not shutil.which("python3"):
|
|
382
|
+
logger.info("python3 not found; skipping Skill Center MCP registration")
|
|
383
|
+
return
|
|
384
|
+
try:
|
|
385
|
+
import ksadk.skills.mcp_server.server # noqa: F401
|
|
386
|
+
except ImportError:
|
|
387
|
+
logger.info("ksadk.skills.mcp_server not importable; skipping")
|
|
388
|
+
return
|
|
389
|
+
env = _collect_env()
|
|
390
|
+
_register_mcporter(env)
|
|
391
|
+
_register_openclaw(env)
|
|
392
|
+
_register_hermes(env)
|
|
393
|
+
_prefetch_manifest_to_workspace()
|
|
394
|
+
logger.info("Skill Center MCP registered: %s (SKILL_SPACE_ID=%s)", MCP_NAME, skill_space_id)
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
if __name__ == "__main__":
|
|
398
|
+
register_skill_center_mcp()
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def _register_refresh_callbacks() -> None:
|
|
402
|
+
"""Register runtime-specific skill refresh callbacks with the MCP server.
|
|
403
|
+
|
|
404
|
+
Called from ``server.main()`` before the background refresh thread starts.
|
|
405
|
+
Each callback receives ``(instruction_text, items)`` when the manifest is
|
|
406
|
+
refreshed, keeping runtime skill entries in sync with the Skill Center.
|
|
407
|
+
"""
|
|
408
|
+
from ksadk.skills.mcp_server.server import register_refresh_callback
|
|
409
|
+
|
|
410
|
+
def _on_refresh(instruction_text: str, items: list) -> None:
|
|
411
|
+
_inject_hermes_skill_hub(instruction_text, items)
|
|
412
|
+
_inject_openclaw_skill_hub(instruction_text, items)
|
|
413
|
+
_inject_openclaw_workspace(instruction_text)
|
|
414
|
+
|
|
415
|
+
register_refresh_callback(_on_refresh)
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"""FastMCP stdio server that bridges ksadk skill tools into MCP-compatible runtimes.
|
|
2
|
+
|
|
3
|
+
This module exposes two MCP tools:
|
|
4
|
+
|
|
5
|
+
- ``list_skills`` -- list or search skills from configured Skill Spaces;
|
|
6
|
+
accepts an optional ``query`` for keyword search and ``space_id`` for
|
|
7
|
+
scoping. Uses a TTL cache to avoid repeated Skill Service round-trips.
|
|
8
|
+
- ``execute_skills`` -- execute a workflow through the Skill Runtime (E2B sandbox).
|
|
9
|
+
|
|
10
|
+
When Hermes or OpenClaw container entrypoints detect ``SKILL_SPACE_ID`` in the
|
|
11
|
+
environment, they start this server as a stdio subprocess and register it as
|
|
12
|
+
an MCP server via mcporter / hermes-mcp / openclaw config, making the tools
|
|
13
|
+
available to the LLM agent.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import json
|
|
19
|
+
import logging
|
|
20
|
+
import os
|
|
21
|
+
import sys
|
|
22
|
+
import threading
|
|
23
|
+
from typing import Any, Callable
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger("ksadk.skills.mcp_server")
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# Refresh callback registry — delegated to _registry module to avoid
|
|
29
|
+
# __main__ / canonical module double-instance (S4 fix).
|
|
30
|
+
# ---------------------------------------------------------------------------
|
|
31
|
+
from ksadk.skills.mcp_server._registry import (
|
|
32
|
+
register_refresh_callback,
|
|
33
|
+
get_refresh_callbacks,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _refresh_callbacks():
|
|
38
|
+
"""Return registered refresh callbacks (compat shim for existing call sites)."""
|
|
39
|
+
return get_refresh_callbacks()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _import_mcp_server_class():
|
|
43
|
+
"""Import the MCP server class, compatible with both old and new MCP SDK."""
|
|
44
|
+
try:
|
|
45
|
+
from mcp.server.fastmcp import FastMCP
|
|
46
|
+
return FastMCP
|
|
47
|
+
except ImportError:
|
|
48
|
+
from mcp.server.mcpserver.server import MCPServer
|
|
49
|
+
return MCPServer
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _create_mcp_server():
|
|
53
|
+
"""Create and return a FastMCP server with skill tools registered."""
|
|
54
|
+
MCPServerClass = _import_mcp_server_class()
|
|
55
|
+
|
|
56
|
+
from ksadk.skills.manifest_cache import get_manifest_cache
|
|
57
|
+
from ksadk.toolsets.skills import (
|
|
58
|
+
execute_skills as _execute_skills_impl,
|
|
59
|
+
load_skill as _load_skill_impl,
|
|
60
|
+
preview_skill as _preview_skill_impl,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
mcp = MCPServerClass("ksadk-skill-center")
|
|
64
|
+
|
|
65
|
+
@mcp.tool()
|
|
66
|
+
def list_skills(
|
|
67
|
+
query: str | None = None,
|
|
68
|
+
space_id: str | None = None,
|
|
69
|
+
max_results: int = 30,
|
|
70
|
+
) -> str:
|
|
71
|
+
"""List or search skills from configured Skill Spaces.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
query: Optional keyword to search skill names and descriptions.
|
|
75
|
+
space_id: Optional Skill Space ID to limit listing to one space.
|
|
76
|
+
max_results: Maximum number of results (default 30).
|
|
77
|
+
|
|
78
|
+
Returns a JSON string with an ok field and a skills array.
|
|
79
|
+
"""
|
|
80
|
+
cache = get_manifest_cache()
|
|
81
|
+
try:
|
|
82
|
+
if query:
|
|
83
|
+
items = cache.search(query, max_results=max(max_results, 1), space_id=space_id)
|
|
84
|
+
elif space_id:
|
|
85
|
+
items = cache.get_space(space_id)
|
|
86
|
+
else:
|
|
87
|
+
items = cache.get_all()
|
|
88
|
+
items = items[:max_results]
|
|
89
|
+
return json.dumps(
|
|
90
|
+
{"ok": True, "skills": [item.to_dict() for item in items], "count": len(items)},
|
|
91
|
+
ensure_ascii=False,
|
|
92
|
+
)
|
|
93
|
+
except Exception as exc:
|
|
94
|
+
return json.dumps(
|
|
95
|
+
{"ok": False, "error_type": type(exc).__name__, "error_message": str(exc), "skills": []},
|
|
96
|
+
ensure_ascii=False,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
@mcp.tool()
|
|
100
|
+
def execute_skills(
|
|
101
|
+
workflow_prompt: str,
|
|
102
|
+
skill_names: list[str] | None = None,
|
|
103
|
+
) -> str:
|
|
104
|
+
"""Execute a workflow through the configured Skill Runtime (E2B sandbox).
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
workflow_prompt: The natural-language workflow to execute.
|
|
108
|
+
skill_names: Optional list of skill names to scope execution to.
|
|
109
|
+
Use ``list_skills`` to discover available skill names.
|
|
110
|
+
|
|
111
|
+
Returns a JSON string with execution results, stdout/stderr, and exit_code.
|
|
112
|
+
"""
|
|
113
|
+
result = _execute_skills_impl(workflow_prompt=workflow_prompt, skill_names=skill_names)
|
|
114
|
+
return json.dumps(result, ensure_ascii=False)
|
|
115
|
+
|
|
116
|
+
@mcp.tool()
|
|
117
|
+
def load_skill(
|
|
118
|
+
skill_name: str,
|
|
119
|
+
space_id: str | None = None,
|
|
120
|
+
) -> str:
|
|
121
|
+
"""Download and load a skill's full SKILL.md instructions.
|
|
122
|
+
|
|
123
|
+
Use this for instruction-first skills where the outer agent should
|
|
124
|
+
read the instructions and complete the task directly. Returns the
|
|
125
|
+
full skill body, scripts directory listing, and root_dir.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
skill_name: The skill name to load.
|
|
129
|
+
space_id: Optional Skill Space ID for disambiguation.
|
|
130
|
+
|
|
131
|
+
Returns a JSON string with ok, instructions, root_dir, has_scripts_dir.
|
|
132
|
+
"""
|
|
133
|
+
result = _load_skill_impl(skill_name=skill_name, space_id=space_id)
|
|
134
|
+
return json.dumps(result, ensure_ascii=False)
|
|
135
|
+
|
|
136
|
+
@mcp.tool()
|
|
137
|
+
def preview_skill(
|
|
138
|
+
skill_name: str,
|
|
139
|
+
space_id: str | None = None,
|
|
140
|
+
) -> str:
|
|
141
|
+
"""Return manifest-level info for a skill without downloading.
|
|
142
|
+
|
|
143
|
+
Lightweight preview: returns name, description, version from the
|
|
144
|
+
manifest cache without downloading or unpacking the skill package.
|
|
145
|
+
Use ``load_skill`` for full instructions.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
skill_name: The skill name to preview.
|
|
149
|
+
space_id: Optional Skill Space ID for disambiguation.
|
|
150
|
+
|
|
151
|
+
Returns a JSON string with ok, name, description, version.
|
|
152
|
+
"""
|
|
153
|
+
result = _preview_skill_impl(skill_name=skill_name, space_id=space_id)
|
|
154
|
+
return json.dumps(result, ensure_ascii=False)
|
|
155
|
+
|
|
156
|
+
return mcp
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _start_background_skill_refresh() -> None:
|
|
160
|
+
"""Start a daemon thread that periodically refreshes skill entries.
|
|
161
|
+
|
|
162
|
+
Calls all registered refresh callbacks so runtime-specific injectors
|
|
163
|
+
(Hermes skill hub, OpenClaw skill hub, etc.) stay in sync with the
|
|
164
|
+
Skill Center manifest without the server hard-wiring any runtime type.
|
|
165
|
+
"""
|
|
166
|
+
try:
|
|
167
|
+
from ksadk.skills.manifest_cache import get_manifest_cache, _ttl_seconds
|
|
168
|
+
except ImportError:
|
|
169
|
+
logger.warning("Cannot start background skill refresh: manifest_cache import failed")
|
|
170
|
+
return
|
|
171
|
+
skill_space_id = os.environ.get("SKILL_SPACE_ID", "").strip()
|
|
172
|
+
if not skill_space_id:
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
def _refresh_loop() -> None:
|
|
176
|
+
import time
|
|
177
|
+
interval = max(30, _ttl_seconds())
|
|
178
|
+
while True:
|
|
179
|
+
try:
|
|
180
|
+
time.sleep(interval)
|
|
181
|
+
cache = get_manifest_cache()
|
|
182
|
+
items = cache.get_all(force_refresh=True)
|
|
183
|
+
instruction_text = cache.build_instruction_text() if items else ""
|
|
184
|
+
for callback in get_refresh_callbacks():
|
|
185
|
+
try:
|
|
186
|
+
callback(instruction_text, items)
|
|
187
|
+
except Exception as exc:
|
|
188
|
+
logger.warning("Skill refresh callback failed: %s", exc)
|
|
189
|
+
logger.info("Background skill refresh: %d skills synced", len(items))
|
|
190
|
+
except Exception as exc:
|
|
191
|
+
logger.warning("Background skill refresh failed: %s", exc)
|
|
192
|
+
|
|
193
|
+
t = threading.Thread(target=_refresh_loop, daemon=True, name="skill-refresh")
|
|
194
|
+
t.start()
|
|
195
|
+
logger.info("Background skill refresh thread started (interval=%ss)", _ttl_seconds())
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def main() -> None:
|
|
199
|
+
"""Run the Skill Center MCP server on stdio transport."""
|
|
200
|
+
logging.basicConfig(
|
|
201
|
+
level=logging.INFO,
|
|
202
|
+
stream=sys.stderr,
|
|
203
|
+
format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
|
|
204
|
+
)
|
|
205
|
+
logger.info("Starting ksadk Skill Center MCP server (stdio)")
|
|
206
|
+
# Register runtime-specific refresh callbacks before starting the refresh thread.
|
|
207
|
+
try:
|
|
208
|
+
from ksadk.skills.mcp_server.register import _register_refresh_callbacks
|
|
209
|
+
_register_refresh_callbacks()
|
|
210
|
+
except ImportError:
|
|
211
|
+
logger.debug("No runtime-specific refresh callbacks registered")
|
|
212
|
+
_start_background_skill_refresh()
|
|
213
|
+
mcp = _create_mcp_server()
|
|
214
|
+
mcp.run(transport="stdio")
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
if __name__ == "__main__":
|
|
218
|
+
main()
|