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/runtime/factory.py
CHANGED
|
@@ -2,17 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import dataclasses
|
|
6
|
-
import hashlib
|
|
7
|
-
import os
|
|
8
|
-
import re
|
|
9
|
-
import shutil
|
|
10
|
-
import tempfile
|
|
11
|
-
from pathlib import Path
|
|
12
5
|
from typing import Any
|
|
13
6
|
|
|
14
|
-
from ksadk.
|
|
15
|
-
|
|
7
|
+
from ksadk.plugins.providers.codex_native import (
|
|
8
|
+
_apply_codex_overrides as _apply_codex_overrides,
|
|
9
|
+
)
|
|
10
|
+
from ksadk.plugins.providers.codex_native import (
|
|
11
|
+
_codex_home_key as _codex_home_key,
|
|
12
|
+
)
|
|
13
|
+
from ksadk.plugins.providers.codex_native import (
|
|
14
|
+
_codex_plugin_bootstrap as _codex_plugin_bootstrap,
|
|
15
|
+
)
|
|
16
|
+
from ksadk.plugins.providers.codex_native import (
|
|
17
|
+
_isolated_codex_home as _isolated_codex_home,
|
|
18
|
+
)
|
|
19
|
+
from ksadk.plugins.providers.codex_native import (
|
|
20
|
+
_manifest_has_network_mcp as _manifest_has_network_mcp,
|
|
21
|
+
)
|
|
22
|
+
from ksadk.plugins.providers.codex_native import (
|
|
23
|
+
_manifest_mcp_overrides as _manifest_mcp_overrides,
|
|
24
|
+
)
|
|
25
|
+
from ksadk.plugins.providers.codex_native import (
|
|
26
|
+
_materialize_bound_codex_skills as _materialize_bound_codex_skills,
|
|
27
|
+
)
|
|
28
|
+
from ksadk.plugins.providers.codex_native import (
|
|
29
|
+
codex_request_config,
|
|
30
|
+
)
|
|
31
|
+
from ksadk.plugins.providers.codex_native import (
|
|
32
|
+
create_codex_adapter as _create_codex,
|
|
33
|
+
)
|
|
16
34
|
from ksadk.runners.base_runner import BaseRunner
|
|
17
35
|
from ksadk.runtime.adapter import RuntimeAdapter, RuntimeRegistry, StartRequest
|
|
18
36
|
from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
|
|
@@ -51,59 +69,7 @@ def kernel_start_request_defaults(context: RuntimeLaunchContext) -> dict[str, An
|
|
|
51
69
|
if context.runtime_type != "codex":
|
|
52
70
|
return defaults
|
|
53
71
|
|
|
54
|
-
|
|
55
|
-
task_prompt = str(config.get("task_prompt") or "").strip()
|
|
56
|
-
base_instructions = prompt
|
|
57
|
-
if task_prompt:
|
|
58
|
-
base_instructions = f"{prompt}\n\n{task_prompt}" if prompt else task_prompt
|
|
59
|
-
|
|
60
|
-
raw_sandbox = str(config.get("sandbox") or "read_only").strip().lower()
|
|
61
|
-
raw_approval = str(config.get("approval_mode") or "").strip().lower()
|
|
62
|
-
approval_profiles = {
|
|
63
|
-
"ask": ("workspace-write", "manual"),
|
|
64
|
-
"risk": ("workspace-write", "auto_review"),
|
|
65
|
-
"full": ("full-access", "deny_all"),
|
|
66
|
-
}
|
|
67
|
-
sandbox_profiles = {
|
|
68
|
-
"read_only": ("read-only", "deny_all"),
|
|
69
|
-
"read-only": ("read-only", "deny_all"),
|
|
70
|
-
"workspace_write": ("workspace-write", "deny_all"),
|
|
71
|
-
"workspace-write": ("workspace-write", "deny_all"),
|
|
72
|
-
"workspace_write_auto": ("workspace-write", "auto_review"),
|
|
73
|
-
"workspace-write-auto": ("workspace-write", "auto_review"),
|
|
74
|
-
"full_access": ("full-access", "deny_all"),
|
|
75
|
-
"full-access": ("full-access", "deny_all"),
|
|
76
|
-
}
|
|
77
|
-
if raw_approval in approval_profiles:
|
|
78
|
-
sandbox, approval = approval_profiles[raw_approval]
|
|
79
|
-
else:
|
|
80
|
-
sandbox, default_approval = sandbox_profiles.get(raw_sandbox, ("read-only", "deny_all"))
|
|
81
|
-
approval = raw_approval or default_approval
|
|
82
|
-
|
|
83
|
-
request_config: dict[str, Any] = {
|
|
84
|
-
"sandbox_read_only": sandbox == "read-only",
|
|
85
|
-
"sandbox": sandbox,
|
|
86
|
-
"approval_mode": approval,
|
|
87
|
-
"cwd": str(context.project_dir),
|
|
88
|
-
"summary": "auto",
|
|
89
|
-
"ephemeral": False,
|
|
90
|
-
}
|
|
91
|
-
if base_instructions:
|
|
92
|
-
request_config["base_instructions"] = base_instructions
|
|
93
|
-
collaboration_mode = str(config.get("collaboration_mode") or "").strip().lower()
|
|
94
|
-
if collaboration_mode:
|
|
95
|
-
if collaboration_mode not in {"default", "plan"}:
|
|
96
|
-
raise ValueError("Codex collaboration_mode must be default or plan")
|
|
97
|
-
request_config["collaboration_mode"] = collaboration_mode
|
|
98
|
-
goal_objective = str(config.get("goal_objective") or "").strip()
|
|
99
|
-
if goal_objective:
|
|
100
|
-
request_config["goal_objective"] = goal_objective
|
|
101
|
-
raw_skills = config.get("skills")
|
|
102
|
-
if isinstance(raw_skills, (list, tuple)):
|
|
103
|
-
request_config["skills"] = [
|
|
104
|
-
dict(item) for item in raw_skills if isinstance(item, dict)
|
|
105
|
-
]
|
|
106
|
-
defaults["config"] = request_config
|
|
72
|
+
defaults["config"] = codex_request_config(context)
|
|
107
73
|
return defaults
|
|
108
74
|
|
|
109
75
|
|
|
@@ -127,9 +93,7 @@ def apply_runtime_start_request_defaults(
|
|
|
127
93
|
default_model = str(defaults.get("model") or "").strip() or None
|
|
128
94
|
requested_model = str(request.model or "").strip()
|
|
129
95
|
allowed_models = {
|
|
130
|
-
str(item).strip()
|
|
131
|
-
for item in (defaults.get("allowed_models") or [])
|
|
132
|
-
if str(item).strip()
|
|
96
|
+
str(item).strip() for item in (defaults.get("allowed_models") or []) if str(item).strip()
|
|
133
97
|
}
|
|
134
98
|
selected_model = (
|
|
135
99
|
requested_model
|
|
@@ -149,214 +113,6 @@ def apply_runtime_start_request_defaults(
|
|
|
149
113
|
)
|
|
150
114
|
|
|
151
115
|
|
|
152
|
-
def _manifest_mcp_overrides(config: dict[str, Any]) -> list[str]:
|
|
153
|
-
"""Translate declarative MCP bindings into native Codex config keys."""
|
|
154
|
-
|
|
155
|
-
overrides: list[str] = []
|
|
156
|
-
servers = config.get("mcp_servers") or []
|
|
157
|
-
if not isinstance(servers, (list, tuple)):
|
|
158
|
-
return overrides
|
|
159
|
-
for server in servers:
|
|
160
|
-
if not isinstance(server, dict):
|
|
161
|
-
continue
|
|
162
|
-
name = str(server.get("name") or "").strip()
|
|
163
|
-
url = str(server.get("url") or "").strip()
|
|
164
|
-
if not name or not url:
|
|
165
|
-
continue
|
|
166
|
-
overrides.append(f"mcp_servers.{name}.url={url}")
|
|
167
|
-
env_key = str(server.get("env_key") or "").strip()
|
|
168
|
-
if env_key:
|
|
169
|
-
overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
|
|
170
|
-
return overrides
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def _create_codex(context: RuntimeLaunchContext) -> RuntimeAdapter:
|
|
174
|
-
client_factory = context.services.codex_client_factory or AsyncCodexClient
|
|
175
|
-
config = dict(context.config)
|
|
176
|
-
bound_skill_paths: dict[str, str] = {}
|
|
177
|
-
overrides = list(config.get("codex_overrides") or [])
|
|
178
|
-
manifest_mcp_overrides = _manifest_mcp_overrides(config)
|
|
179
|
-
overrides.extend(item for item in manifest_mcp_overrides if item not in overrides)
|
|
180
|
-
projected_config = kernel_start_request_defaults(context).get("config") or {}
|
|
181
|
-
if manifest_mcp_overrides and projected_config.get("sandbox") == "workspace-write":
|
|
182
|
-
network_override = "sandbox_workspace_write.network_access=true"
|
|
183
|
-
if network_override not in overrides:
|
|
184
|
-
overrides.append(network_override)
|
|
185
|
-
# Studio's default collaboration mode must expose Codex's structured
|
|
186
|
-
# request_user_input tool; the upstream feature is intentionally off by
|
|
187
|
-
# default outside Plan mode. This stays process-local to the isolated
|
|
188
|
-
# runtime and does not mutate the user's global Codex configuration.
|
|
189
|
-
interaction_override = "features.default_mode_request_user_input=true"
|
|
190
|
-
if interaction_override not in overrides:
|
|
191
|
-
overrides.append(interaction_override)
|
|
192
|
-
try:
|
|
193
|
-
from openai_codex import CodexConfig
|
|
194
|
-
|
|
195
|
-
base_cfg = CodexConfig()
|
|
196
|
-
if overrides:
|
|
197
|
-
base_cfg = dataclasses.replace(
|
|
198
|
-
base_cfg,
|
|
199
|
-
config_overrides=tuple(getattr(base_cfg, "config_overrides", ()) or ())
|
|
200
|
-
+ tuple(str(o) for o in overrides),
|
|
201
|
-
)
|
|
202
|
-
env = dict(getattr(base_cfg, "env", None) or {})
|
|
203
|
-
isolated_home = _isolated_codex_home(context.project_dir)
|
|
204
|
-
bound_skill_paths = _materialize_bound_codex_skills(
|
|
205
|
-
isolated_home, config.get("skills")
|
|
206
|
-
)
|
|
207
|
-
env.setdefault("CODEX_HOME", str(isolated_home))
|
|
208
|
-
# HOME 级隔离:codex app-server 还会按约定扫 ~/.agents/skills、
|
|
209
|
-
# ~/.claude/skills 等宿主目录,仅设 CODEX_HOME 挡不住。隔离 HOME 后这些
|
|
210
|
-
# 路径全部落在工作区内,宿主 skills/MCP/凭证不再进入 Agent 上下文。
|
|
211
|
-
# 设 KSADK_CODEX_ISOLATE_HOME=0 可关闭(调试用)。
|
|
212
|
-
if os.environ.get("KSADK_CODEX_ISOLATE_HOME", "1") != "0":
|
|
213
|
-
env.setdefault("HOME", str(isolated_home))
|
|
214
|
-
# 运行期解析出的凭证值(如 MCP bearer_token_env_var 所需)注入子进程环境
|
|
215
|
-
env.update({str(k): str(v) for k, v in (context.config.get("env") or {}).items()})
|
|
216
|
-
base_cfg = dataclasses.replace(base_cfg, env=env)
|
|
217
|
-
try:
|
|
218
|
-
client: Any = client_factory(config=base_cfg)
|
|
219
|
-
except TypeError:
|
|
220
|
-
# 自定义/测试工厂可能不接受 config 参数:退化为无参构造,
|
|
221
|
-
# config_overrides 事后注入(自定义工厂自行承担 env 隔离)。
|
|
222
|
-
client = client_factory()
|
|
223
|
-
if overrides:
|
|
224
|
-
_apply_codex_overrides(client, overrides)
|
|
225
|
-
except ImportError:
|
|
226
|
-
client: Any = client_factory()
|
|
227
|
-
if overrides:
|
|
228
|
-
_apply_codex_overrides(client, overrides)
|
|
229
|
-
timeout = context.config.get("turn_timeout_seconds")
|
|
230
|
-
request_defaults = kernel_start_request_defaults(context)
|
|
231
|
-
request_config = request_defaults.get("config") or {}
|
|
232
|
-
sandbox_read_only = (
|
|
233
|
-
bool(context.config["sandbox_read_only"])
|
|
234
|
-
if "sandbox_read_only" in context.config
|
|
235
|
-
else bool(request_config.get("sandbox_read_only", True))
|
|
236
|
-
)
|
|
237
|
-
return CodexRuntimeAdapter(
|
|
238
|
-
client,
|
|
239
|
-
sandbox_read_only=sandbox_read_only,
|
|
240
|
-
turn_timeout_seconds=float(timeout) if timeout is not None else None,
|
|
241
|
-
bound_skill_paths=bound_skill_paths,
|
|
242
|
-
)
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
def _isolated_codex_home(project_dir: Any) -> Path:
|
|
246
|
-
"""Studio 运行 Agent 使用工作区级隔离 CODEX_HOME。
|
|
247
|
-
|
|
248
|
-
避免 codex app-server 继承宿主环境(~/.codex / ~/.wework/codex)里的
|
|
249
|
-
skills、MCP 配置、插件与凭证,污染 Agent 上下文甚至泄漏宿主能力。
|
|
250
|
-
可用 KSADK_CODEX_HOME 显式覆盖。
|
|
251
|
-
"""
|
|
252
|
-
override = os.environ.get("KSADK_CODEX_HOME")
|
|
253
|
-
if override:
|
|
254
|
-
home = Path(override).expanduser()
|
|
255
|
-
home.mkdir(parents=True, exist_ok=True)
|
|
256
|
-
return home
|
|
257
|
-
|
|
258
|
-
# Source bundles are deliberately mounted read-only in managed runtimes.
|
|
259
|
-
# Keep the preferred workspace-local isolation for local development, but
|
|
260
|
-
# never make a Codex turn depend on being able to mutate that bundle.
|
|
261
|
-
workspace_home = Path(str(project_dir)) / ".agentkit" / "codex-home"
|
|
262
|
-
try:
|
|
263
|
-
workspace_home.mkdir(parents=True, exist_ok=True)
|
|
264
|
-
return workspace_home
|
|
265
|
-
except OSError:
|
|
266
|
-
pass
|
|
267
|
-
|
|
268
|
-
# The managed runtime already provides a per-workload writable state
|
|
269
|
-
# volume. Derive from its explicit directory first, then from the
|
|
270
|
-
# session-store path for backward-compatible images. /tmp is a final
|
|
271
|
-
# process-local fallback for custom read-only launchers.
|
|
272
|
-
state_dir = os.environ.get("KSADK_RUNTIME_STATE_DIR")
|
|
273
|
-
session_path = os.environ.get("KSADK_SESSION_PATH")
|
|
274
|
-
fallback_root = (
|
|
275
|
-
Path(state_dir)
|
|
276
|
-
if state_dir
|
|
277
|
-
else Path(session_path).expanduser().parent
|
|
278
|
-
if session_path
|
|
279
|
-
else Path(tempfile.gettempdir()) / "ksadk-runtime-state"
|
|
280
|
-
)
|
|
281
|
-
fallback_home = fallback_root / "codex-home"
|
|
282
|
-
fallback_home.mkdir(parents=True, exist_ok=True)
|
|
283
|
-
return fallback_home
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
def _materialize_bound_codex_skills(
|
|
287
|
-
codex_home: Path, value: Any
|
|
288
|
-
) -> dict[str, str]:
|
|
289
|
-
"""Expose immutable Bundle Skills through Codex's native skill catalog.
|
|
290
|
-
|
|
291
|
-
Passing an arbitrary ``SkillInput`` path is accepted by the Python SDK but
|
|
292
|
-
ignored by the real App Server unless the Skill is discoverable by the
|
|
293
|
-
native host. Copy each content-addressed Bundle Skill into the isolated
|
|
294
|
-
CODEX_HOME so the host owns discovery while the Bundle remains read-only.
|
|
295
|
-
Content-addressed directory names avoid overwriting user-managed Skills
|
|
296
|
-
when an explicit KSADK_CODEX_HOME is used.
|
|
297
|
-
"""
|
|
298
|
-
|
|
299
|
-
if not isinstance(value, (list, tuple)):
|
|
300
|
-
return {}
|
|
301
|
-
skills_root = codex_home / "skills"
|
|
302
|
-
skills_root.mkdir(parents=True, exist_ok=True)
|
|
303
|
-
installed: dict[str, str] = {}
|
|
304
|
-
for item in value:
|
|
305
|
-
if not isinstance(item, dict):
|
|
306
|
-
continue
|
|
307
|
-
name = str(item.get("name") or "").strip()
|
|
308
|
-
raw_path = str(item.get("path") or "").strip()
|
|
309
|
-
if not name or not raw_path:
|
|
310
|
-
continue
|
|
311
|
-
skill_file = Path(raw_path).resolve()
|
|
312
|
-
if skill_file.name != "SKILL.md" or not skill_file.is_file():
|
|
313
|
-
continue
|
|
314
|
-
source_dir = skill_file.parent
|
|
315
|
-
digest = hashlib.sha256()
|
|
316
|
-
for source in sorted(path for path in source_dir.rglob("*") if path.is_file()):
|
|
317
|
-
digest.update(source.relative_to(source_dir).as_posix().encode("utf-8"))
|
|
318
|
-
digest.update(b"\0")
|
|
319
|
-
digest.update(source.read_bytes())
|
|
320
|
-
digest.update(b"\0")
|
|
321
|
-
safe_name = re.sub(r"[^A-Za-z0-9._-]+", "-", name).strip(".-") or "skill"
|
|
322
|
-
target = skills_root / f"ksadk-{digest.hexdigest()[:16]}-{safe_name}"
|
|
323
|
-
if target.is_dir():
|
|
324
|
-
installed[name] = str(target / "SKILL.md")
|
|
325
|
-
continue
|
|
326
|
-
staging = Path(tempfile.mkdtemp(prefix=".ksadk-skill-", dir=skills_root))
|
|
327
|
-
try:
|
|
328
|
-
shutil.copytree(source_dir, staging, dirs_exist_ok=True)
|
|
329
|
-
try:
|
|
330
|
-
staging.replace(target)
|
|
331
|
-
except FileExistsError:
|
|
332
|
-
pass
|
|
333
|
-
finally:
|
|
334
|
-
if staging.exists():
|
|
335
|
-
shutil.rmtree(staging)
|
|
336
|
-
installed[name] = str(target / "SKILL.md")
|
|
337
|
-
return installed
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
def _apply_codex_overrides(client: Any, overrides: Any) -> None:
|
|
341
|
-
"""Append MCP server --config overrides to the client's CodexConfig."""
|
|
342
|
-
try:
|
|
343
|
-
from openai_codex import CodexConfig
|
|
344
|
-
except ImportError:
|
|
345
|
-
return
|
|
346
|
-
# ksadk AsyncCodexClient -> AsyncCodex -> inner AsyncCodexClient.config
|
|
347
|
-
inner_codex = getattr(client, "_codex", None)
|
|
348
|
-
inner_client = getattr(inner_codex, "_client", None) or inner_codex
|
|
349
|
-
cfg = getattr(inner_client, "config", None)
|
|
350
|
-
if cfg is None or not isinstance(cfg, CodexConfig):
|
|
351
|
-
return
|
|
352
|
-
base_overrides = tuple(getattr(cfg, "config_overrides", ()) or ())
|
|
353
|
-
new_overrides = tuple(str(o) for o in overrides if o not in base_overrides)
|
|
354
|
-
if not new_overrides:
|
|
355
|
-
return
|
|
356
|
-
new_cfg = dataclasses.replace(cfg, config_overrides=base_overrides + new_overrides)
|
|
357
|
-
setattr(inner_client, "config", new_cfg)
|
|
358
|
-
|
|
359
|
-
|
|
360
116
|
def _create_framework_runner(context: RuntimeLaunchContext, runtime_type: str) -> BaseRunner:
|
|
361
117
|
try:
|
|
362
118
|
from ksadk.runners.patch_langchain import apply_patch
|
|
@@ -119,6 +119,29 @@ class LangGraphRuntimeAdapter(RunnerRuntimeAdapter):
|
|
|
119
119
|
|
|
120
120
|
def _checkpoint_capability(self) -> CheckpointCapability:
|
|
121
121
|
capability = super()._checkpoint_capability()
|
|
122
|
+
if not capability.supported:
|
|
123
|
+
describe = getattr(self._runner, "describe_checkpoint_capability", None)
|
|
124
|
+
try:
|
|
125
|
+
raw = dict(describe()) if callable(describe) else {}
|
|
126
|
+
except Exception: # noqa: BLE001
|
|
127
|
+
raw = {}
|
|
128
|
+
if (
|
|
129
|
+
str(raw.get("Scope") or "").strip().lower() == "process_local"
|
|
130
|
+
and str(raw.get("Backend") or "").strip().lower() in {"memory", "sqlite"}
|
|
131
|
+
):
|
|
132
|
+
# The runner correctly refuses to advertise this checkpoint to
|
|
133
|
+
# hosted callers because it is not durable across a process
|
|
134
|
+
# restart. This adapter only resumes an attached in-process
|
|
135
|
+
# handle, for which LangGraph's memory saver is sufficient.
|
|
136
|
+
capability = capability.model_copy(
|
|
137
|
+
update={
|
|
138
|
+
"supported": True,
|
|
139
|
+
"reason": (
|
|
140
|
+
"Checkpoint resume is limited to the current process; "
|
|
141
|
+
"it is not durable across restarts or pods"
|
|
142
|
+
),
|
|
143
|
+
}
|
|
144
|
+
)
|
|
122
145
|
if not capability.supported:
|
|
123
146
|
return capability
|
|
124
147
|
return capability.model_copy(
|
ksadk/runtime/preprocessing.py
CHANGED
|
@@ -19,6 +19,7 @@ from ksadk.runtime.adapter import (
|
|
|
19
19
|
StartRequest,
|
|
20
20
|
)
|
|
21
21
|
from ksadk.runtime_context import PlatformInvocationContext
|
|
22
|
+
from ksadk.session_context import split_session_context
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
@dataclass
|
|
@@ -58,17 +59,21 @@ async def prepare_runtime_start(request: StartRequest, runner: Any) -> PreparedR
|
|
|
58
59
|
outer_metadata = {
|
|
59
60
|
key: value
|
|
60
61
|
for key, value in request.metadata.items()
|
|
61
|
-
if key
|
|
62
|
+
if key not in {CONVERSATION_PREPROCESSING_METADATA_KEY, "session_context"}
|
|
62
63
|
}
|
|
63
64
|
request_metadata = {**outer_metadata, **conversation.request_metadata}
|
|
64
65
|
messages = conversation.messages or _fallback_messages(request.input)
|
|
65
66
|
raw_prepared = (conversation.model_extra or {}).get("prepared_turn")
|
|
66
67
|
if isinstance(raw_prepared, Mapping):
|
|
67
68
|
prepared = PreparedConversationTurn(**dict(raw_prepared))
|
|
68
|
-
|
|
69
|
+
merged_metadata = {
|
|
69
70
|
**prepared.request_metadata,
|
|
70
71
|
**request_metadata,
|
|
71
72
|
}
|
|
73
|
+
snapshot, prepared.request_metadata = split_session_context(merged_metadata)
|
|
74
|
+
controls = merged_metadata.get("agentengine")
|
|
75
|
+
if isinstance(controls, Mapping) and "session_context" in controls:
|
|
76
|
+
prepared.session_context = snapshot.to_payload()
|
|
72
77
|
else:
|
|
73
78
|
prepared = await build_run_input(
|
|
74
79
|
agent_id=str(request.agent_id or "agent"),
|
|
@@ -114,7 +119,10 @@ async def prepare_runtime_start(request: StartRequest, runner: Any) -> PreparedR
|
|
|
114
119
|
ambient_contexts["memory_recall_events"] = list(prepared.memory_recall_events)
|
|
115
120
|
else:
|
|
116
121
|
prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
|
|
122
|
+
from ksadk.session_context import SessionContext
|
|
123
|
+
|
|
117
124
|
runtime_context = PlatformInvocationContext(
|
|
125
|
+
session=SessionContext.from_payload(prepared.session_context),
|
|
118
126
|
agent_id=str(request.agent_id or "agent"),
|
|
119
127
|
user_id=request.user_id,
|
|
120
128
|
account_id=str(conversation.account_id or ""),
|
ksadk/runtime/runner_adapter.py
CHANGED
|
@@ -54,6 +54,7 @@ from ksadk.runtime.adapter import (
|
|
|
54
54
|
)
|
|
55
55
|
from ksadk.runtime.preprocessing import PreparedRuntimeStart, prepare_runtime_start
|
|
56
56
|
from ksadk.runtime.runner_loading import ensure_runner_loaded
|
|
57
|
+
from ksadk.runtime_context import session_invocation_context
|
|
57
58
|
|
|
58
59
|
logger = logging.getLogger(__name__)
|
|
59
60
|
|
|
@@ -138,6 +139,10 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
138
139
|
|
|
139
140
|
# ---- 框架钩子(子类按需 override) ----
|
|
140
141
|
|
|
142
|
+
def _requires_stable_stream_context(self) -> bool:
|
|
143
|
+
"""Whether one Task must own the runner generator for its lifetime."""
|
|
144
|
+
return self._runtime_type == "adk"
|
|
145
|
+
|
|
141
146
|
def capabilities(self) -> RuntimeCapabilityMatrix:
|
|
142
147
|
"""诚实矩阵:cancel 经 asyncio 任务打断(emulated,过 conformance);
|
|
143
148
|
resume/checkpoint 依赖 runner 声明的原生 checkpoint;attach/durable_restore
|
|
@@ -170,8 +175,12 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
170
175
|
submit_interaction=_unavailable("runtime_no_live_interaction_channel"),
|
|
171
176
|
attach=(
|
|
172
177
|
RuntimeCapability(supported=True, mode="native")
|
|
173
|
-
if
|
|
174
|
-
else _unavailable(
|
|
178
|
+
if durable_supported
|
|
179
|
+
else _unavailable(
|
|
180
|
+
"runner_no_durable_attach_seam"
|
|
181
|
+
if not attach_seam
|
|
182
|
+
else "attach_requires_cross_process_checkpoint"
|
|
183
|
+
)
|
|
175
184
|
),
|
|
176
185
|
steer=_unavailable("runtime_no_native_steer"),
|
|
177
186
|
inject=_unavailable("runtime_no_native_inject"),
|
|
@@ -272,6 +281,15 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
272
281
|
self._active_runs[run_id] = _ActiveRun(invocation_id=run_id, session_id=request.session_id)
|
|
273
282
|
# 暂存 start 输入,供 stream() 使用。
|
|
274
283
|
self._active_runs[run_id].__dict__["_start_request"] = request
|
|
284
|
+
snapshot = request.metadata.get("session_context")
|
|
285
|
+
if snapshot is not None:
|
|
286
|
+
self._active_runs[run_id].__dict__["_tag_context"] = session_invocation_context(
|
|
287
|
+
snapshot,
|
|
288
|
+
agent_id=request.agent_id or "",
|
|
289
|
+
user_id=request.user_id,
|
|
290
|
+
session_id=request.session_id,
|
|
291
|
+
runner_type=self._runtime_type,
|
|
292
|
+
)
|
|
275
293
|
if prepared_start is not None:
|
|
276
294
|
self._active_runs[run_id].__dict__["_prepared_start"] = prepared_start
|
|
277
295
|
return handle
|
|
@@ -307,6 +325,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
307
325
|
f"runner for {self._runtime_type!r} has no durable "
|
|
308
326
|
"attach_runtime_handle capability"
|
|
309
327
|
)
|
|
328
|
+
ensure_runner_loaded(self._runner, runtime_type=self._runtime_type)
|
|
310
329
|
restored = attach(handle)
|
|
311
330
|
if inspect.isawaitable(restored):
|
|
312
331
|
restored = await restored
|
|
@@ -365,11 +384,14 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
365
384
|
self._require_native_checkpoint_capability()
|
|
366
385
|
self._known_runs.add(handle.run_id)
|
|
367
386
|
prepared_start: PreparedRuntimeStart | None = None
|
|
387
|
+
resume_invocation_id = handle.run_id
|
|
368
388
|
raw_start_request = handle.native_ref.pop(RESUME_START_REQUEST_NATIVE_KEY, None)
|
|
369
389
|
if isinstance(raw_start_request, Mapping):
|
|
370
|
-
|
|
371
|
-
|
|
390
|
+
resume_request = StartRequest.model_validate(raw_start_request)
|
|
391
|
+
resume_invocation_id = str(
|
|
392
|
+
resume_request.metadata.get("invocation_id") or handle.run_id
|
|
372
393
|
)
|
|
394
|
+
prepared_start = await prepare_runtime_start(resume_request, self._runner)
|
|
373
395
|
# _resume_native 返回的 runner_input 覆盖存到 run 上,下一次 stream() 经
|
|
374
396
|
# _build_runner_input 消费,以框架原生方式真驱动恢复。
|
|
375
397
|
override = await self._resume_native(handle, target, payload)
|
|
@@ -392,7 +414,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
392
414
|
return handle
|
|
393
415
|
if resume_key in self._consumed_resumes:
|
|
394
416
|
self._active_runs[handle.run_id] = _ActiveRun(
|
|
395
|
-
invocation_id=
|
|
417
|
+
invocation_id=resume_invocation_id,
|
|
396
418
|
session_id=handle.session_id,
|
|
397
419
|
resume_key=resume_key,
|
|
398
420
|
resume_fingerprint=resume_fingerprint,
|
|
@@ -409,11 +431,19 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
409
431
|
raise ValueError(f"run {handle.run_id!r} already has an active or pending resume")
|
|
410
432
|
|
|
411
433
|
run = _ActiveRun(
|
|
412
|
-
invocation_id=
|
|
434
|
+
invocation_id=resume_invocation_id,
|
|
413
435
|
session_id=handle.session_id,
|
|
414
436
|
resume_key=resume_key,
|
|
415
437
|
resume_fingerprint=resume_fingerprint,
|
|
416
438
|
)
|
|
439
|
+
if payload is not None and payload.session_context is not None:
|
|
440
|
+
run.__dict__["_tag_context"] = session_invocation_context(
|
|
441
|
+
payload.session_context,
|
|
442
|
+
agent_id=str(handle.native_ref.get("agent_id") or ""),
|
|
443
|
+
user_id=str(handle.native_ref.get("user_id") or ""),
|
|
444
|
+
session_id=handle.session_id,
|
|
445
|
+
runner_type=self._runtime_type,
|
|
446
|
+
)
|
|
417
447
|
if prepared_start is not None:
|
|
418
448
|
run.__dict__["_prepared_start"] = prepared_start
|
|
419
449
|
if override:
|
|
@@ -509,23 +539,30 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
509
539
|
if run is None:
|
|
510
540
|
run = _ActiveRun(invocation_id=handle.run_id, session_id=handle.session_id)
|
|
511
541
|
self._active_runs[handle.run_id] = run
|
|
542
|
+
event_handle = (
|
|
543
|
+
handle
|
|
544
|
+
if run.invocation_id == handle.run_id
|
|
545
|
+
else handle.model_copy(update={"run_id": run.invocation_id})
|
|
546
|
+
)
|
|
512
547
|
|
|
513
548
|
# 消费 pending cancel:start 时若已记 pending,立即中断该 turn。
|
|
514
549
|
if handle.run_id in self._pending_cancels:
|
|
515
550
|
self._pending_cancels.discard(handle.run_id)
|
|
516
|
-
yield self._make_run_canceled(
|
|
551
|
+
yield self._make_run_canceled(
|
|
552
|
+
event_handle, reason=CancelResult.PENDING_CANCEL_RECORDED.value
|
|
553
|
+
)
|
|
517
554
|
return
|
|
518
555
|
|
|
519
556
|
if run.skip_runner:
|
|
520
557
|
run.done = True
|
|
521
558
|
self._active_runs.pop(handle.run_id, None)
|
|
522
|
-
yield self._make_run_completed(
|
|
559
|
+
yield self._make_run_completed(event_handle)
|
|
523
560
|
return
|
|
524
561
|
|
|
525
562
|
if run.resume_key is not None:
|
|
526
563
|
self._consumed_resumes.add(run.resume_key)
|
|
527
564
|
|
|
528
|
-
yield self._make_run_started(
|
|
565
|
+
yield self._make_run_started(event_handle)
|
|
529
566
|
|
|
530
567
|
request = run.__dict__.get("_start_request")
|
|
531
568
|
runner_input = self._build_runner_input(handle, request)
|
|
@@ -533,7 +570,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
533
570
|
terminal_event_seen = False
|
|
534
571
|
approval_interrupted = False
|
|
535
572
|
try:
|
|
536
|
-
gen = self._map_runner_stream(
|
|
573
|
+
gen = self._map_runner_stream(event_handle, runner_input, active_run=run)
|
|
537
574
|
run.stream = gen
|
|
538
575
|
async for event in gen:
|
|
539
576
|
yield event
|
|
@@ -560,18 +597,38 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
560
597
|
|
|
561
598
|
if run.interrupt_event.is_set() and not terminal_event_seen:
|
|
562
599
|
yield self._make_run_canceled(
|
|
563
|
-
|
|
600
|
+
event_handle, reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value
|
|
564
601
|
)
|
|
565
602
|
elif approval_interrupted and not terminal_event_seen:
|
|
566
|
-
yield self._make_run_interrupted(
|
|
603
|
+
yield self._make_run_interrupted(event_handle, reason="input_required")
|
|
567
604
|
elif not terminal_event_seen:
|
|
568
|
-
yield self._make_run_completed(
|
|
605
|
+
yield self._make_run_completed(
|
|
606
|
+
event_handle, run=run, metrics=run.completion_metrics
|
|
607
|
+
)
|
|
569
608
|
finally:
|
|
570
609
|
run.stream = None
|
|
571
610
|
run.done = True
|
|
572
611
|
self._active_runs.pop(handle.run_id, None)
|
|
573
612
|
|
|
574
613
|
def _build_runner_input(self, handle: RunHandle, request: Optional[StartRequest]) -> dict:
|
|
614
|
+
result = self._build_base_runner_input(handle, request)
|
|
615
|
+
run = self._active_runs.get(handle.run_id)
|
|
616
|
+
context = run.__dict__.get("_tag_context") if run is not None else None
|
|
617
|
+
if context is not None:
|
|
618
|
+
existing_context = result.get("platform_context")
|
|
619
|
+
result["platform_context"] = (
|
|
620
|
+
{**existing_context, "session": context.session.to_payload()}
|
|
621
|
+
if isinstance(existing_context, dict)
|
|
622
|
+
else context.to_payload()
|
|
623
|
+
)
|
|
624
|
+
result["metadata"] = {
|
|
625
|
+
key: value
|
|
626
|
+
for key, value in dict(result.get("metadata") or {}).items()
|
|
627
|
+
if key != "session_context"
|
|
628
|
+
}
|
|
629
|
+
return result
|
|
630
|
+
|
|
631
|
+
def _build_base_runner_input(self, handle: RunHandle, request: Optional[StartRequest]) -> dict:
|
|
575
632
|
# resume 覆盖优先:_resume_native 注入的 checkpoint_resume + framework_ref
|
|
576
633
|
# 直接作为 runner 输入,驱动框架原生恢复。
|
|
577
634
|
run = self._active_runs.get(handle.run_id)
|
|
@@ -588,7 +645,9 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
588
645
|
{
|
|
589
646
|
"input": override.get("input"),
|
|
590
647
|
"session_id": handle.session_id,
|
|
591
|
-
"invocation_id":
|
|
648
|
+
"invocation_id": str(
|
|
649
|
+
merged.get("invocation_id") or handle.run_id
|
|
650
|
+
),
|
|
592
651
|
"metadata": {
|
|
593
652
|
**(dict(base_metadata) if isinstance(base_metadata, Mapping) else {}),
|
|
594
653
|
**dict(override.get("metadata") or {}),
|
ksadk/runtime_context.py
CHANGED
|
@@ -3,7 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
from contextlib import contextmanager
|
|
4
4
|
from contextvars import ContextVar, Token
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import Any, Iterator
|
|
6
|
+
from typing import Any, Iterator, Mapping
|
|
7
|
+
|
|
8
|
+
from ksadk.session_context import SessionContext
|
|
7
9
|
|
|
8
10
|
|
|
9
11
|
@dataclass
|
|
@@ -30,9 +32,10 @@ class PlatformInvocationContext:
|
|
|
30
32
|
# Request-scoped runtime control. It is intentionally separate from
|
|
31
33
|
# public caller metadata so built-in tools can enforce it consistently.
|
|
32
34
|
tool_approval_mode: str = ""
|
|
35
|
+
session: SessionContext = field(default_factory=SessionContext)
|
|
33
36
|
|
|
34
37
|
def to_payload(self) -> dict[str, Any]:
|
|
35
|
-
|
|
38
|
+
payload = {
|
|
36
39
|
"agent_id": self.agent_id,
|
|
37
40
|
"user_id": self.user_id,
|
|
38
41
|
"account_id": self.account_id,
|
|
@@ -52,6 +55,10 @@ class PlatformInvocationContext:
|
|
|
52
55
|
"model_options": dict(self.model_options or {}),
|
|
53
56
|
}
|
|
54
57
|
|
|
58
|
+
if self.session.tags or self.session.revision:
|
|
59
|
+
payload["session"] = self.session.to_payload()
|
|
60
|
+
return payload
|
|
61
|
+
|
|
55
62
|
|
|
56
63
|
@dataclass
|
|
57
64
|
class ToolExecutionContext:
|
|
@@ -179,3 +186,34 @@ def tool_execution_scope(
|
|
|
179
186
|
yield context
|
|
180
187
|
finally:
|
|
181
188
|
reset_current_tool_execution_context(token)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def get_current_session_context() -> SessionContext:
|
|
192
|
+
"""Read the current immutable snapshot in LangChain, LangGraph or ADK code."""
|
|
193
|
+
context = get_current_invocation_context()
|
|
194
|
+
return context.session if context is not None else SessionContext()
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def get_current_session_tags() -> Mapping[str, str]:
|
|
198
|
+
"""Return read-only business labels; these are not authorization claims."""
|
|
199
|
+
return get_current_session_context().tags
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def session_invocation_context(snapshot, *, agent_id="", user_id="", session_id="", runner_type=""):
|
|
203
|
+
"""Build the narrow context for kernel starts without conversation preprocessing."""
|
|
204
|
+
return PlatformInvocationContext(
|
|
205
|
+
agent_id=agent_id,
|
|
206
|
+
user_id=user_id,
|
|
207
|
+
session_id=session_id,
|
|
208
|
+
runner_type=runner_type,
|
|
209
|
+
history=[],
|
|
210
|
+
input_content=[],
|
|
211
|
+
input_messages=[],
|
|
212
|
+
input_parts=[],
|
|
213
|
+
attachments=[],
|
|
214
|
+
attachment_results=[],
|
|
215
|
+
current_attachments=[],
|
|
216
|
+
current_attachment_results=[],
|
|
217
|
+
has_current_files=False,
|
|
218
|
+
session=SessionContext.from_payload(snapshot),
|
|
219
|
+
)
|