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
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"""Local Codex Provider admission and Bundle references, separate from cloud YAML.
|
|
2
|
+
|
|
3
|
+
A local Provider Bundle binds the existing immutable Codex record; native
|
|
4
|
+
marketplace bytes remain governed by that record's original plugin lock.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import hashlib
|
|
10
|
+
import json
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from pydantic import Field
|
|
14
|
+
|
|
15
|
+
from ksadk.plugins.providers.codex_dsh import (
|
|
16
|
+
SHIPPED_CODEX_PROVIDER_ID,
|
|
17
|
+
SHIPPED_CODEX_PROVIDER_VERSION,
|
|
18
|
+
)
|
|
19
|
+
from ksadk.studio.contracts import ContractModel, RuntimeRef
|
|
20
|
+
from ksadk.studio.errors import StudioError
|
|
21
|
+
from ksadk.studio.resource_build_admission import (
|
|
22
|
+
admit_resource_build,
|
|
23
|
+
resource_build_required,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
CODEX_PROVIDER_REF = f"plugin://{SHIPPED_CODEX_PROVIDER_ID}@{SHIPPED_CODEX_PROVIDER_VERSION}"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _digest(value: Any) -> str:
|
|
30
|
+
return (
|
|
31
|
+
"sha256:"
|
|
32
|
+
+ hashlib.sha256(
|
|
33
|
+
json.dumps(
|
|
34
|
+
value,
|
|
35
|
+
sort_keys=True,
|
|
36
|
+
separators=(",", ":"),
|
|
37
|
+
ensure_ascii=False,
|
|
38
|
+
).encode()
|
|
39
|
+
).hexdigest()
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class CodexProviderBuildReference(ContractModel):
|
|
44
|
+
provider_ref: str = Field(pattern=r"^plugin://io\.ksadk\.codex-provider@[^/]+$")
|
|
45
|
+
registration_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
46
|
+
bundle_build_id: str = Field(pattern=r"^build_[0-9a-f]+$")
|
|
47
|
+
bundle_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def digest(self) -> str:
|
|
51
|
+
return _digest(self.model_dump(by_alias=True))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class CodexProviderBuildManager:
|
|
55
|
+
def __init__(self, studio: Any):
|
|
56
|
+
self.studio = studio
|
|
57
|
+
|
|
58
|
+
def _registration_digest(self) -> str:
|
|
59
|
+
manifest = self.studio._active_provider_manifests.get(CODEX_PROVIDER_REF)
|
|
60
|
+
if manifest is None:
|
|
61
|
+
raise StudioError(
|
|
62
|
+
"AGENT_PROVIDER_NOT_REGISTERED",
|
|
63
|
+
"Codex Provider 未注册;请在插件中心安装并启用官方 Codex Provider,"
|
|
64
|
+
"确认 DSH 工具链可用后重试",
|
|
65
|
+
status_code=409,
|
|
66
|
+
)
|
|
67
|
+
return _digest(manifest.model_dump(by_alias=True, mode="json", exclude_none=True))
|
|
68
|
+
|
|
69
|
+
def prepare(
|
|
70
|
+
self,
|
|
71
|
+
snapshot,
|
|
72
|
+
model_profiles: dict,
|
|
73
|
+
model_profile_ids: list[str],
|
|
74
|
+
native_plugin_lock_digest: str | None,
|
|
75
|
+
) -> CodexProviderBuildReference:
|
|
76
|
+
registration_digest = self._registration_digest()
|
|
77
|
+
# The current Provider owns one native client connection per activation.
|
|
78
|
+
# Model names may vary, but a different endpoint/credential needs a new
|
|
79
|
+
# activation contract; never silently send it to the default connection.
|
|
80
|
+
connections = {
|
|
81
|
+
(
|
|
82
|
+
p.get("provider", "openai-compatible"),
|
|
83
|
+
p.get("endpointUrl"),
|
|
84
|
+
p.get("baseUrl"),
|
|
85
|
+
p.get("credentialRef"),
|
|
86
|
+
p.get("wireApi"),
|
|
87
|
+
)
|
|
88
|
+
for p in model_profiles.values()
|
|
89
|
+
}
|
|
90
|
+
missing_profiles = set(snapshot.manifest.allowed_models) - set(model_profiles)
|
|
91
|
+
if len(connections) > 1 or (model_profiles and missing_profiles):
|
|
92
|
+
raise StudioError(
|
|
93
|
+
"CODEX_PROVIDER_MODEL_CONNECTION_UNSUPPORTED",
|
|
94
|
+
"当前 Codex Provider Build 的模型必须具有完整且相同的连接快照;"
|
|
95
|
+
"请补齐模型配置,或拆分不同连接的 Agent",
|
|
96
|
+
status_code=422,
|
|
97
|
+
)
|
|
98
|
+
draft = self.studio.codex_agents._project(snapshot).model_copy(deep=True)
|
|
99
|
+
draft.spec.runtime = RuntimeRef(
|
|
100
|
+
type="plugin",
|
|
101
|
+
provider_ref=CODEX_PROVIDER_REF,
|
|
102
|
+
version=snapshot.manifest.runtime.version,
|
|
103
|
+
provider_config={
|
|
104
|
+
"studioManifestDigest": "sha256:" + snapshot.manifest_sha256,
|
|
105
|
+
"studioBuildFingerprint": _digest(
|
|
106
|
+
{
|
|
107
|
+
"manifest": snapshot.manifest_sha256,
|
|
108
|
+
"profiles": model_profiles,
|
|
109
|
+
"resourceIds": sorted(model_profile_ids),
|
|
110
|
+
"pluginLockDigest": native_plugin_lock_digest,
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
},
|
|
114
|
+
)
|
|
115
|
+
# This Bundle describes the Python AgentProvider. Codex-native marketplace
|
|
116
|
+
# selections stay in the manifest lock, while official DSH platform
|
|
117
|
+
# resources remain in this projected Draft and pass the same trusted
|
|
118
|
+
# resource admission used by framework runtimes.
|
|
119
|
+
draft.spec.bindings.plugins = [
|
|
120
|
+
binding
|
|
121
|
+
for binding in draft.spec.bindings.plugins
|
|
122
|
+
if binding.ecosystem == "dsh"
|
|
123
|
+
]
|
|
124
|
+
manifest = self.studio._active_provider_manifests[CODEX_PROVIDER_REF]
|
|
125
|
+
missing_permissions = sorted(
|
|
126
|
+
set(manifest.spec.permissions) - set(draft.spec.security.allowed_permissions)
|
|
127
|
+
)
|
|
128
|
+
if missing_permissions:
|
|
129
|
+
raise StudioError(
|
|
130
|
+
"AGENT_PROVIDER_PERMISSION_DENIED",
|
|
131
|
+
"请打开 Agent 编辑页,在 Codex 本地执行权限中确认 Provider 请求的权限并保存;"
|
|
132
|
+
"安装插件时的同意不代替 Agent 授权",
|
|
133
|
+
status_code=422,
|
|
134
|
+
field="spec.security.allowedPermissions",
|
|
135
|
+
details={"missingPermissions": missing_permissions},
|
|
136
|
+
)
|
|
137
|
+
composition = self.studio.plugin_compositions.compile(draft)
|
|
138
|
+
resource_build = None
|
|
139
|
+
if resource_build_required(draft):
|
|
140
|
+
resource_build = admit_resource_build(
|
|
141
|
+
draft,
|
|
142
|
+
authority=self.studio.resource_authority,
|
|
143
|
+
connections=self.studio.resource_connections,
|
|
144
|
+
dsh_profile=(
|
|
145
|
+
self.studio.resource_dsh_capabilities.capture_resource_build_snapshot()
|
|
146
|
+
),
|
|
147
|
+
)
|
|
148
|
+
built = self.studio.builder.build(
|
|
149
|
+
draft,
|
|
150
|
+
composition=composition,
|
|
151
|
+
resource_build=resource_build,
|
|
152
|
+
)
|
|
153
|
+
# Refuse a registration change during staging, before saving success.
|
|
154
|
+
if self._registration_digest() != registration_digest:
|
|
155
|
+
raise StudioError(
|
|
156
|
+
"CODEX_PROVIDER_CHANGED", "Provider 构建期间发生变更", status_code=409
|
|
157
|
+
)
|
|
158
|
+
return CodexProviderBuildReference(
|
|
159
|
+
provider_ref=CODEX_PROVIDER_REF,
|
|
160
|
+
registration_digest=registration_digest,
|
|
161
|
+
bundle_build_id=built.id,
|
|
162
|
+
bundle_digest=built.bundle_digest,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
def bundle_root(self, record):
|
|
166
|
+
reference = record.provider_bundle
|
|
167
|
+
if reference is None:
|
|
168
|
+
return None
|
|
169
|
+
if reference.provider_ref != CODEX_PROVIDER_REF or (
|
|
170
|
+
reference.registration_digest != self._registration_digest()
|
|
171
|
+
):
|
|
172
|
+
raise StudioError(
|
|
173
|
+
"CODEX_PROVIDER_CHANGED", "Provider 注册已变更,请重新构建", status_code=409
|
|
174
|
+
)
|
|
175
|
+
try:
|
|
176
|
+
built = self.studio.builds.get(reference.bundle_build_id)
|
|
177
|
+
except StudioError as error:
|
|
178
|
+
raise StudioError(
|
|
179
|
+
"CODEX_PROVIDER_BUNDLE_UNAVAILABLE", "Provider Bundle 记录不可用,请重新构建",
|
|
180
|
+
status_code=409,
|
|
181
|
+
) from error
|
|
182
|
+
if built.agent_id != record.agent_name or built.bundle_digest != reference.bundle_digest:
|
|
183
|
+
raise StudioError(
|
|
184
|
+
"CODEX_PROVIDER_BUILD_MISMATCH", "Provider Bundle 与 Build 不一致", status_code=409
|
|
185
|
+
)
|
|
186
|
+
root = self.studio.plugin_runs._bundle_root(built)
|
|
187
|
+
bundle = self.studio.plugin_runs._resolve_bundle(root)
|
|
188
|
+
if (
|
|
189
|
+
bundle.bundle_digest != reference.bundle_digest
|
|
190
|
+
or (bundle.composition.profile.agent_provider.ref != reference.provider_ref)
|
|
191
|
+
or bundle.composition.profile.agent_provider.config.get("studioManifestDigest")
|
|
192
|
+
!= ("sha256:" + record.manifest_sha256)
|
|
193
|
+
or bundle.composition.profile.agent_provider.config.get("studioBuildFingerprint")
|
|
194
|
+
!= _digest(
|
|
195
|
+
{
|
|
196
|
+
"manifest": record.manifest_sha256,
|
|
197
|
+
"profiles": record.model_profiles,
|
|
198
|
+
"resourceIds": sorted(record.model_profile_ids or []),
|
|
199
|
+
"pluginLockDigest": record.plugin_lock_digest,
|
|
200
|
+
}
|
|
201
|
+
)
|
|
202
|
+
):
|
|
203
|
+
raise StudioError(
|
|
204
|
+
"CODEX_PROVIDER_BUILD_MISMATCH", "Provider Bundle 引用校验失败", status_code=409
|
|
205
|
+
)
|
|
206
|
+
return root
|
|
207
|
+
|
|
208
|
+
def native_launch(self, bundle):
|
|
209
|
+
"""Trusted host callback; no model arguments or serialized secrets accepted."""
|
|
210
|
+
marker = bundle.composition.profile.agent_provider.config.get("studioManifestDigest")
|
|
211
|
+
if marker is None:
|
|
212
|
+
return None
|
|
213
|
+
registration_digest = self._registration_digest()
|
|
214
|
+
matches = [
|
|
215
|
+
record
|
|
216
|
+
for record in self.studio.codex_builds.list()
|
|
217
|
+
if record.provider_bundle is not None
|
|
218
|
+
and record.provider_bundle.bundle_digest == bundle.bundle_digest
|
|
219
|
+
and record.provider_bundle.registration_digest == registration_digest
|
|
220
|
+
]
|
|
221
|
+
if len(matches) != 1:
|
|
222
|
+
raise StudioError(
|
|
223
|
+
"CODEX_PROVIDER_BUILD_MISMATCH",
|
|
224
|
+
"Provider Bundle 缺少唯一 Codex Build",
|
|
225
|
+
status_code=409,
|
|
226
|
+
)
|
|
227
|
+
record = matches[0]
|
|
228
|
+
self.bundle_root(record)
|
|
229
|
+
# Retain native bootstrap, credentials, exact build HOME and workspace
|
|
230
|
+
# from the existing resolver. No cloud schema or second launch policy.
|
|
231
|
+
return self.studio.codex_runs.resolve(record.id).launch_context
|
ksadk/studio/codex_run.py
CHANGED
|
@@ -2,16 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import json
|
|
5
6
|
import os
|
|
6
7
|
import zipfile
|
|
7
8
|
from typing import Any, cast
|
|
9
|
+
from urllib.parse import urlparse
|
|
8
10
|
|
|
9
11
|
import yaml # type: ignore[import-untyped]
|
|
10
12
|
|
|
11
13
|
from ksadk.configs import ModelConfig
|
|
14
|
+
from ksadk.plugins.contracts import plugin_lock_digest
|
|
12
15
|
from ksadk.runtime import RuntimeLaunchContext
|
|
13
16
|
from ksadk.studio.codex_builder import CodexBuildRepository
|
|
17
|
+
from ksadk.studio.codex_credentials import restore_mcp_oauth_credentials
|
|
14
18
|
from ksadk.studio.codex_manifest import CodexAgentManifest, CodexManifestRepository
|
|
19
|
+
from ksadk.studio.codex_plugin_store import CodexPluginSnapshotStore
|
|
15
20
|
from ksadk.studio.contracts import Instructions, ModelSpec
|
|
16
21
|
from ksadk.studio.errors import StudioError
|
|
17
22
|
from ksadk.studio.run_service import StudioRunSpec
|
|
@@ -32,6 +37,8 @@ class CodexRunSpecResolver:
|
|
|
32
37
|
credential_resolver: Any = None,
|
|
33
38
|
resource_catalog: Any = None,
|
|
34
39
|
draft_repository: Any = None,
|
|
40
|
+
plugin_snapshot_store: CodexPluginSnapshotStore | None = None,
|
|
41
|
+
provider_bundle_resolver: Any = None,
|
|
35
42
|
) -> None:
|
|
36
43
|
self.workspace = workspace
|
|
37
44
|
self.builds = build_repository or CodexBuildRepository(workspace)
|
|
@@ -39,6 +46,8 @@ class CodexRunSpecResolver:
|
|
|
39
46
|
self.credentials = credential_resolver
|
|
40
47
|
self.catalog = resource_catalog
|
|
41
48
|
self.drafts = draft_repository
|
|
49
|
+
self.plugin_snapshots = plugin_snapshot_store or CodexPluginSnapshotStore(workspace)
|
|
50
|
+
self.provider_bundle_resolver = provider_bundle_resolver
|
|
42
51
|
|
|
43
52
|
def resolve(
|
|
44
53
|
self,
|
|
@@ -49,6 +58,16 @@ class CodexRunSpecResolver:
|
|
|
49
58
|
approval_mode: str | None = None,
|
|
50
59
|
) -> StudioRunSpec:
|
|
51
60
|
build = self.builds.get(build_id)
|
|
61
|
+
provider_root = None
|
|
62
|
+
if build.local_execution == "provider":
|
|
63
|
+
if self.provider_bundle_resolver is None:
|
|
64
|
+
raise StudioError("CODEX_PROVIDER_REQUIRED", "此 Build 必须通过 Provider 运行",
|
|
65
|
+
status_code=409)
|
|
66
|
+
provider_root = self.provider_bundle_resolver(build)
|
|
67
|
+
if provider_root is None:
|
|
68
|
+
raise StudioError(
|
|
69
|
+
"CODEX_PROVIDER_REQUIRED", "Provider Bundle 不可用", status_code=409,
|
|
70
|
+
)
|
|
52
71
|
current = self.manifests.load(build.agent_name)
|
|
53
72
|
if build.manifest_sha256 != current.manifest_sha256:
|
|
54
73
|
raise StudioError(
|
|
@@ -61,6 +80,13 @@ class CodexRunSpecResolver:
|
|
|
61
80
|
},
|
|
62
81
|
)
|
|
63
82
|
manifest = self._load_build_manifest(build.artifact_path)
|
|
83
|
+
restore_mcp_oauth_credentials(
|
|
84
|
+
self.workspace.root,
|
|
85
|
+
build,
|
|
86
|
+
self.builds.list(),
|
|
87
|
+
manifest.mcp_servers or [],
|
|
88
|
+
)
|
|
89
|
+
plugin_bootstrap = self._plugin_bootstrap(build, manifest)
|
|
64
90
|
selected_model = self._select_model(manifest, model)
|
|
65
91
|
project_dir = self.workspace.root.resolve()
|
|
66
92
|
skills = self._skill_inputs(manifest)
|
|
@@ -72,15 +98,20 @@ class CodexRunSpecResolver:
|
|
|
72
98
|
approval_mode=approval_profile or None,
|
|
73
99
|
)
|
|
74
100
|
if sandbox == "workspace-write":
|
|
75
|
-
# workspace-write
|
|
101
|
+
# workspace-write 默认断网;原生搜索和 MCP 都需要显式放行网络。
|
|
76
102
|
codex_overrides = [*codex_overrides, "sandbox_workspace_write.network_access=true"]
|
|
77
103
|
launch_config: dict[str, Any] = {
|
|
104
|
+
"model": selected_model,
|
|
105
|
+
"models": list(manifest.allowed_models),
|
|
78
106
|
"sandbox_read_only": sandbox == "read-only",
|
|
79
107
|
"sandbox": sandbox,
|
|
80
108
|
"approval_mode": approval,
|
|
109
|
+
"codex_home_key": build.id,
|
|
81
110
|
}
|
|
82
111
|
if codex_overrides:
|
|
83
112
|
launch_config["codex_overrides"] = codex_overrides
|
|
113
|
+
if plugin_bootstrap is not None:
|
|
114
|
+
launch_config["codex_plugin_bootstrap"] = plugin_bootstrap
|
|
84
115
|
runtime_env = {
|
|
85
116
|
**self._resolve_model_env(build, manifest, selected_model),
|
|
86
117
|
**self._resolve_mcp_env(manifest),
|
|
@@ -159,8 +190,85 @@ class CodexRunSpecResolver:
|
|
|
159
190
|
model=selected_model,
|
|
160
191
|
request_config=request_config,
|
|
161
192
|
manifest_sha256=build.manifest_sha256,
|
|
193
|
+
plugin_bundle_root=provider_root,
|
|
162
194
|
)
|
|
163
195
|
|
|
196
|
+
def _plugin_bootstrap(
|
|
197
|
+
self,
|
|
198
|
+
build: Any,
|
|
199
|
+
manifest: CodexAgentManifest,
|
|
200
|
+
) -> dict[str, Any] | None:
|
|
201
|
+
# Only Codex-native bindings belong to the App Server bootstrap. DSH
|
|
202
|
+
# bindings are materialized by the Provider Bundle and intentionally do
|
|
203
|
+
# not have entries in the Codex plugin snapshot store.
|
|
204
|
+
bindings = [
|
|
205
|
+
item
|
|
206
|
+
for item in (manifest.plugins or [])
|
|
207
|
+
if item.enabled and item.ecosystem == "codex"
|
|
208
|
+
]
|
|
209
|
+
lock = getattr(build, "plugin_lock", None)
|
|
210
|
+
lock_digest = getattr(build, "plugin_lock_digest", None)
|
|
211
|
+
marketplace = getattr(build, "plugin_marketplace", None)
|
|
212
|
+
statuses = getattr(build, "plugin_runtime_status", None) or {}
|
|
213
|
+
if not bindings:
|
|
214
|
+
if lock is not None or lock_digest is not None or marketplace is not None:
|
|
215
|
+
raise StudioError(
|
|
216
|
+
"CODEX_PLUGIN_BUILD_INVALID",
|
|
217
|
+
"Codex Build 含有未绑定的插件锁信息",
|
|
218
|
+
status_code=409,
|
|
219
|
+
details={"buildId": build.id},
|
|
220
|
+
)
|
|
221
|
+
return None
|
|
222
|
+
if lock is None or lock_digest is None or marketplace is None:
|
|
223
|
+
raise StudioError(
|
|
224
|
+
"CODEX_PLUGIN_REBUILD_REQUIRED",
|
|
225
|
+
"Codex Build 缺少原生插件不可变快照,请重新构建",
|
|
226
|
+
status_code=409,
|
|
227
|
+
details={"buildId": build.id},
|
|
228
|
+
)
|
|
229
|
+
actual_lock_digest = plugin_lock_digest(lock)
|
|
230
|
+
if actual_lock_digest != lock_digest or marketplace.plugin_lock_digest != lock_digest:
|
|
231
|
+
raise StudioError(
|
|
232
|
+
"CODEX_PLUGIN_LOCK_DIGEST_MISMATCH",
|
|
233
|
+
"Codex Build 的 PluginLock 摘要不一致",
|
|
234
|
+
status_code=409,
|
|
235
|
+
details={
|
|
236
|
+
"buildId": build.id,
|
|
237
|
+
"expected": lock_digest,
|
|
238
|
+
"actual": actual_lock_digest,
|
|
239
|
+
},
|
|
240
|
+
)
|
|
241
|
+
for binding in bindings:
|
|
242
|
+
stored = self.plugin_snapshots.load(binding.snapshot_digest)
|
|
243
|
+
if stored.plugin_ref != binding.plugin_ref:
|
|
244
|
+
raise StudioError(
|
|
245
|
+
"CODEX_PLUGIN_BINDING_MISMATCH",
|
|
246
|
+
"Codex 插件绑定与不可变快照身份不一致",
|
|
247
|
+
status_code=409,
|
|
248
|
+
details={"pluginRef": binding.plugin_ref},
|
|
249
|
+
)
|
|
250
|
+
stored.select_components(binding.components)
|
|
251
|
+
status = statuses.get(binding.plugin_ref) or {}
|
|
252
|
+
if status.get("runnable") is False or any(
|
|
253
|
+
selector.startswith("hook:") for selector in binding.components
|
|
254
|
+
):
|
|
255
|
+
raise StudioError(
|
|
256
|
+
"CODEX_PLUGIN_HOOK_TRUST_UNAVAILABLE",
|
|
257
|
+
"Codex App Server 尚无可验证的 hook trust API;该绑定已安全阻断",
|
|
258
|
+
status_code=409,
|
|
259
|
+
details={
|
|
260
|
+
"pluginRef": binding.plugin_ref,
|
|
261
|
+
"hookTrust": status.get("hookTrust", "unsupported"),
|
|
262
|
+
},
|
|
263
|
+
)
|
|
264
|
+
root = self.plugin_snapshots.verify_marketplace(marketplace)
|
|
265
|
+
return {
|
|
266
|
+
"marketplace_path": str(root),
|
|
267
|
+
"marketplace_name": marketplace.marketplace_name,
|
|
268
|
+
"plugin_names": list(marketplace.plugin_names),
|
|
269
|
+
"snapshot_digest": marketplace.marketplace_digest,
|
|
270
|
+
}
|
|
271
|
+
|
|
164
272
|
def _resolve_model_env(
|
|
165
273
|
self,
|
|
166
274
|
build: Any,
|
|
@@ -184,12 +292,23 @@ class CodexRunSpecResolver:
|
|
|
184
292
|
if profile is not None
|
|
185
293
|
else ModelConfig().api_base.rstrip("/")
|
|
186
294
|
)
|
|
187
|
-
|
|
295
|
+
env = {
|
|
188
296
|
"OPENAI_API_KEY": credential,
|
|
189
297
|
"OPENAI_BASE_URL": base_url,
|
|
190
298
|
"OPENAI_API_BASE": base_url,
|
|
191
299
|
"OPENAI_MODEL_NAME": selected_model,
|
|
192
300
|
}
|
|
301
|
+
# A chat-only profile necessarily needs the Responses-to-Chat bridge.
|
|
302
|
+
# KSPMAS build snapshots created before wireApi was persisted have the
|
|
303
|
+
# same requirement. Route those known profiles directly so every fresh
|
|
304
|
+
# Studio process does not spend several seconds probing /models and two
|
|
305
|
+
# /responses payload dialects before the user's first turn.
|
|
306
|
+
if "KSADK_CODEX_USE_PROXY" not in os.environ and (
|
|
307
|
+
(profile is not None and profile.wire_api == "chat")
|
|
308
|
+
or self._is_known_chat_model_gateway(base_url)
|
|
309
|
+
):
|
|
310
|
+
env["KSADK_CODEX_USE_PROXY"] = "1"
|
|
311
|
+
return env
|
|
193
312
|
|
|
194
313
|
def _resolve_model_profile(
|
|
195
314
|
self,
|
|
@@ -248,19 +367,41 @@ class CodexRunSpecResolver:
|
|
|
248
367
|
return raw[: -len(suffix)]
|
|
249
368
|
return raw
|
|
250
369
|
|
|
370
|
+
@staticmethod
|
|
371
|
+
def _is_known_chat_model_gateway(base_url: str) -> bool:
|
|
372
|
+
host = (urlparse(base_url).hostname or "").lower()
|
|
373
|
+
return host == "kspmas.ksyun.com" or host.startswith("kspmas-internal.")
|
|
374
|
+
|
|
251
375
|
@staticmethod
|
|
252
376
|
def _mcp_overrides(manifest: CodexAgentManifest) -> list[str]:
|
|
253
377
|
"""Translate bound MCP servers into codex --config overrides."""
|
|
254
378
|
overrides: list[str] = []
|
|
255
379
|
for server in manifest.mcp_servers or []:
|
|
256
380
|
name = str(server.get("name") or "").strip()
|
|
381
|
+
transport = str(
|
|
382
|
+
server.get("transport") or ("http" if server.get("url") else "")
|
|
383
|
+
).lower()
|
|
257
384
|
url = str(server.get("url") or "").strip()
|
|
258
|
-
if not name
|
|
385
|
+
if not name:
|
|
259
386
|
continue
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
387
|
+
if transport == "stdio":
|
|
388
|
+
command = str(server.get("command") or "").strip()
|
|
389
|
+
if not command:
|
|
390
|
+
continue
|
|
391
|
+
args = [str(argument) for argument in (server.get("args") or [])]
|
|
392
|
+
overrides.append(f"mcp_servers.{name}.command={json.dumps(command)}")
|
|
393
|
+
overrides.append(f"mcp_servers.{name}.args={json.dumps(args)}")
|
|
394
|
+
env_refs = server.get("env_refs") or {}
|
|
395
|
+
if isinstance(env_refs, dict) and env_refs:
|
|
396
|
+
overrides.append(
|
|
397
|
+
f"mcp_servers.{name}.env_vars="
|
|
398
|
+
f"{json.dumps(sorted(str(key) for key in env_refs))}"
|
|
399
|
+
)
|
|
400
|
+
elif transport in {"http", "sse"} and url:
|
|
401
|
+
overrides.append(f"mcp_servers.{name}.url={url}")
|
|
402
|
+
env_key = str(server.get("env_key") or "").strip()
|
|
403
|
+
if env_key:
|
|
404
|
+
overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
|
|
264
405
|
return overrides
|
|
265
406
|
|
|
266
407
|
def _resolve_mcp_env(self, manifest: CodexAgentManifest) -> dict[str, str]:
|
|
@@ -272,10 +413,20 @@ class CodexRunSpecResolver:
|
|
|
272
413
|
"""
|
|
273
414
|
env: dict[str, str] = {}
|
|
274
415
|
for server in manifest.mcp_servers or []:
|
|
416
|
+
references: dict[str, str] = {}
|
|
275
417
|
env_key = str(server.get("env_key") or "").strip()
|
|
276
|
-
if
|
|
277
|
-
|
|
278
|
-
|
|
418
|
+
if env_key:
|
|
419
|
+
references[env_key] = f"env://{env_key}"
|
|
420
|
+
raw_references = server.get("env_refs") or {}
|
|
421
|
+
if isinstance(raw_references, dict):
|
|
422
|
+
references.update(
|
|
423
|
+
{
|
|
424
|
+
str(name).strip(): str(reference).strip()
|
|
425
|
+
for name, reference in raw_references.items()
|
|
426
|
+
if str(name).strip() and str(reference).strip()
|
|
427
|
+
}
|
|
428
|
+
)
|
|
429
|
+
if not references:
|
|
279
430
|
continue
|
|
280
431
|
resolver = self.credentials
|
|
281
432
|
if resolver is None:
|
|
@@ -283,19 +434,22 @@ class CodexRunSpecResolver:
|
|
|
283
434
|
|
|
284
435
|
resolver = CredentialResolver(self.workspace)
|
|
285
436
|
self.credentials = resolver
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
"
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
437
|
+
for name, reference in references.items():
|
|
438
|
+
if name in env:
|
|
439
|
+
continue
|
|
440
|
+
try:
|
|
441
|
+
env[name] = resolver.resolve(reference)
|
|
442
|
+
except Exception as exc:
|
|
443
|
+
raise StudioError(
|
|
444
|
+
"MCP_CREDENTIAL_MISSING",
|
|
445
|
+
f"MCP Server「{server.get('name')}」需要凭证 {name},"
|
|
446
|
+
"请先保存对应 Secret 引用",
|
|
447
|
+
status_code=422,
|
|
448
|
+
details={
|
|
449
|
+
"server": str(server.get("name") or ""),
|
|
450
|
+
"reference": reference,
|
|
451
|
+
},
|
|
452
|
+
) from exc
|
|
299
453
|
return env
|
|
300
454
|
|
|
301
455
|
@staticmethod
|
|
@@ -326,11 +480,16 @@ class CodexRunSpecResolver:
|
|
|
326
480
|
if approval_mode:
|
|
327
481
|
return approval_presets[normalize_tool_approval_mode(approval_mode)]
|
|
328
482
|
raw = (
|
|
329
|
-
(
|
|
483
|
+
(
|
|
484
|
+
override
|
|
485
|
+
or os.environ.get("KSADK_CODEX_SANDBOX")
|
|
486
|
+
or manifest.sandbox
|
|
487
|
+
or "workspace_write_auto"
|
|
488
|
+
)
|
|
330
489
|
.strip()
|
|
331
490
|
.lower()
|
|
332
491
|
)
|
|
333
|
-
return presets.get(raw, ("
|
|
492
|
+
return presets.get(raw, ("workspace-write", "auto_review"))
|
|
334
493
|
|
|
335
494
|
def _skill_inputs(self, manifest: CodexAgentManifest) -> list[dict[str, str]]:
|
|
336
495
|
"""Resolve bound skill resource ids to codex SkillInput wire dicts."""
|
|
@@ -12,6 +12,7 @@ import json
|
|
|
12
12
|
from collections.abc import Callable, Mapping
|
|
13
13
|
from typing import Any
|
|
14
14
|
|
|
15
|
+
from ksadk.plugins.builtins import builtin_capability_permissions
|
|
15
16
|
from ksadk.plugins.contracts import LockedCapability, PluginLockEntry, PluginManifest
|
|
16
17
|
from ksadk.plugins.resolver import (
|
|
17
18
|
PluginResolutionError,
|
|
@@ -36,6 +37,11 @@ def compatibility_facts_digest(
|
|
|
36
37
|
|
|
37
38
|
payload: dict[str, Any] = {
|
|
38
39
|
"allowedPermissions": sorted(set(draft.spec.security.allowed_permissions)),
|
|
40
|
+
"hostOwnedPermissions": (
|
|
41
|
+
sorted(builtin_capability_permissions(composition.profile))
|
|
42
|
+
if composition is not None
|
|
43
|
+
else []
|
|
44
|
+
),
|
|
39
45
|
"runtime": {
|
|
40
46
|
"type": str(runtime_lock.get("type") or ""),
|
|
41
47
|
"version": str(runtime_lock.get("version") or ""),
|
|
@@ -90,7 +96,12 @@ def build_bundle_compatibility_report(
|
|
|
90
96
|
else {}
|
|
91
97
|
),
|
|
92
98
|
}
|
|
93
|
-
allowed_permissions = sorted(
|
|
99
|
+
allowed_permissions = sorted(
|
|
100
|
+
set(draft.spec.security.allowed_permissions)
|
|
101
|
+
| set(builtin_capability_permissions(composition.profile))
|
|
102
|
+
if composition is not None
|
|
103
|
+
else set(draft.spec.security.allowed_permissions)
|
|
104
|
+
)
|
|
94
105
|
if composition is None:
|
|
95
106
|
return _legacy_report(
|
|
96
107
|
bundle=bundle,
|