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
ksadk/studio/service.py
CHANGED
|
@@ -8,10 +8,11 @@ import json
|
|
|
8
8
|
import logging
|
|
9
9
|
import os
|
|
10
10
|
import zipfile
|
|
11
|
-
from collections.abc import Mapping, Sequence
|
|
11
|
+
from collections.abc import AsyncIterator, Awaitable, Mapping, Sequence
|
|
12
|
+
from contextlib import asynccontextmanager
|
|
12
13
|
from dataclasses import dataclass
|
|
13
14
|
from pathlib import Path
|
|
14
|
-
from typing import Any, Callable, Literal, cast
|
|
15
|
+
from typing import Any, Callable, Literal, TypeVar, cast
|
|
15
16
|
from urllib.parse import urlparse
|
|
16
17
|
from uuid import uuid4
|
|
17
18
|
|
|
@@ -43,6 +44,7 @@ from ksadk.evaluation.studio_build_adapter import (
|
|
|
43
44
|
from ksadk.events.store import RuntimeEventStore
|
|
44
45
|
from ksadk.observability.session_log import SessionLogError, export_session_log
|
|
45
46
|
from ksadk.observability.trajectory import encode_sse, project_trajectory_event
|
|
47
|
+
from ksadk.plugins.bundle_security import BundleSecurityError
|
|
46
48
|
from ksadk.plugins.contracts import PluginManifest
|
|
47
49
|
from ksadk.plugins.providers.legacy import LegacyHarnessSource
|
|
48
50
|
from ksadk.plugins.providers.legacy_catalog import (
|
|
@@ -82,6 +84,8 @@ from ksadk.studio.codex_manifest import (
|
|
|
82
84
|
CodexAgentManifest,
|
|
83
85
|
CodexManifestRepository,
|
|
84
86
|
)
|
|
87
|
+
from ksadk.studio.codex_plugin_store import CodexPluginSnapshotStore
|
|
88
|
+
from ksadk.studio.codex_provider_build import CodexProviderBuildManager
|
|
85
89
|
from ksadk.studio.codex_run import CodexRunSpecResolver
|
|
86
90
|
from ksadk.studio.compiler import AgentCompiler
|
|
87
91
|
from ksadk.studio.contracts import (
|
|
@@ -92,7 +96,10 @@ from ksadk.studio.contracts import (
|
|
|
92
96
|
AgentTemplateComposeRequest,
|
|
93
97
|
AgentTemplateComposition,
|
|
94
98
|
BuildStatus,
|
|
99
|
+
BundleManifest,
|
|
95
100
|
DeploymentRequest,
|
|
101
|
+
Diagnostic,
|
|
102
|
+
DiagnosticSeverity,
|
|
96
103
|
Operation,
|
|
97
104
|
OperationKind,
|
|
98
105
|
RunEvent,
|
|
@@ -100,6 +107,9 @@ from ksadk.studio.contracts import (
|
|
|
100
107
|
RuntimeRef,
|
|
101
108
|
ToolContract,
|
|
102
109
|
)
|
|
110
|
+
from ksadk.studio.dsh_capability_service import (
|
|
111
|
+
StudioDshCapabilityService,
|
|
112
|
+
)
|
|
103
113
|
from ksadk.studio.dsh_provider_registration import (
|
|
104
114
|
StudioDshProviderRegistrationError,
|
|
105
115
|
StudioDshProviderRegistrationManager,
|
|
@@ -114,7 +124,17 @@ from ksadk.studio.operations import OperationManager
|
|
|
114
124
|
from ksadk.studio.plugin_composition import StudioPluginCompositionCompiler
|
|
115
125
|
from ksadk.studio.plugin_runtime import StudioPluginRuntime
|
|
116
126
|
from ksadk.studio.repository import AgentDraftRepository, BuildRepository, load_yaml_file
|
|
127
|
+
from ksadk.studio.resource_authority import (
|
|
128
|
+
ResourceAuthorityPolicy,
|
|
129
|
+
SignedKnowledgeResourceAuthority,
|
|
130
|
+
resource_authority_policy_from_environment,
|
|
131
|
+
)
|
|
132
|
+
from ksadk.studio.resource_build_admission import (
|
|
133
|
+
admit_resource_build,
|
|
134
|
+
resource_build_required,
|
|
135
|
+
)
|
|
117
136
|
from ksadk.studio.resource_catalog import LocalResourceCatalog
|
|
137
|
+
from ksadk.studio.resource_connections import ResourceConnectionRepository
|
|
118
138
|
from ksadk.studio.run_service import StudioRunService, StudioRunSpec
|
|
119
139
|
from ksadk.studio.runtime_catalog import inspect_runtime_catalog
|
|
120
140
|
from ksadk.studio.runtime_source import materialize_generated_runtime_source
|
|
@@ -133,6 +153,8 @@ from ksadk.studio.templates import (
|
|
|
133
153
|
from ksadk.studio.validator import AgentValidator
|
|
134
154
|
from ksadk.studio.workspace import Workspace
|
|
135
155
|
|
|
156
|
+
_T = TypeVar("_T")
|
|
157
|
+
|
|
136
158
|
_TRAJECTORY_KEEPALIVE_SECONDS = 15.0
|
|
137
159
|
_EVALUATION_TARGET_LABELS = {
|
|
138
160
|
TargetKind.A2A: "A2A Agent",
|
|
@@ -162,6 +184,8 @@ class StudioService:
|
|
|
162
184
|
plugin_provider_factories: Mapping[str, Any] | None = None,
|
|
163
185
|
legacy_harness_sources: Sequence[LegacyHarnessSource] = (),
|
|
164
186
|
dsh_provider_registration_manager: StudioDshProviderRegistrationManager | None = None,
|
|
187
|
+
dsh_capability_service: StudioDshCapabilityService | None = None,
|
|
188
|
+
resource_authority_policy: ResourceAuthorityPolicy | None = None,
|
|
165
189
|
) -> None:
|
|
166
190
|
provider_manifests = dict(plugin_provider_manifests or {})
|
|
167
191
|
provider_factories = dict(plugin_provider_factories or {})
|
|
@@ -180,14 +204,53 @@ class StudioService:
|
|
|
180
204
|
self.workspace.root
|
|
181
205
|
)
|
|
182
206
|
)
|
|
207
|
+
self.dsh_capabilities = (
|
|
208
|
+
dsh_capability_service
|
|
209
|
+
or StudioDshCapabilityService.discover_or_create_workspace_default(self.workspace.root)
|
|
210
|
+
)
|
|
211
|
+
if dsh_capability_service is not None or os.environ.get(
|
|
212
|
+
"KSADK_DSH_HOME", ""
|
|
213
|
+
).strip() or os.environ.get("KSADK_DSH_PROFILE", "").strip():
|
|
214
|
+
self._resource_dsh_provider_registration_manager = None
|
|
215
|
+
self.resource_dsh_capabilities = self.dsh_capabilities
|
|
216
|
+
else:
|
|
217
|
+
self._resource_dsh_provider_registration_manager = (
|
|
218
|
+
StudioDshProviderRegistrationManager.create_workspace_resource_default(
|
|
219
|
+
self.workspace.root
|
|
220
|
+
)
|
|
221
|
+
)
|
|
222
|
+
self.resource_dsh_capabilities = (
|
|
223
|
+
StudioDshCapabilityService.create_workspace_resource_default(
|
|
224
|
+
self.workspace.root
|
|
225
|
+
)
|
|
226
|
+
)
|
|
183
227
|
self._start_lock = asyncio.Lock()
|
|
184
228
|
self._started = False
|
|
229
|
+
self._closed = False
|
|
185
230
|
self._apply_persisted_settings()
|
|
186
231
|
self.avatar_assets = AgentAvatarAssetStore(self.workspace)
|
|
187
232
|
self.conversation_attachments = ConversationAttachmentStore(self.workspace)
|
|
188
233
|
self.drafts = AgentDraftRepository(self.workspace)
|
|
189
234
|
self.catalog = LocalResourceCatalog(self.workspace)
|
|
190
235
|
self.builds = BuildRepository(self.workspace)
|
|
236
|
+
self.credentials = (
|
|
237
|
+
credential_resolver
|
|
238
|
+
or getattr(model_client, "credential_resolver", None)
|
|
239
|
+
or CredentialResolver(self.workspace)
|
|
240
|
+
)
|
|
241
|
+
self.resource_connections = ResourceConnectionRepository(self.workspace, self.credentials)
|
|
242
|
+
effective_resource_policy = (
|
|
243
|
+
resource_authority_policy
|
|
244
|
+
if resource_authority_policy is not None
|
|
245
|
+
else resource_authority_policy_from_environment()
|
|
246
|
+
)
|
|
247
|
+
self.resource_authority = (
|
|
248
|
+
SignedKnowledgeResourceAuthority(
|
|
249
|
+
self.resource_connections, effective_resource_policy
|
|
250
|
+
)
|
|
251
|
+
if effective_resource_policy is not None
|
|
252
|
+
else None
|
|
253
|
+
)
|
|
191
254
|
self.validator = AgentValidator()
|
|
192
255
|
self.builder = AgentBundleBuilder(
|
|
193
256
|
self.workspace,
|
|
@@ -209,6 +272,8 @@ class StudioService:
|
|
|
209
272
|
self.codex_manifests = CodexManifestRepository(self.workspace)
|
|
210
273
|
self.codex_builds = CodexBuildRepository(self.workspace)
|
|
211
274
|
self.codex_drafts = CodexDraftRepository(self.workspace)
|
|
275
|
+
self.codex_plugin_snapshots = CodexPluginSnapshotStore(self.workspace)
|
|
276
|
+
self.codex_provider_builds = CodexProviderBuildManager(self)
|
|
212
277
|
codex_builder_kwargs = {}
|
|
213
278
|
if codex_runtime_inspector is not None:
|
|
214
279
|
codex_builder_kwargs["runtime_inspector"] = codex_runtime_inspector
|
|
@@ -218,6 +283,10 @@ class StudioService:
|
|
|
218
283
|
build_repository=self.codex_builds,
|
|
219
284
|
resource_catalog=self.catalog,
|
|
220
285
|
draft_repository=self.codex_drafts,
|
|
286
|
+
plugin_snapshot_store=self.codex_plugin_snapshots,
|
|
287
|
+
resource_connections=self.resource_connections,
|
|
288
|
+
provider_build=self.codex_provider_builds.prepare,
|
|
289
|
+
provider_validate=self.codex_provider_builds.bundle_root,
|
|
221
290
|
**codex_builder_kwargs,
|
|
222
291
|
)
|
|
223
292
|
self.runtime_executor = runtime_executor or RuntimeExecutor(
|
|
@@ -230,17 +299,15 @@ class StudioService:
|
|
|
230
299
|
session_service=self.session_service,
|
|
231
300
|
runtime_events=self.runtime_events,
|
|
232
301
|
)
|
|
233
|
-
self.credentials = (
|
|
234
|
-
credential_resolver
|
|
235
|
-
or getattr(model_client, "credential_resolver", None)
|
|
236
|
-
or CredentialResolver(self.workspace)
|
|
237
|
-
)
|
|
238
302
|
self.codex_runs = CodexRunSpecResolver(
|
|
239
303
|
self.workspace,
|
|
240
304
|
build_repository=self.codex_builds,
|
|
241
305
|
manifest_repository=self.codex_manifests,
|
|
242
306
|
credential_resolver=self.credentials,
|
|
243
307
|
resource_catalog=self.catalog,
|
|
308
|
+
draft_repository=self.codex_drafts,
|
|
309
|
+
plugin_snapshot_store=self.codex_plugin_snapshots,
|
|
310
|
+
provider_bundle_resolver=self.codex_provider_builds.bundle_root,
|
|
244
311
|
)
|
|
245
312
|
self.framework_runs = FrameworkRunSpecResolver(
|
|
246
313
|
self.workspace,
|
|
@@ -256,10 +323,17 @@ class StudioService:
|
|
|
256
323
|
session_service=self.session_service,
|
|
257
324
|
model_client=self.model_client,
|
|
258
325
|
secret_resolver=self.credentials,
|
|
326
|
+
codex_local_launch_resolver=self.codex_provider_builds.native_launch,
|
|
327
|
+
runtime_executor=self.runtime_executor,
|
|
259
328
|
harness_reasoner=harness_reasoner,
|
|
260
329
|
provider_manifests=provider_manifests,
|
|
261
330
|
provider_factories=provider_factories,
|
|
262
331
|
legacy_harness_sources=legacy_harness_sources,
|
|
332
|
+
dsh_capability_service=self.dsh_capabilities,
|
|
333
|
+
resource_dsh_capability_service=self.resource_dsh_capabilities,
|
|
334
|
+
resource_authority=self.resource_authority,
|
|
335
|
+
resource_connections=self.resource_connections,
|
|
336
|
+
resource_actor_ref="local-user",
|
|
263
337
|
)
|
|
264
338
|
self.run_service.plugin_runtime = self.plugin_runs
|
|
265
339
|
self.scheduler_runtimes = StudioScheduledKernelRegistry(
|
|
@@ -272,6 +346,9 @@ class StudioService:
|
|
|
272
346
|
self.workspace,
|
|
273
347
|
runtime_registry=self.scheduler_runtimes,
|
|
274
348
|
)
|
|
349
|
+
from ksadk.studio.scheduler_assistant import StudioScheduleAssistant
|
|
350
|
+
|
|
351
|
+
self.run_service.schedule_assistant = StudioScheduleAssistant(self)
|
|
275
352
|
self.mcp_runtime = MCPRuntimeAdapter(self.workspace, credentials=self.credentials)
|
|
276
353
|
self._cloud_gateway_override = cloud_gateway
|
|
277
354
|
self.cloud = CloudDeploymentService(
|
|
@@ -288,6 +365,7 @@ class StudioService:
|
|
|
288
365
|
"""Bind ready managed DSH registrations before build or execution."""
|
|
289
366
|
|
|
290
367
|
async with self._start_lock:
|
|
368
|
+
self._ensure_open()
|
|
291
369
|
if self._started:
|
|
292
370
|
return
|
|
293
371
|
await self._bootstrap_official_dsh_defaults()
|
|
@@ -304,23 +382,139 @@ class StudioService:
|
|
|
304
382
|
"""Rebind the exact current DSH Profile and release stale activations."""
|
|
305
383
|
|
|
306
384
|
async with self._start_lock:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
385
|
+
self._ensure_open()
|
|
386
|
+
safe_to_resume = False
|
|
387
|
+
try:
|
|
388
|
+
await self.plugin_runs.suspend_admission()
|
|
389
|
+
await self.reset_dsh_capability_state()
|
|
390
|
+
await self._bind_dsh_provider_registrations_locked(refresh=True)
|
|
391
|
+
await self._refresh_dsh_catalog_resource(required=False)
|
|
392
|
+
safe_to_resume = True
|
|
393
|
+
finally:
|
|
394
|
+
if safe_to_resume:
|
|
395
|
+
await self.plugin_runs.resume_admission()
|
|
396
|
+
|
|
397
|
+
async def reconfigure_dsh_profile(
|
|
398
|
+
self,
|
|
399
|
+
operation: Callable[[], Awaitable[_T]],
|
|
400
|
+
) -> _T:
|
|
401
|
+
"""Run one Profile mutation while all Agent admission is suspended."""
|
|
402
|
+
|
|
403
|
+
async with self._start_lock:
|
|
404
|
+
self._ensure_open()
|
|
405
|
+
safe_to_resume = False
|
|
406
|
+
try:
|
|
407
|
+
await self.plugin_runs.suspend_admission()
|
|
408
|
+
await self.reset_dsh_capability_state()
|
|
409
|
+
try:
|
|
410
|
+
result = await operation()
|
|
411
|
+
except BaseException as mutation_error:
|
|
412
|
+
if (
|
|
413
|
+
isinstance(mutation_error, StudioError)
|
|
414
|
+
and mutation_error.code == "DSH_PROFILE_RECOVERY_REQUIRED"
|
|
415
|
+
):
|
|
416
|
+
raise
|
|
417
|
+
try:
|
|
418
|
+
await self._bind_dsh_provider_registrations_locked(refresh=True)
|
|
419
|
+
await self._refresh_dsh_catalog_resource(required=False)
|
|
420
|
+
safe_to_resume = True
|
|
421
|
+
except Exception as recovery_error: # noqa: BLE001
|
|
422
|
+
logging.getLogger(__name__).warning(
|
|
423
|
+
"DSH provider recovery after mutation failure skipped: %s",
|
|
424
|
+
recovery_error,
|
|
425
|
+
)
|
|
426
|
+
raise
|
|
427
|
+
await self._bind_dsh_provider_registrations_locked(refresh=True)
|
|
428
|
+
await self._refresh_dsh_catalog_resource(required=False)
|
|
429
|
+
safe_to_resume = True
|
|
430
|
+
return result
|
|
431
|
+
finally:
|
|
432
|
+
if safe_to_resume:
|
|
433
|
+
await self.plugin_runs.resume_admission()
|
|
434
|
+
|
|
435
|
+
async def _bind_dsh_provider_registrations_locked(self, *, refresh: bool) -> None:
|
|
436
|
+
if self._dsh_provider_registration_manager is None:
|
|
437
|
+
self._dsh_provider_registration_manager = (
|
|
438
|
+
StudioDshProviderRegistrationManager.discover_or_create_workspace_default(
|
|
439
|
+
self.workspace.root
|
|
312
440
|
)
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
441
|
+
)
|
|
442
|
+
await self._bootstrap_official_dsh_defaults()
|
|
443
|
+
manifests, factories, manager_refs = await self._provider_snapshot(refresh=refresh)
|
|
444
|
+
self.plugin_compositions.replace_provider_registrations(manifests)
|
|
445
|
+
self.plugin_runs.replace_provider_registrations(manifests, factories)
|
|
446
|
+
self._active_provider_manifests = manifests
|
|
447
|
+
manager = self._dsh_provider_registration_manager
|
|
448
|
+
if manager is not None and manager_refs is not None:
|
|
449
|
+
manager.mark_bound(manager_refs)
|
|
450
|
+
self._started = True
|
|
451
|
+
|
|
452
|
+
async def reset_dsh_capability_state(self) -> None:
|
|
453
|
+
"""Drop the current DSH capability/Core generation."""
|
|
454
|
+
|
|
455
|
+
self.catalog.clear_dsh_profile_mcp()
|
|
456
|
+
await self.dsh_capabilities.refresh()
|
|
457
|
+
|
|
458
|
+
async def refresh_dsh_catalog_resource(self): # type: ignore[no-untyped-def]
|
|
459
|
+
"""Validate and publish the current DSH Profile as a bindable MCP."""
|
|
460
|
+
|
|
461
|
+
_snapshot, resource = await self.dsh_capability_catalog_snapshot()
|
|
462
|
+
return resource
|
|
463
|
+
|
|
464
|
+
async def dsh_capability_catalog_snapshot(self): # type: ignore[no-untyped-def]
|
|
465
|
+
"""Atomically snapshot and publish one current DSH generation."""
|
|
466
|
+
|
|
467
|
+
async with self._start_lock:
|
|
468
|
+
self._ensure_open()
|
|
469
|
+
snapshot = await self.dsh_capabilities.capability_snapshot()
|
|
470
|
+
resource = self.catalog.replace_dsh_profile_mcp(snapshot.descriptor)
|
|
471
|
+
return snapshot, resource
|
|
472
|
+
|
|
473
|
+
async def ensure_dsh_catalog_available(self) -> None:
|
|
474
|
+
"""Publish an explicitly enabled DSH Profile for the generic selector.
|
|
475
|
+
|
|
476
|
+
The normal Studio startup remains side-effect free for legacy users.
|
|
477
|
+
The generic MCP catalog request performs only a profile metadata check;
|
|
478
|
+
it starts the managed capability host when the user has already enabled
|
|
479
|
+
at least one DSH plugin.
|
|
480
|
+
"""
|
|
481
|
+
|
|
482
|
+
async with self._start_lock:
|
|
483
|
+
self._ensure_open()
|
|
484
|
+
existing = self.catalog.list(kind="mcp", source="provider", limit=200)
|
|
485
|
+
if any(item.contract.get("materialization") == "dsh-profile" for item in existing):
|
|
486
|
+
return
|
|
487
|
+
checker = getattr(self.dsh_capabilities, "has_enabled_profile_plugins", None)
|
|
488
|
+
if checker is None:
|
|
489
|
+
return
|
|
490
|
+
try:
|
|
491
|
+
enabled = await checker()
|
|
492
|
+
except Exception as error: # noqa: BLE001 - optional ecosystem boundary
|
|
493
|
+
logging.getLogger(__name__).warning("DSH catalog discovery skipped: %s", error)
|
|
494
|
+
return
|
|
495
|
+
if enabled:
|
|
496
|
+
await self._refresh_dsh_catalog_resource(required=False)
|
|
497
|
+
|
|
498
|
+
@asynccontextmanager
|
|
499
|
+
async def dsh_profile_read_transaction(self) -> AsyncIterator[None]:
|
|
500
|
+
"""Fence a UI grant read against Profile mutation and shutdown."""
|
|
501
|
+
|
|
502
|
+
async with self._start_lock:
|
|
503
|
+
self._ensure_open()
|
|
504
|
+
yield
|
|
505
|
+
|
|
506
|
+
async def _refresh_dsh_catalog_resource(self, *, required: bool): # type: ignore[no-untyped-def]
|
|
507
|
+
try:
|
|
508
|
+
snapshot = await self.dsh_capabilities.capability_snapshot()
|
|
509
|
+
return self.catalog.replace_dsh_profile_mcp(snapshot.descriptor)
|
|
510
|
+
except Exception as error: # noqa: BLE001 - optional ecosystem boundary
|
|
511
|
+
self.catalog.clear_dsh_profile_mcp()
|
|
512
|
+
if required:
|
|
513
|
+
raise
|
|
514
|
+
logging.getLogger(__name__).warning(
|
|
515
|
+
"DSH capability catalog publication skipped: %s", error
|
|
516
|
+
)
|
|
517
|
+
return None
|
|
324
518
|
|
|
325
519
|
async def _bootstrap_official_dsh_defaults(self) -> None:
|
|
326
520
|
manager = self._dsh_provider_registration_manager
|
|
@@ -332,9 +526,36 @@ class StudioService:
|
|
|
332
526
|
logging.getLogger(__name__).warning(
|
|
333
527
|
"official DSH provider bootstrap skipped: %s", error
|
|
334
528
|
)
|
|
529
|
+
else:
|
|
530
|
+
if result in {"installed", "already_enabled"}:
|
|
531
|
+
logging.getLogger(__name__).info(
|
|
532
|
+
"official Codex DSH provider bootstrap: %s", result
|
|
533
|
+
)
|
|
534
|
+
try:
|
|
535
|
+
resource_result = await manager.bootstrap_official_resource_plugins()
|
|
536
|
+
except Exception as error: # optional DSH must fail closed to legacy paths
|
|
537
|
+
logging.getLogger(__name__).warning(
|
|
538
|
+
"official DSH resource bootstrap skipped: %s", error
|
|
539
|
+
)
|
|
540
|
+
else:
|
|
541
|
+
if resource_result in {"installed", "already_enabled"}:
|
|
542
|
+
logging.getLogger(__name__).info(
|
|
543
|
+
"official platform resource DSH bootstrap: %s", resource_result
|
|
544
|
+
)
|
|
545
|
+
resource_manager = self._resource_dsh_provider_registration_manager
|
|
546
|
+
if resource_manager is None:
|
|
335
547
|
return
|
|
336
|
-
|
|
337
|
-
|
|
548
|
+
try:
|
|
549
|
+
resource_result = await resource_manager.bootstrap_official_resource_plugins()
|
|
550
|
+
except Exception as error:
|
|
551
|
+
logging.getLogger(__name__).warning(
|
|
552
|
+
"official resource execution Profile bootstrap skipped: %s", error
|
|
553
|
+
)
|
|
554
|
+
else:
|
|
555
|
+
if resource_result in {"installed", "already_enabled"}:
|
|
556
|
+
logging.getLogger(__name__).info(
|
|
557
|
+
"official resource execution Profile bootstrap: %s", resource_result
|
|
558
|
+
)
|
|
338
559
|
|
|
339
560
|
async def _provider_snapshot(
|
|
340
561
|
self, *, refresh: bool
|
|
@@ -453,19 +674,29 @@ class StudioService:
|
|
|
453
674
|
"""Resolve one immutable Build through its only compatible resolver."""
|
|
454
675
|
|
|
455
676
|
try:
|
|
677
|
+
self.codex_builds.get(build_id)
|
|
678
|
+
except Exception as exc:
|
|
679
|
+
if getattr(exc, "status_code", None) != 404:
|
|
680
|
+
raise
|
|
681
|
+
else:
|
|
682
|
+
# The record exists in the Codex repository. Any later resolution
|
|
683
|
+
# error belongs to that Build and must remain actionable; a nested
|
|
684
|
+
# 404 (for example a missing plugin snapshot) is not evidence that
|
|
685
|
+
# this is a framework Build.
|
|
456
686
|
return self.codex_runs.resolve(
|
|
457
687
|
build_id,
|
|
458
688
|
model=model,
|
|
459
689
|
sandbox=sandbox,
|
|
460
690
|
approval_mode=approval_mode,
|
|
461
691
|
)
|
|
462
|
-
except Exception as exc:
|
|
463
|
-
if getattr(exc, "status_code", None) != 404:
|
|
464
|
-
raise
|
|
465
692
|
framework_build = self.builds.get(build_id)
|
|
466
693
|
runtime_type = framework_build.runtime_type.strip().lower()
|
|
467
694
|
if runtime_type in {"harness", "plugin"}:
|
|
468
|
-
return self.plugin_runs.resolve(
|
|
695
|
+
return self.plugin_runs.resolve(
|
|
696
|
+
build_id,
|
|
697
|
+
model=model,
|
|
698
|
+
approval_mode=approval_mode,
|
|
699
|
+
)
|
|
469
700
|
return self.framework_runs.resolve(
|
|
470
701
|
build_id,
|
|
471
702
|
model=model,
|
|
@@ -605,11 +836,13 @@ class StudioService:
|
|
|
605
836
|
return await asyncio.to_thread(self.codex_builder.build, agent_id)
|
|
606
837
|
draft = self.drafts.get(agent_id)
|
|
607
838
|
composition_required = self.plugin_compositions.required_for(draft)
|
|
839
|
+
resources_required = resource_build_required(draft)
|
|
608
840
|
for record in self.builds.list_for_agent(agent_id):
|
|
609
841
|
if record.status == BuildStatus.SUCCEEDED:
|
|
610
|
-
if composition_required and (
|
|
842
|
+
if (composition_required or resources_required) and (
|
|
611
843
|
record.source_revision != draft.metadata.revision
|
|
612
|
-
or not self._build_has_composition(record)
|
|
844
|
+
or (composition_required and not self._build_has_composition(record))
|
|
845
|
+
or (resources_required and not self._build_has_resources(record))
|
|
613
846
|
):
|
|
614
847
|
continue
|
|
615
848
|
if composition_required:
|
|
@@ -638,7 +871,44 @@ class StudioService:
|
|
|
638
871
|
|
|
639
872
|
def _build_agent_bundle(self, draft: AgentDraft):
|
|
640
873
|
composition = self.plugin_compositions.compile_if_required(draft)
|
|
641
|
-
|
|
874
|
+
resource_build = None
|
|
875
|
+
if resource_build_required(draft):
|
|
876
|
+
dsh_profile = self.resource_dsh_capabilities.capture_resource_build_snapshot()
|
|
877
|
+
resource_build = admit_resource_build(
|
|
878
|
+
draft,
|
|
879
|
+
authority=self.resource_authority,
|
|
880
|
+
connections=self.resource_connections,
|
|
881
|
+
dsh_profile=dsh_profile,
|
|
882
|
+
)
|
|
883
|
+
try:
|
|
884
|
+
record = self.builder.build(
|
|
885
|
+
draft,
|
|
886
|
+
composition=composition,
|
|
887
|
+
resource_build=resource_build,
|
|
888
|
+
)
|
|
889
|
+
except BundleSecurityError as error:
|
|
890
|
+
first = error.findings[0]
|
|
891
|
+
reason = {
|
|
892
|
+
"literal-secret-field": "明文凭证",
|
|
893
|
+
"url-credentials": "含账号信息的 URL",
|
|
894
|
+
"local-home-path": "本机用户目录路径",
|
|
895
|
+
"invalid-structured-input": "无法解析的结构化数据",
|
|
896
|
+
}.get(first.kind, "敏感内容")
|
|
897
|
+
raise StudioError(
|
|
898
|
+
"BUNDLE_SECURITY_REJECTED",
|
|
899
|
+
f"AgentBundle 安全检查未通过:{first.path} 检测到{reason}",
|
|
900
|
+
status_code=422,
|
|
901
|
+
details={
|
|
902
|
+
"securityFindings": [
|
|
903
|
+
{
|
|
904
|
+
"path": finding.path,
|
|
905
|
+
"kind": finding.kind,
|
|
906
|
+
"field": finding.field,
|
|
907
|
+
}
|
|
908
|
+
for finding in error.findings
|
|
909
|
+
]
|
|
910
|
+
},
|
|
911
|
+
) from error
|
|
642
912
|
if composition is not None:
|
|
643
913
|
self.plugin_compositions.bind_build(
|
|
644
914
|
composition,
|
|
@@ -670,6 +940,26 @@ class StudioService:
|
|
|
670
940
|
except (KeyError, OSError, UnicodeError, ValueError, zipfile.BadZipFile):
|
|
671
941
|
return False
|
|
672
942
|
|
|
943
|
+
def _build_has_resources(self, record: Any) -> bool:
|
|
944
|
+
if (
|
|
945
|
+
not record.artifact_path
|
|
946
|
+
or not record.resource_build_digest
|
|
947
|
+
or not record.resource_snapshot_digest
|
|
948
|
+
):
|
|
949
|
+
return False
|
|
950
|
+
try:
|
|
951
|
+
archive = self.workspace.resolve(record.artifact_path, must_exist=True)
|
|
952
|
+
with zipfile.ZipFile(archive) as bundle:
|
|
953
|
+
manifest = BundleManifest.model_validate_json(bundle.read("manifest.json"))
|
|
954
|
+
names = frozenset(bundle.namelist())
|
|
955
|
+
return bool(
|
|
956
|
+
manifest.resource_build_digest == record.resource_build_digest
|
|
957
|
+
and manifest.resource_snapshot_digest == record.resource_snapshot_digest
|
|
958
|
+
and "platform-resources/resource-build.json" in names
|
|
959
|
+
)
|
|
960
|
+
except (KeyError, OSError, UnicodeError, ValueError, zipfile.BadZipFile):
|
|
961
|
+
return False
|
|
962
|
+
|
|
673
963
|
async def create_agent_schedule(
|
|
674
964
|
self,
|
|
675
965
|
agent_id: str,
|
|
@@ -714,6 +1004,7 @@ class StudioService:
|
|
|
714
1004
|
field="sessionId",
|
|
715
1005
|
)
|
|
716
1006
|
if continuity == "continue_session":
|
|
1007
|
+
await self._require_schedule_session_owner(agent_id, session_id)
|
|
717
1008
|
self._require_schedule_continuation(runtime, spec.launch_context.runtime_type)
|
|
718
1009
|
task = ScheduledTask(
|
|
719
1010
|
task_id=f"sched-{uuid4().hex[:20]}",
|
|
@@ -736,6 +1027,29 @@ class StudioService:
|
|
|
736
1027
|
)
|
|
737
1028
|
return self.scheduler.create_task(task)
|
|
738
1029
|
|
|
1030
|
+
async def _require_schedule_session_owner(self, agent_id: str, session_id: str | None) -> None:
|
|
1031
|
+
session = (
|
|
1032
|
+
await self.session_service.get_session_metadata(session_id) if session_id else None
|
|
1033
|
+
)
|
|
1034
|
+
if session is None or session.agent_id != agent_id:
|
|
1035
|
+
raise StudioError(
|
|
1036
|
+
"SCHEDULE_SESSION_INVALID",
|
|
1037
|
+
"请选择该智能体已有的会话。",
|
|
1038
|
+
status_code=422,
|
|
1039
|
+
field="sessionId",
|
|
1040
|
+
)
|
|
1041
|
+
|
|
1042
|
+
async def validate_schedule_session(
|
|
1043
|
+
self, agent_id: str, continuity: str, session_id: str | None, build_id: str | None
|
|
1044
|
+
) -> None:
|
|
1045
|
+
if continuity != "continue_session":
|
|
1046
|
+
return
|
|
1047
|
+
await self._require_schedule_session_owner(agent_id, session_id)
|
|
1048
|
+
await self.scheduler_runtimes.ensure_build(build_id, expected_agent_id=agent_id)
|
|
1049
|
+
runtime = self.scheduler_runtimes.runtime_for_build(build_id)
|
|
1050
|
+
spec = self.resolve_run_spec(build_id)
|
|
1051
|
+
self._require_schedule_continuation(runtime, spec.launch_context.runtime_type)
|
|
1052
|
+
|
|
739
1053
|
@staticmethod
|
|
740
1054
|
def _require_schedule_continuation(runtime: Any, runtime_type: str) -> None:
|
|
741
1055
|
"""Fail closed unless the bound Provider can preserve one conversation.
|
|
@@ -904,7 +1218,8 @@ class StudioService:
|
|
|
904
1218
|
from ksadk.studio.errors import not_found
|
|
905
1219
|
|
|
906
1220
|
runs = self.event_store.list_runs(session_id=session_id)
|
|
907
|
-
|
|
1221
|
+
session = await self.session_service.get_session_metadata(session_id)
|
|
1222
|
+
if not runs and session is None:
|
|
908
1223
|
raise not_found("session", session_id)
|
|
909
1224
|
if any(run.status == RunStatus.RUNNING for run in runs):
|
|
910
1225
|
raise StudioError(
|
|
@@ -920,9 +1235,46 @@ class StudioService:
|
|
|
920
1235
|
async def aclose(self) -> None:
|
|
921
1236
|
"""Release local provider activations and supervised plugin processes."""
|
|
922
1237
|
|
|
923
|
-
|
|
1238
|
+
async with self._start_lock:
|
|
1239
|
+
if self._closed:
|
|
1240
|
+
return
|
|
1241
|
+
self._closed = True
|
|
1242
|
+
cleanup = asyncio.create_task(self._close_owned_plugin_services())
|
|
1243
|
+
interrupted = False
|
|
1244
|
+
while not cleanup.done():
|
|
1245
|
+
try:
|
|
1246
|
+
await asyncio.shield(cleanup)
|
|
1247
|
+
except asyncio.CancelledError:
|
|
1248
|
+
interrupted = True
|
|
1249
|
+
cleanup.result()
|
|
1250
|
+
if interrupted:
|
|
1251
|
+
raise asyncio.CancelledError
|
|
1252
|
+
|
|
1253
|
+
async def _close_owned_plugin_services(self) -> None:
|
|
1254
|
+
first_error: BaseException | None = None
|
|
1255
|
+
owned = [self.plugin_runs.aclose, self.dsh_capabilities.aclose]
|
|
1256
|
+
if self.resource_dsh_capabilities is not self.dsh_capabilities:
|
|
1257
|
+
owned.append(self.resource_dsh_capabilities.aclose)
|
|
924
1258
|
if self._dsh_provider_registration_manager is not None:
|
|
925
|
-
|
|
1259
|
+
owned.append(self._dsh_provider_registration_manager.aclose)
|
|
1260
|
+
if self._resource_dsh_provider_registration_manager is not None:
|
|
1261
|
+
owned.append(self._resource_dsh_provider_registration_manager.aclose)
|
|
1262
|
+
for close in owned:
|
|
1263
|
+
try:
|
|
1264
|
+
await close()
|
|
1265
|
+
except BaseException as error: # cleanup must continue
|
|
1266
|
+
if first_error is None:
|
|
1267
|
+
first_error = error
|
|
1268
|
+
if first_error is not None:
|
|
1269
|
+
raise first_error
|
|
1270
|
+
|
|
1271
|
+
def _ensure_open(self) -> None:
|
|
1272
|
+
if self._closed:
|
|
1273
|
+
raise StudioError(
|
|
1274
|
+
"STUDIO_SERVICE_CLOSED",
|
|
1275
|
+
"Studio service 已关闭",
|
|
1276
|
+
status_code=503,
|
|
1277
|
+
)
|
|
926
1278
|
|
|
927
1279
|
async def _require_runtime_session(self, session_id: str) -> None:
|
|
928
1280
|
if await self.session_service.get_session_metadata(session_id) is None:
|
|
@@ -1623,6 +1975,83 @@ class StudioService:
|
|
|
1623
1975
|
return detail["validation"]
|
|
1624
1976
|
return self.validator.validate(draft, level=level)
|
|
1625
1977
|
|
|
1978
|
+
async def resource_binding_status(self, agent_id: str, *, activation_id: str) -> dict:
|
|
1979
|
+
# Check workspace ownership, but never project the mutable draft as runtime state.
|
|
1980
|
+
await asyncio.to_thread(self.agent_detail, agent_id)
|
|
1981
|
+
status = await self.dsh_capabilities.resource_runtime_status(
|
|
1982
|
+
agent_id=agent_id, activation_id=activation_id,
|
|
1983
|
+
)
|
|
1984
|
+
if status is None:
|
|
1985
|
+
raise StudioError(
|
|
1986
|
+
"RESOURCE_ACTIVATION_NOT_FOUND", "未找到此 Agent 的资源运行实例",
|
|
1987
|
+
status_code=404,
|
|
1988
|
+
)
|
|
1989
|
+
return status
|
|
1990
|
+
|
|
1991
|
+
def validate_resource_bindings(self, agent_id: str, *, expected_revision: int) -> dict:
|
|
1992
|
+
from ksadk.resource_runtime.plugin_config import resource_plugin_config
|
|
1993
|
+
from ksadk.studio.resource_binding_validation import resource_binding_diagnostics
|
|
1994
|
+
|
|
1995
|
+
draft = self.agent_detail(agent_id)["draft"]
|
|
1996
|
+
if draft.metadata.revision != expected_revision:
|
|
1997
|
+
raise StudioError(
|
|
1998
|
+
"AGENT_REVISION_CONFLICT", "资源校验版本与当前 Agent 不一致", status_code=409,
|
|
1999
|
+
)
|
|
2000
|
+
diagnostics = resource_binding_diagnostics(
|
|
2001
|
+
draft.spec.bindings.plugins, draft.spec.memory, self.resource_connections,
|
|
2002
|
+
)
|
|
2003
|
+
configs = [
|
|
2004
|
+
(index, config)
|
|
2005
|
+
for index, binding in enumerate(draft.spec.bindings.plugins)
|
|
2006
|
+
if binding.enabled
|
|
2007
|
+
for config in [
|
|
2008
|
+
resource_plugin_config(
|
|
2009
|
+
binding.plugin_ref,
|
|
2010
|
+
binding.ecosystem,
|
|
2011
|
+
binding.config,
|
|
2012
|
+
enabled=True,
|
|
2013
|
+
)
|
|
2014
|
+
]
|
|
2015
|
+
if config is not None
|
|
2016
|
+
]
|
|
2017
|
+
verified = []
|
|
2018
|
+
if (
|
|
2019
|
+
self.resource_authority is not None
|
|
2020
|
+
and configs
|
|
2021
|
+
and not any(item.severity == DiagnosticSeverity.ERROR for item in diagnostics)
|
|
2022
|
+
):
|
|
2023
|
+
for index, config in configs:
|
|
2024
|
+
try:
|
|
2025
|
+
verified.append(self.resource_authority.admit(config))
|
|
2026
|
+
except StudioError as error:
|
|
2027
|
+
diagnostics.append(
|
|
2028
|
+
Diagnostic(
|
|
2029
|
+
severity=DiagnosticSeverity.ERROR,
|
|
2030
|
+
code=error.code,
|
|
2031
|
+
message=error.message,
|
|
2032
|
+
field=error.field
|
|
2033
|
+
or f"spec.bindings.plugins[{index}].config.binding",
|
|
2034
|
+
)
|
|
2035
|
+
)
|
|
2036
|
+
current = self.agent_detail(agent_id)["draft"]
|
|
2037
|
+
if current.metadata.revision != draft.metadata.revision:
|
|
2038
|
+
raise StudioError(
|
|
2039
|
+
"AGENT_REVISION_CONFLICT",
|
|
2040
|
+
"资源校验期间 Agent 已变更,请刷新后重试",
|
|
2041
|
+
status_code=409,
|
|
2042
|
+
)
|
|
2043
|
+
authorization_verified = bool(configs) and len(verified) == len(configs)
|
|
2044
|
+
if authorization_verified:
|
|
2045
|
+
diagnostics = [
|
|
2046
|
+
item for item in diagnostics if item.code != "RESOURCE_AUTHORITY_UNVERIFIED"
|
|
2047
|
+
]
|
|
2048
|
+
return {
|
|
2049
|
+
"revision": draft.metadata.revision,
|
|
2050
|
+
"valid": not any(item.severity == "error" for item in diagnostics),
|
|
2051
|
+
"authorizationVerified": authorization_verified,
|
|
2052
|
+
"diagnostics": [item.model_dump(by_alias=True, mode="json") for item in diagnostics],
|
|
2053
|
+
}
|
|
2054
|
+
|
|
1626
2055
|
def submit_studio_build(
|
|
1627
2056
|
self,
|
|
1628
2057
|
agent_id: str,
|
|
@@ -2500,6 +2929,12 @@ class StudioService:
|
|
|
2500
2929
|
runner=managed_runtime_runner,
|
|
2501
2930
|
)
|
|
2502
2931
|
|
|
2932
|
+
# Do not turn a stale URL or a deleted Agent's Build into an accepted
|
|
2933
|
+
# operation that can only fail later in the worker. The Codex lookup
|
|
2934
|
+
# above intentionally falls back to framework builds, so establish
|
|
2935
|
+
# that the fallback record exists before returning HTTP 202.
|
|
2936
|
+
self.builds.get(build_id)
|
|
2937
|
+
|
|
2503
2938
|
async def runner(_operation_id: str):
|
|
2504
2939
|
return await self.cloud.deploy(build_id, request)
|
|
2505
2940
|
|
|
@@ -2655,7 +3090,7 @@ class StudioService:
|
|
|
2655
3090
|
except Exception:
|
|
2656
3091
|
data = {}
|
|
2657
3092
|
defaults = {
|
|
2658
|
-
"sandbox": os.environ.get("KSADK_CODEX_SANDBOX", "
|
|
3093
|
+
"sandbox": os.environ.get("KSADK_CODEX_SANDBOX", "workspace-write-auto"),
|
|
2659
3094
|
"buildAfterCreate": True,
|
|
2660
3095
|
"codexProxy": current_proxy_mode(),
|
|
2661
3096
|
"cloudRegion": os.environ.get(
|
|
@@ -2783,24 +3218,34 @@ class StudioService:
|
|
|
2783
3218
|
secret_key = (
|
|
2784
3219
|
os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY", "")
|
|
2785
3220
|
).strip()
|
|
2786
|
-
|
|
2787
|
-
|
|
3221
|
+
configured_region = os.environ.get(
|
|
3222
|
+
"AGENTENGINE_REGION", os.environ.get("KSYUN_REGION", "")
|
|
3223
|
+
).strip()
|
|
3224
|
+
environment_region = os.environ.get("KSYUN_REGION", "").strip()
|
|
3225
|
+
logical_region = (
|
|
3226
|
+
"pre-online"
|
|
3227
|
+
if environment_region.lower() == "pre-online"
|
|
3228
|
+
else configured_region
|
|
3229
|
+
)
|
|
3230
|
+
if not all((access_key, secret_key, logical_region)):
|
|
2788
3231
|
return UnavailableCloudGateway()
|
|
2789
3232
|
control_client = AgentEngineClient(
|
|
2790
|
-
region=
|
|
3233
|
+
region=logical_region,
|
|
2791
3234
|
access_key=access_key,
|
|
2792
3235
|
secret_key=secret_key,
|
|
2793
3236
|
)
|
|
3237
|
+
is_preonline = logical_region.lower() == "pre-online"
|
|
2794
3238
|
stream_base_url = os.environ.get("AGENTENGINE_STREAM_SERVER_URL", "").strip()
|
|
2795
|
-
if not stream_base_url and
|
|
3239
|
+
if not stream_base_url and is_preonline:
|
|
2796
3240
|
# The pre-online KOP response path currently buffers SSE until
|
|
2797
|
-
# EOF
|
|
2798
|
-
#
|
|
3241
|
+
# EOF, and KOP may not yet publish newly deployed native Action
|
|
3242
|
+
# names. Its internal Server ingress validates the same V4
|
|
3243
|
+
# signature for RunAgent, ManagedRuntime, and plugin delivery.
|
|
2799
3244
|
stream_base_url = "http://agent-api-pre.kspmas-internal.ksyun.com"
|
|
2800
3245
|
stream_client = (
|
|
2801
3246
|
AgentEngineClient(
|
|
2802
3247
|
base_url=stream_base_url,
|
|
2803
|
-
region=
|
|
3248
|
+
region=logical_region,
|
|
2804
3249
|
access_key=access_key,
|
|
2805
3250
|
secret_key=secret_key,
|
|
2806
3251
|
)
|
|
@@ -2808,9 +3253,10 @@ class StudioService:
|
|
|
2808
3253
|
else control_client
|
|
2809
3254
|
)
|
|
2810
3255
|
return DirectAgentEngineCloudDeploymentGateway(
|
|
2811
|
-
region=
|
|
3256
|
+
region=logical_region,
|
|
2812
3257
|
client=control_client,
|
|
2813
3258
|
stream_client=stream_client,
|
|
3259
|
+
managed_runtime_client=stream_client if is_preonline else None,
|
|
2814
3260
|
bucket=os.environ.get("KS3_BUCKET", "").strip() or None,
|
|
2815
3261
|
ks3_credentials={
|
|
2816
3262
|
"access_key": access_key,
|