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
|
@@ -431,6 +431,34 @@ def _tool_event_from_call(event: Mapping[str, Any], metadata: Mapping[str, Any])
|
|
|
431
431
|
}
|
|
432
432
|
|
|
433
433
|
|
|
434
|
+
def _approval_status_from_resume(response: Any, resume_input: Mapping[str, Any]) -> str:
|
|
435
|
+
"""从 approval_response 事件的 resume_input 判断审批结果状态。
|
|
436
|
+
|
|
437
|
+
支持两种协议:
|
|
438
|
+
- mcp_approval_response: resume_input 含 approve/approved bool
|
|
439
|
+
- ksadk_resume + decisions: resume_input.value.decisions[0].type 为
|
|
440
|
+
approve/edit/reject(HumanInTheLoopMiddleware 协议)
|
|
441
|
+
"""
|
|
442
|
+
if response is None:
|
|
443
|
+
return "paused"
|
|
444
|
+
# ksadk_resume + decisions 协议
|
|
445
|
+
value = resume_input.get("value")
|
|
446
|
+
if isinstance(value, Mapping):
|
|
447
|
+
decisions = value.get("decisions")
|
|
448
|
+
if isinstance(decisions, list) and decisions:
|
|
449
|
+
first = decisions[0]
|
|
450
|
+
if isinstance(first, Mapping):
|
|
451
|
+
decision_type = str(first.get("type") or "").strip().lower()
|
|
452
|
+
if decision_type in {"approve", "edit"}:
|
|
453
|
+
return "approved"
|
|
454
|
+
if decision_type in {"reject", "respond"}:
|
|
455
|
+
return "denied"
|
|
456
|
+
# mcp_approval_response 协议
|
|
457
|
+
if resume_input.get("approve") or resume_input.get("approved"):
|
|
458
|
+
return "approved"
|
|
459
|
+
return "denied"
|
|
460
|
+
|
|
461
|
+
|
|
434
462
|
def _project_approval_events(
|
|
435
463
|
events: Sequence[Mapping[str, Any]],
|
|
436
464
|
*,
|
|
@@ -438,10 +466,52 @@ def _project_approval_events(
|
|
|
438
466
|
) -> list[dict[str, Any]]:
|
|
439
467
|
approvals: list[dict[str, Any]] = []
|
|
440
468
|
for request in events:
|
|
441
|
-
|
|
469
|
+
event_type = str(request.get("EventType") or "")
|
|
470
|
+
# 识别归一化后的 approval_request,以及未归一化的 canonical interaction.requested。
|
|
471
|
+
if event_type not in {"approval_request", "interaction.requested"}:
|
|
442
472
|
continue
|
|
443
473
|
metadata = _event_metadata(request)
|
|
474
|
+
# 归一化路径:interrupt_info 在 metadata;canonical 路径在
|
|
475
|
+
# Content.runtime_event.request.detail。
|
|
444
476
|
interrupt_info = metadata.get("interrupt_info")
|
|
477
|
+
if not isinstance(interrupt_info, Mapping):
|
|
478
|
+
# 尝试从 canonical event 的 Content.runtime_event 提取
|
|
479
|
+
raw_content = request.get("Content")
|
|
480
|
+
content = raw_content if isinstance(raw_content, Mapping) else {}
|
|
481
|
+
runtime_event = content.get("runtime_event")
|
|
482
|
+
if isinstance(runtime_event, Mapping):
|
|
483
|
+
req = runtime_event.get("request") or {}
|
|
484
|
+
if isinstance(req, Mapping):
|
|
485
|
+
detail = req.get("detail")
|
|
486
|
+
if isinstance(detail, Mapping):
|
|
487
|
+
# 从 detail.action_requests[0] 提取(HumanInTheLoopMiddleware 结构)
|
|
488
|
+
action_requests = detail.get("action_requests")
|
|
489
|
+
first_action = (
|
|
490
|
+
action_requests[0]
|
|
491
|
+
if isinstance(action_requests, list) and action_requests
|
|
492
|
+
else {}
|
|
493
|
+
)
|
|
494
|
+
if not isinstance(first_action, Mapping):
|
|
495
|
+
first_action = {}
|
|
496
|
+
interaction_id = runtime_event.get("interaction_id") or req.get(
|
|
497
|
+
"call_id"
|
|
498
|
+
)
|
|
499
|
+
interrupt_info = {
|
|
500
|
+
"approval_request_id": interaction_id,
|
|
501
|
+
"id": interaction_id,
|
|
502
|
+
"tool_name": detail.get("tool_name")
|
|
503
|
+
or first_action.get("name")
|
|
504
|
+
or req.get("kind"),
|
|
505
|
+
"arguments": detail.get("arguments")
|
|
506
|
+
or detail.get("args")
|
|
507
|
+
or first_action.get("args")
|
|
508
|
+
or first_action.get("arguments"),
|
|
509
|
+
"description": detail.get("description")
|
|
510
|
+
or first_action.get("description"),
|
|
511
|
+
"review_configs": detail.get("review_configs"),
|
|
512
|
+
"approval_message": detail.get("message")
|
|
513
|
+
or first_action.get("description"),
|
|
514
|
+
}
|
|
445
515
|
if not isinstance(interrupt_info, Mapping):
|
|
446
516
|
interrupt_info = {}
|
|
447
517
|
request_id = str(
|
|
@@ -452,31 +522,56 @@ def _project_approval_events(
|
|
|
452
522
|
resume_input = response_metadata.get("resume_input")
|
|
453
523
|
if not isinstance(resume_input, Mapping):
|
|
454
524
|
resume_input = {}
|
|
455
|
-
status = (
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
)
|
|
525
|
+
status = _approval_status_from_resume(response, resume_input)
|
|
526
|
+
# HumanInTheLoopMiddleware 的 interrupt_info 把 tool_name 嵌在
|
|
527
|
+
# action_requests[0].name 里,runtime path 存的事件可能没有顶层 tool_name。
|
|
528
|
+
# 这里统一提取,避免 Name fallback 成 "approval" 导致前端显示不对。
|
|
529
|
+
action_requests = interrupt_info.get("action_requests")
|
|
530
|
+
first_action = (
|
|
531
|
+
action_requests[0]
|
|
532
|
+
if isinstance(action_requests, list) and action_requests
|
|
533
|
+
else {}
|
|
534
|
+
)
|
|
535
|
+
if not isinstance(first_action, Mapping):
|
|
536
|
+
first_action = {}
|
|
537
|
+
tool_name = (
|
|
538
|
+
interrupt_info.get("tool_name")
|
|
539
|
+
or first_action.get("name")
|
|
540
|
+
or "approval"
|
|
463
541
|
)
|
|
464
542
|
entry: dict[str, Any] = {
|
|
465
543
|
"SeqId": request.get("SeqId"),
|
|
466
544
|
"Type": "approval",
|
|
467
|
-
"Name": str(
|
|
545
|
+
"Name": str(tool_name),
|
|
468
546
|
"Status": status,
|
|
469
547
|
"ApprovalRequestId": request_id or None,
|
|
470
548
|
}
|
|
471
549
|
if metadata.get("protocol") == "ag-ui":
|
|
472
550
|
entry["Protocol"] = "ag-ui"
|
|
551
|
+
# arguments/description 优先从顶层取(_get_interrupt_info/归一化已提取),
|
|
552
|
+
# fallback 到 action_requests[0](runtime path 存的原始 interrupt_info)。
|
|
473
553
|
arguments = (
|
|
474
554
|
interrupt_info.get("arguments")
|
|
475
555
|
or interrupt_info.get("tool_args")
|
|
476
556
|
or interrupt_info.get("args")
|
|
557
|
+
or first_action.get("args")
|
|
558
|
+
or first_action.get("arguments")
|
|
477
559
|
)
|
|
478
560
|
if arguments is not None:
|
|
479
561
|
entry["Args"] = arguments
|
|
562
|
+
description = (
|
|
563
|
+
interrupt_info.get("description")
|
|
564
|
+
or first_action.get("description")
|
|
565
|
+
)
|
|
566
|
+
if description:
|
|
567
|
+
entry["Description"] = str(description)
|
|
568
|
+
review_configs = interrupt_info.get("review_configs")
|
|
569
|
+
if isinstance(review_configs, list) and review_configs:
|
|
570
|
+
first_review = review_configs[0]
|
|
571
|
+
if isinstance(first_review, Mapping):
|
|
572
|
+
allowed = first_review.get("allowed_decisions")
|
|
573
|
+
if isinstance(allowed, list) and allowed:
|
|
574
|
+
entry["AllowedDecisions"] = [str(d) for d in allowed]
|
|
480
575
|
approval_level = interrupt_info.get("approval_level") or interrupt_info.get("risk_level")
|
|
481
576
|
if approval_level:
|
|
482
577
|
entry["ApprovalLevel"] = str(approval_level)
|
|
@@ -722,15 +817,36 @@ def _normalize_canonical_event(
|
|
|
722
817
|
detail = request.get("detail")
|
|
723
818
|
if not isinstance(detail, Mapping):
|
|
724
819
|
detail = {}
|
|
820
|
+
# HumanInTheLoopMiddleware 的 detail 把 tool_name/arguments/description
|
|
821
|
+
# 嵌在 action_requests[0] 里,detail 顶层没有,需要提取。
|
|
822
|
+
action_requests = detail.get("action_requests")
|
|
823
|
+
first_action = (
|
|
824
|
+
action_requests[0]
|
|
825
|
+
if isinstance(action_requests, list) and action_requests
|
|
826
|
+
else {}
|
|
827
|
+
)
|
|
828
|
+
if not isinstance(first_action, Mapping):
|
|
829
|
+
first_action = {}
|
|
830
|
+
review_configs = detail.get("review_configs")
|
|
725
831
|
normalized["EventType"] = "approval_request"
|
|
726
832
|
normalized["Content"] = {"detail": detail}
|
|
727
833
|
normalized_metadata["interrupt_info"] = {
|
|
728
834
|
"approval_request_id": interaction_id or call_id,
|
|
729
835
|
"id": interaction_id or call_id,
|
|
730
|
-
"tool_name": detail.get("tool_name")
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
"
|
|
836
|
+
"tool_name": detail.get("tool_name")
|
|
837
|
+
or first_action.get("name")
|
|
838
|
+
or kind,
|
|
839
|
+
"arguments": detail.get("arguments")
|
|
840
|
+
or detail.get("args")
|
|
841
|
+
or first_action.get("args")
|
|
842
|
+
or first_action.get("arguments"),
|
|
843
|
+
"description": detail.get("description")
|
|
844
|
+
or first_action.get("description"),
|
|
845
|
+
"review_configs": review_configs if isinstance(review_configs, list) else None,
|
|
846
|
+
"approval_level": detail.get("approval_level")
|
|
847
|
+
or first_action.get("approval_level"),
|
|
848
|
+
"approval_message": detail.get("message")
|
|
849
|
+
or first_action.get("description"),
|
|
734
850
|
}
|
|
735
851
|
# Preserve ag-ui protocol tag from source metadata.
|
|
736
852
|
source = runtime_event.get("source") or {}
|
|
@@ -861,6 +977,11 @@ def _normalize_runtime_event(
|
|
|
861
977
|
or approval_request.get("args")
|
|
862
978
|
or detail.get("arguments")
|
|
863
979
|
or detail.get("args"),
|
|
980
|
+
"description": action.get("description")
|
|
981
|
+
or approval_request.get("description")
|
|
982
|
+
or detail.get("description"),
|
|
983
|
+
"review_configs": approval_request.get("review_configs")
|
|
984
|
+
or detail.get("review_configs"),
|
|
864
985
|
"approval_level": action.get("approval_level")
|
|
865
986
|
or approval_request.get("approval_level")
|
|
866
987
|
or detail.get("approval_level")
|
ksadk/conversations/projector.py
CHANGED
|
@@ -203,6 +203,7 @@ def project_conversation_item(
|
|
|
203
203
|
)
|
|
204
204
|
payload = {
|
|
205
205
|
"interactionId": event.interaction_id,
|
|
206
|
+
"callId": getattr(event.request, "call_id", None),
|
|
206
207
|
"kind": getattr(event.request, "kind", event.interaction_kind),
|
|
207
208
|
"detail": getattr(event.request, "detail", None),
|
|
208
209
|
"prompt": getattr(event.request, "prompt", None),
|
|
@@ -250,7 +251,7 @@ def project_conversation_item(
|
|
|
250
251
|
schema = "conversation.item.error/v1"
|
|
251
252
|
payload = {
|
|
252
253
|
"status": "failed" if isinstance(event, RunFailed) else "canceled",
|
|
253
|
-
"error": event.error.message if isinstance(event, RunFailed) else event.reason or ""
|
|
254
|
+
"error": event.error.message if isinstance(event, RunFailed) else event.reason or "",
|
|
254
255
|
}
|
|
255
256
|
elif isinstance(event, (ContinuationCreated, ContinuationResumed)):
|
|
256
257
|
kind = "progress"
|
|
@@ -524,9 +525,7 @@ def _item_snapshot(
|
|
|
524
525
|
def _artifact_payload(snapshot: ContentSnapshot | None) -> dict[str, Any]:
|
|
525
526
|
if snapshot is None:
|
|
526
527
|
return {}
|
|
527
|
-
artifact = next(
|
|
528
|
-
(part for part in snapshot.parts if isinstance(part, ArtifactContent)), None
|
|
529
|
-
)
|
|
528
|
+
artifact = next((part for part in snapshot.parts if isinstance(part, ArtifactContent)), None)
|
|
530
529
|
if artifact is None:
|
|
531
530
|
return {}
|
|
532
531
|
return {
|
|
@@ -583,8 +582,7 @@ def _is_codex_goal_item(event: RuntimeEvent) -> bool:
|
|
|
583
582
|
isinstance(event, (ItemStarted, ItemUpdated, ItemSnapshotReplaced, ItemCompleted))
|
|
584
583
|
and event.item_kind == "data"
|
|
585
584
|
and event.source.framework == "codex"
|
|
586
|
-
and event.source.metadata.get("method")
|
|
587
|
-
in {"thread/goal/updated", "thread/goal/cleared"}
|
|
585
|
+
and event.source.metadata.get("method") in {"thread/goal/updated", "thread/goal/cleared"}
|
|
588
586
|
)
|
|
589
587
|
|
|
590
588
|
|
|
@@ -123,6 +123,7 @@ async def invoke_conversation_once(
|
|
|
123
123
|
agent_system: str = "",
|
|
124
124
|
agent_task: str = "",
|
|
125
125
|
prompt_integration_mode: str = "",
|
|
126
|
+
resume_lifecycle_prepared: bool = False,
|
|
126
127
|
) -> tuple[str, dict[str, Any]]:
|
|
127
128
|
"""非流式 turn 编排入口。
|
|
128
129
|
|
|
@@ -159,6 +160,7 @@ async def invoke_conversation_once(
|
|
|
159
160
|
agent_system=agent_system,
|
|
160
161
|
agent_task=agent_task,
|
|
161
162
|
prompt_integration_mode=prompt_integration_mode,
|
|
163
|
+
resume_lifecycle_prepared=resume_lifecycle_prepared,
|
|
162
164
|
)
|
|
163
165
|
# prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
|
|
164
166
|
run_mode = prepared.run_mode
|
|
@@ -184,7 +186,10 @@ async def invoke_conversation_once(
|
|
|
184
186
|
user_input=prepared.user_input,
|
|
185
187
|
)
|
|
186
188
|
prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
|
|
189
|
+
from ksadk.session_context import SessionContext
|
|
190
|
+
|
|
187
191
|
runtime_context = PlatformInvocationContext(
|
|
192
|
+
session=SessionContext.from_payload(prepared.session_context),
|
|
188
193
|
agent_id=agent_id,
|
|
189
194
|
user_id=user_id,
|
|
190
195
|
account_id=str(account_id or ""),
|
|
@@ -49,6 +49,7 @@ from ksadk.conversations.runtime_metadata import (
|
|
|
49
49
|
)
|
|
50
50
|
from ksadk.conversations.runtime_observability import _latest_deferred_tool_names
|
|
51
51
|
from ksadk.conversations.runtime_payloads import PreparedConversationTurn
|
|
52
|
+
from ksadk.session_context import split_session_context
|
|
52
53
|
from ksadk.conversations.runtime_persistence import (
|
|
53
54
|
append_conversation_event,
|
|
54
55
|
append_run_resume_event,
|
|
@@ -110,6 +111,7 @@ async def build_run_input(
|
|
|
110
111
|
deployment_mode: str = "local",
|
|
111
112
|
agent_max_input_tokens: int | None = None,
|
|
112
113
|
agent_reserve_output_tokens: int | None = None,
|
|
114
|
+
resume_lifecycle_prepared: bool = False,
|
|
113
115
|
) -> PreparedConversationTurn:
|
|
114
116
|
"""构建一次 turn 的标准运行输入,并在进入模型前做上下文投影/压缩。
|
|
115
117
|
|
|
@@ -138,7 +140,7 @@ async def build_run_input(
|
|
|
138
140
|
model,
|
|
139
141
|
model_metadata=model_metadata,
|
|
140
142
|
)
|
|
141
|
-
normalized_request_metadata =
|
|
143
|
+
session_context, normalized_request_metadata = split_session_context(request_metadata)
|
|
142
144
|
normalized_custom_metadata = dict(custom_metadata or {})
|
|
143
145
|
policy_model = model or os.getenv("OPENAI_MODEL_NAME") or os.getenv("MODEL_NAME")
|
|
144
146
|
normalized_model_options = {
|
|
@@ -170,39 +172,37 @@ async def build_run_input(
|
|
|
170
172
|
if resume_input is not None:
|
|
171
173
|
if not session_id:
|
|
172
174
|
raise ValueError("Responses resume input requires session_id")
|
|
173
|
-
existing_events = await service.get_events(resolved_session_id)
|
|
174
175
|
normalized_resume_input = dict(resume_input)
|
|
175
176
|
if _is_checkpoint_resume_input(normalized_resume_input):
|
|
176
177
|
normalized_resume_input = _normalize_checkpoint_resume_input(normalized_resume_input)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
|
|
201
|
-
)
|
|
178
|
+
if not resume_lifecycle_prepared:
|
|
179
|
+
await append_run_resume_event(
|
|
180
|
+
session_id=resolved_session_id,
|
|
181
|
+
author=agent_id,
|
|
182
|
+
run_id=str(normalized_resume_input["run_id"]),
|
|
183
|
+
checkpoint_id=str(normalized_resume_input["checkpoint_id"]),
|
|
184
|
+
resume_attempt_id=str(normalized_resume_input["resume_attempt_id"]),
|
|
185
|
+
framework=str(normalized_resume_input["framework"]),
|
|
186
|
+
framework_ref=normalized_resume_input["framework_ref"],
|
|
187
|
+
invocation_id=resolved_invocation_id,
|
|
188
|
+
session_service_provider=provider,
|
|
189
|
+
)
|
|
190
|
+
# run_resume 与 ActiveRunStatus 分属不同事件类型,因此补写 resuming。
|
|
191
|
+
await append_run_status_event(
|
|
192
|
+
session_id=resolved_session_id,
|
|
193
|
+
author=agent_id,
|
|
194
|
+
status="resuming",
|
|
195
|
+
invocation_id=resolved_invocation_id,
|
|
196
|
+
detail="checkpoint_resume",
|
|
197
|
+
session_service_provider=provider,
|
|
198
|
+
run_mode=caller_run_mode,
|
|
199
|
+
run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
|
|
200
|
+
)
|
|
202
201
|
event_history = await service.get_events(resolved_session_id)
|
|
203
202
|
history = build_history_from_events(event_history)
|
|
204
203
|
responses_history = project_responses_history(event_history)
|
|
205
204
|
return PreparedConversationTurn(
|
|
205
|
+
session_context=session_context.to_payload(),
|
|
206
206
|
session_id=resolved_session_id,
|
|
207
207
|
invocation_id=resolved_invocation_id,
|
|
208
208
|
user_input="",
|
|
@@ -239,6 +239,7 @@ async def build_run_input(
|
|
|
239
239
|
provider_ref=provider_ref,
|
|
240
240
|
)
|
|
241
241
|
|
|
242
|
+
existing_events = await service.get_events(resolved_session_id)
|
|
242
243
|
is_approval_resume = _is_approval_resume_input(normalized_resume_input)
|
|
243
244
|
existing_tool_receipt_event = None
|
|
244
245
|
if is_approval_resume and not _has_pending_approval(existing_events):
|
|
@@ -319,6 +320,7 @@ async def build_run_input(
|
|
|
319
320
|
history = build_history_from_events(event_history)
|
|
320
321
|
responses_history = project_responses_history(event_history)
|
|
321
322
|
return PreparedConversationTurn(
|
|
323
|
+
session_context=session_context.to_payload(),
|
|
322
324
|
session_id=resolved_session_id,
|
|
323
325
|
invocation_id=resolved_invocation_id,
|
|
324
326
|
user_input=resume_text,
|
|
@@ -478,6 +480,7 @@ async def build_run_input(
|
|
|
478
480
|
working_state = _latest_checkpoint_working_state(event_history)
|
|
479
481
|
|
|
480
482
|
prepared = PreparedConversationTurn(
|
|
483
|
+
session_context=session_context.to_payload(),
|
|
481
484
|
session_id=resolved_session_id,
|
|
482
485
|
invocation_id=resolved_invocation_id,
|
|
483
486
|
user_id=resolved_user_id,
|
|
@@ -185,6 +185,48 @@ def _parse_approval_arguments(value: Any) -> dict[str, Any]:
|
|
|
185
185
|
|
|
186
186
|
|
|
187
187
|
def _approval_decision_from_resume(resume_input: Mapping[str, Any]) -> dict[str, Any]:
|
|
188
|
+
# ksadk_resume + decisions 协议(HumanInTheLoopMiddleware):
|
|
189
|
+
# resume_input.value.decisions[0].type 为 approve/edit/reject。
|
|
190
|
+
value = resume_input.get("value")
|
|
191
|
+
if isinstance(value, Mapping):
|
|
192
|
+
decisions = value.get("decisions")
|
|
193
|
+
if isinstance(decisions, list) and decisions:
|
|
194
|
+
first = decisions[0]
|
|
195
|
+
if isinstance(first, Mapping):
|
|
196
|
+
decision_type = str(first.get("type") or "").strip().lower()
|
|
197
|
+
if decision_type in {"approve", "edit"}:
|
|
198
|
+
approved = True
|
|
199
|
+
if decision_type == "edit":
|
|
200
|
+
# edit 带修改后的参数;记录到 decision 供下游使用。
|
|
201
|
+
edited = first.get("edited_action")
|
|
202
|
+
if isinstance(edited, Mapping):
|
|
203
|
+
return {
|
|
204
|
+
"approved": True,
|
|
205
|
+
"approval_request_id": str(
|
|
206
|
+
resume_input.get("approval_request_id")
|
|
207
|
+
or resume_input.get("interrupt_id")
|
|
208
|
+
or resume_input.get("id")
|
|
209
|
+
or ""
|
|
210
|
+
),
|
|
211
|
+
"edited_action": dict(edited),
|
|
212
|
+
}
|
|
213
|
+
elif decision_type in {"reject", "respond"}:
|
|
214
|
+
approved = False
|
|
215
|
+
else:
|
|
216
|
+
approved = True
|
|
217
|
+
decision = {
|
|
218
|
+
"approved": approved,
|
|
219
|
+
"approval_request_id": str(
|
|
220
|
+
resume_input.get("approval_request_id")
|
|
221
|
+
or resume_input.get("interrupt_id")
|
|
222
|
+
or resume_input.get("id")
|
|
223
|
+
or ""
|
|
224
|
+
),
|
|
225
|
+
}
|
|
226
|
+
message = first.get("message") or first.get("feedback")
|
|
227
|
+
if message is not None:
|
|
228
|
+
decision["reason"] = str(message)
|
|
229
|
+
return decision
|
|
188
230
|
if "approve" in resume_input:
|
|
189
231
|
approved = bool(resume_input.get("approve"))
|
|
190
232
|
elif "approved" in resume_input:
|
|
@@ -624,7 +666,11 @@ def _extract_agentengine_metadata(result: Mapping[str, Any] | None) -> dict[str,
|
|
|
624
666
|
agentengine = metadata.get("agentengine")
|
|
625
667
|
if not isinstance(agentengine, Mapping):
|
|
626
668
|
return {}
|
|
627
|
-
return {
|
|
669
|
+
return {
|
|
670
|
+
"agentengine": {
|
|
671
|
+
key: value for key, value in agentengine.items() if key != "session_context"
|
|
672
|
+
}
|
|
673
|
+
}
|
|
628
674
|
|
|
629
675
|
|
|
630
676
|
def _checkpoint_event_args_from_agentengine_metadata(
|
|
@@ -682,7 +728,9 @@ def _merge_agentengine_metadata(
|
|
|
682
728
|
agentengine = metadata.get("agentengine")
|
|
683
729
|
if not isinstance(agentengine, Mapping):
|
|
684
730
|
continue
|
|
685
|
-
next_agentengine =
|
|
731
|
+
next_agentengine = {
|
|
732
|
+
key: value for key, value in agentengine.items() if key != "session_context"
|
|
733
|
+
}
|
|
686
734
|
merged.update(next_agentengine)
|
|
687
735
|
framework_ref = agentengine.get("framework_ref")
|
|
688
736
|
if isinstance(framework_ref, Mapping):
|
|
@@ -136,6 +136,7 @@ async def _iter_conversation_turn_events(
|
|
|
136
136
|
agent_system: str = "",
|
|
137
137
|
agent_task: str = "",
|
|
138
138
|
prompt_integration_mode: str = "",
|
|
139
|
+
resume_lifecycle_prepared: bool = False,
|
|
139
140
|
) -> AsyncIterator[dict[str, Any]]:
|
|
140
141
|
"""Internal semantic event stream shared by protocol serializers."""
|
|
141
142
|
provider = session_service_provider or resolve_session_service
|
|
@@ -198,6 +199,7 @@ async def _iter_conversation_turn_events(
|
|
|
198
199
|
agent_system=agent_system,
|
|
199
200
|
agent_task=agent_task,
|
|
200
201
|
prompt_integration_mode=prompt_integration_mode,
|
|
202
|
+
resume_lifecycle_prepared=resume_lifecycle_prepared,
|
|
201
203
|
)
|
|
202
204
|
# prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
|
|
203
205
|
run_mode = prepared.run_mode
|
|
@@ -224,7 +226,10 @@ async def _iter_conversation_turn_events(
|
|
|
224
226
|
user_input=prepared.user_input,
|
|
225
227
|
)
|
|
226
228
|
prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
|
|
229
|
+
from ksadk.session_context import SessionContext
|
|
230
|
+
|
|
227
231
|
runtime_context = PlatformInvocationContext(
|
|
232
|
+
session=SessionContext.from_payload(prepared.session_context),
|
|
228
233
|
agent_id=agent_id,
|
|
229
234
|
user_id=user_id,
|
|
230
235
|
account_id=str(account_id or ""),
|
|
@@ -39,6 +39,7 @@ async def stream_conversation_turn(
|
|
|
39
39
|
invocation_id: Optional[str] = None,
|
|
40
40
|
session_service_provider: Callable[[], Any] | None = None,
|
|
41
41
|
run_mode: str = RUN_MODE_FOREGROUND,
|
|
42
|
+
resume_lifecycle_prepared: bool = False,
|
|
42
43
|
) -> AsyncIterator[str]:
|
|
43
44
|
"""Legacy ksadk response SSE stream used by hosted chat and chat-completions."""
|
|
44
45
|
events = _iter_conversation_turn_events(
|
|
@@ -60,6 +61,7 @@ async def stream_conversation_turn(
|
|
|
60
61
|
invocation_id=invocation_id,
|
|
61
62
|
session_service_provider=session_service_provider,
|
|
62
63
|
run_mode=run_mode,
|
|
64
|
+
resume_lifecycle_prepared=resume_lifecycle_prepared,
|
|
63
65
|
)
|
|
64
66
|
async for chunk in _stream_conversation_semantic_events(
|
|
65
67
|
events=events,
|
|
@@ -151,7 +153,7 @@ async def _stream_conversation_semantic_events(
|
|
|
151
153
|
yield _response_sse(
|
|
152
154
|
"response.tool_call",
|
|
153
155
|
{
|
|
154
|
-
"name": event.get("name"),
|
|
156
|
+
"name": event.get("tool_name") or event.get("name"),
|
|
155
157
|
"args": event.get("args", {}),
|
|
156
158
|
"run_id": event.get("run_id"),
|
|
157
159
|
"stage": event.get("stage"),
|
|
@@ -164,7 +166,7 @@ async def _stream_conversation_semantic_events(
|
|
|
164
166
|
yield _response_sse(
|
|
165
167
|
"response.tool_result",
|
|
166
168
|
{
|
|
167
|
-
"name": event.get("name"),
|
|
169
|
+
"name": event.get("tool_name") or event.get("name"),
|
|
168
170
|
"output": event.get("output", ""),
|
|
169
171
|
"run_id": event.get("run_id"),
|
|
170
172
|
},
|
|
@@ -174,7 +176,7 @@ async def _stream_conversation_semantic_events(
|
|
|
174
176
|
f"response.ksadk.{event_type}",
|
|
175
177
|
{
|
|
176
178
|
"type": event_type,
|
|
177
|
-
"name": event.get("name"),
|
|
179
|
+
"name": event.get("tool_name") or event.get("name"),
|
|
178
180
|
"args": event.get("args", {}),
|
|
179
181
|
"output": event.get("output", ""),
|
|
180
182
|
"run_id": event.get("run_id"),
|
|
@@ -228,6 +230,7 @@ async def stream_responses_conversation_turn(
|
|
|
228
230
|
invocation_id: Optional[str] = None,
|
|
229
231
|
session_service_provider: Callable[[], Any] | None = None,
|
|
230
232
|
run_mode: str = RUN_MODE_FOREGROUND,
|
|
233
|
+
resume_lifecycle_prepared: bool = False,
|
|
231
234
|
) -> AsyncIterator[str]:
|
|
232
235
|
"""OpenAI Responses-style SSE stream."""
|
|
233
236
|
response_id = f"resp_{uuid.uuid4().hex}"
|
|
@@ -476,12 +479,14 @@ async def _stream_responses_semantic_events(
|
|
|
476
479
|
call_id = str(event.get("run_id") or f"call_{uuid.uuid4().hex[:12]}")
|
|
477
480
|
item_id = f"fc_{uuid.uuid4().hex[:12]}"
|
|
478
481
|
call_output_index = _next_output_index()
|
|
482
|
+
# tool_name 是 runner stream 的字段名;name 用于向后兼容旧事件源。
|
|
483
|
+
tool_name = event.get("tool_name") or event.get("name") or "unknown"
|
|
479
484
|
item = {
|
|
480
485
|
"id": item_id,
|
|
481
486
|
"type": "function_call",
|
|
482
487
|
"status": "in_progress",
|
|
483
488
|
"call_id": call_id,
|
|
484
|
-
"name":
|
|
489
|
+
"name": tool_name,
|
|
485
490
|
"arguments": "",
|
|
486
491
|
}
|
|
487
492
|
yield _response_sse(
|
|
@@ -505,7 +510,7 @@ async def _stream_responses_semantic_events(
|
|
|
505
510
|
"response.ksadk.tool_call",
|
|
506
511
|
{
|
|
507
512
|
"type": "tool_call",
|
|
508
|
-
"name":
|
|
513
|
+
"name": tool_name,
|
|
509
514
|
"args": event.get("args", {}),
|
|
510
515
|
"run_id": event.get("run_id"),
|
|
511
516
|
"stage": event.get("stage"),
|
|
@@ -520,7 +525,7 @@ async def _stream_responses_semantic_events(
|
|
|
520
525
|
yield _response_sse(
|
|
521
526
|
"response.ksadk.tool_result",
|
|
522
527
|
{
|
|
523
|
-
"name": event.get("name"),
|
|
528
|
+
"name": event.get("tool_name") or event.get("name"),
|
|
524
529
|
"output": event.get("output", ""),
|
|
525
530
|
"run_id": event.get("run_id"),
|
|
526
531
|
},
|
|
@@ -532,7 +537,7 @@ async def _stream_responses_semantic_events(
|
|
|
532
537
|
f"response.ksadk.{event_type}",
|
|
533
538
|
{
|
|
534
539
|
"type": event_type,
|
|
535
|
-
"name": event.get("name"),
|
|
540
|
+
"name": event.get("tool_name") or event.get("name"),
|
|
536
541
|
"args": event.get("args", {}),
|
|
537
542
|
"output": event.get("output", ""),
|
|
538
543
|
"run_id": event.get("run_id"),
|
|
@@ -569,6 +574,19 @@ async def _stream_responses_semantic_events(
|
|
|
569
574
|
"arguments": arguments,
|
|
570
575
|
"server_label": str(interrupt_info.get("server_label") or "ksadk"),
|
|
571
576
|
}
|
|
577
|
+
# 透传 HumanInTheLoopMiddleware 的可读描述和允许决策类型,
|
|
578
|
+
# 供前端审批卡展示操作说明和 edit 按钮。
|
|
579
|
+
if interrupt_info.get("description"):
|
|
580
|
+
approval_item["description"] = str(interrupt_info.get("description"))
|
|
581
|
+
review_configs = interrupt_info.get("review_configs")
|
|
582
|
+
if isinstance(review_configs, list) and review_configs:
|
|
583
|
+
first_review = review_configs[0]
|
|
584
|
+
if isinstance(first_review, Mapping):
|
|
585
|
+
allowed = first_review.get("allowed_decisions")
|
|
586
|
+
if isinstance(allowed, list) and allowed:
|
|
587
|
+
approval_item["allowed_decisions"] = [
|
|
588
|
+
str(d) for d in allowed
|
|
589
|
+
]
|
|
572
590
|
approval_output_index = _next_output_index()
|
|
573
591
|
yield _response_sse(
|
|
574
592
|
"response.output_item.added",
|
ksadk/deployment/env_forward.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""部署时的 shell 进程环境变量转发规则。
|
|
2
2
|
|
|
3
3
|
通用 deploy (serverless/kcf/kce) 与 hermes/openclaw deploy 共用同一套规则:
|
|
4
|
-
按前缀 (KSADK_/OPENAI_/KSYUN_/E2B_) + 显式 allowlist 转发 shell 环境变量,
|
|
4
|
+
按前缀 (KSADK_/OPENAI_/KSYUN_/E2B_/AGENTENGINE_/AGENTKIT_) + 显式 allowlist 转发 shell 环境变量,
|
|
5
5
|
denylist 中的 CLI/builders/configs/web 模块本地键不转发。
|
|
6
6
|
"""
|
|
7
7
|
|
|
@@ -37,7 +37,7 @@ DEPLOY_PROCESS_ENV_ALLOWLIST = frozenset(
|
|
|
37
37
|
"KSYUN_SECRET_KEY",
|
|
38
38
|
}
|
|
39
39
|
)
|
|
40
|
-
DEPLOY_PROCESS_ENV_PREFIXES = ("KSADK_", "OPENAI_", "KSYUN_", "E2B_")
|
|
40
|
+
DEPLOY_PROCESS_ENV_PREFIXES = ("KSADK_", "OPENAI_", "KSYUN_", "E2B_", "AGENTENGINE_", "AGENTKIT_")
|
|
41
41
|
DEPLOY_PROCESS_ENV_DENYLIST = frozenset(
|
|
42
42
|
{spec.name for spec in ENV_VAR_REGISTRY if spec.module in {"builders", "cli", "configs", "web"}}
|
|
43
43
|
) | frozenset(
|