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/cloud.py
CHANGED
|
@@ -3,16 +3,19 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import hashlib
|
|
6
|
+
import io
|
|
6
7
|
import json
|
|
7
8
|
import logging
|
|
8
9
|
import os
|
|
9
10
|
import tempfile
|
|
11
|
+
import zipfile
|
|
10
12
|
from collections.abc import AsyncIterator
|
|
11
13
|
from dataclasses import dataclass
|
|
12
14
|
from pathlib import Path
|
|
13
15
|
from typing import Any, Callable, Protocol, cast
|
|
14
16
|
from uuid import uuid4
|
|
15
17
|
|
|
18
|
+
import yaml
|
|
16
19
|
from pydantic import ValidationError
|
|
17
20
|
|
|
18
21
|
from ksadk.api import AgentEngineAPIError, AgentEngineClient
|
|
@@ -110,9 +113,7 @@ class CloudDeploymentGateway(Protocol):
|
|
|
110
113
|
self, agent_id: str, *, version_id: str
|
|
111
114
|
) -> dict[str, Any]: ...
|
|
112
115
|
|
|
113
|
-
async def get_account_agent_dashboard_access(
|
|
114
|
-
self, agent_id: str
|
|
115
|
-
) -> dict[str, str | None]: ...
|
|
116
|
+
async def get_account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]: ...
|
|
116
117
|
|
|
117
118
|
async def delete_account_agent(self, agent_id: str) -> bool: ...
|
|
118
119
|
|
|
@@ -226,9 +227,7 @@ class UnavailableCloudGateway:
|
|
|
226
227
|
status_code=501,
|
|
227
228
|
)
|
|
228
229
|
|
|
229
|
-
async def get_account_agent_dashboard_access(
|
|
230
|
-
self, _agent_id: str
|
|
231
|
-
) -> dict[str, str | None]:
|
|
230
|
+
async def get_account_agent_dashboard_access(self, _agent_id: str) -> dict[str, str | None]:
|
|
232
231
|
raise StudioError(
|
|
233
232
|
"CLOUD_DASHBOARD_UNAVAILABLE",
|
|
234
233
|
"当前未配置可用的云端签名账号,不能打开云端 Agent UI",
|
|
@@ -383,9 +382,7 @@ class InMemoryCloudGateway:
|
|
|
383
382
|
"noop": False,
|
|
384
383
|
}
|
|
385
384
|
|
|
386
|
-
async def get_account_agent_dashboard_access(
|
|
387
|
-
self, agent_id: str
|
|
388
|
-
) -> dict[str, str | None]:
|
|
385
|
+
async def get_account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
|
|
389
386
|
return {
|
|
390
387
|
"access_url": f"memory://dashboard/{agent_id}",
|
|
391
388
|
"agent_id": agent_id,
|
|
@@ -450,6 +447,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
450
447
|
region: str,
|
|
451
448
|
client: Any | None = None,
|
|
452
449
|
stream_client: Any | None = None,
|
|
450
|
+
managed_runtime_client: Any | None = None,
|
|
453
451
|
uploader_factory: Callable[..., Any] = KS3Uploader,
|
|
454
452
|
bucket: str | None = None,
|
|
455
453
|
ks3_credentials: dict[str, str] | None = None,
|
|
@@ -488,8 +486,37 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
488
486
|
# complete response body even when RunAgent returns SSE; both clients
|
|
489
487
|
# still use the same process-only V4 credentials and Server admission.
|
|
490
488
|
self.stream_client = stream_client or self.client
|
|
489
|
+
# Native ManagedRuntime and plugin-delivery actions may be available
|
|
490
|
+
# on Server before KOP publishes their Action names. Studio composes
|
|
491
|
+
# this client explicitly from its environment instead of inferring the
|
|
492
|
+
# deployment environment from the physical Region selected in UI.
|
|
493
|
+
self._native_runtime_client = managed_runtime_client
|
|
491
494
|
self._bundles: dict[str, dict[str, str]] = {}
|
|
492
495
|
|
|
496
|
+
def _managed_runtime_client(self) -> Any:
|
|
497
|
+
"""Use the deployed Server ingress for pre-online native runtime actions.
|
|
498
|
+
|
|
499
|
+
KOP remains the ordinary control-plane entry point. Pre-online may
|
|
500
|
+
publish a new ManagedRuntime or plugin-delivery action against a
|
|
501
|
+
different Server revision, while Studio's dedicated Server client is
|
|
502
|
+
already V4-signed and points at the deployment being validated.
|
|
503
|
+
"""
|
|
504
|
+
|
|
505
|
+
if self._native_runtime_client is not None:
|
|
506
|
+
return self._native_runtime_client
|
|
507
|
+
if self.region.lower() == "pre-online":
|
|
508
|
+
return self.stream_client
|
|
509
|
+
return self.client
|
|
510
|
+
|
|
511
|
+
def cached_identity(self) -> dict[str, str] | None:
|
|
512
|
+
"""Read the SDK's per-AK identity cache without making an IAM request."""
|
|
513
|
+
from ksadk.identity import get_cached_identity
|
|
514
|
+
|
|
515
|
+
identity = get_cached_identity(self._ks3_credentials["access_key"])
|
|
516
|
+
if not identity or not identity.user_uuid or not identity.user_name:
|
|
517
|
+
return None
|
|
518
|
+
return {"userName": identity.user_name, "userId": identity.user_uuid}
|
|
519
|
+
|
|
493
520
|
async def upload_bundle(self, **kwargs) -> str:
|
|
494
521
|
bundle = bytes(kwargs["bundle"])
|
|
495
522
|
provenance = dict(kwargs["provenance"])
|
|
@@ -510,7 +537,12 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
510
537
|
status_code=422,
|
|
511
538
|
)
|
|
512
539
|
object_key = f"studio-bundles/{_safe_object_component(agent_id)}/{archive_sha}/bundle.zip"
|
|
513
|
-
uploader = self.uploader_factory(
|
|
540
|
+
uploader = self.uploader_factory(
|
|
541
|
+
region=self.ks3_region,
|
|
542
|
+
bucket=self.bucket,
|
|
543
|
+
access_key=self._ks3_credentials["access_key"],
|
|
544
|
+
secret_key=self._ks3_credentials["secret_key"],
|
|
545
|
+
)
|
|
514
546
|
local_path: Path | None = None
|
|
515
547
|
try:
|
|
516
548
|
with tempfile.NamedTemporaryFile(
|
|
@@ -741,9 +773,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
741
773
|
return False
|
|
742
774
|
|
|
743
775
|
@classmethod
|
|
744
|
-
def _cloud_chat_route(
|
|
745
|
-
cls, *, runtime_type: str, capabilities: Any
|
|
746
|
-
) -> tuple[str, str]:
|
|
776
|
+
def _cloud_chat_route(cls, *, runtime_type: str, capabilities: Any) -> tuple[str, str]:
|
|
747
777
|
if cls._session_event_chat_declared(capabilities):
|
|
748
778
|
return (
|
|
749
779
|
"studio-session-events",
|
|
@@ -767,9 +797,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
767
797
|
else {}
|
|
768
798
|
)
|
|
769
799
|
deployment = (
|
|
770
|
-
payload.get("deployment")
|
|
771
|
-
if isinstance(payload.get("deployment"), dict)
|
|
772
|
-
else {}
|
|
800
|
+
payload.get("deployment") if isinstance(payload.get("deployment"), dict) else {}
|
|
773
801
|
)
|
|
774
802
|
runtime_config = (
|
|
775
803
|
deployment.get("runtime_config")
|
|
@@ -801,21 +829,24 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
801
829
|
return None
|
|
802
830
|
|
|
803
831
|
agent_id = str(
|
|
804
|
-
first("agent_id", "agentId", "agent_runtime_id", "agentRuntimeId", "id")
|
|
805
|
-
or fallback_id
|
|
832
|
+
first("agent_id", "agentId", "agent_runtime_id", "agentRuntimeId", "id") or fallback_id
|
|
806
833
|
).strip()
|
|
807
|
-
runtime_type =
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
834
|
+
runtime_type = (
|
|
835
|
+
str(
|
|
836
|
+
first(
|
|
837
|
+
"framework",
|
|
838
|
+
"runtime_kind",
|
|
839
|
+
"runtimeKind",
|
|
840
|
+
"runtime_type",
|
|
841
|
+
"runtimeType",
|
|
842
|
+
"runtime_name",
|
|
843
|
+
"runtimeName",
|
|
844
|
+
)
|
|
845
|
+
or ""
|
|
846
|
+
)
|
|
847
|
+
.strip()
|
|
848
|
+
.lower()
|
|
849
|
+
)
|
|
819
850
|
capabilities = first("capabilities", "Capabilities")
|
|
820
851
|
chat_transport, chat_routing_reason = (
|
|
821
852
|
DirectAgentEngineCloudDeploymentGateway._cloud_chat_route(
|
|
@@ -824,11 +855,14 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
824
855
|
)
|
|
825
856
|
)
|
|
826
857
|
version_id = str(first("version_id", "versionId", "revision") or "").strip()
|
|
827
|
-
manifest_sha256 =
|
|
828
|
-
runtime_config.get("manifest_sha256")
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
)
|
|
858
|
+
manifest_sha256 = (
|
|
859
|
+
str(runtime_config.get("manifest_sha256") or runtime_config.get("manifestSha256") or "")
|
|
860
|
+
.strip()
|
|
861
|
+
.lower()
|
|
862
|
+
)
|
|
863
|
+
kernel_ready_value = first("agent_kernel_ready", "agentKernelReady")
|
|
864
|
+
kernel_report_value = first("agent_kernel_runtime", "agentKernelRuntime")
|
|
865
|
+
kernel_report = kernel_report_value if isinstance(kernel_report_value, dict) else {}
|
|
832
866
|
if not version_id and len(manifest_sha256) == 64:
|
|
833
867
|
try:
|
|
834
868
|
bytes.fromhex(manifest_sha256)
|
|
@@ -860,7 +894,8 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
860
894
|
or quick_access.get("privateEndpoint")
|
|
861
895
|
or lifecycle_first("endpoint")
|
|
862
896
|
or ""
|
|
863
|
-
).strip()
|
|
897
|
+
).strip()
|
|
898
|
+
or None,
|
|
864
899
|
"framework": runtime_type or None,
|
|
865
900
|
"runtimeType": runtime_type or None,
|
|
866
901
|
"capabilities": capabilities if isinstance(capabilities, dict) else None,
|
|
@@ -873,21 +908,26 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
873
908
|
lifecycle_first("updated_at", "updatedAt", "update_time", "updateTime") or ""
|
|
874
909
|
).strip()
|
|
875
910
|
or None,
|
|
911
|
+
# Keep cloud lifecycle and AgentKernel readiness separate. A Pod
|
|
912
|
+
# can be RUNNING while control admission still rejects chat; these
|
|
913
|
+
# fields let Studio explain that state without exposing credentials
|
|
914
|
+
# or the full Server deployment record.
|
|
915
|
+
"kernelReady": (kernel_ready_value if isinstance(kernel_ready_value, bool) else None),
|
|
916
|
+
"deploymentPhase": str(first("deployment_phase", "deploymentPhase") or "").strip()
|
|
917
|
+
or None,
|
|
918
|
+
"statusMessage": str(first("message", "Message") or "").strip() or None,
|
|
919
|
+
"kernelReason": str(kernel_report.get("reason") or "").strip() or None,
|
|
920
|
+
"kernelObservedAt": str(
|
|
921
|
+
kernel_report.get("observed_at") or kernel_report.get("observedAt") or ""
|
|
922
|
+
).strip()
|
|
923
|
+
or None,
|
|
876
924
|
}
|
|
877
925
|
|
|
878
926
|
async def list_account_agents(self, *, page: int, size: int) -> dict[str, Any]:
|
|
879
927
|
payload = await self.client.list_agents(page=page, page_size=size)
|
|
880
928
|
raw_items = payload.get("agents") or payload.get("Agents") or []
|
|
881
|
-
items = [
|
|
882
|
-
|
|
883
|
-
for item in raw_items
|
|
884
|
-
if isinstance(item, dict)
|
|
885
|
-
]
|
|
886
|
-
items = [
|
|
887
|
-
item
|
|
888
|
-
for item in items
|
|
889
|
-
if item["agentId"] and item["status"] != "DELETED"
|
|
890
|
-
]
|
|
929
|
+
items = [self._account_agent_view(item) for item in raw_items if isinstance(item, dict)]
|
|
930
|
+
items = [item for item in items if item["agentId"] and item["status"] != "DELETED"]
|
|
891
931
|
return {
|
|
892
932
|
"items": items,
|
|
893
933
|
"total": len(items),
|
|
@@ -912,9 +952,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
912
952
|
|
|
913
953
|
return {
|
|
914
954
|
"versionId": str(first("version_id", "VersionId", default="") or "").strip(),
|
|
915
|
-
"versionName": str(
|
|
916
|
-
first("version_name", "VersionName", default="") or ""
|
|
917
|
-
).strip(),
|
|
955
|
+
"versionName": str(first("version_name", "VersionName", default="") or "").strip(),
|
|
918
956
|
"tag": str(first("tag", "Tag", default="") or "").strip(),
|
|
919
957
|
"status": str(first("status", "Status", default="") or "").strip(),
|
|
920
958
|
"trafficPercentage": int(
|
|
@@ -929,8 +967,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
929
967
|
)
|
|
930
968
|
or ""
|
|
931
969
|
).strip(),
|
|
932
|
-
"createdAt": str(first("created_at", "CreatedAt", default="") or "").strip()
|
|
933
|
-
or None,
|
|
970
|
+
"createdAt": str(first("created_at", "CreatedAt", default="") or "").strip() or None,
|
|
934
971
|
"createdBy": str(first("created_by", "CreatedBy", default="") or "").strip(),
|
|
935
972
|
}
|
|
936
973
|
|
|
@@ -958,9 +995,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
958
995
|
) from exc
|
|
959
996
|
raw_items = payload.get("versions") or payload.get("Versions") or []
|
|
960
997
|
items = [
|
|
961
|
-
self._account_agent_version_view(item)
|
|
962
|
-
for item in raw_items
|
|
963
|
-
if isinstance(item, dict)
|
|
998
|
+
self._account_agent_version_view(item) for item in raw_items if isinstance(item, dict)
|
|
964
999
|
]
|
|
965
1000
|
items = [item for item in items if item["versionId"]]
|
|
966
1001
|
current = next(
|
|
@@ -973,11 +1008,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
973
1008
|
)
|
|
974
1009
|
return {
|
|
975
1010
|
"items": items,
|
|
976
|
-
"total": int(
|
|
977
|
-
payload.get("total_count")
|
|
978
|
-
or payload.get("TotalCount")
|
|
979
|
-
or len(items)
|
|
980
|
-
),
|
|
1011
|
+
"total": int(payload.get("total_count") or payload.get("TotalCount") or len(items)),
|
|
981
1012
|
"currentVersionId": current,
|
|
982
1013
|
}
|
|
983
1014
|
|
|
@@ -1016,16 +1047,12 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1016
1047
|
) from exc
|
|
1017
1048
|
return {
|
|
1018
1049
|
"agentId": str(payload.get("agent_id") or normalized_id),
|
|
1019
|
-
"targetVersionId": str(
|
|
1020
|
-
payload.get("target_version_id") or normalized_version_id
|
|
1021
|
-
),
|
|
1050
|
+
"targetVersionId": str(payload.get("target_version_id") or normalized_version_id),
|
|
1022
1051
|
"status": str(payload.get("status") or "UPDATING"),
|
|
1023
1052
|
"noop": bool(payload.get("noop")),
|
|
1024
1053
|
}
|
|
1025
1054
|
|
|
1026
|
-
async def get_account_agent_dashboard_access(
|
|
1027
|
-
self, agent_id: str
|
|
1028
|
-
) -> dict[str, str | None]:
|
|
1055
|
+
async def get_account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
|
|
1029
1056
|
detail = await self.get_account_agent(agent_id)
|
|
1030
1057
|
path = (
|
|
1031
1058
|
_NATIVE_DASHBOARD_UI_PATH
|
|
@@ -1067,9 +1094,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1067
1094
|
)
|
|
1068
1095
|
return True
|
|
1069
1096
|
|
|
1070
|
-
def _chat_agent_id(
|
|
1071
|
-
self, deployment: DeploymentRecord | AccountCloudAgentReference
|
|
1072
|
-
) -> str:
|
|
1097
|
+
def _chat_agent_id(self, deployment: DeploymentRecord | AccountCloudAgentReference) -> str:
|
|
1073
1098
|
"""Bind local cloud chat to an immutable Studio deployment receipt.
|
|
1074
1099
|
|
|
1075
1100
|
In particular, the browser cannot provide an arbitrary AgentId and
|
|
@@ -1109,6 +1134,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1109
1134
|
*,
|
|
1110
1135
|
session_id: str,
|
|
1111
1136
|
after_seq_id: int | None = None,
|
|
1137
|
+
before_seq_id: int | None = None,
|
|
1112
1138
|
limit: int = 100,
|
|
1113
1139
|
) -> dict[str, Any]:
|
|
1114
1140
|
"""Return the Server/Runtime message projection for a bound session."""
|
|
@@ -1118,6 +1144,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1118
1144
|
agent_id=self._chat_agent_id(deployment),
|
|
1119
1145
|
session_id=session_id,
|
|
1120
1146
|
after_seq_id=after_seq_id,
|
|
1147
|
+
before_seq_id=before_seq_id,
|
|
1121
1148
|
limit=limit,
|
|
1122
1149
|
)
|
|
1123
1150
|
except AgentEngineAPIError as exc:
|
|
@@ -1242,14 +1269,10 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1242
1269
|
},
|
|
1243
1270
|
) from exc
|
|
1244
1271
|
|
|
1245
|
-
async def list_deployment_chat_models(
|
|
1246
|
-
self, deployment: DeploymentRecord
|
|
1247
|
-
) -> dict[str, Any]:
|
|
1272
|
+
async def list_deployment_chat_models(self, deployment: DeploymentRecord) -> dict[str, Any]:
|
|
1248
1273
|
"""Read the Server-authoritative model catalog for this Agent."""
|
|
1249
1274
|
|
|
1250
|
-
return await self.client.list_agent_models(
|
|
1251
|
-
agent_id=self._chat_agent_id(deployment)
|
|
1252
|
-
)
|
|
1275
|
+
return await self.client.list_agent_models(agent_id=self._chat_agent_id(deployment))
|
|
1253
1276
|
|
|
1254
1277
|
async def submit_deployment_chat_interaction(
|
|
1255
1278
|
self,
|
|
@@ -1264,23 +1287,106 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1264
1287
|
idempotency_key: str,
|
|
1265
1288
|
) -> dict[str, Any]:
|
|
1266
1289
|
"""Forward only Interaction/v1's caller-visible response fields."""
|
|
1290
|
+
try:
|
|
1291
|
+
# Match the transport used by the active cloud run. Pre-online
|
|
1292
|
+
# uses the private Server ingress because its public KOP action
|
|
1293
|
+
# catalog can lag the Server revision; production remains on the
|
|
1294
|
+
# account-scoped KOP client. Both are AgentEngineClient instances
|
|
1295
|
+
# and therefore reuse the same AWS V4 and verified IAM identity
|
|
1296
|
+
# header construction.
|
|
1297
|
+
return await self.stream_client.submit_interaction(
|
|
1298
|
+
agent_id=self._chat_agent_id(deployment),
|
|
1299
|
+
session_id=session_id,
|
|
1300
|
+
run_id=run_id,
|
|
1301
|
+
interaction_id=interaction_id,
|
|
1302
|
+
expected_revision=expected_revision,
|
|
1303
|
+
action=action,
|
|
1304
|
+
response=response,
|
|
1305
|
+
idempotency_key=idempotency_key,
|
|
1306
|
+
)
|
|
1307
|
+
except AgentEngineAPIError as exc:
|
|
1308
|
+
logger.warning(
|
|
1309
|
+
"cloud interaction submit rejected: agent=%s session=%s run=%s "
|
|
1310
|
+
"interaction=%s revision=%s action=%s reason=%s",
|
|
1311
|
+
self._chat_agent_id(deployment),
|
|
1312
|
+
session_id,
|
|
1313
|
+
run_id,
|
|
1314
|
+
interaction_id,
|
|
1315
|
+
expected_revision,
|
|
1316
|
+
action,
|
|
1317
|
+
AgentEngineClient._safe_log_error_summary(
|
|
1318
|
+
details={"code": exc.raw_code, "message": exc.message}
|
|
1319
|
+
),
|
|
1320
|
+
)
|
|
1321
|
+
raise StudioError(
|
|
1322
|
+
"CLOUD_INTERACTION_SUBMIT_FAILED",
|
|
1323
|
+
exc.message,
|
|
1324
|
+
status_code=502,
|
|
1325
|
+
details={
|
|
1326
|
+
"serverCode": exc.raw_code,
|
|
1327
|
+
**{
|
|
1328
|
+
key: value
|
|
1329
|
+
for key, value in exc.details.items()
|
|
1330
|
+
if key in {"request_id", "action", "http_status"}
|
|
1331
|
+
},
|
|
1332
|
+
},
|
|
1333
|
+
) from exc
|
|
1267
1334
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1335
|
+
async def prepare_plugin_delivery(
|
|
1336
|
+
self, workspace: Workspace, build_id: str, manifest: str, runtime_version: str
|
|
1337
|
+
) -> list[dict[str, Any]]:
|
|
1338
|
+
from ksadk.plugins.delivery import PluginDelivery
|
|
1339
|
+
from ksadk.studio.codex_builder import CodexStudioBuilder
|
|
1340
|
+
|
|
1341
|
+
builder = CodexStudioBuilder(workspace)
|
|
1342
|
+
build = builder.repository.get(build_id)
|
|
1343
|
+
if (
|
|
1344
|
+
build.runtime_version != runtime_version
|
|
1345
|
+
or build.manifest_sha256 != hashlib.sha256(manifest.encode()).hexdigest()
|
|
1346
|
+
):
|
|
1347
|
+
raise StudioError(
|
|
1348
|
+
"PLUGIN_BUILD_MISMATCH", "部署声明与冻结 Build 不一致", status_code=409
|
|
1349
|
+
)
|
|
1350
|
+
receipt, archive = builder.export_plugin_artifact(build_id)
|
|
1351
|
+
object_key = f"plugin-artifacts/v1/{receipt.artifact_digest[7:]}.zip"
|
|
1352
|
+
uploader = self.uploader_factory(
|
|
1353
|
+
region=self.ks3_region,
|
|
1354
|
+
bucket=self.bucket,
|
|
1355
|
+
access_key=self._ks3_credentials["access_key"],
|
|
1356
|
+
secret_key=self._ks3_credentials["secret_key"],
|
|
1357
|
+
public_read=False,
|
|
1277
1358
|
)
|
|
1359
|
+
artifact_path = await uploader.upload(archive, object_key)
|
|
1360
|
+
if not artifact_path:
|
|
1361
|
+
raise StudioError(
|
|
1362
|
+
"PLUGIN_UPLOAD_FAILED",
|
|
1363
|
+
"插件归档上传到 Agent 代码包 KS3 桶失败",
|
|
1364
|
+
status_code=502,
|
|
1365
|
+
)
|
|
1366
|
+
pinned = build.plugin_marketplace
|
|
1367
|
+
delivery = PluginDelivery(
|
|
1368
|
+
artifact_path=str(artifact_path),
|
|
1369
|
+
storage_region=self.ks3_region,
|
|
1370
|
+
receipt=receipt,
|
|
1371
|
+
build_id=build_id,
|
|
1372
|
+
manifest_sha256=build.manifest_sha256,
|
|
1373
|
+
marketplace_name=pinned.marketplace_name,
|
|
1374
|
+
plugin_names=list(pinned.plugin_names),
|
|
1375
|
+
snapshot_digest=pinned.marketplace_digest,
|
|
1376
|
+
bindings=[
|
|
1377
|
+
b
|
|
1378
|
+
for b in yaml.safe_load(manifest).get("plugins", [])
|
|
1379
|
+
if b.get("enabled", True) and b.get("ecosystem") == "codex"
|
|
1380
|
+
],
|
|
1381
|
+
)
|
|
1382
|
+
delivery.validate_manifest(yaml.safe_load(manifest))
|
|
1383
|
+
return [delivery.model_dump()]
|
|
1278
1384
|
|
|
1279
1385
|
async def create_managed_runtime_deployment(self, **kwargs) -> DeploymentRecord:
|
|
1280
1386
|
request: DeploymentRequest = kwargs["request"]
|
|
1281
1387
|
digest = str(kwargs["manifest_digest"])
|
|
1282
1388
|
runtime_environment = dict(kwargs.get("runtime_environment") or {})
|
|
1283
|
-
result = await self.
|
|
1389
|
+
result = await self._managed_runtime_client().create_agent(
|
|
1284
1390
|
self._managed_runtime_payload(
|
|
1285
1391
|
agent_name=str(kwargs["agent_name"]),
|
|
1286
1392
|
manifest=str(kwargs["manifest"]),
|
|
@@ -1288,6 +1394,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1288
1394
|
runtime_version=str(kwargs["runtime_version"]),
|
|
1289
1395
|
request=request,
|
|
1290
1396
|
runtime_environment=runtime_environment,
|
|
1397
|
+
plugin_artifacts=kwargs.get("plugin_artifacts"),
|
|
1291
1398
|
)
|
|
1292
1399
|
)
|
|
1293
1400
|
agent_id = str(result.get("agent_id") or "").strip()
|
|
@@ -1334,12 +1441,16 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1334
1441
|
"manifest": str(kwargs["manifest"]),
|
|
1335
1442
|
},
|
|
1336
1443
|
}
|
|
1444
|
+
if kwargs.get("plugin_artifacts"):
|
|
1445
|
+
update_payload["managed_runtime_config"]["plugin_artifacts"] = kwargs[
|
|
1446
|
+
"plugin_artifacts"
|
|
1447
|
+
]
|
|
1337
1448
|
if runtime_environment:
|
|
1338
1449
|
# A changed MCP/model binding can introduce a new credential ref.
|
|
1339
1450
|
# Re-resolve it for every immutable revision instead of relying on
|
|
1340
1451
|
# the environment captured by the first CreateAgent call.
|
|
1341
1452
|
update_payload["environment_variables"] = runtime_environment
|
|
1342
|
-
await self.
|
|
1453
|
+
await self._managed_runtime_client().update_agent(
|
|
1343
1454
|
deployment.agent_id,
|
|
1344
1455
|
update_payload,
|
|
1345
1456
|
)
|
|
@@ -1398,6 +1509,7 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1398
1509
|
runtime_version: str,
|
|
1399
1510
|
request: DeploymentRequest,
|
|
1400
1511
|
runtime_environment: dict[str, str] | None = None,
|
|
1512
|
+
plugin_artifacts: list[dict[str, Any]] | None = None,
|
|
1401
1513
|
) -> dict[str, Any]:
|
|
1402
1514
|
payload = {
|
|
1403
1515
|
"name": _server_agent_name(agent_name),
|
|
@@ -1420,6 +1532,8 @@ class DirectAgentEngineCloudDeploymentGateway:
|
|
|
1420
1532
|
"scaling": {"min_replicas": 1, "max_replicas": 1, "concurrency": 20},
|
|
1421
1533
|
"auth_type": "ApiKey",
|
|
1422
1534
|
}
|
|
1535
|
+
if plugin_artifacts:
|
|
1536
|
+
payload["managed_runtime_config"]["plugin_artifacts"] = plugin_artifacts
|
|
1423
1537
|
if runtime_environment:
|
|
1424
1538
|
# Model credentials are resolved only for this in-memory deployment
|
|
1425
1539
|
# request. They are never written into the YAML build or local
|
|
@@ -1527,6 +1641,28 @@ class CloudDeploymentService:
|
|
|
1527
1641
|
status_code=409,
|
|
1528
1642
|
details={"deploymentId": replacing.id},
|
|
1529
1643
|
)
|
|
1644
|
+
plugin_artifacts = None
|
|
1645
|
+
if runtime_name == "codex":
|
|
1646
|
+
declaration = yaml.safe_load(manifest) or {}
|
|
1647
|
+
bindings = [
|
|
1648
|
+
b
|
|
1649
|
+
for b in declaration.get("plugins", [])
|
|
1650
|
+
if (
|
|
1651
|
+
not isinstance(b, dict)
|
|
1652
|
+
or (b.get("enabled", True) and b.get("ecosystem") == "codex")
|
|
1653
|
+
)
|
|
1654
|
+
]
|
|
1655
|
+
if bindings:
|
|
1656
|
+
prepare = getattr(self.gateway, "prepare_plugin_delivery", None)
|
|
1657
|
+
if prepare is None:
|
|
1658
|
+
raise StudioError(
|
|
1659
|
+
"NATIVE_PLUGIN_DELIVERY_UNAVAILABLE",
|
|
1660
|
+
"云端尚未声明插件交付能力",
|
|
1661
|
+
status_code=409,
|
|
1662
|
+
)
|
|
1663
|
+
plugin_artifacts = await prepare(
|
|
1664
|
+
self.workspace, build_id, manifest, runtime_version
|
|
1665
|
+
)
|
|
1530
1666
|
if replacing is None:
|
|
1531
1667
|
record = await self.gateway.create_managed_runtime_deployment(
|
|
1532
1668
|
build_id=build_id,
|
|
@@ -1537,18 +1673,45 @@ class CloudDeploymentService:
|
|
|
1537
1673
|
manifest_digest=manifest_digest,
|
|
1538
1674
|
request=request,
|
|
1539
1675
|
runtime_environment=runtime_environment,
|
|
1676
|
+
plugin_artifacts=plugin_artifacts,
|
|
1540
1677
|
)
|
|
1541
1678
|
else:
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1679
|
+
try:
|
|
1680
|
+
record = await self.gateway.replace_managed_runtime_deployment(
|
|
1681
|
+
replacing,
|
|
1682
|
+
build_id=build_id,
|
|
1683
|
+
manifest=manifest,
|
|
1684
|
+
runtime_name=runtime_name,
|
|
1685
|
+
runtime_version=runtime_version,
|
|
1686
|
+
manifest_digest=manifest_digest,
|
|
1687
|
+
request=request,
|
|
1688
|
+
runtime_environment=runtime_environment,
|
|
1689
|
+
plugin_artifacts=plugin_artifacts,
|
|
1690
|
+
)
|
|
1691
|
+
except (AgentEngineAPIError, StudioError) as error:
|
|
1692
|
+
status_code = (
|
|
1693
|
+
error.status_code
|
|
1694
|
+
if isinstance(error, StudioError)
|
|
1695
|
+
else error.details.get("http_status", error.code)
|
|
1696
|
+
)
|
|
1697
|
+
if status_code != 404:
|
|
1698
|
+
raise
|
|
1699
|
+
# Local receipts may outlive an Agent removed through the
|
|
1700
|
+
# console or another client. The authoritative 404 means this
|
|
1701
|
+
# is a fresh create, while all other update failures remain
|
|
1702
|
+
# fail-closed to avoid duplicate Agents.
|
|
1703
|
+
record = await self.gateway.create_managed_runtime_deployment(
|
|
1704
|
+
build_id=build_id,
|
|
1705
|
+
agent_name=agent_name,
|
|
1706
|
+
manifest=manifest,
|
|
1707
|
+
runtime_name=runtime_name,
|
|
1708
|
+
runtime_version=runtime_version,
|
|
1709
|
+
manifest_digest=manifest_digest,
|
|
1710
|
+
request=request,
|
|
1711
|
+
runtime_environment=runtime_environment,
|
|
1712
|
+
plugin_artifacts=plugin_artifacts,
|
|
1713
|
+
)
|
|
1714
|
+
record = self._capture_creator(record, replacing)
|
|
1552
1715
|
self._save(record, request)
|
|
1553
1716
|
return record
|
|
1554
1717
|
|
|
@@ -1586,9 +1749,30 @@ class CloudDeploymentService:
|
|
|
1586
1749
|
bundle_digest=build.bundle_digest,
|
|
1587
1750
|
request=request,
|
|
1588
1751
|
)
|
|
1752
|
+
record = self._capture_creator(record, replacing)
|
|
1589
1753
|
self._save(record, request)
|
|
1590
1754
|
return record
|
|
1591
1755
|
|
|
1756
|
+
def cached_identity(self) -> dict[str, str] | None:
|
|
1757
|
+
reader = getattr(self.gateway, "cached_identity", None)
|
|
1758
|
+
return reader() if reader else None
|
|
1759
|
+
|
|
1760
|
+
def _capture_creator(
|
|
1761
|
+
self, record: DeploymentRecord, replacing: DeploymentRecord | None
|
|
1762
|
+
) -> DeploymentRecord:
|
|
1763
|
+
if replacing is not None:
|
|
1764
|
+
return record.model_copy(update={
|
|
1765
|
+
"created_by_name": replacing.created_by_name,
|
|
1766
|
+
"created_by_user_id": replacing.created_by_user_id,
|
|
1767
|
+
})
|
|
1768
|
+
identity = self.cached_identity()
|
|
1769
|
+
if not identity:
|
|
1770
|
+
return record
|
|
1771
|
+
return record.model_copy(update={
|
|
1772
|
+
"created_by_name": identity["userName"],
|
|
1773
|
+
"created_by_user_id": identity["userId"],
|
|
1774
|
+
})
|
|
1775
|
+
|
|
1592
1776
|
def _prepared_build(self, build_id: str) -> tuple[BuildRecord, bytes, dict[str, Any]]:
|
|
1593
1777
|
build = self.build_repository.get(build_id)
|
|
1594
1778
|
if build.status != BuildStatus.SUCCEEDED or not build.artifact_path:
|
|
@@ -1599,6 +1783,7 @@ class CloudDeploymentService:
|
|
|
1599
1783
|
)
|
|
1600
1784
|
archive = self.workspace.resolve(build.artifact_path, must_exist=True)
|
|
1601
1785
|
bundle = archive.read_bytes()
|
|
1786
|
+
self._reject_local_only_materializers(bundle, artifact_name=archive.name)
|
|
1602
1787
|
checked_bundle = (
|
|
1603
1788
|
preflight_hosted_kernel_bundle(bundle)
|
|
1604
1789
|
if getattr(self.gateway, "requires_hosted_kernel_bundle_preflight", False)
|
|
@@ -1637,6 +1822,63 @@ class CloudDeploymentService:
|
|
|
1637
1822
|
provenance["runtimeType"] = str(manifest.get("runtimeType") or build.runtime_type)
|
|
1638
1823
|
return build, bundle, provenance
|
|
1639
1824
|
|
|
1825
|
+
@staticmethod
|
|
1826
|
+
def _reject_local_only_materializers(
|
|
1827
|
+
bundle_bytes: bytes,
|
|
1828
|
+
*,
|
|
1829
|
+
artifact_name: str,
|
|
1830
|
+
) -> None:
|
|
1831
|
+
"""Check the exact bytes that will be uploaded for local-only materializers."""
|
|
1832
|
+
|
|
1833
|
+
try:
|
|
1834
|
+
with zipfile.ZipFile(io.BytesIO(bundle_bytes)) as bundle:
|
|
1835
|
+
|
|
1836
|
+
def load_optional(name: str) -> dict[str, Any]:
|
|
1837
|
+
try:
|
|
1838
|
+
info = bundle.getinfo(name)
|
|
1839
|
+
except KeyError:
|
|
1840
|
+
return {}
|
|
1841
|
+
if info.file_size > 8 * 1024 * 1024:
|
|
1842
|
+
raise ValueError(f"{name} is too large")
|
|
1843
|
+
payload = json.loads(bundle.read(info).decode("utf-8"))
|
|
1844
|
+
if not isinstance(payload, dict):
|
|
1845
|
+
raise ValueError(f"{name} must be an object")
|
|
1846
|
+
return payload
|
|
1847
|
+
|
|
1848
|
+
composition = load_optional("composition-profile.json")
|
|
1849
|
+
resolved = load_optional("resolved-agent-spec.json")
|
|
1850
|
+
except (
|
|
1851
|
+
OSError,
|
|
1852
|
+
UnicodeError,
|
|
1853
|
+
ValueError,
|
|
1854
|
+
zipfile.BadZipFile,
|
|
1855
|
+
json.JSONDecodeError,
|
|
1856
|
+
) as error:
|
|
1857
|
+
raise StudioError(
|
|
1858
|
+
"BUILD_ARTIFACT_INVALID",
|
|
1859
|
+
"部署前无法验证 Bundle 的本地运行时依赖",
|
|
1860
|
+
status_code=422,
|
|
1861
|
+
details={"buildArtifact": artifact_name},
|
|
1862
|
+
) from error
|
|
1863
|
+
|
|
1864
|
+
dynamic_ref = any(
|
|
1865
|
+
isinstance(item, dict)
|
|
1866
|
+
and str(item.get("ref") or "").startswith("plugin://io.ksadk.mcp.dsh-profile@")
|
|
1867
|
+
for item in composition.get("capabilities", [])
|
|
1868
|
+
)
|
|
1869
|
+
resolved_capabilities = resolved.get("capabilities")
|
|
1870
|
+
dynamic_server = isinstance(resolved_capabilities, dict) and any(
|
|
1871
|
+
isinstance(item, dict) and item.get("materialization") == "dsh-profile"
|
|
1872
|
+
for item in resolved_capabilities.get("mcpServers", [])
|
|
1873
|
+
)
|
|
1874
|
+
if dynamic_ref or dynamic_server:
|
|
1875
|
+
raise StudioError(
|
|
1876
|
+
"DSH_MCP_DEPLOYMENT_UNSUPPORTED",
|
|
1877
|
+
"DSH Profile MCP 当前只能由本地 Studio 按 activation 物化,尚不能部署到云端",
|
|
1878
|
+
status_code=422,
|
|
1879
|
+
details={"materialization": "dsh-profile"},
|
|
1880
|
+
)
|
|
1881
|
+
|
|
1640
1882
|
def get(self, deployment_id: str) -> DeploymentRecord:
|
|
1641
1883
|
path = self.workspace.resolve(Path(".agentkit/deployments") / f"{deployment_id}.json")
|
|
1642
1884
|
if not path.is_file():
|
|
@@ -1751,9 +1993,7 @@ class CloudDeploymentService:
|
|
|
1751
1993
|
)
|
|
1752
1994
|
await deleter(deployment)
|
|
1753
1995
|
|
|
1754
|
-
deleted_receipts = self._delete_receipts_for_agent(
|
|
1755
|
-
agent_id, required=deployment
|
|
1756
|
-
)
|
|
1996
|
+
deleted_receipts = self._delete_receipts_for_agent(agent_id, required=deployment)
|
|
1757
1997
|
return {"agentId": agent_id, "deletedReceiptIds": deleted_receipts}
|
|
1758
1998
|
|
|
1759
1999
|
def _delete_receipts_for_agent(
|
|
@@ -1818,9 +2058,7 @@ class CloudDeploymentService:
|
|
|
1818
2058
|
)
|
|
1819
2059
|
return await rollback(agent_id, version_id=version_id)
|
|
1820
2060
|
|
|
1821
|
-
async def account_agent_dashboard_access(
|
|
1822
|
-
self, agent_id: str
|
|
1823
|
-
) -> dict[str, str | None]:
|
|
2061
|
+
async def account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
|
|
1824
2062
|
reader = getattr(self.gateway, "get_account_agent_dashboard_access", None)
|
|
1825
2063
|
if reader is None:
|
|
1826
2064
|
raise StudioError(
|
|
@@ -1844,9 +2082,7 @@ class CloudDeploymentService:
|
|
|
1844
2082
|
"deletedReceiptIds": self._delete_receipts_for_agent(agent_id),
|
|
1845
2083
|
}
|
|
1846
2084
|
|
|
1847
|
-
async def _chat_target(
|
|
1848
|
-
self, target_id: str
|
|
1849
|
-
) -> DeploymentRecord | AccountCloudAgentReference:
|
|
2085
|
+
async def _chat_target(self, target_id: str) -> DeploymentRecord | AccountCloudAgentReference:
|
|
1850
2086
|
if not target_id.startswith("account:"):
|
|
1851
2087
|
return self.get(target_id)
|
|
1852
2088
|
agent_id = target_id.removeprefix("account:").strip()
|
|
@@ -1901,6 +2137,7 @@ class CloudDeploymentService:
|
|
|
1901
2137
|
*,
|
|
1902
2138
|
session_id: str,
|
|
1903
2139
|
after_seq_id: int | None = None,
|
|
2140
|
+
before_seq_id: int | None = None,
|
|
1904
2141
|
limit: int = 100,
|
|
1905
2142
|
) -> dict[str, Any]:
|
|
1906
2143
|
deployment = await self._chat_target(deployment_id)
|
|
@@ -1915,6 +2152,7 @@ class CloudDeploymentService:
|
|
|
1915
2152
|
deployment,
|
|
1916
2153
|
session_id=session_id,
|
|
1917
2154
|
after_seq_id=after_seq_id,
|
|
2155
|
+
before_seq_id=before_seq_id,
|
|
1918
2156
|
limit=limit,
|
|
1919
2157
|
)
|
|
1920
2158
|
|