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/model_proxy/transform.py
CHANGED
|
@@ -234,13 +234,51 @@ _EFFORT_CAP_PREFIXES = (
|
|
|
234
234
|
("qwen3.5", "high"),
|
|
235
235
|
)
|
|
236
236
|
|
|
237
|
+
# 各上游模型的 reasoning_effort 合法值集合(2026-09 实测,见 tests/model_proxy)。
|
|
238
|
+
# 与 _EFFORT_CAP_PREFIXES 的区别:cap 是"单调钳顶"(qwen 超 cap 钳到 cap);
|
|
239
|
+
# 这里是"值域裁剪"——glm-5.3-flash 是始终思考模型,合法值只有 low/high/max,
|
|
240
|
+
# none/minimal/medium/xhigh 全部 400,无法用单调钳顶表达。
|
|
241
|
+
_EFFORT_ALLOWED_SETS = {
|
|
242
|
+
"glm-5.3-flash": ("low", "high", "max"),
|
|
243
|
+
}
|
|
244
|
+
# 值域裁剪用的档位表:max 视为与 xhigh 同级(5),仅在值域裁剪内部使用,
|
|
245
|
+
# 不改 _EFFORT_RANK(影响 cap 路径)。
|
|
246
|
+
_ALLOWED_RANK = {**_EFFORT_RANK, "max": 5}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def remap_reasoning_effort(model, effort):
|
|
250
|
+
"""把 reasoning_effort 向上取整到该模型的合法值集合(值域裁剪)。
|
|
251
|
+
|
|
252
|
+
规则:档位 >= 入参的最近合法档;无更高档则取集合最高档;未知档位取集合最低档。
|
|
253
|
+
未列出的模型/非字符串原样返回(不做发明式映射)。
|
|
254
|
+
|
|
255
|
+
实测:glm-5.3-flash 始终思考,medium/xhigh/none/minimal 全 400,
|
|
256
|
+
medium→high、xhigh→max、none/minimal→low。
|
|
257
|
+
"""
|
|
258
|
+
if not isinstance(model, str) or not isinstance(effort, str):
|
|
259
|
+
return effort
|
|
260
|
+
allowed = None
|
|
261
|
+
for prefix, vals in _EFFORT_ALLOWED_SETS.items():
|
|
262
|
+
if model.startswith(prefix):
|
|
263
|
+
allowed = vals
|
|
264
|
+
break
|
|
265
|
+
if not allowed or effort in allowed:
|
|
266
|
+
return effort
|
|
267
|
+
r = _ALLOWED_RANK.get(effort)
|
|
268
|
+
if r is None:
|
|
269
|
+
return allowed[0]
|
|
270
|
+
higher = [v for v in allowed if _ALLOWED_RANK[v] >= r]
|
|
271
|
+
return higher[0] if higher else allowed[-1]
|
|
272
|
+
|
|
237
273
|
|
|
238
274
|
def clamp_reasoning_effort(model, effort):
|
|
239
|
-
"""
|
|
275
|
+
"""把 reasoning_effort 适配到上游模型:先做值域裁剪,再做上限钳制。
|
|
240
276
|
|
|
241
|
-
|
|
277
|
+
值域裁剪(remap_reasoning_effort)处理非单调值域(如 glm-5.3-flash 只认
|
|
278
|
+
low/high/max);上限钳制处理单调超 cap(如 qwen3.7 xhigh→high)。
|
|
242
279
|
未知档位/未知模型族原样返回(不做发明式映射)。
|
|
243
280
|
"""
|
|
281
|
+
effort = remap_reasoning_effort(model, effort)
|
|
244
282
|
if not isinstance(effort, str) or effort not in _EFFORT_RANK:
|
|
245
283
|
return effort
|
|
246
284
|
for prefix, cap in _EFFORT_CAP_PREFIXES:
|
ksadk/plugins/__init__.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Versioned contracts for the
|
|
1
|
+
"""Versioned contracts for the Release plugin composition boundary.
|
|
2
2
|
|
|
3
3
|
This package models discovery, deterministic locking, and the controlled
|
|
4
4
|
PluginHost lifecycle. It does not create a second runtime/event store;
|
|
@@ -27,8 +27,10 @@ from ksadk.plugins.context_contributor import (
|
|
|
27
27
|
from ksadk.plugins.contracts import (
|
|
28
28
|
CapabilityDefinition,
|
|
29
29
|
CompositionProfile,
|
|
30
|
+
LockedPluginComponent,
|
|
30
31
|
PluginInventory,
|
|
31
32
|
PluginLock,
|
|
33
|
+
PluginSourceSnapshot,
|
|
32
34
|
canonical_plugin_lock,
|
|
33
35
|
plugin_lock_digest,
|
|
34
36
|
)
|
|
@@ -120,6 +122,7 @@ __all__ = [
|
|
|
120
122
|
"BridgeTransitionPlan",
|
|
121
123
|
"CapabilityDefinition",
|
|
122
124
|
"CompositionProfile",
|
|
125
|
+
"LockedPluginComponent",
|
|
123
126
|
"ContextClassification",
|
|
124
127
|
"ContextContributorCacheability",
|
|
125
128
|
"ContextContributorCapabilities",
|
|
@@ -135,6 +138,7 @@ __all__ = [
|
|
|
135
138
|
"EcosystemPluginInventory",
|
|
136
139
|
"PluginInventory",
|
|
137
140
|
"PluginLock",
|
|
141
|
+
"PluginSourceSnapshot",
|
|
138
142
|
"PluginDesiredState",
|
|
139
143
|
"PluginEcosystem",
|
|
140
144
|
"PluginEcosystemBridge",
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"""Portable plugin bytes; credentials and machine state never belong here.
|
|
2
|
+
|
|
3
|
+
The caller supplies an already verified, selected plugin tree. Delivery and
|
|
4
|
+
credential authorization remain separate from this bounded archive format.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import shutil
|
|
13
|
+
import stat
|
|
14
|
+
import tempfile
|
|
15
|
+
import zipfile
|
|
16
|
+
from pathlib import Path, PurePosixPath
|
|
17
|
+
from typing import Literal
|
|
18
|
+
|
|
19
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
20
|
+
|
|
21
|
+
MAX_FILES = 10000
|
|
22
|
+
MAX_BYTES = 256 * 1024 * 1024
|
|
23
|
+
SCHEMA = "ksadk.plugin-artifact/v1"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class PluginArtifactReceipt(BaseModel):
|
|
27
|
+
model_config = ConfigDict(extra="forbid")
|
|
28
|
+
schema_version: Literal["ksadk.plugin-artifact/v1"] = SCHEMA
|
|
29
|
+
ecosystem: Literal["codex"] = "codex"
|
|
30
|
+
runtime_version: str = Field(min_length=1)
|
|
31
|
+
plugin_lock_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
32
|
+
artifact_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
33
|
+
size_bytes: int = Field(gt=0, le=MAX_BYTES)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _digest(raw: bytes) -> str:
|
|
37
|
+
return "sha256:" + hashlib.sha256(raw).hexdigest()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _safe_path(value: str) -> str:
|
|
41
|
+
path = PurePosixPath(value)
|
|
42
|
+
if (
|
|
43
|
+
not value
|
|
44
|
+
or "\\" in value
|
|
45
|
+
or path.is_absolute()
|
|
46
|
+
or str(path) != value
|
|
47
|
+
or any(p in {".", ".."} for p in path.parts)
|
|
48
|
+
):
|
|
49
|
+
raise ValueError("Invalid plugin artifact path")
|
|
50
|
+
forbidden = {".credentials.json", "auth.json", "config.toml", ".git", "sessions"}
|
|
51
|
+
if any(part.lower() in forbidden or part.lower().startswith(".env") for part in path.parts):
|
|
52
|
+
raise ValueError("Plugin artifact contains credential or host state paths")
|
|
53
|
+
return value
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _zip_entry(name: str, mode: int) -> zipfile.ZipInfo:
|
|
57
|
+
info = zipfile.ZipInfo(name, date_time=(1980, 1, 1, 0, 0, 0))
|
|
58
|
+
info.create_system = 3
|
|
59
|
+
info.external_attr = (stat.S_IFREG | mode) << 16
|
|
60
|
+
info.compress_type = zipfile.ZIP_STORED
|
|
61
|
+
return info
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def export_plugin_artifact(
|
|
65
|
+
root: Path,
|
|
66
|
+
output_dir: Path,
|
|
67
|
+
*,
|
|
68
|
+
runtime_version: str,
|
|
69
|
+
plugin_lock_digest: str,
|
|
70
|
+
) -> tuple[PluginArtifactReceipt, Path]:
|
|
71
|
+
"""Package only the pinned Codex marketplace, independent of local paths."""
|
|
72
|
+
if root.is_symlink() or not root.is_dir():
|
|
73
|
+
raise ValueError("Plugin artifact root must be a real directory")
|
|
74
|
+
if output_dir.resolve().is_relative_to(root.resolve()):
|
|
75
|
+
raise ValueError("Plugin artifact output must be outside its source tree")
|
|
76
|
+
files = []
|
|
77
|
+
total = 0
|
|
78
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
79
|
+
fd, temporary = tempfile.mkstemp(prefix=".plugin-artifact-", dir=output_dir)
|
|
80
|
+
os.close(fd)
|
|
81
|
+
temporary_path = Path(temporary)
|
|
82
|
+
try:
|
|
83
|
+
with zipfile.ZipFile(temporary_path, "w") as archive:
|
|
84
|
+
for source in sorted(root.rglob("*")):
|
|
85
|
+
if source.is_symlink():
|
|
86
|
+
raise ValueError("Plugin artifacts cannot contain symlinks")
|
|
87
|
+
if source.is_dir():
|
|
88
|
+
_safe_path(source.relative_to(root).as_posix())
|
|
89
|
+
continue
|
|
90
|
+
if not source.is_file():
|
|
91
|
+
raise ValueError("Plugin artifacts require regular files")
|
|
92
|
+
name = _safe_path(source.relative_to(root).as_posix())
|
|
93
|
+
size = source.stat().st_size
|
|
94
|
+
total += size
|
|
95
|
+
if total > MAX_BYTES or len(files) >= MAX_FILES:
|
|
96
|
+
raise ValueError("Plugin artifact exceeds size limits")
|
|
97
|
+
with source.open("rb") as stream:
|
|
98
|
+
raw = stream.read(size + 1)
|
|
99
|
+
if len(raw) != size:
|
|
100
|
+
raise ValueError("Plugin artifact source changed during export")
|
|
101
|
+
mode = 0o644 | (source.stat().st_mode & 0o111)
|
|
102
|
+
files.append({"path": name, "digest": _digest(raw), "size": len(raw), "mode": mode})
|
|
103
|
+
archive.writestr(_zip_entry("payload/" + name, mode), raw)
|
|
104
|
+
if not files:
|
|
105
|
+
raise ValueError("Plugin artifact is empty")
|
|
106
|
+
manifest = {
|
|
107
|
+
"schema_version": SCHEMA,
|
|
108
|
+
"ecosystem": "codex",
|
|
109
|
+
"runtime_version": runtime_version,
|
|
110
|
+
"plugin_lock_digest": plugin_lock_digest,
|
|
111
|
+
"files": files,
|
|
112
|
+
}
|
|
113
|
+
archive.writestr(
|
|
114
|
+
_zip_entry("manifest.json", 0o644),
|
|
115
|
+
json.dumps(manifest, sort_keys=True, separators=(",", ":")).encode(),
|
|
116
|
+
)
|
|
117
|
+
if temporary_path.stat().st_size > MAX_BYTES:
|
|
118
|
+
raise ValueError("Plugin artifact exceeds size limits")
|
|
119
|
+
raw = temporary_path.read_bytes()
|
|
120
|
+
receipt = PluginArtifactReceipt(
|
|
121
|
+
runtime_version=runtime_version,
|
|
122
|
+
plugin_lock_digest=plugin_lock_digest,
|
|
123
|
+
artifact_digest=_digest(raw),
|
|
124
|
+
size_bytes=len(raw),
|
|
125
|
+
)
|
|
126
|
+
target = output_dir / (receipt.artifact_digest.removeprefix("sha256:") + ".zip")
|
|
127
|
+
os.replace(temporary_path, target)
|
|
128
|
+
return receipt, target
|
|
129
|
+
finally:
|
|
130
|
+
temporary_path.unlink(missing_ok=True)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def restore_plugin_artifact(
|
|
134
|
+
archive_path: Path, receipt: PluginArtifactReceipt, target: Path
|
|
135
|
+
) -> Path:
|
|
136
|
+
"""Verify a downloaded archive before atomic installation into a fresh path."""
|
|
137
|
+
if archive_path.stat().st_size != receipt.size_bytes:
|
|
138
|
+
raise ValueError("Plugin artifact size mismatch")
|
|
139
|
+
if _digest(archive_path.read_bytes()) != receipt.artifact_digest:
|
|
140
|
+
raise ValueError("Plugin artifact digest mismatch")
|
|
141
|
+
if target.exists() or target.is_symlink():
|
|
142
|
+
raise ValueError("Plugin artifact target already exists")
|
|
143
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
144
|
+
staging = Path(tempfile.mkdtemp(prefix=".plugin-restore-", dir=target.parent))
|
|
145
|
+
try:
|
|
146
|
+
with zipfile.ZipFile(archive_path) as archive:
|
|
147
|
+
entries = archive.infolist()
|
|
148
|
+
names = [entry.filename for entry in entries]
|
|
149
|
+
if len(names) != len(set(names)) or len(names) > MAX_FILES + 1:
|
|
150
|
+
raise ValueError("Duplicate or excessive plugin archive entries")
|
|
151
|
+
if sum(entry.file_size for entry in entries) > MAX_BYTES:
|
|
152
|
+
raise ValueError("Plugin archive expands beyond size limit")
|
|
153
|
+
manifest = json.loads(archive.read("manifest.json"))
|
|
154
|
+
for key in ("schema_version", "ecosystem", "runtime_version", "plugin_lock_digest"):
|
|
155
|
+
if manifest.get(key) != getattr(receipt, key):
|
|
156
|
+
raise ValueError("Plugin artifact manifest mismatch")
|
|
157
|
+
files = manifest.get("files")
|
|
158
|
+
if not isinstance(files, list) or not files:
|
|
159
|
+
raise ValueError("Missing plugin artifact file index")
|
|
160
|
+
expected = ["payload/" + _safe_path(item["path"]) for item in files]
|
|
161
|
+
if len(expected) != len(set(expected)) or set(names) != {"manifest.json", *expected}:
|
|
162
|
+
raise ValueError("Plugin artifact file index mismatch")
|
|
163
|
+
for item, name in zip(files, expected, strict=True):
|
|
164
|
+
info = archive.getinfo(name)
|
|
165
|
+
mode = info.external_attr >> 16
|
|
166
|
+
if not stat.S_ISREG(mode) or (item["mode"] & ~0o111) != 0o644:
|
|
167
|
+
raise ValueError("Plugin artifact has invalid file type or mode")
|
|
168
|
+
raw = archive.read(name)
|
|
169
|
+
if len(raw) != item["size"] or _digest(raw) != item["digest"]:
|
|
170
|
+
raise ValueError("Plugin artifact file digest mismatch")
|
|
171
|
+
destination = staging / item["path"]
|
|
172
|
+
destination.parent.mkdir(parents=True, exist_ok=True)
|
|
173
|
+
destination.write_bytes(raw)
|
|
174
|
+
destination.chmod(item["mode"])
|
|
175
|
+
os.replace(staging, target)
|
|
176
|
+
return target
|
|
177
|
+
finally:
|
|
178
|
+
if staging.exists():
|
|
179
|
+
shutil.rmtree(staging)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def restore_materialized_plugin_artifact(
|
|
183
|
+
source: Path, receipt: PluginArtifactReceipt, target: Path
|
|
184
|
+
) -> Path:
|
|
185
|
+
"""Verify an init-container-extracted artifact before atomic installation.
|
|
186
|
+
|
|
187
|
+
The init container verifies the downloaded archive digest before extraction.
|
|
188
|
+
The runtime independently verifies the portable manifest and every extracted
|
|
189
|
+
file before the marketplace becomes visible to Codex.
|
|
190
|
+
"""
|
|
191
|
+
if source.is_symlink() or not source.is_dir():
|
|
192
|
+
raise ValueError("Materialized plugin artifact must be a real directory")
|
|
193
|
+
if target.exists() or target.is_symlink():
|
|
194
|
+
raise ValueError("Plugin artifact target already exists")
|
|
195
|
+
|
|
196
|
+
manifest_path = source / "manifest.json"
|
|
197
|
+
if manifest_path.is_symlink() or not manifest_path.is_file():
|
|
198
|
+
raise ValueError("Missing plugin artifact manifest")
|
|
199
|
+
if manifest_path.stat().st_size > MAX_BYTES:
|
|
200
|
+
raise ValueError("Plugin artifact manifest exceeds size limit")
|
|
201
|
+
try:
|
|
202
|
+
manifest = json.loads(manifest_path.read_bytes())
|
|
203
|
+
except (json.JSONDecodeError, UnicodeError) as exc:
|
|
204
|
+
raise ValueError("Invalid plugin artifact manifest") from exc
|
|
205
|
+
if not isinstance(manifest, dict):
|
|
206
|
+
raise ValueError("Plugin artifact manifest must be an object")
|
|
207
|
+
for key in ("schema_version", "ecosystem", "runtime_version", "plugin_lock_digest"):
|
|
208
|
+
if manifest.get(key) != getattr(receipt, key):
|
|
209
|
+
raise ValueError("Plugin artifact manifest mismatch")
|
|
210
|
+
|
|
211
|
+
files = manifest.get("files")
|
|
212
|
+
if not isinstance(files, list) or not files or len(files) > MAX_FILES:
|
|
213
|
+
raise ValueError("Missing or excessive plugin artifact file index")
|
|
214
|
+
|
|
215
|
+
indexed: list[tuple[dict, str]] = []
|
|
216
|
+
expected = {"manifest.json"}
|
|
217
|
+
for item in files:
|
|
218
|
+
if not isinstance(item, dict):
|
|
219
|
+
raise ValueError("Invalid plugin artifact file index")
|
|
220
|
+
try:
|
|
221
|
+
name = _safe_path(item["path"])
|
|
222
|
+
size = int(item["size"])
|
|
223
|
+
mode = int(item["mode"])
|
|
224
|
+
digest = str(item["digest"])
|
|
225
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
226
|
+
raise ValueError("Invalid plugin artifact file index") from exc
|
|
227
|
+
if size < 0 or size > MAX_BYTES or (mode & ~0o111) != 0o644:
|
|
228
|
+
raise ValueError("Plugin artifact has invalid file size or mode")
|
|
229
|
+
if not digest.startswith("sha256:") or len(digest) != 71:
|
|
230
|
+
raise ValueError("Plugin artifact has invalid file digest")
|
|
231
|
+
relative = "payload/" + name
|
|
232
|
+
if relative in expected:
|
|
233
|
+
raise ValueError("Duplicate plugin artifact file index")
|
|
234
|
+
expected.add(relative)
|
|
235
|
+
indexed.append((item, relative))
|
|
236
|
+
|
|
237
|
+
actual: set[str] = set()
|
|
238
|
+
for path in source.rglob("*"):
|
|
239
|
+
relative = path.relative_to(source).as_posix()
|
|
240
|
+
if path.is_symlink():
|
|
241
|
+
raise ValueError("Plugin artifacts cannot contain symlinks")
|
|
242
|
+
if path.is_dir():
|
|
243
|
+
_safe_path(relative)
|
|
244
|
+
continue
|
|
245
|
+
if not path.is_file():
|
|
246
|
+
raise ValueError("Plugin artifacts require regular files")
|
|
247
|
+
actual.add(relative)
|
|
248
|
+
if actual != expected:
|
|
249
|
+
raise ValueError("Plugin artifact file index mismatch")
|
|
250
|
+
|
|
251
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
252
|
+
staging = Path(tempfile.mkdtemp(prefix=".plugin-restore-", dir=target.parent))
|
|
253
|
+
total = 0
|
|
254
|
+
try:
|
|
255
|
+
for item, relative in indexed:
|
|
256
|
+
source_file = source / relative
|
|
257
|
+
size = int(item["size"])
|
|
258
|
+
with source_file.open("rb") as stream:
|
|
259
|
+
raw = stream.read(size + 1)
|
|
260
|
+
total += len(raw)
|
|
261
|
+
if (
|
|
262
|
+
len(raw) != size
|
|
263
|
+
or total > MAX_BYTES
|
|
264
|
+
or _digest(raw) != item["digest"]
|
|
265
|
+
):
|
|
266
|
+
raise ValueError("Plugin artifact file digest mismatch")
|
|
267
|
+
destination = staging / item["path"]
|
|
268
|
+
destination.parent.mkdir(parents=True, exist_ok=True)
|
|
269
|
+
destination.write_bytes(raw)
|
|
270
|
+
destination.chmod(int(item["mode"]))
|
|
271
|
+
os.replace(staging, target)
|
|
272
|
+
return target
|
|
273
|
+
finally:
|
|
274
|
+
if staging.exists():
|
|
275
|
+
shutil.rmtree(staging)
|
|
@@ -7,6 +7,8 @@ not add a generic plugin execution API to KsADK.
|
|
|
7
7
|
from ksadk.plugins.bridges.codex import (
|
|
8
8
|
CodexAppServerPluginBridge,
|
|
9
9
|
CodexBridgeError,
|
|
10
|
+
CodexHostComponentDetail,
|
|
11
|
+
CodexMarketplaceAddResult,
|
|
10
12
|
CodexPluginApprovalRequired,
|
|
11
13
|
CodexPluginDetail,
|
|
12
14
|
CodexPluginInventory,
|
|
@@ -15,7 +17,6 @@ from ksadk.plugins.bridges.codex import (
|
|
|
15
17
|
from ksadk.plugins.bridges.dsh import (
|
|
16
18
|
DshBridgeError,
|
|
17
19
|
DshBridgeHost,
|
|
18
|
-
DshClientBundle,
|
|
19
20
|
DshHostUnavailableError,
|
|
20
21
|
DshPluginApprovalRequired,
|
|
21
22
|
DshPluginInventory,
|
|
@@ -28,13 +29,14 @@ from ksadk.plugins.bridges.dsh import (
|
|
|
28
29
|
__all__ = [
|
|
29
30
|
"CodexAppServerPluginBridge",
|
|
30
31
|
"CodexBridgeError",
|
|
32
|
+
"CodexHostComponentDetail",
|
|
33
|
+
"CodexMarketplaceAddResult",
|
|
31
34
|
"CodexPluginApprovalRequired",
|
|
32
35
|
"CodexPluginDetail",
|
|
33
36
|
"CodexPluginInventory",
|
|
34
37
|
"CodexPluginNotFoundError",
|
|
35
38
|
"DshBridgeError",
|
|
36
39
|
"DshBridgeHost",
|
|
37
|
-
"DshClientBundle",
|
|
38
40
|
"DshHostUnavailableError",
|
|
39
41
|
"DshPluginApprovalRequired",
|
|
40
42
|
"DshPluginInventory",
|
ksadk/plugins/bridges/codex.py
CHANGED
|
@@ -21,7 +21,7 @@ def _to_camel(value: str) -> str:
|
|
|
21
21
|
return head + "".join(part.capitalize() for part in tail)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
class
|
|
24
|
+
class _CodexPublicModel(BaseModel):
|
|
25
25
|
model_config = ConfigDict(
|
|
26
26
|
alias_generator=_to_camel,
|
|
27
27
|
populate_by_name=True,
|
|
@@ -30,6 +30,17 @@ class _CodexWireModel(BaseModel):
|
|
|
30
30
|
)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
class _CodexWireModel(_CodexPublicModel):
|
|
34
|
+
"""Forward-compatible model for the experimental App Server surface."""
|
|
35
|
+
|
|
36
|
+
model_config = ConfigDict(
|
|
37
|
+
alias_generator=_to_camel,
|
|
38
|
+
populate_by_name=True,
|
|
39
|
+
extra="allow",
|
|
40
|
+
frozen=True,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
33
44
|
class _LocalSource(_CodexWireModel):
|
|
34
45
|
type: Literal["local"]
|
|
35
46
|
path: str
|
|
@@ -130,7 +141,7 @@ class _PluginUninstallResponse(_CodexWireModel):
|
|
|
130
141
|
pass
|
|
131
142
|
|
|
132
143
|
|
|
133
|
-
class CodexPluginInventory(
|
|
144
|
+
class CodexPluginInventory(_CodexPublicModel):
|
|
134
145
|
"""Normalized observed state; install receipt never implies these fields."""
|
|
135
146
|
|
|
136
147
|
plugin_id: str
|
|
@@ -142,6 +153,7 @@ class CodexPluginInventory(_CodexWireModel):
|
|
|
142
153
|
enabled: bool
|
|
143
154
|
availability: str
|
|
144
155
|
source: CodexPluginSource = Field(discriminator="type")
|
|
156
|
+
interface: dict[str, Any] = Field(default_factory=dict)
|
|
145
157
|
permissions_declared: Literal[False] = False
|
|
146
158
|
risk_disclosures: tuple[str, ...] = (
|
|
147
159
|
"Codex plugin permissions are host-managed and not declared in the plugin manifest.",
|
|
@@ -149,29 +161,47 @@ class CodexPluginInventory(_CodexWireModel):
|
|
|
149
161
|
)
|
|
150
162
|
|
|
151
163
|
|
|
152
|
-
class
|
|
164
|
+
class CodexHostComponentDetail(_CodexPublicModel):
|
|
165
|
+
"""Lossless-enough projection of a component reported by ``plugin/read``."""
|
|
166
|
+
|
|
167
|
+
kind: Literal["skill", "mcp", "hook", "app", "app-template", "scheduled-task"]
|
|
168
|
+
name: str
|
|
169
|
+
path: str | None = None
|
|
170
|
+
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class CodexPluginDetail(_CodexPublicModel):
|
|
153
174
|
inventory: CodexPluginInventory
|
|
154
175
|
description: str | None = None
|
|
176
|
+
share_url: str | None = None
|
|
155
177
|
skills: tuple[str, ...] = ()
|
|
156
178
|
mcp_servers: tuple[str, ...] = ()
|
|
157
179
|
hooks: tuple[str, ...] = ()
|
|
158
180
|
apps: tuple[str, ...] = ()
|
|
159
181
|
scheduled_tasks: tuple[str, ...] = ()
|
|
182
|
+
components: tuple[CodexHostComponentDetail, ...] = ()
|
|
183
|
+
host_metadata: dict[str, Any] = Field(default_factory=dict)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class CodexMarketplaceAddResult(_CodexPublicModel):
|
|
187
|
+
marketplace_name: str
|
|
188
|
+
installed_root: str
|
|
189
|
+
already_added: bool
|
|
160
190
|
|
|
161
191
|
|
|
162
|
-
class CodexPluginInstallResult(
|
|
192
|
+
class CodexPluginInstallResult(_CodexPublicModel):
|
|
163
193
|
inventory: CodexPluginInventory
|
|
164
194
|
auth_policy: Literal["ON_INSTALL", "ON_USE"]
|
|
165
195
|
apps_needing_auth: tuple[str, ...] = ()
|
|
166
196
|
|
|
167
197
|
|
|
168
|
-
class CodexPluginUninstallResult(
|
|
198
|
+
class CodexPluginUninstallResult(_CodexPublicModel):
|
|
169
199
|
plugin_id: str
|
|
170
200
|
installed: Literal[False] = False
|
|
171
201
|
enabled: Literal[False] = False
|
|
172
202
|
|
|
173
203
|
|
|
174
|
-
class CodexBridgeHost(
|
|
204
|
+
class CodexBridgeHost(_CodexPublicModel):
|
|
175
205
|
host_id: Literal["codex-app-server"] = "codex-app-server"
|
|
176
206
|
version: str
|
|
177
207
|
protocol: Literal["codex.app-server/v1"] = "codex.app-server/v1"
|
|
@@ -231,6 +261,63 @@ def _reported_host_version(metadata: Any) -> str:
|
|
|
231
261
|
return match.group(1) if match is not None else "unreported"
|
|
232
262
|
|
|
233
263
|
|
|
264
|
+
def _component_path(metadata: dict[str, Any]) -> str | None:
|
|
265
|
+
for field in (
|
|
266
|
+
"path",
|
|
267
|
+
"filePath",
|
|
268
|
+
"file_path",
|
|
269
|
+
"skillPath",
|
|
270
|
+
"skill_path",
|
|
271
|
+
"manifestPath",
|
|
272
|
+
"manifest_path",
|
|
273
|
+
):
|
|
274
|
+
value = metadata.get(field)
|
|
275
|
+
if isinstance(value, str) and value:
|
|
276
|
+
return value
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _reported_components(plugin: _PluginDetailWire) -> tuple[CodexHostComponentDetail, ...]:
|
|
281
|
+
components: list[CodexHostComponentDetail] = []
|
|
282
|
+
|
|
283
|
+
def append(
|
|
284
|
+
kind: Literal["skill", "hook", "app", "app-template", "scheduled-task"],
|
|
285
|
+
items: tuple[dict[str, Any], ...],
|
|
286
|
+
identity_fields: tuple[str, ...],
|
|
287
|
+
) -> None:
|
|
288
|
+
for index, item in enumerate(items):
|
|
289
|
+
name = next(
|
|
290
|
+
(
|
|
291
|
+
str(item[field])
|
|
292
|
+
for field in identity_fields
|
|
293
|
+
if item.get(field) not in (None, "")
|
|
294
|
+
),
|
|
295
|
+
f"{kind}:{index}",
|
|
296
|
+
)
|
|
297
|
+
components.append(
|
|
298
|
+
CodexHostComponentDetail(
|
|
299
|
+
kind=kind,
|
|
300
|
+
name=name,
|
|
301
|
+
path=_component_path(item),
|
|
302
|
+
metadata=dict(item),
|
|
303
|
+
)
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
append("skill", plugin.skills, ("name", "id", "key"))
|
|
307
|
+
append("hook", plugin.hooks, ("key", "name", "id"))
|
|
308
|
+
append("app", plugin.apps, ("id", "name", "key"))
|
|
309
|
+
append("app-template", plugin.app_templates, ("id", "name", "key"))
|
|
310
|
+
append(
|
|
311
|
+
"scheduled-task",
|
|
312
|
+
plugin.scheduled_tasks or (),
|
|
313
|
+
("key", "name", "id"),
|
|
314
|
+
)
|
|
315
|
+
components.extend(
|
|
316
|
+
CodexHostComponentDetail(kind="mcp", name=name) for name in plugin.mcp_servers
|
|
317
|
+
)
|
|
318
|
+
return tuple(components)
|
|
319
|
+
|
|
320
|
+
|
|
234
321
|
class CodexAppServerPluginBridge:
|
|
235
322
|
"""Allowlisted Codex plugin manager backed by one App Server process."""
|
|
236
323
|
|
|
@@ -290,12 +377,27 @@ class CodexAppServerPluginBridge:
|
|
|
290
377
|
await transport.close()
|
|
291
378
|
|
|
292
379
|
async def add_marketplace(self, source: str, *, ref_name: str | None = None) -> str:
|
|
380
|
+
result = await self.add_marketplace_with_receipt(source, ref_name=ref_name)
|
|
381
|
+
return result.marketplace_name
|
|
382
|
+
|
|
383
|
+
async def add_marketplace_with_receipt(
|
|
384
|
+
self,
|
|
385
|
+
source: str,
|
|
386
|
+
*,
|
|
387
|
+
ref_name: str | None = None,
|
|
388
|
+
) -> CodexMarketplaceAddResult:
|
|
389
|
+
"""Add a marketplace while retaining its host-materialized root."""
|
|
390
|
+
|
|
293
391
|
response = await self._request(
|
|
294
392
|
"marketplace/add",
|
|
295
393
|
{"source": source, "refName": ref_name, "sparsePaths": None},
|
|
296
394
|
_MarketplaceAddResponse,
|
|
297
395
|
)
|
|
298
|
-
return
|
|
396
|
+
return CodexMarketplaceAddResult(
|
|
397
|
+
marketplace_name=response.marketplace_name,
|
|
398
|
+
installed_root=response.installed_root,
|
|
399
|
+
already_added=response.already_added,
|
|
400
|
+
)
|
|
299
401
|
|
|
300
402
|
async def list_plugins(
|
|
301
403
|
self, *, force_refetch: bool = False
|
|
@@ -324,18 +426,20 @@ class CodexAppServerPluginBridge:
|
|
|
324
426
|
_PluginReadResponse,
|
|
325
427
|
)
|
|
326
428
|
plugin = response.plugin
|
|
429
|
+
components = _reported_components(plugin)
|
|
327
430
|
return CodexPluginDetail(
|
|
328
431
|
inventory=self._inventory(marketplace, plugin.summary),
|
|
329
432
|
description=plugin.description,
|
|
330
|
-
|
|
433
|
+
share_url=plugin.share_url,
|
|
434
|
+
skills=tuple(component.name for component in components if component.kind == "skill"),
|
|
331
435
|
mcp_servers=plugin.mcp_servers,
|
|
332
|
-
hooks=tuple(
|
|
333
|
-
apps=tuple(
|
|
436
|
+
hooks=tuple(component.name for component in components if component.kind == "hook"),
|
|
437
|
+
apps=tuple(component.name for component in components if component.kind == "app"),
|
|
334
438
|
scheduled_tasks=tuple(
|
|
335
|
-
|
|
336
|
-
for item in (plugin.scheduled_tasks or ())
|
|
337
|
-
if item.get("key")
|
|
439
|
+
component.name for component in components if component.kind == "scheduled-task"
|
|
338
440
|
),
|
|
441
|
+
components=components,
|
|
442
|
+
host_metadata=dict(plugin.model_extra or {}),
|
|
339
443
|
)
|
|
340
444
|
|
|
341
445
|
async def install_plugin(
|
|
@@ -536,6 +640,7 @@ class CodexAppServerPluginBridge:
|
|
|
536
640
|
enabled=summary.enabled,
|
|
537
641
|
availability=summary.availability,
|
|
538
642
|
source=summary.source,
|
|
643
|
+
interface=summary.interface or {},
|
|
539
644
|
)
|
|
540
645
|
|
|
541
646
|
|
|
@@ -543,6 +648,8 @@ __all__ = [
|
|
|
543
648
|
"CodexAppServerPluginBridge",
|
|
544
649
|
"CodexBridgeError",
|
|
545
650
|
"CodexBridgeHost",
|
|
651
|
+
"CodexHostComponentDetail",
|
|
652
|
+
"CodexMarketplaceAddResult",
|
|
546
653
|
"CodexPluginApprovalRequired",
|
|
547
654
|
"CodexPluginDetail",
|
|
548
655
|
"CodexPluginInstallResult",
|