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
ksadk/studio/compiler.py
CHANGED
|
@@ -6,6 +6,8 @@ from dataclasses import dataclass
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
from urllib.parse import urlparse
|
|
8
8
|
|
|
9
|
+
from ksadk.plugins.providers.legacy_catalog import CODEX_AGENT_PROVIDER_PLUGIN_ID
|
|
10
|
+
from ksadk.resource_runtime.plugin_config import resource_plugin_config
|
|
9
11
|
from ksadk.studio.capabilities import (
|
|
10
12
|
CapabilityResolver,
|
|
11
13
|
LocalCapabilityResolver,
|
|
@@ -46,6 +48,39 @@ class AgentCompiler:
|
|
|
46
48
|
self.catalog = catalog or LocalResourceCatalog(workspace)
|
|
47
49
|
|
|
48
50
|
def compile(self, draft: AgentDraft) -> CompileResult:
|
|
51
|
+
unsupported_plugins = [
|
|
52
|
+
binding.plugin_ref
|
|
53
|
+
for binding in draft.spec.bindings.plugins
|
|
54
|
+
if binding.enabled
|
|
55
|
+
and resource_plugin_config(
|
|
56
|
+
binding.plugin_ref,
|
|
57
|
+
binding.ecosystem,
|
|
58
|
+
binding.config,
|
|
59
|
+
enabled=True,
|
|
60
|
+
)
|
|
61
|
+
is None
|
|
62
|
+
]
|
|
63
|
+
if unsupported_plugins:
|
|
64
|
+
raise StudioError(
|
|
65
|
+
"NATIVE_PLUGIN_RUNTIME_INCOMPATIBLE",
|
|
66
|
+
"Framework Agent 不能直接绑定未物化的原生插件快照",
|
|
67
|
+
status_code=422,
|
|
68
|
+
field="spec.bindings.plugins",
|
|
69
|
+
details={"pluginRefs": sorted(unsupported_plugins)},
|
|
70
|
+
)
|
|
71
|
+
direct_dynamic = [
|
|
72
|
+
server.name
|
|
73
|
+
for server in draft.spec.capabilities.mcp_servers
|
|
74
|
+
if server.enabled and server.materialization == "dsh-profile"
|
|
75
|
+
]
|
|
76
|
+
if direct_dynamic:
|
|
77
|
+
raise StudioError(
|
|
78
|
+
"DSH_MCP_MANAGED_BINDING_REQUIRED",
|
|
79
|
+
"DSH Profile MCP 必须从当前 Catalog Resource 显式绑定,不能直接写入 AgentSpec",
|
|
80
|
+
status_code=422,
|
|
81
|
+
field="spec.capabilities.mcpServers",
|
|
82
|
+
details={"servers": sorted(direct_dynamic)},
|
|
83
|
+
)
|
|
49
84
|
source_payload = draft.model_dump(by_alias=True, exclude_none=True, mode="json")
|
|
50
85
|
source_digest = sha256_digest(canonical_json(source_payload))
|
|
51
86
|
materialized = self._materialize_bindings(draft)
|
|
@@ -62,13 +97,19 @@ class AgentCompiler:
|
|
|
62
97
|
for ref in materialized.spec.capabilities.mcp_servers
|
|
63
98
|
if ref.enabled
|
|
64
99
|
]
|
|
65
|
-
tools = [
|
|
66
|
-
self.resolver.resolve_tool(tool)
|
|
67
|
-
for tool in materialized.spec.capabilities.tools
|
|
68
|
-
]
|
|
100
|
+
tools = [self.resolver.resolve_tool(tool) for tool in materialized.spec.capabilities.tools]
|
|
69
101
|
skills.sort(key=lambda item: (item["name"], item["version"], item["digest"]))
|
|
70
102
|
mcp_servers.sort(key=lambda item: (item["name"], item["version"], item["digest"]))
|
|
71
103
|
tools.sort(key=lambda item: (item.name, item.version, item.digest or ""))
|
|
104
|
+
available_tools = {tool.name for tool in tools}
|
|
105
|
+
for sub in materialized.spec.sub_agents:
|
|
106
|
+
if set(sub.tools) - available_tools or sub.name in available_tools:
|
|
107
|
+
raise StudioError(
|
|
108
|
+
"SUBAGENT_TOOL_SCOPE_INVALID",
|
|
109
|
+
"子 Agent 只能使用父 Agent 已绑定工具,且子 Agent 名称不能与工具重名",
|
|
110
|
+
status_code=422,
|
|
111
|
+
field="spec.subAgents",
|
|
112
|
+
)
|
|
72
113
|
|
|
73
114
|
resolved = ResolvedAgentSpec(
|
|
74
115
|
agent_id=draft.metadata.id,
|
|
@@ -89,6 +130,7 @@ class AgentCompiler:
|
|
|
89
130
|
memory=materialized.spec.memory,
|
|
90
131
|
security=materialized.spec.security,
|
|
91
132
|
evaluation=materialized.spec.evaluation,
|
|
133
|
+
sub_agents=materialized.spec.sub_agents,
|
|
92
134
|
source_digest=source_digest,
|
|
93
135
|
)
|
|
94
136
|
digest_payload = resolved.model_dump(
|
|
@@ -111,21 +153,53 @@ class AgentCompiler:
|
|
|
111
153
|
"skills": skills,
|
|
112
154
|
"mcpServers": mcp_servers,
|
|
113
155
|
"tools": [
|
|
114
|
-
tool.model_dump(by_alias=True, exclude_none=True, mode="json")
|
|
115
|
-
for tool in tools
|
|
156
|
+
tool.model_dump(by_alias=True, exclude_none=True, mode="json") for tool in tools
|
|
116
157
|
],
|
|
117
158
|
}
|
|
118
159
|
return CompileResult(resolved=resolved, dependency_lock=dependency_lock)
|
|
119
160
|
|
|
120
161
|
def _materialize_bindings(self, draft: AgentDraft) -> AgentDraft:
|
|
162
|
+
runtime = draft.spec.runtime
|
|
163
|
+
uses_codex_native_tools = bool(
|
|
164
|
+
runtime
|
|
165
|
+
and (
|
|
166
|
+
runtime.type == "codex"
|
|
167
|
+
or (
|
|
168
|
+
runtime.type == "plugin"
|
|
169
|
+
and runtime.provider_ref
|
|
170
|
+
and runtime.provider_ref.startswith(
|
|
171
|
+
f"plugin://{CODEX_AGENT_PROVIDER_PLUGIN_ID}@"
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
)
|
|
121
176
|
bindings = draft.spec.bindings
|
|
177
|
+
if uses_codex_native_tools and bindings.tools:
|
|
178
|
+
bindings = bindings.model_copy(update={"tools": []})
|
|
122
179
|
if (
|
|
123
|
-
not
|
|
180
|
+
not uses_codex_native_tools
|
|
181
|
+
and not bindings.model_profile_id
|
|
124
182
|
and not bindings.tools
|
|
125
183
|
and not bindings.mcp_servers
|
|
126
184
|
and not bindings.skills
|
|
127
185
|
):
|
|
128
186
|
return draft
|
|
187
|
+
runtime_type = draft.spec.runtime.type if draft.spec.runtime is not None else None
|
|
188
|
+
for binding in bindings.mcp_servers:
|
|
189
|
+
if not binding.enabled:
|
|
190
|
+
continue
|
|
191
|
+
descriptor = self.catalog.get(binding.resource_id)
|
|
192
|
+
if (
|
|
193
|
+
descriptor.contract.get("materialization") == "dsh-profile"
|
|
194
|
+
and runtime_type != "harness"
|
|
195
|
+
):
|
|
196
|
+
raise StudioError(
|
|
197
|
+
"DSH_MCP_RUNTIME_INCOMPATIBLE",
|
|
198
|
+
"DSH Profile MCP 当前只支持 Harness Runtime",
|
|
199
|
+
status_code=422,
|
|
200
|
+
field="spec.runtime.type",
|
|
201
|
+
details={"runtimeType": runtime_type},
|
|
202
|
+
)
|
|
129
203
|
materialized = draft.model_copy(deep=True)
|
|
130
204
|
model = self.catalog.resolve_model(bindings) or materialized.spec.model
|
|
131
205
|
if model is None:
|
|
@@ -147,9 +221,13 @@ class AgentCompiler:
|
|
|
147
221
|
*self.catalog.resolve_mcp_servers(bindings),
|
|
148
222
|
],
|
|
149
223
|
tools=[
|
|
150
|
-
*materialized.spec.capabilities.tools,
|
|
224
|
+
*([] if uses_codex_native_tools else materialized.spec.capabilities.tools),
|
|
151
225
|
*bound_tools,
|
|
152
|
-
|
|
226
|
+
# Non-Codex runtimes consume the probed MCP contracts through
|
|
227
|
+
# the generic Tool execution path. Codex connects to the MCP
|
|
228
|
+
# server natively, so expanding those contracts here turns a
|
|
229
|
+
# valid MCP binding into unsupported third-party tools.
|
|
230
|
+
*([] if uses_codex_native_tools else bound_mcp_tools),
|
|
153
231
|
],
|
|
154
232
|
)
|
|
155
233
|
self._require_unique(
|
|
@@ -169,11 +247,7 @@ class AgentCompiler:
|
|
|
169
247
|
materialized.spec.security.allowed_permissions = sorted(
|
|
170
248
|
set(materialized.spec.security.allowed_permissions)
|
|
171
249
|
| set(permissions)
|
|
172
|
-
| {
|
|
173
|
-
permission
|
|
174
|
-
for tool in bound_mcp_tools
|
|
175
|
-
for permission in tool.permissions
|
|
176
|
-
}
|
|
250
|
+
| {permission for tool in bound_mcp_tools for permission in tool.permissions}
|
|
177
251
|
)
|
|
178
252
|
endpoint = model.endpoint_url or model.base_url or ""
|
|
179
253
|
hostname = (urlparse(endpoint).hostname or "").lower().rstrip(".")
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""One workspace configuration store for Studio settings and secret references."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from collections.abc import Mapping
|
|
7
|
+
from threading import RLock
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
import yaml
|
|
11
|
+
from dotenv import dotenv_values
|
|
12
|
+
|
|
13
|
+
from ksadk.configs.global_config import get_env_from_global_config
|
|
14
|
+
from ksadk.studio.errors import StudioError
|
|
15
|
+
|
|
16
|
+
SETTINGS_ENV = {
|
|
17
|
+
"cloudAccessKey": "KSYUN_ACCESS_KEY",
|
|
18
|
+
"cloudSecretKey": "KSYUN_SECRET_KEY",
|
|
19
|
+
"cloudAccountId": "KSYUN_ACCOUNT_ID",
|
|
20
|
+
"cloudServerUrl": "AGENTENGINE_SERVER_URL",
|
|
21
|
+
"teamsServerUrl": "KSADK_TEAMS_SERVER_URL",
|
|
22
|
+
"cloudRegion": "AGENTENGINE_REGION",
|
|
23
|
+
"cloudBucket": "KS3_BUCKET",
|
|
24
|
+
"sandbox": "KSADK_CODEX_SANDBOX",
|
|
25
|
+
}
|
|
26
|
+
SECRET_SETTINGS = {"cloudAccessKey", "cloudSecretKey"}
|
|
27
|
+
_LOCK = RLock()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class WorkspaceConfiguration:
|
|
31
|
+
"""Explicit env-file > workspace > inherited environment > workspace .env.
|
|
32
|
+
|
|
33
|
+
The canonical file is written atomically with mode 0600. Old files are
|
|
34
|
+
imported once, without modifying them or the user's .env. Read fresh on
|
|
35
|
+
each operation so settings and credential API writes share one store.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, workspace: Any, *, overrides: Mapping[str, str] | None = None):
|
|
39
|
+
self.workspace = workspace
|
|
40
|
+
self.path = workspace.resolve(".agentkit/config.yaml")
|
|
41
|
+
self.overrides = dict(overrides or {})
|
|
42
|
+
self.inherited = dict(os.environ)
|
|
43
|
+
self.global_defaults = get_env_from_global_config()
|
|
44
|
+
self.dotenv = {
|
|
45
|
+
key: value
|
|
46
|
+
for key, value in dotenv_values(workspace.resolve(".env")).items()
|
|
47
|
+
if value is not None
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
def _read(self) -> dict[str, Any]:
|
|
51
|
+
try:
|
|
52
|
+
if self.path.is_file():
|
|
53
|
+
data = yaml.safe_load(self.path.read_text(encoding="utf-8"))
|
|
54
|
+
if not isinstance(data, dict) or data.get("version") != 1:
|
|
55
|
+
raise ValueError("schema")
|
|
56
|
+
if not isinstance(data.get("settings"), dict) or not isinstance(
|
|
57
|
+
data.get("secrets"), dict
|
|
58
|
+
):
|
|
59
|
+
raise ValueError("sections")
|
|
60
|
+
if any(
|
|
61
|
+
not isinstance(k, str) or not isinstance(v, str)
|
|
62
|
+
for k, v in data["secrets"].items()
|
|
63
|
+
):
|
|
64
|
+
raise ValueError("secrets")
|
|
65
|
+
return data
|
|
66
|
+
legacy_settings = self.workspace.resolve(".agentkit/settings.yaml")
|
|
67
|
+
legacy_secrets = self.workspace.resolve(".agentkit/secrets.env")
|
|
68
|
+
settings = (
|
|
69
|
+
yaml.safe_load(legacy_settings.read_text(encoding="utf-8")) or {}
|
|
70
|
+
if legacy_settings.is_file()
|
|
71
|
+
else {}
|
|
72
|
+
)
|
|
73
|
+
if not isinstance(settings, dict):
|
|
74
|
+
raise ValueError("legacy settings")
|
|
75
|
+
# Legacy writer stored literal values, without dotenv interpolation.
|
|
76
|
+
secrets = {}
|
|
77
|
+
if legacy_secrets.is_file():
|
|
78
|
+
for line in legacy_secrets.read_text(encoding="utf-8").splitlines():
|
|
79
|
+
if line and not line.startswith("#") and "=" in line:
|
|
80
|
+
key, _, value = line.partition("=")
|
|
81
|
+
secrets[key.strip()] = value
|
|
82
|
+
for key in SECRET_SETTINGS:
|
|
83
|
+
if settings.get(key):
|
|
84
|
+
secrets.setdefault(SETTINGS_ENV[key], str(settings.pop(key)))
|
|
85
|
+
data = {"version": 1, "settings": settings, "secrets": secrets}
|
|
86
|
+
if legacy_settings.is_file() or legacy_secrets.is_file():
|
|
87
|
+
self._write(data)
|
|
88
|
+
return data
|
|
89
|
+
except (ValueError, OSError, yaml.YAMLError) as error:
|
|
90
|
+
raise StudioError(
|
|
91
|
+
"CONFIGURATION_INVALID",
|
|
92
|
+
"工作区配置无法读取,请检查 .agentkit/config.yaml 或旧配置文件",
|
|
93
|
+
status_code=422,
|
|
94
|
+
) from error
|
|
95
|
+
|
|
96
|
+
def _write(self, data: dict[str, Any]) -> None:
|
|
97
|
+
try:
|
|
98
|
+
self.workspace.ignore_private_configuration()
|
|
99
|
+
self.workspace.atomic_write_yaml(self.path, data)
|
|
100
|
+
except OSError as error:
|
|
101
|
+
raise StudioError(
|
|
102
|
+
"CONFIGURATION_SAVE_FAILED", "工作区配置保存失败,请检查目录权限", status_code=500
|
|
103
|
+
) from error
|
|
104
|
+
|
|
105
|
+
def settings(self) -> dict[str, Any]:
|
|
106
|
+
with _LOCK:
|
|
107
|
+
return dict(self._read()["settings"])
|
|
108
|
+
|
|
109
|
+
def secrets(self) -> dict[str, str]:
|
|
110
|
+
with _LOCK:
|
|
111
|
+
return dict(self._read()["secrets"])
|
|
112
|
+
|
|
113
|
+
def update_settings(self, patch: Mapping[str, Any]) -> None:
|
|
114
|
+
with _LOCK:
|
|
115
|
+
data = self._read()
|
|
116
|
+
for key, value in patch.items():
|
|
117
|
+
if key in SECRET_SETTINGS:
|
|
118
|
+
data["secrets"][SETTINGS_ENV[key]] = value
|
|
119
|
+
else:
|
|
120
|
+
data["settings"][key] = value
|
|
121
|
+
self._write(data)
|
|
122
|
+
|
|
123
|
+
def put_secret(self, name: str, value: str | None) -> None:
|
|
124
|
+
with _LOCK:
|
|
125
|
+
data = self._read()
|
|
126
|
+
if value is None:
|
|
127
|
+
data["secrets"].pop(name, None)
|
|
128
|
+
else:
|
|
129
|
+
data["secrets"][name] = value
|
|
130
|
+
self._write(data)
|
|
131
|
+
|
|
132
|
+
def resolve(self, name: str) -> tuple[str | None, str]:
|
|
133
|
+
if name in self.overrides:
|
|
134
|
+
return self.overrides[name], "env-file"
|
|
135
|
+
with _LOCK:
|
|
136
|
+
data = self._read()
|
|
137
|
+
if name in data["secrets"]:
|
|
138
|
+
return data["secrets"][name], "workspace"
|
|
139
|
+
for key, env in SETTINGS_ENV.items():
|
|
140
|
+
if env == name and key in data["settings"]:
|
|
141
|
+
return str(data["settings"][key]), "workspace"
|
|
142
|
+
if self.global_defaults.get(name):
|
|
143
|
+
return self.global_defaults[name], "global"
|
|
144
|
+
if self.inherited.get(name):
|
|
145
|
+
return self.inherited[name], "environment"
|
|
146
|
+
if self.dotenv.get(name):
|
|
147
|
+
return self.dotenv[name], "dotenv"
|
|
148
|
+
return None, "missing"
|
|
149
|
+
|
|
150
|
+
def resolve_candidates(self, names: list[str]) -> tuple[str | None, str]:
|
|
151
|
+
ranked = {
|
|
152
|
+
"env-file": 0,
|
|
153
|
+
"workspace": 1,
|
|
154
|
+
"global": 2,
|
|
155
|
+
"environment": 3,
|
|
156
|
+
"dotenv": 4,
|
|
157
|
+
"missing": 5,
|
|
158
|
+
}
|
|
159
|
+
candidates = [(self.resolve(name), i) for i, name in enumerate(names)]
|
|
160
|
+
(value, source), index = min(candidates, key=lambda item: (ranked[item[0][1]], item[1]))
|
|
161
|
+
return value, source + ("-alias" if value and index else "")
|
|
162
|
+
|
|
163
|
+
def environment(self) -> dict[str, str]:
|
|
164
|
+
with _LOCK:
|
|
165
|
+
data = self._read()
|
|
166
|
+
values = {**self.dotenv, **self.global_defaults, **self.inherited}
|
|
167
|
+
for key, name in SETTINGS_ENV.items():
|
|
168
|
+
if key in data["settings"]:
|
|
169
|
+
values[name] = str(data["settings"][key])
|
|
170
|
+
if "codexProxy" in data["settings"]:
|
|
171
|
+
from ksadk.studio.codex_builder import proxy_mode_env_value
|
|
172
|
+
|
|
173
|
+
proxy = proxy_mode_env_value(data["settings"]["codexProxy"])
|
|
174
|
+
if proxy is None:
|
|
175
|
+
values.pop("KSADK_CODEX_USE_PROXY", None)
|
|
176
|
+
else:
|
|
177
|
+
values["KSADK_CODEX_USE_PROXY"] = proxy
|
|
178
|
+
if "traceContent" in data["settings"]:
|
|
179
|
+
values["KSADK_STUDIO_TRACE_CONTENT"] = "1" if data["settings"]["traceContent"] else "0"
|
|
180
|
+
values.update(data["secrets"])
|
|
181
|
+
values.update(self.overrides)
|
|
182
|
+
return values
|
ksadk/studio/contracts.py
CHANGED
|
@@ -9,6 +9,8 @@ from typing import Any, Literal
|
|
|
9
9
|
|
|
10
10
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
11
11
|
|
|
12
|
+
from ksadk.harness.spec import SubAgentBinding
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
def _to_camel(value: str) -> str:
|
|
14
16
|
head, *tail = value.split("_")
|
|
@@ -107,9 +109,40 @@ class MCPServerRef(CapabilityRef):
|
|
|
107
109
|
args: list[str] = Field(default_factory=list)
|
|
108
110
|
endpoint_url: str | None = None
|
|
109
111
|
env_refs: dict[str, str] = Field(default_factory=dict)
|
|
112
|
+
# ``dsh-profile`` is resolved at PluginHost activation time. Only the
|
|
113
|
+
# immutable profile/inventory identity is allowed into an Agent Build;
|
|
114
|
+
# the loopback endpoint and bearer token remain process-scoped lease data.
|
|
115
|
+
materialization: Literal["dsh-profile"] | None = None
|
|
116
|
+
profile: str | None = None
|
|
117
|
+
profile_digest: str | None = None
|
|
118
|
+
descriptor_digest: str | None = None
|
|
119
|
+
inventory_digest: str | None = None
|
|
110
120
|
|
|
111
121
|
@model_validator(mode="after")
|
|
112
122
|
def validate_transport(self) -> "MCPServerRef":
|
|
123
|
+
dynamic_fields = (
|
|
124
|
+
self.profile,
|
|
125
|
+
self.profile_digest,
|
|
126
|
+
self.descriptor_digest,
|
|
127
|
+
self.inventory_digest,
|
|
128
|
+
)
|
|
129
|
+
if self.materialization == "dsh-profile":
|
|
130
|
+
if self.transport != "http":
|
|
131
|
+
raise ValueError("DSH Profile MCP 必须使用运行时 HTTP 租约")
|
|
132
|
+
if self.endpoint_url or self.command or self.args or self.env_refs:
|
|
133
|
+
raise ValueError("DSH Profile MCP 不能持久化 endpoint、命令或环境变量")
|
|
134
|
+
if not all(dynamic_fields):
|
|
135
|
+
raise ValueError("DSH Profile MCP 必须锁定 Profile 与能力摘要")
|
|
136
|
+
if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}", self.profile or ""):
|
|
137
|
+
raise ValueError("DSH Profile 名称无效")
|
|
138
|
+
if any(
|
|
139
|
+
not re.fullmatch(r"sha256:[0-9a-f]{64}", value or "")
|
|
140
|
+
for value in dynamic_fields[1:]
|
|
141
|
+
):
|
|
142
|
+
raise ValueError("DSH Profile MCP 摘要无效")
|
|
143
|
+
return self
|
|
144
|
+
if any(value is not None for value in dynamic_fields):
|
|
145
|
+
raise ValueError("静态 MCP 不能声明 DSH Profile 运行时字段")
|
|
113
146
|
if self.transport == "stdio" and not self.command:
|
|
114
147
|
raise ValueError("stdio MCP 必须配置 command")
|
|
115
148
|
if self.transport in {"http", "sse"} and not self.endpoint_url:
|
|
@@ -129,6 +162,10 @@ class ToolContract(ContractModel):
|
|
|
129
162
|
)
|
|
130
163
|
permissions: list[str] = Field(default_factory=list)
|
|
131
164
|
timeout_seconds: int = Field(default=20, ge=1, le=3600)
|
|
165
|
+
# Optional deterministic per-Run budget. The Managed Harness reserves one
|
|
166
|
+
# slot immediately before execution, so model retries and process restarts
|
|
167
|
+
# cannot bypass the limit.
|
|
168
|
+
max_calls_per_run: int | None = Field(default=None, ge=1, le=100_000)
|
|
132
169
|
side_effect: Literal["none", "read", "write", "external"] = "none"
|
|
133
170
|
approval: Literal["never", "always", "policy"] = "never"
|
|
134
171
|
executor: Literal["builtin", "mcp", "deferred", "python"] = "builtin"
|
|
@@ -198,6 +235,53 @@ class CapabilityBinding(ContractModel):
|
|
|
198
235
|
config: dict[str, Any] = Field(default_factory=dict)
|
|
199
236
|
|
|
200
237
|
|
|
238
|
+
class NativePluginBinding(ContractModel):
|
|
239
|
+
"""Immutable component selection from a host-managed native plugin."""
|
|
240
|
+
|
|
241
|
+
ecosystem: Literal["codex", "dsh"]
|
|
242
|
+
plugin_ref: str = Field(min_length=12, max_length=256)
|
|
243
|
+
snapshot_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
244
|
+
components: list[str] = Field(min_length=1, max_length=128)
|
|
245
|
+
enabled: bool = True
|
|
246
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
247
|
+
|
|
248
|
+
@field_validator("plugin_ref")
|
|
249
|
+
@classmethod
|
|
250
|
+
def validate_plugin_ref(cls, value: str) -> str:
|
|
251
|
+
if not re.fullmatch(
|
|
252
|
+
r"plugin://[a-z0-9]+(?:[._-][a-z0-9]+)*@"
|
|
253
|
+
r"\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?",
|
|
254
|
+
value,
|
|
255
|
+
):
|
|
256
|
+
raise ValueError("插件绑定必须使用 plugin://<id>@<exact-version>")
|
|
257
|
+
return value
|
|
258
|
+
|
|
259
|
+
@field_validator("components")
|
|
260
|
+
@classmethod
|
|
261
|
+
def validate_components(cls, value: list[str]) -> list[str]:
|
|
262
|
+
if len(value) != len(set(value)):
|
|
263
|
+
raise ValueError("插件组件不能重复")
|
|
264
|
+
if any(
|
|
265
|
+
not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}", component)
|
|
266
|
+
for component in value
|
|
267
|
+
):
|
|
268
|
+
raise ValueError("插件组件 ID 无效")
|
|
269
|
+
return value
|
|
270
|
+
|
|
271
|
+
@field_validator("config")
|
|
272
|
+
@classmethod
|
|
273
|
+
def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
|
|
274
|
+
_reject_clear_runtime_secrets(value, path="pluginBinding.config")
|
|
275
|
+
return value
|
|
276
|
+
|
|
277
|
+
@model_validator(mode="after")
|
|
278
|
+
def validate_platform_resource_config(self) -> "NativePluginBinding":
|
|
279
|
+
from ksadk.resource_runtime.plugin_config import resource_plugin_config
|
|
280
|
+
|
|
281
|
+
resource_plugin_config(self.plugin_ref, self.ecosystem, self.config, enabled=self.enabled)
|
|
282
|
+
return self
|
|
283
|
+
|
|
284
|
+
|
|
201
285
|
class AgentBindings(ContractModel):
|
|
202
286
|
model_profile_id: str | None = None
|
|
203
287
|
model_profile_ids: list[str] = Field(default_factory=list)
|
|
@@ -206,6 +290,7 @@ class AgentBindings(ContractModel):
|
|
|
206
290
|
tools: list[CapabilityBinding] = Field(default_factory=list)
|
|
207
291
|
mcp_servers: list[CapabilityBinding] = Field(default_factory=list)
|
|
208
292
|
skills: list[CapabilityBinding] = Field(default_factory=list)
|
|
293
|
+
plugins: list[NativePluginBinding] = Field(default_factory=list)
|
|
209
294
|
|
|
210
295
|
@model_validator(mode="after")
|
|
211
296
|
def validate_model_profiles(self) -> "AgentBindings":
|
|
@@ -219,6 +304,12 @@ class AgentBindings(ContractModel):
|
|
|
219
304
|
and self.model_profile_id not in self.model_profile_ids
|
|
220
305
|
):
|
|
221
306
|
raise ValueError("默认 modelProfileId 必须包含在 modelProfileIds 中")
|
|
307
|
+
plugin_refs = [binding.plugin_ref for binding in self.plugins if binding.enabled]
|
|
308
|
+
if len(plugin_refs) != len(set(plugin_refs)):
|
|
309
|
+
raise ValueError("启用的插件绑定不能重复 pluginRef")
|
|
310
|
+
from ksadk.resource_runtime.plugin_config import validate_resource_plugin_bindings
|
|
311
|
+
|
|
312
|
+
validate_resource_plugin_bindings(self.plugins)
|
|
222
313
|
return self
|
|
223
314
|
|
|
224
315
|
|
|
@@ -235,8 +326,8 @@ class RetryPolicy(ContractModel):
|
|
|
235
326
|
|
|
236
327
|
class ExecutionSpec(ContractModel):
|
|
237
328
|
strategy: Literal["direct", "plan-act-observe"] = "direct"
|
|
238
|
-
max_steps: int = Field(default=
|
|
239
|
-
timeout_seconds: int = Field(default=
|
|
329
|
+
max_steps: int = Field(default=100, ge=1, le=100)
|
|
330
|
+
timeout_seconds: int = Field(default=600, ge=1, le=3600)
|
|
240
331
|
retry: RetryPolicy = Field(default_factory=RetryPolicy)
|
|
241
332
|
sandbox: str | None = None
|
|
242
333
|
approval_mode: str | None = None
|
|
@@ -418,9 +509,7 @@ class RuntimeRef(ContractModel):
|
|
|
418
509
|
return self
|
|
419
510
|
|
|
420
511
|
|
|
421
|
-
_RUNTIME_SECRET_KEY = re.compile(
|
|
422
|
-
r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE
|
|
423
|
-
)
|
|
512
|
+
_RUNTIME_SECRET_KEY = re.compile(r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE)
|
|
424
513
|
_RUNTIME_SECRET_REF_PREFIXES = (
|
|
425
514
|
"secret://",
|
|
426
515
|
"env://",
|
|
@@ -436,9 +525,7 @@ def _reject_clear_runtime_secrets(value: Any, *, path: str = "providerConfig") -
|
|
|
436
525
|
for key, child in value.items():
|
|
437
526
|
child_path = f"{path}.{key}"
|
|
438
527
|
if _RUNTIME_SECRET_KEY.search(str(key)) and child is not None:
|
|
439
|
-
if not isinstance(child, str) or not child.startswith(
|
|
440
|
-
_RUNTIME_SECRET_REF_PREFIXES
|
|
441
|
-
):
|
|
528
|
+
if not isinstance(child, str) or not child.startswith(_RUNTIME_SECRET_REF_PREFIXES):
|
|
442
529
|
raise ValueError(f"{child_path} 必须保存 Secret 引用,不能保存明文")
|
|
443
530
|
_reject_clear_runtime_secrets(child, path=child_path)
|
|
444
531
|
elif isinstance(value, list):
|
|
@@ -459,6 +546,48 @@ class AgentSpec(ContractModel):
|
|
|
459
546
|
memory: MemorySpec = Field(default_factory=MemorySpec)
|
|
460
547
|
security: SecuritySpec = Field(default_factory=SecuritySpec)
|
|
461
548
|
evaluation: EvaluationSpec = Field(default_factory=EvaluationSpec)
|
|
549
|
+
sub_agents: tuple[SubAgentBinding, ...] = Field(default=(), max_length=32)
|
|
550
|
+
|
|
551
|
+
@model_validator(mode="after")
|
|
552
|
+
def validate_sub_agents(self) -> "AgentSpec":
|
|
553
|
+
if not self.sub_agents:
|
|
554
|
+
return self
|
|
555
|
+
if self.runtime is not None and self.runtime.type != "harness":
|
|
556
|
+
raise ValueError("subAgents 当前需要 Harness Runtime")
|
|
557
|
+
names = {sub.name for sub in self.sub_agents}
|
|
558
|
+
if len(names) != len(self.sub_agents):
|
|
559
|
+
raise ValueError("subAgents 名称不能重复")
|
|
560
|
+
dependencies = {sub.name: set(sub.depends_on) for sub in self.sub_agents}
|
|
561
|
+
if any(deps - names for deps in dependencies.values()):
|
|
562
|
+
raise ValueError("subAgents dependsOn 引用了未声明的子 Agent")
|
|
563
|
+
resolved: set[str] = set()
|
|
564
|
+
while len(resolved) < len(names):
|
|
565
|
+
ready = {name for name, deps in dependencies.items() if deps <= resolved} - resolved
|
|
566
|
+
if not ready:
|
|
567
|
+
raise ValueError("subAgents dependsOn 存在依赖环")
|
|
568
|
+
resolved.update(ready)
|
|
569
|
+
return self
|
|
570
|
+
|
|
571
|
+
@model_validator(mode="after")
|
|
572
|
+
def validate_memory_resource_reference(self) -> "AgentSpec":
|
|
573
|
+
if not self.memory.enabled or not self.memory.provider_ref.startswith("binding://"):
|
|
574
|
+
return self
|
|
575
|
+
from ksadk.resource_runtime.plugin_config import resource_plugin_config
|
|
576
|
+
|
|
577
|
+
binding_id = self.memory.provider_ref.removeprefix("binding://")
|
|
578
|
+
for binding in self.bindings.plugins:
|
|
579
|
+
if not binding.enabled:
|
|
580
|
+
continue
|
|
581
|
+
resource = resource_plugin_config(
|
|
582
|
+
binding.plugin_ref, binding.ecosystem, binding.config, enabled=True
|
|
583
|
+
)
|
|
584
|
+
if resource is not None and resource.binding.id == binding_id:
|
|
585
|
+
if resource.binding.resource.kind != "memory-instance":
|
|
586
|
+
raise ValueError("Memory providerRef must reference a memory-instance binding")
|
|
587
|
+
if self.memory.scopes != ["user"]:
|
|
588
|
+
raise ValueError("Platform memory requires explicit scopes: [user]")
|
|
589
|
+
return self
|
|
590
|
+
raise ValueError("Memory providerRef references a missing or disabled resource binding")
|
|
462
591
|
|
|
463
592
|
|
|
464
593
|
_AGENT_ID_PATTERN = re.compile(r"^[a-z][a-z0-9-]{2,62}$")
|
|
@@ -521,8 +650,8 @@ class AgentTemplateComposeRequest(ContractModel):
|
|
|
521
650
|
mcp_resource_ids: list[str] = Field(default_factory=list)
|
|
522
651
|
policy_template: Literal["loose", "strict", "custom"] = "strict"
|
|
523
652
|
execution_strategy: Literal["direct", "plan-act-observe"] = "direct"
|
|
524
|
-
max_steps: int = Field(default=
|
|
525
|
-
timeout_seconds: int = Field(default=
|
|
653
|
+
max_steps: int = Field(default=100, ge=1, le=100)
|
|
654
|
+
timeout_seconds: int = Field(default=600, ge=1, le=3600)
|
|
526
655
|
auto_bind_tools: bool = True
|
|
527
656
|
auto_bind_mcp: bool = True
|
|
528
657
|
|
|
@@ -591,6 +720,7 @@ class ResolvedAgentSpec(ContractModel):
|
|
|
591
720
|
memory: MemorySpec
|
|
592
721
|
security: SecuritySpec
|
|
593
722
|
evaluation: EvaluationSpec
|
|
723
|
+
sub_agents: tuple[SubAgentBinding, ...] = Field(default=(), max_length=32)
|
|
594
724
|
source_digest: str
|
|
595
725
|
resolved_digest: str = ""
|
|
596
726
|
|
|
@@ -638,6 +768,14 @@ class BundleManifest(ContractModel):
|
|
|
638
768
|
composition_mode: Literal["legacy", "composed"] | None = None
|
|
639
769
|
composition_profile_digest: str | None = None
|
|
640
770
|
hosted_kernel_requirement_digest: str = ""
|
|
771
|
+
resource_build_digest: str | None = Field(
|
|
772
|
+
default=None,
|
|
773
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
774
|
+
)
|
|
775
|
+
resource_snapshot_digest: str | None = Field(
|
|
776
|
+
default=None,
|
|
777
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
778
|
+
)
|
|
641
779
|
files: list[FileEntry]
|
|
642
780
|
created_at: str = "1970-01-01T00:00:00Z"
|
|
643
781
|
bundle_digest: str = ""
|
|
@@ -648,6 +786,10 @@ class BundleManifest(ContractModel):
|
|
|
648
786
|
raise ValueError("composed Bundle v2 requires compositionProfileDigest")
|
|
649
787
|
if self.composition_mode == "legacy" and self.composition_profile_digest:
|
|
650
788
|
raise ValueError("legacy Bundle v2 cannot declare compositionProfileDigest")
|
|
789
|
+
if bool(self.resource_build_digest) != bool(self.resource_snapshot_digest):
|
|
790
|
+
raise ValueError(
|
|
791
|
+
"resourceBuildDigest and resourceSnapshotDigest must be declared together"
|
|
792
|
+
)
|
|
651
793
|
return self
|
|
652
794
|
|
|
653
795
|
@property
|
|
@@ -665,7 +807,7 @@ class BundleManifest(ContractModel):
|
|
|
665
807
|
|
|
666
808
|
|
|
667
809
|
# ``BundleManifest`` is the existing, installed source type. The explicit
|
|
668
|
-
# name documents that its ``agentkit.bundle/v2`` branch is the
|
|
810
|
+
# name documents that its ``agentkit.bundle/v2`` branch is the Release
|
|
669
811
|
# AgentBundleManifest/v2 contract; it is an alias, not a parallel manifest.
|
|
670
812
|
AgentBundleManifest = BundleManifest
|
|
671
813
|
|
|
@@ -680,6 +822,14 @@ class BuildRecord(ContractModel):
|
|
|
680
822
|
source_digest: str = ""
|
|
681
823
|
runtime_lock: dict[str, Any] = Field(default_factory=dict)
|
|
682
824
|
bundle_digest: str = ""
|
|
825
|
+
resource_build_digest: str | None = Field(
|
|
826
|
+
default=None,
|
|
827
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
828
|
+
)
|
|
829
|
+
resource_snapshot_digest: str | None = Field(
|
|
830
|
+
default=None,
|
|
831
|
+
pattern=r"^sha256:[0-9a-f]{64}$",
|
|
832
|
+
)
|
|
683
833
|
artifact_path: str | None = None
|
|
684
834
|
diagnostics: list[Diagnostic] = Field(default_factory=list)
|
|
685
835
|
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
@@ -854,6 +1004,10 @@ class DeploymentRequest(ContractModel):
|
|
|
854
1004
|
|
|
855
1005
|
|
|
856
1006
|
class DeploymentRecord(ContractModel):
|
|
1007
|
+
# Identity observed when the cloud Agent was created, never inferred from
|
|
1008
|
+
# whichever credentials happen to be configured when history is read.
|
|
1009
|
+
created_by_name: str | None = None
|
|
1010
|
+
created_by_user_id: str | None = None
|
|
857
1011
|
id: str
|
|
858
1012
|
build_id: str
|
|
859
1013
|
bundle_digest: str
|