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,83 @@
|
|
|
1
|
+
"""Credential-free identities of the actual loaded companion execution inputs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
from collections.abc import Mapping, Sequence
|
|
8
|
+
from dataclasses import asdict, dataclass
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from ksadk.plugins.bridges.dsh import DshPluginInventory, DshProfileBuildSnapshot
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _digest(value: object) -> str:
|
|
15
|
+
data = json.dumps(value, sort_keys=True, separators=(",", ":")).encode()
|
|
16
|
+
return "sha256:" + hashlib.sha256(data).hexdigest()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class DshCompanionComponent:
|
|
21
|
+
component: str
|
|
22
|
+
package: str
|
|
23
|
+
version: str
|
|
24
|
+
source_digest: str | None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True)
|
|
28
|
+
class DshCompanionArtifact:
|
|
29
|
+
plugin_id: str
|
|
30
|
+
profile: str
|
|
31
|
+
components: tuple[DshCompanionComponent, ...]
|
|
32
|
+
dependency_lock_digest: str
|
|
33
|
+
installation_digest: str
|
|
34
|
+
source_digest: str
|
|
35
|
+
profile_digest: str
|
|
36
|
+
host_version: str
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def plugin_digest(self) -> str:
|
|
40
|
+
# Deliberately conservative: the whole dependency closure is bound.
|
|
41
|
+
# Runtime generations, temporary endpoints and secrets never enter it.
|
|
42
|
+
return _digest(asdict(self))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def companion_source_digest(sources: Sequence[Path]) -> str:
|
|
46
|
+
"""Hash trusted host-selected source bytes, excluding caches and file paths.
|
|
47
|
+
|
|
48
|
+
The caller defines an ordered source list. File names distinguish its roles
|
|
49
|
+
while an absolute checkout path does not affect a relocated installation.
|
|
50
|
+
"""
|
|
51
|
+
rows = []
|
|
52
|
+
for source in sources:
|
|
53
|
+
if source.is_symlink() or not source.is_file() or source.stat().st_size > 8 * 1024 * 1024:
|
|
54
|
+
raise ValueError("Companion source must be a bounded regular file")
|
|
55
|
+
rows.append((source.name, hashlib.sha256(source.read_bytes()).hexdigest()))
|
|
56
|
+
return _digest(rows)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def companion_artifact(
|
|
60
|
+
*,
|
|
61
|
+
plugin_id: str,
|
|
62
|
+
components: Mapping[str, str],
|
|
63
|
+
snapshot: DshProfileBuildSnapshot,
|
|
64
|
+
inventory: Sequence[DshPluginInventory],
|
|
65
|
+
sources: Sequence[Path],
|
|
66
|
+
) -> DshCompanionArtifact:
|
|
67
|
+
installed = {item.name: item for item in inventory}
|
|
68
|
+
rows = []
|
|
69
|
+
for component, package in sorted(components.items()):
|
|
70
|
+
item = installed.get(package)
|
|
71
|
+
if item is None or not item.enabled or package not in snapshot.projection.bundles:
|
|
72
|
+
raise ValueError("Companion requires its entire installed and enabled package graph")
|
|
73
|
+
rows.append(DshCompanionComponent(component, package, item.version, item.source_digest))
|
|
74
|
+
return DshCompanionArtifact(
|
|
75
|
+
plugin_id=plugin_id,
|
|
76
|
+
profile=snapshot.projection.profile,
|
|
77
|
+
components=tuple(rows),
|
|
78
|
+
dependency_lock_digest=snapshot.dependency_lock_digest,
|
|
79
|
+
installation_digest=snapshot.installation_digest,
|
|
80
|
+
source_digest=companion_source_digest(sources),
|
|
81
|
+
profile_digest=snapshot.projection.config_digest,
|
|
82
|
+
host_version=snapshot.projection.host_version,
|
|
83
|
+
)
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"""Private, generation-scoped IPC for Cordis-owned Python companions.
|
|
2
|
+
|
|
3
|
+
Only a complete live Cordis graph and a healthy Core activate a companion.
|
|
4
|
+
Invocation principals are retained in Python behind opaque, expiring handles;
|
|
5
|
+
neither plugin tool arguments nor browser payloads can choose that principal.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import inspect
|
|
12
|
+
import json
|
|
13
|
+
import secrets
|
|
14
|
+
import shutil
|
|
15
|
+
import tempfile
|
|
16
|
+
import time
|
|
17
|
+
from collections.abc import Awaitable, Callable, Mapping
|
|
18
|
+
from dataclasses import dataclass, field
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
from ksadk.plugins.companion_artifacts import DshCompanionArtifact
|
|
23
|
+
|
|
24
|
+
Callback = Callable[[], Awaitable[None] | None]
|
|
25
|
+
BindArtifact = Callable[[DshCompanionArtifact], Awaitable[None] | None]
|
|
26
|
+
Invoke = Callable[[Any, str, dict[str, Any], str], Awaitable[dict[str, Any]] | dict[str, Any]]
|
|
27
|
+
_MAX_BYTES = 1024 * 1024
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CompanionError(RuntimeError):
|
|
31
|
+
def __init__(self, code: str) -> None:
|
|
32
|
+
super().__init__(code)
|
|
33
|
+
self.code = code
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass(frozen=True)
|
|
37
|
+
class DshCompanionDefinition:
|
|
38
|
+
plugin_id: str
|
|
39
|
+
components: Mapping[str, str]
|
|
40
|
+
operations: frozenset[str]
|
|
41
|
+
start: Callback
|
|
42
|
+
revoke: Callback
|
|
43
|
+
close: Callback
|
|
44
|
+
invoke: Invoke
|
|
45
|
+
profile: str = "web"
|
|
46
|
+
bind_artifact: BindArtifact | None = None
|
|
47
|
+
artifact_sources: tuple[Path, ...] = ()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass(frozen=True)
|
|
51
|
+
class _Grant:
|
|
52
|
+
plugin_id: str
|
|
53
|
+
principal: Any
|
|
54
|
+
operations: frozenset[str]
|
|
55
|
+
expires_at: float
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@dataclass
|
|
59
|
+
class _Companion:
|
|
60
|
+
definition: DshCompanionDefinition
|
|
61
|
+
connections: dict[str, asyncio.StreamWriter] = field(default_factory=dict)
|
|
62
|
+
running: bool = False
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
async def _call(callback: Callback) -> None:
|
|
66
|
+
result = callback()
|
|
67
|
+
if inspect.isawaitable(result):
|
|
68
|
+
await result
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _object(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
|
|
72
|
+
result: dict[str, Any] = {}
|
|
73
|
+
for key, value in pairs:
|
|
74
|
+
if key in result:
|
|
75
|
+
raise ValueError("duplicate key")
|
|
76
|
+
result[key] = value
|
|
77
|
+
return result
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class DshPluginCompanionManager:
|
|
81
|
+
def __init__(
|
|
82
|
+
self,
|
|
83
|
+
*,
|
|
84
|
+
profile: str,
|
|
85
|
+
generation_id: str,
|
|
86
|
+
definitions: tuple[DshCompanionDefinition, ...],
|
|
87
|
+
artifacts: Mapping[str, DshCompanionArtifact] | None = None,
|
|
88
|
+
) -> None:
|
|
89
|
+
if any(item.profile != profile for item in definitions):
|
|
90
|
+
raise CompanionError("COMPANION_PROFILE_MISMATCH")
|
|
91
|
+
self.profile = profile
|
|
92
|
+
self.generation_id = generation_id
|
|
93
|
+
self._companions = {item.plugin_id: _Companion(item) for item in definitions}
|
|
94
|
+
self._artifacts = dict(artifacts or {})
|
|
95
|
+
if any(
|
|
96
|
+
item.bind_artifact and item.plugin_id not in self._artifacts for item in definitions
|
|
97
|
+
):
|
|
98
|
+
raise CompanionError("COMPANION_ARTIFACT_REQUIRED")
|
|
99
|
+
if len(self._companions) != len(definitions):
|
|
100
|
+
raise CompanionError("COMPANION_DUPLICATE")
|
|
101
|
+
self._secret = secrets.token_urlsafe(32)
|
|
102
|
+
self._grants: dict[str, _Grant] = {}
|
|
103
|
+
self._pending: dict[asyncio.Task[Any], str] = {}
|
|
104
|
+
self._connections: set[asyncio.StreamWriter] = set()
|
|
105
|
+
self._lock = asyncio.Lock()
|
|
106
|
+
self._server: asyncio.Server | None = None
|
|
107
|
+
self._root: Path | None = None
|
|
108
|
+
self._healthy = False
|
|
109
|
+
self._closed = False
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def active_plugins(self) -> frozenset[str]:
|
|
113
|
+
return frozenset(key for key, value in self._companions.items() if value.running)
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def configuration(self) -> dict[str, Any]:
|
|
117
|
+
if self._root is None:
|
|
118
|
+
raise CompanionError("COMPANION_BROKER_NOT_STARTED")
|
|
119
|
+
return {
|
|
120
|
+
"socketPath": str(self._root / "host.sock"),
|
|
121
|
+
"generationId": self.generation_id,
|
|
122
|
+
"secret": self._secret,
|
|
123
|
+
"plugins": {
|
|
124
|
+
key: {"components": sorted(value.definition.components)}
|
|
125
|
+
for key, value in self._companions.items()
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async def start_broker(self) -> Path:
|
|
130
|
+
if self._closed:
|
|
131
|
+
raise CompanionError("COMPANION_CLOSED")
|
|
132
|
+
if self._root is None:
|
|
133
|
+
self._root = Path(tempfile.mkdtemp(prefix="ksadk-companion-"))
|
|
134
|
+
self._root.chmod(0o700)
|
|
135
|
+
path = self._root / "host.sock"
|
|
136
|
+
self._server = await asyncio.start_unix_server(self._connection, path=path)
|
|
137
|
+
path.chmod(0o600)
|
|
138
|
+
return self._root / "host.sock"
|
|
139
|
+
|
|
140
|
+
async def confirm_core_ready(self) -> None:
|
|
141
|
+
"""Called by the trusted supervisor only after actual Core health passes."""
|
|
142
|
+
async with self._lock:
|
|
143
|
+
if self._closed:
|
|
144
|
+
raise CompanionError("COMPANION_CLOSED")
|
|
145
|
+
for value in self._companions.values():
|
|
146
|
+
if set(value.connections) != set(value.definition.components):
|
|
147
|
+
raise CompanionError("COMPANION_GRAPH_NOT_READY")
|
|
148
|
+
self._healthy = True
|
|
149
|
+
try:
|
|
150
|
+
for value in self._companions.values():
|
|
151
|
+
await self._start(value)
|
|
152
|
+
except BaseException:
|
|
153
|
+
self._healthy = False
|
|
154
|
+
for value in self._companions.values():
|
|
155
|
+
await self._stop(value)
|
|
156
|
+
raise
|
|
157
|
+
|
|
158
|
+
def issue_invocation(
|
|
159
|
+
self,
|
|
160
|
+
plugin_id: str,
|
|
161
|
+
principal: Any,
|
|
162
|
+
*,
|
|
163
|
+
operations: frozenset[str],
|
|
164
|
+
ttl_seconds: float = 60,
|
|
165
|
+
) -> str:
|
|
166
|
+
value = self._companions.get(plugin_id)
|
|
167
|
+
if self._closed or not self._healthy or value is None or not value.running:
|
|
168
|
+
raise CompanionError("COMPANION_UNAVAILABLE")
|
|
169
|
+
if (
|
|
170
|
+
not operations
|
|
171
|
+
or not operations <= value.definition.operations
|
|
172
|
+
or not 0 < ttl_seconds <= 120
|
|
173
|
+
):
|
|
174
|
+
raise CompanionError("COMPANION_GRANT_INVALID")
|
|
175
|
+
now = time.monotonic()
|
|
176
|
+
self._grants = {key: grant for key, grant in self._grants.items() if grant.expires_at > now}
|
|
177
|
+
if len(self._grants) >= 1024:
|
|
178
|
+
raise CompanionError("COMPANION_BUSY")
|
|
179
|
+
handle = secrets.token_urlsafe(32)
|
|
180
|
+
self._grants[handle] = _Grant(plugin_id, principal, operations, now + ttl_seconds)
|
|
181
|
+
return handle
|
|
182
|
+
|
|
183
|
+
def revoke_invocation(self, handle: str) -> None:
|
|
184
|
+
self._grants.pop(handle, None)
|
|
185
|
+
|
|
186
|
+
async def _start(self, value: _Companion) -> None:
|
|
187
|
+
if (
|
|
188
|
+
not value.running
|
|
189
|
+
and self._healthy
|
|
190
|
+
and set(value.connections) == set(value.definition.components)
|
|
191
|
+
):
|
|
192
|
+
try:
|
|
193
|
+
if value.definition.bind_artifact is not None:
|
|
194
|
+
bound = value.definition.bind_artifact(
|
|
195
|
+
self._artifacts[value.definition.plugin_id]
|
|
196
|
+
)
|
|
197
|
+
if inspect.isawaitable(bound):
|
|
198
|
+
await bound
|
|
199
|
+
await _call(value.definition.start)
|
|
200
|
+
except BaseException:
|
|
201
|
+
await _call(value.definition.revoke)
|
|
202
|
+
await _call(value.definition.close)
|
|
203
|
+
raise
|
|
204
|
+
value.running = True
|
|
205
|
+
|
|
206
|
+
async def _stop(self, value: _Companion) -> None:
|
|
207
|
+
plugin_id = value.definition.plugin_id
|
|
208
|
+
self._grants = {
|
|
209
|
+
key: grant for key, grant in self._grants.items() if grant.plugin_id != plugin_id
|
|
210
|
+
}
|
|
211
|
+
if value.running:
|
|
212
|
+
value.running = False
|
|
213
|
+
# Revoke host dispatch and tool authority before closing the domain.
|
|
214
|
+
try:
|
|
215
|
+
await _call(value.definition.revoke)
|
|
216
|
+
finally:
|
|
217
|
+
for task, owner in tuple(self._pending.items()):
|
|
218
|
+
if owner == plugin_id and task is not asyncio.current_task():
|
|
219
|
+
task.cancel()
|
|
220
|
+
await _call(value.definition.close)
|
|
221
|
+
|
|
222
|
+
async def close(self) -> None:
|
|
223
|
+
async with self._lock:
|
|
224
|
+
if self._closed:
|
|
225
|
+
return
|
|
226
|
+
self._closed = True
|
|
227
|
+
self._healthy = False
|
|
228
|
+
try:
|
|
229
|
+
for value in self._companions.values():
|
|
230
|
+
await self._stop(value)
|
|
231
|
+
finally:
|
|
232
|
+
if self._server:
|
|
233
|
+
self._server.close()
|
|
234
|
+
for writer in tuple(self._connections):
|
|
235
|
+
writer.close()
|
|
236
|
+
if self._server:
|
|
237
|
+
await self._server.wait_closed()
|
|
238
|
+
self._grants.clear()
|
|
239
|
+
if self._root:
|
|
240
|
+
shutil.rmtree(self._root, ignore_errors=True)
|
|
241
|
+
|
|
242
|
+
async def _read(self, reader: asyncio.StreamReader) -> dict[str, Any]:
|
|
243
|
+
size = int.from_bytes(await reader.readexactly(4), "big")
|
|
244
|
+
if not 0 < size <= _MAX_BYTES:
|
|
245
|
+
raise CompanionError("COMPANION_REQUEST_INVALID")
|
|
246
|
+
raw = await reader.readexactly(size)
|
|
247
|
+
value = json.loads(
|
|
248
|
+
raw.decode("utf-8"),
|
|
249
|
+
object_pairs_hook=_object,
|
|
250
|
+
parse_constant=lambda _value: (_ for _ in ()).throw(ValueError()),
|
|
251
|
+
)
|
|
252
|
+
if not isinstance(value, dict) or value.get("v") != 1:
|
|
253
|
+
raise CompanionError("COMPANION_REQUEST_INVALID")
|
|
254
|
+
return value
|
|
255
|
+
|
|
256
|
+
async def _write(self, writer: asyncio.StreamWriter, value: dict[str, Any]) -> None:
|
|
257
|
+
body = json.dumps(
|
|
258
|
+
value, ensure_ascii=False, allow_nan=False, separators=(",", ":")
|
|
259
|
+
).encode()
|
|
260
|
+
if len(body) > _MAX_BYTES:
|
|
261
|
+
raise CompanionError("COMPANION_RESPONSE_INVALID")
|
|
262
|
+
writer.write(len(body).to_bytes(4, "big") + body)
|
|
263
|
+
await writer.drain()
|
|
264
|
+
|
|
265
|
+
async def _connection(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None:
|
|
266
|
+
component: str | None = None
|
|
267
|
+
companion: _Companion | None = None
|
|
268
|
+
request_id = ""
|
|
269
|
+
if len(self._connections) >= 128 or self._closed:
|
|
270
|
+
writer.close()
|
|
271
|
+
return
|
|
272
|
+
self._connections.add(writer)
|
|
273
|
+
try:
|
|
274
|
+
request = await asyncio.wait_for(self._read(reader), timeout=5)
|
|
275
|
+
request_id = request.get("requestId")
|
|
276
|
+
if not isinstance(request_id, str) or not 1 <= len(request_id) <= 128:
|
|
277
|
+
raise CompanionError("COMPANION_REQUEST_INVALID")
|
|
278
|
+
companion = self._companions.get(request.get("pluginId"))
|
|
279
|
+
if companion is None:
|
|
280
|
+
raise CompanionError("COMPANION_UNAVAILABLE")
|
|
281
|
+
if request.get("type") == "register":
|
|
282
|
+
component = request.get("component")
|
|
283
|
+
if (
|
|
284
|
+
request.get("generationId") != self.generation_id
|
|
285
|
+
or not isinstance(request.get("secret"), str)
|
|
286
|
+
or not secrets.compare_digest(request["secret"], self._secret)
|
|
287
|
+
or component not in companion.definition.components
|
|
288
|
+
):
|
|
289
|
+
component = None
|
|
290
|
+
raise CompanionError("COMPANION_REGISTRATION_INVALID")
|
|
291
|
+
async with self._lock:
|
|
292
|
+
if component in companion.connections:
|
|
293
|
+
component = None
|
|
294
|
+
raise CompanionError("COMPANION_COMPONENT_DUPLICATE")
|
|
295
|
+
companion.connections[component] = writer
|
|
296
|
+
await self._start(companion)
|
|
297
|
+
await self._write(
|
|
298
|
+
writer, {"v": 1, "requestId": request_id, "result": {"registered": True}}
|
|
299
|
+
)
|
|
300
|
+
# A live connection is the component's lifecycle lease. Any
|
|
301
|
+
# data or EOF retires it; no caller-controlled heartbeat state.
|
|
302
|
+
await reader.read(1)
|
|
303
|
+
elif request.get("type") == "invoke":
|
|
304
|
+
operation = request.get("operation")
|
|
305
|
+
grant = self._grants.get(request.get("handle"))
|
|
306
|
+
arguments = request.get("arguments")
|
|
307
|
+
deadline = request.get("deadline")
|
|
308
|
+
call_id = request.get("callId")
|
|
309
|
+
if (
|
|
310
|
+
not self._healthy
|
|
311
|
+
or not companion.running
|
|
312
|
+
or grant is None
|
|
313
|
+
or grant.plugin_id != companion.definition.plugin_id
|
|
314
|
+
or grant.expires_at <= time.monotonic()
|
|
315
|
+
or operation not in grant.operations
|
|
316
|
+
):
|
|
317
|
+
raise CompanionError("COMPANION_INVOCATION_DENIED")
|
|
318
|
+
if (
|
|
319
|
+
not isinstance(arguments, dict)
|
|
320
|
+
or not isinstance(call_id, str)
|
|
321
|
+
or not 1 <= len(call_id) <= 128
|
|
322
|
+
or isinstance(deadline, bool)
|
|
323
|
+
or not isinstance(deadline, int)
|
|
324
|
+
or deadline <= time.time() * 1000
|
|
325
|
+
or deadline > time.time() * 1000 + 120_000
|
|
326
|
+
):
|
|
327
|
+
raise CompanionError("COMPANION_REQUEST_INVALID")
|
|
328
|
+
task = asyncio.current_task()
|
|
329
|
+
assert task is not None
|
|
330
|
+
self._pending[task] = companion.definition.plugin_id
|
|
331
|
+
result = companion.definition.invoke(
|
|
332
|
+
grant.principal, operation, arguments, call_id
|
|
333
|
+
)
|
|
334
|
+
if inspect.isawaitable(result):
|
|
335
|
+
result = await asyncio.wait_for(
|
|
336
|
+
result,
|
|
337
|
+
timeout=min(
|
|
338
|
+
grant.expires_at - time.monotonic(), deadline / 1000 - time.time()
|
|
339
|
+
),
|
|
340
|
+
)
|
|
341
|
+
if not isinstance(result, dict):
|
|
342
|
+
raise CompanionError("COMPANION_RESPONSE_INVALID")
|
|
343
|
+
await self._write(writer, {"v": 1, "requestId": request_id, "result": result})
|
|
344
|
+
else:
|
|
345
|
+
raise CompanionError("COMPANION_REQUEST_INVALID")
|
|
346
|
+
except asyncio.CancelledError:
|
|
347
|
+
raise
|
|
348
|
+
except Exception as error:
|
|
349
|
+
code = error.code if isinstance(error, CompanionError) else "COMPANION_REQUEST_FAILED"
|
|
350
|
+
try:
|
|
351
|
+
await self._write(
|
|
352
|
+
writer, {"v": 1, "requestId": request_id, "error": {"code": code}}
|
|
353
|
+
)
|
|
354
|
+
except Exception:
|
|
355
|
+
pass
|
|
356
|
+
finally:
|
|
357
|
+
self._pending.pop(asyncio.current_task(), None)
|
|
358
|
+
if companion is not None and component is not None:
|
|
359
|
+
async with self._lock:
|
|
360
|
+
if companion.connections.get(component) is writer:
|
|
361
|
+
companion.connections.pop(component)
|
|
362
|
+
await self._stop(companion)
|
|
363
|
+
self._connections.discard(writer)
|
|
364
|
+
writer.close()
|
|
365
|
+
try:
|
|
366
|
+
await writer.wait_closed()
|
|
367
|
+
except (ConnectionError, OSError):
|
|
368
|
+
pass
|
ksadk/plugins/composition.py
CHANGED
|
@@ -102,6 +102,7 @@ class CompositionPolicy:
|
|
|
102
102
|
context_contributors: Mapping[str, PluginCapabilitySelection] = field(
|
|
103
103
|
default_factory=dict
|
|
104
104
|
)
|
|
105
|
+
host_capabilities: tuple[PluginCapabilitySelection, ...] = ()
|
|
105
106
|
renderers: tuple[PluginCapabilitySelection, ...] = ()
|
|
106
107
|
default_runtime: str = "codex"
|
|
107
108
|
|
|
@@ -185,6 +186,13 @@ class CompositionCompiler:
|
|
|
185
186
|
field="policy.sessionStore",
|
|
186
187
|
)
|
|
187
188
|
|
|
189
|
+
for selection in self._policy.host_capabilities:
|
|
190
|
+
self._append_selection(
|
|
191
|
+
capabilities,
|
|
192
|
+
selection,
|
|
193
|
+
field="policy.hostCapabilities",
|
|
194
|
+
)
|
|
195
|
+
|
|
188
196
|
if revision.spec.memory.enabled:
|
|
189
197
|
memory = self._policy.memory_providers.get(revision.spec.memory.provider_ref)
|
|
190
198
|
if memory is None:
|
ksadk/plugins/contracts.py
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
"""Frozen source contracts and internal records for plugin composition.
|
|
2
2
|
|
|
3
|
-
Only the models exported through ``__all__`` are public
|
|
3
|
+
Only the models exported through ``__all__`` are public Release contracts.
|
|
4
4
|
``PluginManifest`` and its supporting models are internal admission records:
|
|
5
5
|
they project DSH/Codex host inventory into the Python composition engine and
|
|
6
6
|
are not a third installable package format or a stable public contract.
|
|
7
7
|
"""
|
|
8
|
+
|
|
8
9
|
from __future__ import annotations
|
|
9
10
|
|
|
10
11
|
import hashlib
|
|
11
12
|
import json
|
|
12
13
|
import re
|
|
13
14
|
from collections.abc import Mapping
|
|
15
|
+
from pathlib import PurePosixPath
|
|
14
16
|
from typing import Any, Literal
|
|
17
|
+
from urllib.parse import urlsplit
|
|
15
18
|
|
|
16
19
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
|
17
20
|
|
|
@@ -98,6 +101,77 @@ class CapabilityOffer(PluginContractModel):
|
|
|
98
101
|
return value
|
|
99
102
|
|
|
100
103
|
|
|
104
|
+
class PluginSourceSnapshot(PluginContractModel):
|
|
105
|
+
"""Credential-free upstream identity retained in an immutable plugin lock.
|
|
106
|
+
|
|
107
|
+
Lifecycle hosts (Codex App Server or DSH) remain responsible for resolving
|
|
108
|
+
and installing packages. This record only captures the exact source that
|
|
109
|
+
was admitted so a later build cannot silently follow a mutable marketplace,
|
|
110
|
+
Git branch, npm tag, or local directory.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
ecosystem: Literal["ksadk", "codex", "dsh"]
|
|
114
|
+
type: Literal["builtin", "registry", "local", "git", "npm", "market", "runtime-native"]
|
|
115
|
+
requested: str = Field(min_length=1, max_length=2048)
|
|
116
|
+
resolved: str = Field(min_length=1, max_length=2048)
|
|
117
|
+
integrity: str | None = Field(default=None, max_length=512)
|
|
118
|
+
marketplace: str | None = Field(default=None, max_length=256)
|
|
119
|
+
registry: str | None = Field(default=None, max_length=2048)
|
|
120
|
+
|
|
121
|
+
@field_validator("requested", "resolved", "integrity", "marketplace", "registry")
|
|
122
|
+
@classmethod
|
|
123
|
+
def validate_public_coordinate(cls, value: str | None) -> str | None:
|
|
124
|
+
if value is None:
|
|
125
|
+
return None
|
|
126
|
+
if value != value.strip() or any(ord(character) < 32 for character in value):
|
|
127
|
+
raise ValueError("plugin source coordinates must be trimmed printable text")
|
|
128
|
+
# Build artifacts and inventories are routinely shared. A source URL
|
|
129
|
+
# therefore cannot retain embedded credentials, query tokens, or URL
|
|
130
|
+
# fragments. Authentication remains a host-owned credential concern.
|
|
131
|
+
if "://" in value:
|
|
132
|
+
parsed = urlsplit(value)
|
|
133
|
+
if parsed.username or parsed.password or parsed.query or parsed.fragment:
|
|
134
|
+
raise ValueError("plugin source coordinates must not contain credentials")
|
|
135
|
+
return value
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class LockedPluginComponent(PluginContractModel):
|
|
139
|
+
"""One selected native component and the bytes admitted for a build."""
|
|
140
|
+
|
|
141
|
+
id: str = Field(min_length=1, max_length=256)
|
|
142
|
+
kind: Literal["skill", "mcp", "hook", "app", "client"]
|
|
143
|
+
digest: str
|
|
144
|
+
path: str | None = Field(default=None, max_length=512)
|
|
145
|
+
|
|
146
|
+
@field_validator("id")
|
|
147
|
+
@classmethod
|
|
148
|
+
def validate_component_id(cls, value: str) -> str:
|
|
149
|
+
if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:/-]*", value):
|
|
150
|
+
raise ValueError("plugin component id is invalid")
|
|
151
|
+
return value
|
|
152
|
+
|
|
153
|
+
@field_validator("digest")
|
|
154
|
+
@classmethod
|
|
155
|
+
def validate_component_digest(cls, value: str) -> str:
|
|
156
|
+
return _validate_digest(value)
|
|
157
|
+
|
|
158
|
+
@field_validator("path")
|
|
159
|
+
@classmethod
|
|
160
|
+
def validate_component_path(cls, value: str | None) -> str | None:
|
|
161
|
+
if value is None:
|
|
162
|
+
return None
|
|
163
|
+
if "\\" in value:
|
|
164
|
+
raise ValueError("plugin component paths must use POSIX separators")
|
|
165
|
+
path = PurePosixPath(value)
|
|
166
|
+
if (
|
|
167
|
+
path.is_absolute()
|
|
168
|
+
or not path.parts
|
|
169
|
+
or any(part in {"", ".", ".."} for part in path.parts)
|
|
170
|
+
):
|
|
171
|
+
raise ValueError("plugin component path must stay relative to the plugin root")
|
|
172
|
+
return value
|
|
173
|
+
|
|
174
|
+
|
|
101
175
|
class CapabilityRequirement(PluginContractModel):
|
|
102
176
|
definition: str
|
|
103
177
|
version: str = Field(min_length=1, max_length=128)
|
|
@@ -122,12 +196,26 @@ class PluginProvenance(PluginContractModel):
|
|
|
122
196
|
digest: str
|
|
123
197
|
signature_ref: str | None = Field(default=None, max_length=512)
|
|
124
198
|
license: str | None = Field(default=None, max_length=128)
|
|
199
|
+
upstream: PluginSourceSnapshot | None = None
|
|
200
|
+
components: tuple[LockedPluginComponent, ...] | None = None
|
|
125
201
|
|
|
126
202
|
@field_validator("digest")
|
|
127
203
|
@classmethod
|
|
128
204
|
def validate_digest(cls, value: str) -> str:
|
|
129
205
|
return _validate_digest(value)
|
|
130
206
|
|
|
207
|
+
@field_validator("components")
|
|
208
|
+
@classmethod
|
|
209
|
+
def validate_components(
|
|
210
|
+
cls, value: tuple[LockedPluginComponent, ...] | None
|
|
211
|
+
) -> tuple[LockedPluginComponent, ...] | None:
|
|
212
|
+
if value is None:
|
|
213
|
+
return None
|
|
214
|
+
identities = [(item.kind, item.id) for item in value]
|
|
215
|
+
if len(identities) != len(set(identities)):
|
|
216
|
+
raise ValueError("plugin components must have unique kind/id identities")
|
|
217
|
+
return tuple(sorted(value, key=lambda item: (item.kind, item.id, item.digest)))
|
|
218
|
+
|
|
131
219
|
|
|
132
220
|
class PluginSpec(PluginContractModel):
|
|
133
221
|
domain: Literal["ksadk-platform", "runtime-native"]
|
|
@@ -303,6 +391,8 @@ class PluginLockEntry(PluginContractModel):
|
|
|
303
391
|
license: str | None = Field(default=None, max_length=128)
|
|
304
392
|
provides: list[LockedCapability] = Field(default_factory=list)
|
|
305
393
|
dependencies: list[PluginDependency] = Field(default_factory=list)
|
|
394
|
+
upstream: PluginSourceSnapshot | None = None
|
|
395
|
+
components: tuple[LockedPluginComponent, ...] | None = None
|
|
306
396
|
|
|
307
397
|
@field_validator("id")
|
|
308
398
|
@classmethod
|
|
@@ -321,6 +411,32 @@ class PluginLockEntry(PluginContractModel):
|
|
|
321
411
|
def validate_digest(cls, value: str) -> str:
|
|
322
412
|
return _validate_digest(value)
|
|
323
413
|
|
|
414
|
+
@field_validator("components")
|
|
415
|
+
@classmethod
|
|
416
|
+
def validate_components(
|
|
417
|
+
cls, value: tuple[LockedPluginComponent, ...] | None
|
|
418
|
+
) -> tuple[LockedPluginComponent, ...] | None:
|
|
419
|
+
if value is None:
|
|
420
|
+
return None
|
|
421
|
+
identities = [(item.kind, item.id) for item in value]
|
|
422
|
+
if len(identities) != len(set(identities)):
|
|
423
|
+
raise ValueError("plugin lock components must have unique kind/id identities")
|
|
424
|
+
return tuple(sorted(value, key=lambda item: (item.kind, item.id, item.digest)))
|
|
425
|
+
|
|
426
|
+
@model_validator(mode="after")
|
|
427
|
+
def validate_external_snapshot(self) -> "PluginLockEntry":
|
|
428
|
+
if self.upstream is not None:
|
|
429
|
+
compatible_sources = {
|
|
430
|
+
"builtin": {"builtin"},
|
|
431
|
+
"registry": {"registry", "npm"},
|
|
432
|
+
"local": {"local", "git", "npm"},
|
|
433
|
+
"market": {"market", "local", "git", "npm"},
|
|
434
|
+
"runtime-native": {"runtime-native"},
|
|
435
|
+
}
|
|
436
|
+
if self.upstream.type not in compatible_sources[self.source]:
|
|
437
|
+
raise ValueError("plugin lock source and upstream source type are inconsistent")
|
|
438
|
+
return self
|
|
439
|
+
|
|
324
440
|
|
|
325
441
|
class PluginLock(PluginContractModel):
|
|
326
442
|
"""The current Bundle v2 lock shape, now with an exact typed entry form."""
|
|
@@ -442,10 +558,12 @@ def plugin_lock_digest(lock: PluginLock) -> str:
|
|
|
442
558
|
__all__ = [
|
|
443
559
|
"CapabilityDefinition",
|
|
444
560
|
"CompositionProfile",
|
|
561
|
+
"LockedPluginComponent",
|
|
445
562
|
"PluginLock",
|
|
446
563
|
"PluginLockEntry",
|
|
447
564
|
"PluginInventory",
|
|
448
565
|
"PluginInventoryItem",
|
|
566
|
+
"PluginSourceSnapshot",
|
|
449
567
|
"canonical_plugin_lock",
|
|
450
568
|
"plugin_lock_digest",
|
|
451
569
|
]
|