agentengine-sdk-python 0.8.3__py3-none-any.whl → 0.8.4__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.4.dist-info}/METADATA +9 -8
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/RECORD +482 -245
- ksadk/_build_provenance.json +1 -1
- ksadk/api/client.py +105 -91
- ksadk/builders/code_builder.py +36 -9
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +36 -7
- ksadk/builders/managed_runtime_builder.py +1 -0
- ksadk/cli/__init__.py +32 -3
- ksadk/cli/cmd_managed_runtime.py +13 -1
- ksadk/cli/cmd_plugin.py +6 -1
- ksadk/cli/cmd_web.py +2 -5
- ksadk/cli/runtime_bootstrap.py +23 -1
- ksadk/codex/client.py +424 -96
- ksadk/codex/projection.py +24 -0
- ksadk/codex/runtime.py +56 -298
- ksadk/common/auth.py +16 -10
- ksadk/configs/env_registry.py +29 -1
- ksadk/conversations/message_projection.py +135 -14
- ksadk/conversations/projector.py +4 -6
- ksadk/conversations/runtime_invocation.py +5 -0
- ksadk/conversations/runtime_payloads.py +1 -0
- ksadk/conversations/runtime_preparation.py +30 -27
- ksadk/conversations/runtime_resume.py +50 -2
- ksadk/conversations/runtime_stream_events.py +5 -0
- ksadk/conversations/runtime_streaming.py +25 -7
- ksadk/deployment/env_forward.py +2 -2
- ksadk/deployment/providers/serverless.py +1 -1
- ksadk/events/adapters/_codex_validators.py +18 -7
- ksadk/events/adapters/langgraph.py +15 -1
- ksadk/events/canonical_store.py +3 -1
- ksadk/events/projections.py +1 -1
- ksadk/harness/config.py +2 -2
- ksadk/harness/runtime.py +27 -27
- ksadk/harness/tools.py +38 -13
- ksadk/interaction/provider.py +1 -0
- ksadk/interaction/providers/langgraph.py +1 -0
- ksadk/kernel/bootstrap.py +28 -4
- ksadk/kernel/ingress.py +15 -2
- ksadk/kernel/sqlite_store.py +27 -0
- ksadk/kernel/store.py +3 -0
- ksadk/kernel/worker.py +65 -10
- 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/models.py +7 -4
- ksadk/memory/provider_resolver.py +3 -0
- ksadk/model_proxy/server.py +10 -5
- ksadk/plugins/__init__.py +4 -0
- 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 +340 -156
- ksadk/plugins/builtins.py +35 -36
- ksadk/plugins/bundle_security.py +28 -4
- ksadk/plugins/codex_manifest.py +983 -0
- ksadk/plugins/composition.py +8 -0
- ksadk/plugins/contracts.py +118 -0
- ksadk/plugins/delivery.py +153 -0
- ksadk/plugins/dsh_installation_digest.py +71 -0
- ksadk/plugins/dsh_toolchain.py +110 -21
- ksadk/plugins/ecosystem_probe.py +6 -6
- 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-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/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
- ksadk/plugins/providers/codex.py +335 -69
- ksadk/plugins/providers/codex_native.py +368 -0
- ksadk/plugins/providers/codex_turn.py +301 -0
- ksadk/plugins/providers/dsh_capabilities.py +1389 -0
- ksadk/plugins/providers/dsh_mcp.py +467 -0
- ksadk/plugins/providers/harness.py +118 -113
- ksadk/plugins/providers/mcp_projection.py +150 -0
- ksadk/plugins/providers/platform_resources.py +657 -0
- ksadk/plugins/resolver.py +8 -1
- 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 +74 -6
- ksadk/runners/adk_runner.py +149 -11
- ksadk/runners/base_runner.py +29 -1
- ksadk/runners/langgraph_runner.py +475 -145
- ksadk/runtime/_runner_adapter/stream_mapping.py +142 -18
- ksadk/runtime/adapter.py +2 -0
- ksadk/runtime/conversation_execution.py +92 -16
- ksadk/runtime/executor.py +78 -2
- ksadk/runtime/factory.py +29 -273
- ksadk/runtime/framework_adapters.py +23 -0
- ksadk/runtime/preprocessing.py +10 -2
- ksadk/runtime/runner_adapter.py +73 -14
- ksadk/runtime_context.py +40 -2
- ksadk/sandbox/backends/e2b.py +52 -11
- ksadk/sandbox/backends/local_process.py +9 -0
- ksadk/sandbox/base.py +2 -0
- ksadk/sandbox/e2b_connection.py +66 -0
- ksadk/scheduler/sqlite_store.py +18 -0
- ksadk/server/composition.py +2 -0
- ksadk/server/factory.py +5 -0
- ksadk/server/persistence_capability.py +516 -0
- ksadk/server/routes/control.py +210 -46
- ksadk/server/routes/dependencies.py +15 -0
- ksadk/server/routes/models.py +47 -4
- ksadk/server/routes/projection.py +252 -12
- ksadk/server/routes/sessions.py +284 -107
- ksadk/server/routes/streaming.py +43 -9
- ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-b4C7upmO.js} +3 -3
- ksadk/server/static/assets/{MathMessageMarkdown-D9uB55Oh.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
- ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-BEBN4Ksz.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
- ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-bTohInsS.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-bZ7ws-8m.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-CkonRdAS.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
- ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-UBpgon5q.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
- ksadk/server/static/assets/{dist-DdRBIceA.js → dist-B2_CVgKv.js} +1 -1
- ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-B3FR1SKK.js} +1 -1
- ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-BIr4DSRq.js} +1 -1
- ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-BgV_owcB.js} +1 -1
- ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-Bj730Ib4.js} +1 -1
- ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-BnaTiyzN.js} +1 -1
- ksadk/server/static/assets/{dist-C71CsujO.js → dist-C1NMAY5a.js} +1 -1
- ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-C5_ZAZsG.js} +1 -1
- ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-CB9iJrvg.js} +1 -1
- ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CFzsn6BG.js} +1 -1
- ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-Cf125P_m.js} +1 -1
- ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-ClYUxfeK.js} +1 -1
- ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-DFD6Qa6T.js} +1 -1
- ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DVCOWtha.js} +1 -1
- ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-D_ctSS2i.js} +1 -1
- ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-DiixqL0J.js} +1 -1
- ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-DoVSwoDb.js} +1 -1
- ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-DvFK7p5S.js} +1 -1
- ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-QfkEHOlb.js} +1 -1
- ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-btbmmX5O.js} +1 -1
- ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-fBO2v5Kt.js} +1 -1
- ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-ufY3F5p6.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
- ksadk/server/static/assets/index-DcTML1Up.css +2 -0
- ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CgoyWiDR.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
- ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-B4weu383.js} +1 -1
- ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-V-MgYHW1.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-CBijEX_c.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-BQVc9ia_.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-EnNl0DE7.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
- ksadk/server/static/index.html +2 -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/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/models.py +26 -4
- ksadk/skills/package_store.py +186 -38
- ksadk/skills/runtime/agent.py +31 -6
- ksadk/skills/runtime/artifact_delivery.py +139 -0
- ksadk/skills/runtime/backends/e2b.py +98 -6
- ksadk/skills/runtime/backends/local.py +73 -8
- ksadk/skills/runtime/base.py +3 -0
- ksadk/skills/runtime/executor.py +2 -0
- ksadk/skills/runtime/loader.py +10 -2
- ksadk/skills/runtime/pinned.py +114 -0
- ksadk/skills/runtime/request.py +31 -0
- ksadk/skills/service_client.py +167 -28
- ksadk/studio/api.py +224 -42
- ksadk/studio/api_catalog_routes.py +18 -0
- ksadk/studio/api_plugin_routes.py +526 -95
- ksadk/studio/api_resource_connections.py +183 -0
- ksadk/studio/authoring_coordinator.py +19 -14
- ksadk/studio/builder.py +76 -0
- ksadk/studio/cloud.py +342 -104
- ksadk/studio/cloud_shared_web.py +565 -0
- ksadk/studio/codex_agent_service.py +128 -26
- ksadk/studio/codex_builder.py +241 -2
- 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 +184 -25
- ksadk/studio/compatibility_report.py +12 -1
- ksadk/studio/compiler.py +78 -14
- ksadk/studio/contracts.py +132 -6
- ksadk/studio/dsh_application.py +137 -0
- ksadk/studio/dsh_capability_service.py +1107 -0
- ksadk/studio/dsh_models.py +59 -0
- ksadk/studio/dsh_provider_registration.py +320 -13
- ksadk/studio/hosted_kernel.py +88 -13
- ksadk/studio/mcp_runtime.py +11 -3
- ksadk/studio/model_client.py +2 -2
- ksadk/studio/plugin_composition.py +190 -23
- ksadk/studio/plugin_kernel_adapter.py +12 -112
- ksadk/studio/plugin_runtime.py +224 -45
- ksadk/studio/resource_authority.py +637 -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 +143 -2
- ksadk/studio/resource_connections.py +220 -0
- ksadk/studio/run_service.py +462 -52
- ksadk/studio/runtime_source.py +15 -7
- ksadk/studio/scheduler_assistant.py +317 -0
- ksadk/studio/scheduler_runtime.py +9 -0
- ksadk/studio/scheduler_service.py +3 -0
- ksadk/studio/service.py +490 -44
- ksadk/studio/shared_web.py +446 -62
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -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-CBcDrAw--BEOyPC3w.css +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
- ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
- ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
- ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
- ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
- ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
- ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
- ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
- ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
- ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
- ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
- ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
- ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
- ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
- ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
- ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
- ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
- ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
- ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
- ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.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-0BZ98mya.js +30 -0
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
- ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
- ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
- ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
- ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
- ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
- ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
- ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
- ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
- ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
- ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
- ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
- ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
- ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
- ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
- ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
- ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
- ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
- ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.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-Bo-JTwt0.js +40 -0
- ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
- ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
- ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
- ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
- ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/version.py +1 -1
- 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/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.4.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
|
@@ -6,10 +6,13 @@ delegates every turn to ``HarnessRuntimeAdapter`` through
|
|
|
6
6
|
history therefore stay on the existing conversation pipeline; this module does
|
|
7
7
|
not create another event stream or transcript store.
|
|
8
8
|
"""
|
|
9
|
+
|
|
9
10
|
from __future__ import annotations
|
|
10
11
|
|
|
12
|
+
import asyncio
|
|
11
13
|
import json
|
|
12
|
-
from collections.abc import Mapping, Sequence
|
|
14
|
+
from collections.abc import Awaitable, Mapping, Sequence
|
|
15
|
+
from contextlib import AsyncExitStack
|
|
13
16
|
from dataclasses import dataclass, replace
|
|
14
17
|
from pathlib import Path
|
|
15
18
|
from typing import Any, Protocol, cast, runtime_checkable
|
|
@@ -20,6 +23,7 @@ from ksadk.harness.runtime import HarnessRuntimeAdapter
|
|
|
20
23
|
from ksadk.plugins.bundle import ResolvedPluginBundle
|
|
21
24
|
from ksadk.plugins.contracts import CompositionProfile, PluginManifest
|
|
22
25
|
from ksadk.plugins.host import PluginExecutionContext, PluginHostError
|
|
26
|
+
from ksadk.plugins.providers.mcp_projection import project_mcp_capabilities
|
|
23
27
|
from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext, RuntimeRegistry, StartRequest
|
|
24
28
|
from ksadk.runtime.conversation_execution import invoke_runtime_conversation_once
|
|
25
29
|
from ksadk.sessions import create_session_service
|
|
@@ -59,23 +63,15 @@ class HarnessTurnRequest:
|
|
|
59
63
|
if isinstance(value, cls):
|
|
60
64
|
return value
|
|
61
65
|
if not isinstance(value, Mapping):
|
|
62
|
-
raise PluginHostError(
|
|
63
|
-
"harness_input_invalid", "Harness input must be an object"
|
|
64
|
-
)
|
|
66
|
+
raise PluginHostError("harness_input_invalid", "Harness input must be an object")
|
|
65
67
|
user_id = str(value.get("user_id") or value.get("userId") or "").strip()
|
|
66
68
|
if not user_id:
|
|
67
|
-
raise PluginHostError(
|
|
68
|
-
"harness_input_invalid", "Harness input requires user_id"
|
|
69
|
-
)
|
|
69
|
+
raise PluginHostError("harness_input_invalid", "Harness input requires user_id")
|
|
70
70
|
raw_messages = value.get("messages")
|
|
71
71
|
if raw_messages is None and value.get("input") is not None:
|
|
72
72
|
raw_messages = [{"role": "user", "content": value.get("input")}]
|
|
73
|
-
if not isinstance(raw_messages, Sequence) or isinstance(
|
|
74
|
-
|
|
75
|
-
):
|
|
76
|
-
raise PluginHostError(
|
|
77
|
-
"harness_input_invalid", "Harness input requires messages"
|
|
78
|
-
)
|
|
73
|
+
if not isinstance(raw_messages, Sequence) or isinstance(raw_messages, (str, bytes)):
|
|
74
|
+
raise PluginHostError("harness_input_invalid", "Harness input requires messages")
|
|
79
75
|
messages: list[Mapping[str, Any]] = []
|
|
80
76
|
for index, message in enumerate(raw_messages):
|
|
81
77
|
if not isinstance(message, Mapping):
|
|
@@ -94,24 +90,18 @@ class HarnessTurnRequest:
|
|
|
94
90
|
raise PluginHostError(
|
|
95
91
|
"harness_input_invalid", "Harness turn must end with a user message"
|
|
96
92
|
)
|
|
97
|
-
session_id = str(
|
|
98
|
-
value.get("session_id") or value.get("sessionId") or ""
|
|
99
|
-
).strip()
|
|
93
|
+
session_id = str(value.get("session_id") or value.get("sessionId") or "").strip()
|
|
100
94
|
model = str(value.get("model") or "").strip()
|
|
101
95
|
metadata = value.get("request_metadata") or value.get("requestMetadata")
|
|
102
96
|
if metadata is not None and not isinstance(metadata, Mapping):
|
|
103
|
-
raise PluginHostError(
|
|
104
|
-
"harness_input_invalid", "request_metadata must be an object"
|
|
105
|
-
)
|
|
97
|
+
raise PluginHostError("harness_input_invalid", "request_metadata must be an object")
|
|
106
98
|
return cls(
|
|
107
99
|
user_id=user_id,
|
|
108
100
|
session_id=session_id or None,
|
|
109
101
|
messages=tuple(messages),
|
|
110
102
|
model=model or None,
|
|
111
103
|
request_metadata=dict(metadata) if metadata is not None else None,
|
|
112
|
-
invocation_id=str(
|
|
113
|
-
value.get("invocation_id") or value.get("invocationId") or ""
|
|
114
|
-
).strip()
|
|
104
|
+
invocation_id=str(value.get("invocation_id") or value.get("invocationId") or "").strip()
|
|
115
105
|
or None,
|
|
116
106
|
)
|
|
117
107
|
|
|
@@ -129,14 +119,17 @@ class HarnessTurnResult:
|
|
|
129
119
|
class HarnessMCPSource(Protocol):
|
|
130
120
|
def harness_mcp_specs(
|
|
131
121
|
self, bundle: ResolvedPluginBundle
|
|
132
|
-
) -> Sequence[McpToolSpec]: ...
|
|
122
|
+
) -> Sequence[McpToolSpec] | Awaitable[Sequence[McpToolSpec]]: ...
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@runtime_checkable
|
|
126
|
+
class HarnessMCPActivationSource(Protocol):
|
|
127
|
+
async def release_harness_mcp_specs(self, specs: Sequence[McpToolSpec]) -> None: ...
|
|
133
128
|
|
|
134
129
|
|
|
135
130
|
@runtime_checkable
|
|
136
131
|
class HarnessSkillSource(Protocol):
|
|
137
|
-
def harness_skill(
|
|
138
|
-
self, bundle: ResolvedPluginBundle
|
|
139
|
-
) -> HarnessSkillContribution: ...
|
|
132
|
+
def harness_skill(self, bundle: ResolvedPluginBundle) -> HarnessSkillContribution: ...
|
|
140
133
|
|
|
141
134
|
|
|
142
135
|
@runtime_checkable
|
|
@@ -269,97 +262,91 @@ class KsADKHarnessProviderRuntime:
|
|
|
269
262
|
capabilities: PluginExecutionContext,
|
|
270
263
|
) -> "KsADKHarnessActivation":
|
|
271
264
|
if not self._ready or self._disposed:
|
|
272
|
-
raise PluginHostError(
|
|
273
|
-
|
|
265
|
+
raise PluginHostError("harness_provider_unavailable", "Harness provider is not ready")
|
|
266
|
+
|
|
267
|
+
async with AsyncExitStack() as mcp_cleanup:
|
|
268
|
+
projection = await project_mcp_capabilities(capabilities, bundle)
|
|
269
|
+
mcp_cleanup.push_async_callback(projection.aclose)
|
|
270
|
+
mcp_specs = list(projection.specs)
|
|
271
|
+
mcp_owners = list(projection.owners)
|
|
272
|
+
|
|
273
|
+
skills: list[HarnessSkillContribution] = []
|
|
274
|
+
skill_owners: list[str] = []
|
|
275
|
+
for binding in capabilities.all("skill.source/v1"):
|
|
276
|
+
if not isinstance(binding.runtime, HarnessSkillSource):
|
|
277
|
+
raise PluginHostError(
|
|
278
|
+
"harness_skill_incompatible",
|
|
279
|
+
f"plugin {binding.plugin_id} cannot project Harness instructions",
|
|
280
|
+
)
|
|
281
|
+
contribution = binding.runtime.harness_skill(bundle)
|
|
282
|
+
if not contribution.name.strip() or not contribution.instructions.strip():
|
|
283
|
+
raise PluginHostError(
|
|
284
|
+
"harness_skill_invalid",
|
|
285
|
+
f"plugin {binding.plugin_id} returned an empty Skill contribution",
|
|
286
|
+
)
|
|
287
|
+
skills.append(contribution)
|
|
288
|
+
skill_owners.append(binding.plugin_id)
|
|
289
|
+
|
|
290
|
+
context_sources: list[HarnessContextSource] = []
|
|
291
|
+
context_owners: list[str] = []
|
|
292
|
+
for binding in capabilities.all("context.contributor/v1"):
|
|
293
|
+
if not isinstance(binding.runtime, HarnessContextSource):
|
|
294
|
+
raise PluginHostError(
|
|
295
|
+
"harness_context_incompatible",
|
|
296
|
+
f"plugin {binding.plugin_id} cannot contribute Harness context",
|
|
297
|
+
)
|
|
298
|
+
context_sources.append(binding.runtime)
|
|
299
|
+
context_owners.append(binding.plugin_id)
|
|
300
|
+
|
|
301
|
+
execution = bundle.resolved_agent_spec.get("execution")
|
|
302
|
+
strategy = (
|
|
303
|
+
str(execution.get("strategy") or "direct").strip()
|
|
304
|
+
if isinstance(execution, Mapping)
|
|
305
|
+
else "direct"
|
|
274
306
|
)
|
|
275
|
-
|
|
276
|
-
mcp_specs: list[McpToolSpec] = []
|
|
277
|
-
mcp_owners: list[str] = []
|
|
278
|
-
for binding in capabilities.all("mcp.connector/v1"):
|
|
279
|
-
if not isinstance(binding.runtime, HarnessMCPSource):
|
|
280
|
-
raise PluginHostError(
|
|
281
|
-
"harness_mcp_incompatible",
|
|
282
|
-
f"plugin {binding.plugin_id} cannot project Harness MCP config",
|
|
283
|
-
)
|
|
284
|
-
mcp_specs.extend(binding.runtime.harness_mcp_specs(bundle))
|
|
285
|
-
mcp_owners.append(binding.plugin_id)
|
|
286
|
-
|
|
287
|
-
skills: list[HarnessSkillContribution] = []
|
|
288
|
-
skill_owners: list[str] = []
|
|
289
|
-
for binding in capabilities.all("skill.source/v1"):
|
|
290
|
-
if not isinstance(binding.runtime, HarnessSkillSource):
|
|
291
|
-
raise PluginHostError(
|
|
292
|
-
"harness_skill_incompatible",
|
|
293
|
-
f"plugin {binding.plugin_id} cannot project Harness instructions",
|
|
294
|
-
)
|
|
295
|
-
contribution = binding.runtime.harness_skill(bundle)
|
|
296
|
-
if not contribution.name.strip() or not contribution.instructions.strip():
|
|
307
|
+
if strategy != "direct":
|
|
297
308
|
raise PluginHostError(
|
|
298
|
-
"
|
|
299
|
-
f"
|
|
309
|
+
"harness_execution_strategy_unsupported",
|
|
310
|
+
f"KsADK Harness Provider does not support {strategy!r}",
|
|
300
311
|
)
|
|
301
|
-
skills.append(contribution)
|
|
302
|
-
skill_owners.append(binding.plugin_id)
|
|
303
312
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
"harness_context_incompatible",
|
|
310
|
-
f"plugin {binding.plugin_id} cannot contribute Harness context",
|
|
313
|
+
model, prompt = _bundle_model_and_prompt(bundle)
|
|
314
|
+
if skills:
|
|
315
|
+
prompt = _append_prompt_sections(
|
|
316
|
+
prompt,
|
|
317
|
+
[f"Skill {item.name}:\n{item.instructions}" for item in skills],
|
|
311
318
|
)
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
if isinstance(execution, Mapping)
|
|
319
|
-
else "direct"
|
|
320
|
-
)
|
|
321
|
-
if strategy != "direct":
|
|
322
|
-
raise PluginHostError(
|
|
323
|
-
"harness_execution_strategy_unsupported",
|
|
324
|
-
f"KsADK Harness Provider does not support {strategy!r}",
|
|
319
|
+
config = HarnessConfig(
|
|
320
|
+
model=model,
|
|
321
|
+
prompt=prompt,
|
|
322
|
+
mcp_tools=tuple(mcp_specs),
|
|
323
|
+
sandbox=SandboxPolicy(read_only=True),
|
|
324
|
+
runtime="yaml",
|
|
325
325
|
)
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
326
|
+
inventory = HarnessProviderInventory(
|
|
327
|
+
provider=self._plugin_id,
|
|
328
|
+
execution_strategy=strategy,
|
|
329
|
+
model=model,
|
|
330
|
+
history_owner="canonical_session_service",
|
|
331
|
+
mcp_servers=tuple(mcp_owners),
|
|
332
|
+
skills=tuple(item.name for item in skills),
|
|
333
|
+
context_contributors=tuple(context_owners),
|
|
334
|
+
)
|
|
335
|
+
self._last_inventory = inventory
|
|
336
|
+
workspace_root = bundle.root / "runtime"
|
|
337
|
+
if not workspace_root.is_dir():
|
|
338
|
+
workspace_root = bundle.root
|
|
339
|
+
return KsADKHarnessActivation(
|
|
340
|
+
bundle=bundle,
|
|
341
|
+
config=config,
|
|
342
|
+
agent_name=bundle.manifest.agent_id,
|
|
343
|
+
workspace_root=workspace_root,
|
|
344
|
+
reasoner=self._reasoner,
|
|
345
|
+
context_sources=tuple(context_sources),
|
|
346
|
+
session_service=self._session_service,
|
|
347
|
+
inventory=inventory,
|
|
348
|
+
mcp_cleanup=mcp_cleanup.pop_all(),
|
|
332
349
|
)
|
|
333
|
-
config = HarnessConfig(
|
|
334
|
-
model=model,
|
|
335
|
-
prompt=prompt,
|
|
336
|
-
mcp_tools=tuple(mcp_specs),
|
|
337
|
-
sandbox=SandboxPolicy(read_only=True),
|
|
338
|
-
runtime="yaml",
|
|
339
|
-
)
|
|
340
|
-
inventory = HarnessProviderInventory(
|
|
341
|
-
provider=self._plugin_id,
|
|
342
|
-
execution_strategy=strategy,
|
|
343
|
-
model=model,
|
|
344
|
-
history_owner="canonical_session_service",
|
|
345
|
-
mcp_servers=tuple(mcp_owners),
|
|
346
|
-
skills=tuple(item.name for item in skills),
|
|
347
|
-
context_contributors=tuple(context_owners),
|
|
348
|
-
)
|
|
349
|
-
self._last_inventory = inventory
|
|
350
|
-
workspace_root = bundle.root / "runtime"
|
|
351
|
-
if not workspace_root.is_dir():
|
|
352
|
-
workspace_root = bundle.root
|
|
353
|
-
return KsADKHarnessActivation(
|
|
354
|
-
bundle=bundle,
|
|
355
|
-
config=config,
|
|
356
|
-
agent_name=bundle.manifest.agent_id,
|
|
357
|
-
workspace_root=workspace_root,
|
|
358
|
-
reasoner=self._reasoner,
|
|
359
|
-
context_sources=tuple(context_sources),
|
|
360
|
-
session_service=self._session_service,
|
|
361
|
-
inventory=inventory,
|
|
362
|
-
)
|
|
363
350
|
|
|
364
351
|
|
|
365
352
|
class KsADKHarnessProviderFactory:
|
|
@@ -412,6 +399,7 @@ class KsADKHarnessActivation:
|
|
|
412
399
|
context_sources: tuple[HarnessContextSource, ...],
|
|
413
400
|
session_service: BaseSessionService,
|
|
414
401
|
inventory: HarnessProviderInventory,
|
|
402
|
+
mcp_cleanup: AsyncExitStack | None = None,
|
|
415
403
|
) -> None:
|
|
416
404
|
self._bundle = bundle
|
|
417
405
|
self._config = config
|
|
@@ -421,6 +409,8 @@ class KsADKHarnessActivation:
|
|
|
421
409
|
self._context_sources = context_sources
|
|
422
410
|
self._session_service = session_service
|
|
423
411
|
self._inventory = inventory
|
|
412
|
+
self._mcp_cleanup = mcp_cleanup
|
|
413
|
+
self._mcp_cleanup_lock = asyncio.Lock()
|
|
424
414
|
self._ready = False
|
|
425
415
|
self._disposed = False
|
|
426
416
|
self._executors: list[RuntimeExecutor] = []
|
|
@@ -504,9 +494,18 @@ class KsADKHarnessActivation:
|
|
|
504
494
|
async def drain(self) -> None:
|
|
505
495
|
self._ready = False
|
|
506
496
|
|
|
497
|
+
async def abort(self) -> None:
|
|
498
|
+
"""Revoke external MCP credentials before waiting on a stuck turn."""
|
|
499
|
+
|
|
500
|
+
await self._release_mcp_credentials()
|
|
501
|
+
|
|
507
502
|
async def dispose(self) -> None:
|
|
508
503
|
self._ready = False
|
|
509
504
|
first_error: BaseException | None = None
|
|
505
|
+
try:
|
|
506
|
+
await self._release_mcp_credentials()
|
|
507
|
+
except BaseException as error: # cleanup must continue
|
|
508
|
+
first_error = error
|
|
510
509
|
if self._kernel_adapter is not None:
|
|
511
510
|
try:
|
|
512
511
|
await self._kernel_adapter.close_all()
|
|
@@ -524,6 +523,13 @@ class KsADKHarnessActivation:
|
|
|
524
523
|
if first_error is not None:
|
|
525
524
|
raise first_error
|
|
526
525
|
|
|
526
|
+
async def _release_mcp_credentials(self) -> None:
|
|
527
|
+
async with self._mcp_cleanup_lock:
|
|
528
|
+
cleanup = self._mcp_cleanup
|
|
529
|
+
if cleanup is not None:
|
|
530
|
+
await cleanup.aclose()
|
|
531
|
+
self._mcp_cleanup = None
|
|
532
|
+
|
|
527
533
|
|
|
528
534
|
def _build_direct_backend(
|
|
529
535
|
config: HarnessConfig,
|
|
@@ -597,9 +603,7 @@ def _chat_history(history: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
|
|
|
597
603
|
if role not in {"user", "assistant", "tool"}:
|
|
598
604
|
continue
|
|
599
605
|
content = item.get("content")
|
|
600
|
-
if isinstance(content, Sequence) and not isinstance(
|
|
601
|
-
content, (str, bytes, bytearray)
|
|
602
|
-
):
|
|
606
|
+
if isinstance(content, Sequence) and not isinstance(content, (str, bytes, bytearray)):
|
|
603
607
|
segments = [
|
|
604
608
|
str(part.get("text") or "")
|
|
605
609
|
for part in content
|
|
@@ -617,6 +621,7 @@ def _chat_history(history: Sequence[Mapping[str, Any]]) -> list[dict[str, Any]]:
|
|
|
617
621
|
__all__ = [
|
|
618
622
|
"HarnessContextSource",
|
|
619
623
|
"HarnessMCPSource",
|
|
624
|
+
"HarnessMCPActivationSource",
|
|
620
625
|
"HarnessProviderInventory",
|
|
621
626
|
"HarnessSkillContribution",
|
|
622
627
|
"HarnessSkillSource",
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""Provider-neutral projection of PluginHost MCP connector capabilities."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
from collections.abc import Awaitable, Sequence
|
|
7
|
+
from contextlib import AsyncExitStack
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from typing import Protocol, runtime_checkable
|
|
10
|
+
|
|
11
|
+
from ksadk.harness.config import McpToolSpec
|
|
12
|
+
from ksadk.plugins.bundle import ResolvedPluginBundle
|
|
13
|
+
from ksadk.plugins.host import PluginExecutionContext, PluginHostError
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@runtime_checkable
|
|
17
|
+
class ActivationMCPSource(Protocol):
|
|
18
|
+
"""MCP source whose lease is bound to one PluginHost activation."""
|
|
19
|
+
|
|
20
|
+
def activation_mcp_specs(
|
|
21
|
+
self,
|
|
22
|
+
bundle: ResolvedPluginBundle,
|
|
23
|
+
*,
|
|
24
|
+
activation_key: str,
|
|
25
|
+
) -> Sequence[McpToolSpec] | Awaitable[Sequence[McpToolSpec]]: ...
|
|
26
|
+
|
|
27
|
+
async def release_activation_mcp_specs(
|
|
28
|
+
self,
|
|
29
|
+
activation_key: str,
|
|
30
|
+
specs: Sequence[McpToolSpec],
|
|
31
|
+
) -> None: ...
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@runtime_checkable
|
|
35
|
+
class StaticMCPSource(Protocol):
|
|
36
|
+
"""Compatibility seam implemented by existing MCP capability plugins."""
|
|
37
|
+
|
|
38
|
+
def harness_mcp_specs(
|
|
39
|
+
self,
|
|
40
|
+
bundle: ResolvedPluginBundle,
|
|
41
|
+
) -> Sequence[McpToolSpec] | Awaitable[Sequence[McpToolSpec]]: ...
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@runtime_checkable
|
|
45
|
+
class ReleasableStaticMCPSource(Protocol):
|
|
46
|
+
async def release_harness_mcp_specs(self, specs: Sequence[McpToolSpec]) -> None: ...
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class MCPProjectionLease:
|
|
51
|
+
"""Projected connector specs and their activation-owned cleanup."""
|
|
52
|
+
|
|
53
|
+
specs: tuple[McpToolSpec, ...]
|
|
54
|
+
owners: tuple[str, ...]
|
|
55
|
+
_cleanup: AsyncExitStack
|
|
56
|
+
_close_task: asyncio.Task[None] | None = None
|
|
57
|
+
|
|
58
|
+
async def aclose(self) -> None:
|
|
59
|
+
if self._close_task is None:
|
|
60
|
+
self._close_task = asyncio.create_task(self._cleanup.aclose())
|
|
61
|
+
await _finish_owned_task(self._close_task)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
async def _finish_owned_task(task: asyncio.Task[None]) -> None:
|
|
65
|
+
"""Finish a security cleanup before propagating caller cancellation."""
|
|
66
|
+
|
|
67
|
+
interrupted = False
|
|
68
|
+
while not task.done():
|
|
69
|
+
try:
|
|
70
|
+
await asyncio.shield(task)
|
|
71
|
+
except asyncio.CancelledError:
|
|
72
|
+
interrupted = True
|
|
73
|
+
task.result()
|
|
74
|
+
if interrupted:
|
|
75
|
+
raise asyncio.CancelledError
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
async def project_mcp_capabilities(
|
|
79
|
+
capabilities: PluginExecutionContext,
|
|
80
|
+
bundle: ResolvedPluginBundle,
|
|
81
|
+
*,
|
|
82
|
+
activation_only: bool = False,
|
|
83
|
+
) -> MCPProjectionLease:
|
|
84
|
+
"""Activate every MCP capability and retain cleanup for the provider."""
|
|
85
|
+
|
|
86
|
+
cleanup = AsyncExitStack()
|
|
87
|
+
specs: list[McpToolSpec] = []
|
|
88
|
+
owners: list[str] = []
|
|
89
|
+
names: set[str] = set()
|
|
90
|
+
try:
|
|
91
|
+
for binding in capabilities.all("mcp.connector/v1"):
|
|
92
|
+
runtime = binding.runtime
|
|
93
|
+
if isinstance(runtime, ActivationMCPSource):
|
|
94
|
+
projected = runtime.activation_mcp_specs(
|
|
95
|
+
bundle,
|
|
96
|
+
activation_key=capabilities.activation_key,
|
|
97
|
+
)
|
|
98
|
+
if isinstance(projected, Awaitable):
|
|
99
|
+
projected = await projected
|
|
100
|
+
projected_specs = tuple(projected)
|
|
101
|
+
cleanup.push_async_callback(
|
|
102
|
+
runtime.release_activation_mcp_specs,
|
|
103
|
+
capabilities.activation_key,
|
|
104
|
+
projected_specs,
|
|
105
|
+
)
|
|
106
|
+
elif isinstance(runtime, StaticMCPSource):
|
|
107
|
+
if activation_only:
|
|
108
|
+
continue
|
|
109
|
+
projected = runtime.harness_mcp_specs(bundle)
|
|
110
|
+
if isinstance(projected, Awaitable):
|
|
111
|
+
projected = await projected
|
|
112
|
+
projected_specs = tuple(projected)
|
|
113
|
+
if isinstance(runtime, ReleasableStaticMCPSource):
|
|
114
|
+
cleanup.push_async_callback(
|
|
115
|
+
runtime.release_harness_mcp_specs,
|
|
116
|
+
projected_specs,
|
|
117
|
+
)
|
|
118
|
+
else:
|
|
119
|
+
raise PluginHostError(
|
|
120
|
+
"mcp_capability_incompatible",
|
|
121
|
+
f"plugin {binding.plugin_id} cannot project MCP connector config",
|
|
122
|
+
)
|
|
123
|
+
for spec in projected_specs:
|
|
124
|
+
if not isinstance(spec, McpToolSpec) or not spec.name.strip():
|
|
125
|
+
raise PluginHostError(
|
|
126
|
+
"mcp_capability_invalid",
|
|
127
|
+
f"plugin {binding.plugin_id} returned an invalid MCP connector",
|
|
128
|
+
)
|
|
129
|
+
if spec.name in names:
|
|
130
|
+
raise PluginHostError(
|
|
131
|
+
"mcp_capability_ambiguous",
|
|
132
|
+
f"more than one MCP connector is named {spec.name!r}",
|
|
133
|
+
)
|
|
134
|
+
names.add(spec.name)
|
|
135
|
+
specs.append(spec)
|
|
136
|
+
owners.append(binding.plugin_id)
|
|
137
|
+
except BaseException:
|
|
138
|
+
close = asyncio.create_task(cleanup.aclose())
|
|
139
|
+
await _finish_owned_task(close)
|
|
140
|
+
raise
|
|
141
|
+
return MCPProjectionLease(tuple(specs), tuple(owners), cleanup)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
__all__ = [
|
|
145
|
+
"ActivationMCPSource",
|
|
146
|
+
"MCPProjectionLease",
|
|
147
|
+
"ReleasableStaticMCPSource",
|
|
148
|
+
"StaticMCPSource",
|
|
149
|
+
"project_mcp_capabilities",
|
|
150
|
+
]
|