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
|
@@ -8,15 +8,19 @@ from typing import Any, Literal, NoReturn, cast
|
|
|
8
8
|
|
|
9
9
|
from pydantic import JsonValue
|
|
10
10
|
|
|
11
|
-
_CODEX_ERROR_INFO_VALUES = frozenset(
|
|
11
|
+
_CODEX_ERROR_INFO_VALUES = frozenset(
|
|
12
|
+
"""
|
|
12
13
|
contextWindowExceeded sessionBudgetExceeded usageLimitExceeded serverOverloaded
|
|
13
14
|
cyberPolicy internalServerError unauthorized badRequest threadRollbackFailed
|
|
14
15
|
sandboxError other
|
|
15
|
-
""".split()
|
|
16
|
-
|
|
16
|
+
""".split()
|
|
17
|
+
)
|
|
18
|
+
_CODEX_ERROR_INFO_VARIANTS = frozenset(
|
|
19
|
+
"""
|
|
17
20
|
httpConnectionFailed responseStreamConnectionFailed responseStreamDisconnected
|
|
18
21
|
responseTooManyFailedAttempts activeTurnNotSteerable
|
|
19
|
-
""".split()
|
|
22
|
+
""".split()
|
|
23
|
+
)
|
|
20
24
|
|
|
21
25
|
|
|
22
26
|
class CodexMappingError(ValueError):
|
|
@@ -151,16 +155,23 @@ def _question_schema(
|
|
|
151
155
|
)
|
|
152
156
|
)
|
|
153
157
|
option_details.append(_json_value(option))
|
|
158
|
+
multiple = bool(question.get("isMultiSelect", False))
|
|
159
|
+
allow_other = bool(question.get("isOther", False))
|
|
154
160
|
property_schema: dict[str, JsonValue] = {
|
|
155
|
-
"type": "string",
|
|
161
|
+
"type": "array" if multiple else "string",
|
|
156
162
|
"title": header,
|
|
157
163
|
"description": prompt,
|
|
158
164
|
"x-codex-options": option_details,
|
|
159
165
|
"x-codex-is-secret": is_secret,
|
|
160
166
|
"x-codex-is-other": bool(question.get("isOther", False)),
|
|
161
167
|
}
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
value_schema: dict[str, JsonValue] = {"type": "string", "minLength": 1}
|
|
169
|
+
if labels and not allow_other:
|
|
170
|
+
value_schema["enum"] = cast(JsonValue, labels)
|
|
171
|
+
if multiple:
|
|
172
|
+
property_schema.update({"items": value_schema, "minItems": 1, "uniqueItems": True})
|
|
173
|
+
else:
|
|
174
|
+
property_schema.update(value_schema)
|
|
164
175
|
properties[question_id] = property_schema
|
|
165
176
|
required.append(question_id)
|
|
166
177
|
prompts.append(prompt)
|
|
@@ -87,6 +87,7 @@ class LangGraphEventAdapter:
|
|
|
87
87
|
def __init__(self) -> None:
|
|
88
88
|
self._messages: dict[tuple[str, str], _MessageState] = {}
|
|
89
89
|
self._tools: dict[tuple[str, str], _ToolState] = {}
|
|
90
|
+
self._tool_occurrences: dict[tuple[str, str], int] = {}
|
|
90
91
|
self._lifecycles: dict[str, _LifecycleState] = {}
|
|
91
92
|
|
|
92
93
|
async def stream_run(
|
|
@@ -331,7 +332,20 @@ class LangGraphEventAdapter:
|
|
|
331
332
|
f"LangGraph tool call {call_id!r} started twice",
|
|
332
333
|
)
|
|
333
334
|
name = _required_string(payload.get("tool_name"), "tools tool_name")
|
|
334
|
-
|
|
335
|
+
occurrence = self._tool_occurrences.get(state_key, 0)
|
|
336
|
+
self._tool_occurrences[state_key] = occurrence + 1
|
|
337
|
+
item_id = (
|
|
338
|
+
stable_item_id("langgraph", frame.scope_id, "tool_result", call_id)
|
|
339
|
+
if occurrence == 0
|
|
340
|
+
else stable_item_id(
|
|
341
|
+
"langgraph",
|
|
342
|
+
frame.scope_id,
|
|
343
|
+
"tool_result",
|
|
344
|
+
call_id,
|
|
345
|
+
"occurrence",
|
|
346
|
+
frame.occurrence_key,
|
|
347
|
+
)
|
|
348
|
+
)
|
|
335
349
|
self._tools[state_key] = _ToolState(
|
|
336
350
|
scope_id=frame.scope_id,
|
|
337
351
|
parent_scope_id=frame.parent_scope_id,
|
ksadk/events/canonical_store.py
CHANGED
|
@@ -158,7 +158,9 @@ class RuntimeEventStore:
|
|
|
158
158
|
self._typed_session_id = session_id
|
|
159
159
|
else:
|
|
160
160
|
self._event_store = None
|
|
161
|
-
|
|
161
|
+
# A live-first session wrapper may expose one durable authority for
|
|
162
|
+
# canonical facts without claiming that its dual writes are atomic.
|
|
163
|
+
self._service = getattr(store, "canonical_event_service", store)
|
|
162
164
|
self._typed_session_id = session_id
|
|
163
165
|
|
|
164
166
|
@property
|
ksadk/events/projections.py
CHANGED
|
@@ -23,7 +23,7 @@ canonical store(``ksadk/events/canonical_store.py`` 及 ``canonical.py`` 的
|
|
|
23
23
|
| Responses 历史 | ``conversations/context.py::project_responses_history`` | Responses API 请求回放 input | OpenAI Responses input items(``type``/``call_id``/``output``/role 消息),仅可靠 call_id 的 tool 项 |
|
|
24
24
|
| 模型 history | ``conversations/context.py::project_model_messages`` | 运行时模型上下文(内部投喂) | ``role``/``content`` 消息列表;control 事件不进入上下文 |
|
|
25
25
|
| server checkpoint payload | ``server/routes/projection.py::_checkpoint_event_to_action_payload`` | REST 断点续跑/预览接口 | ``EventId``/``SessionId``/``RunId``/``CheckpointId``/``Framework``/``FrameworkRef``/``IsResumable``/``ResumeStatus``/``IsTerminal``/``NextNode``(经 ``run_checkpoint`` 元数据或 ``continuation.created`` 投影) |
|
|
26
|
-
| server 动作事件 payload | ``server/routes/projection.py::_event_to_action_payload`` | REST 会话动作接口(事件原始形态透传) | ``EventId``/``SessionId``/``Author``/``EventType``/``Content``/``Timestamp``/``SeqId``(可选 ``InvocationId``)——序列化存储形态本身,非 canonical
|
|
26
|
+
| server 动作事件 payload | ``server/routes/projection.py::_event_to_action_payload`` | REST 会话动作接口(事件原始形态透传) | ``EventId``/``SessionId``/``Author``/``EventType``/``Content``/``Timestamp``/``SeqId``(可选 ``InvocationId``)——序列化存储形态本身,非 canonical 派生;canonical runtime 事件额外注入 ``Content.parts[0].text`` 兼容旧前端 |
|
|
27
27
|
|
|
28
28
|
内部不保证(任何投影都不承诺、消费方不得依赖):
|
|
29
29
|
- ``seq``/``run_seq`` 的具体数值与连续性(仅保序语义);
|
ksadk/harness/config.py
CHANGED
|
@@ -41,8 +41,8 @@ class McpToolSpec:
|
|
|
41
41
|
"""MCP 工具条目(最小子集)。"""
|
|
42
42
|
|
|
43
43
|
name: str
|
|
44
|
-
url: str
|
|
45
|
-
api_key: Optional[str] = None
|
|
44
|
+
url: str = field(repr=False)
|
|
45
|
+
api_key: Optional[str] = field(default=None, repr=False)
|
|
46
46
|
tool_filter: tuple[str, ...] = ()
|
|
47
47
|
tool_name_prefix: Optional[str] = None
|
|
48
48
|
|
ksadk/harness/runtime.py
CHANGED
|
@@ -109,6 +109,8 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
109
109
|
self._tool_lock = asyncio.Lock()
|
|
110
110
|
self._mcp_toolsets: list[Any] = []
|
|
111
111
|
self._sessions: dict[tuple[str, str, str], _HarnessSession] = {}
|
|
112
|
+
self._lifecycle_lock = asyncio.Lock()
|
|
113
|
+
self._closed = False
|
|
112
114
|
|
|
113
115
|
@property
|
|
114
116
|
def harness_config(self) -> HarnessConfig:
|
|
@@ -123,10 +125,13 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
123
125
|
return self._sandbox.workspace_root
|
|
124
126
|
|
|
125
127
|
async def start(self, request: StartRequest) -> RunHandle:
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
async with self._lifecycle_lock:
|
|
129
|
+
if self._closed:
|
|
130
|
+
raise RuntimeError("Harness runtime adapter is closed")
|
|
131
|
+
run_id = str(request.metadata.get("invocation_id") or f"harness_{uuid.uuid4().hex}")
|
|
132
|
+
if run_id in self._runs:
|
|
133
|
+
raise ValueError(f"duplicate Harness invocation: {run_id}")
|
|
134
|
+
self._runs[run_id] = _HarnessRun(request=request)
|
|
130
135
|
return RunHandle(
|
|
131
136
|
run_id=run_id,
|
|
132
137
|
session_id=request.session_id,
|
|
@@ -174,28 +179,29 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
174
179
|
)
|
|
175
180
|
|
|
176
181
|
async def close(self, handle: RunHandle) -> None:
|
|
177
|
-
|
|
182
|
+
async with self._lifecycle_lock:
|
|
183
|
+
run = self._runs.pop(handle.run_id, None)
|
|
184
|
+
has_runs = bool(self._runs)
|
|
178
185
|
if run is not None and run.task is not None and not run.task.done():
|
|
179
186
|
run.task.cancel()
|
|
180
187
|
await asyncio.gather(run.task, return_exceptions=True)
|
|
181
|
-
if not
|
|
188
|
+
if not has_runs:
|
|
182
189
|
await self._close_tools()
|
|
183
190
|
|
|
184
191
|
async def close_all(self) -> None:
|
|
185
192
|
"""Dispose every process-local run owned by this adapter instance."""
|
|
186
193
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
)
|
|
194
|
+
async with self._lifecycle_lock:
|
|
195
|
+
self._closed = True
|
|
196
|
+
runs = tuple(self._runs.values())
|
|
197
|
+
self._runs.clear()
|
|
198
|
+
self._sessions.clear()
|
|
199
|
+
tasks = [run.task for run in runs if run.task is not None and not run.task.done()]
|
|
200
|
+
for task in tasks:
|
|
201
|
+
task.cancel()
|
|
202
|
+
if tasks:
|
|
203
|
+
await asyncio.gather(*tasks, return_exceptions=True)
|
|
204
|
+
await self._close_tools()
|
|
199
205
|
|
|
200
206
|
def is_handle_attached(self, handle: RunHandle) -> bool:
|
|
201
207
|
return handle.run_id in self._runs
|
|
@@ -305,9 +311,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
305
311
|
|
|
306
312
|
def _effective(self, request: StartRequest) -> tuple[str, str]:
|
|
307
313
|
metadata = request.metadata or {}
|
|
308
|
-
model = str(
|
|
309
|
-
metadata.get("model_override") or request.model or self._config.model
|
|
310
|
-
).strip()
|
|
314
|
+
model = str(metadata.get("model_override") or request.model or self._config.model).strip()
|
|
311
315
|
prompt = str(
|
|
312
316
|
metadata.get("prompt_override")
|
|
313
317
|
or request.config.get("base_instructions")
|
|
@@ -344,9 +348,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
344
348
|
},
|
|
345
349
|
)
|
|
346
350
|
|
|
347
|
-
def env_kwargs(
|
|
348
|
-
item_id: str, event_type: str, part_id: str
|
|
349
|
-
) -> dict[str, Any]:
|
|
351
|
+
def env_kwargs(item_id: str, event_type: str, part_id: str) -> dict[str, Any]:
|
|
350
352
|
n = next_seq()
|
|
351
353
|
return {
|
|
352
354
|
"schema_version": 2,
|
|
@@ -445,9 +447,7 @@ class HarnessRuntimeAdapter(RuntimeAdapter):
|
|
|
445
447
|
**env_kwargs(message_item_id, "item.completed", "text-0"),
|
|
446
448
|
item_id=message_item_id,
|
|
447
449
|
item_kind="message",
|
|
448
|
-
snapshot=ContentSnapshot(
|
|
449
|
-
parts=(TextContent(part_id="text-0", text=text),)
|
|
450
|
-
),
|
|
450
|
+
snapshot=ContentSnapshot(parts=(TextContent(part_id="text-0", text=text),)),
|
|
451
451
|
)
|
|
452
452
|
run.done = True
|
|
453
453
|
yield RunCompleted(
|
ksadk/harness/tools.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import asyncio
|
|
5
6
|
import json
|
|
6
7
|
import uuid
|
|
7
8
|
from dataclasses import dataclass
|
|
@@ -14,6 +15,13 @@ from ksadk.mcp_runtime import MCPServerConfig, build_mcp_toolset
|
|
|
14
15
|
|
|
15
16
|
ToolHandler = Callable[[dict[str, Any], str | None], Awaitable[Any]]
|
|
16
17
|
|
|
18
|
+
HARNESS_SANDBOX_TOOL_NAMES = frozenset(
|
|
19
|
+
{
|
|
20
|
+
"sandbox_read_file",
|
|
21
|
+
"sandbox_run_command",
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
|
|
17
25
|
|
|
18
26
|
@dataclass(frozen=True)
|
|
19
27
|
class HarnessTool:
|
|
@@ -89,11 +97,25 @@ async def load_mcp_tools(spec: McpToolSpec) -> tuple[Any, list[HarnessTool]]:
|
|
|
89
97
|
toolset = build_mcp_toolset(config)
|
|
90
98
|
try:
|
|
91
99
|
native_tools = await toolset.get_tools_with_prefix()
|
|
92
|
-
except
|
|
93
|
-
|
|
100
|
+
except BaseException as error:
|
|
101
|
+
cleanup = asyncio.create_task(toolset.close())
|
|
102
|
+
interrupted = False
|
|
103
|
+
while not cleanup.done():
|
|
104
|
+
try:
|
|
105
|
+
await asyncio.shield(cleanup)
|
|
106
|
+
except asyncio.CancelledError:
|
|
107
|
+
interrupted = True
|
|
108
|
+
try:
|
|
109
|
+
cleanup.result()
|
|
110
|
+
except Exception:
|
|
111
|
+
pass
|
|
112
|
+
if interrupted or isinstance(error, asyncio.CancelledError):
|
|
113
|
+
raise asyncio.CancelledError
|
|
114
|
+
if not isinstance(error, Exception):
|
|
115
|
+
raise
|
|
94
116
|
raise RuntimeError(
|
|
95
|
-
f"Harness MCP server {spec.name!r} at {spec.url
|
|
96
|
-
) from
|
|
117
|
+
f"Harness MCP server {spec.name!r} at {spec.url} failed to start"
|
|
118
|
+
) from None
|
|
97
119
|
|
|
98
120
|
available_names = {str(tool.name) for tool in native_tools}
|
|
99
121
|
expected_names = {
|
|
@@ -104,14 +126,11 @@ async def load_mcp_tools(spec: McpToolSpec) -> tuple[Any, list[HarnessTool]]:
|
|
|
104
126
|
if missing_names:
|
|
105
127
|
await toolset.close()
|
|
106
128
|
raise RuntimeError(
|
|
107
|
-
f"Harness MCP server {spec.name!r}
|
|
108
|
-
f"tool(s): {missing_names}"
|
|
129
|
+
f"Harness MCP server {spec.name!r} did not expose configured tool(s): {missing_names}"
|
|
109
130
|
)
|
|
110
131
|
if not native_tools:
|
|
111
132
|
await toolset.close()
|
|
112
|
-
raise RuntimeError(
|
|
113
|
-
f"Harness MCP server {spec.name!r} at {spec.url!r} exposed no callable tools"
|
|
114
|
-
)
|
|
133
|
+
raise RuntimeError(f"Harness MCP server {spec.name!r} exposed no callable tools")
|
|
115
134
|
|
|
116
135
|
tools: list[HarnessTool] = []
|
|
117
136
|
for native_tool in native_tools:
|
|
@@ -139,10 +158,10 @@ async def load_mcp_tools(spec: McpToolSpec) -> tuple[Any, list[HarnessTool]]:
|
|
|
139
158
|
context = await _new_tool_context(call_id or _tool_name)
|
|
140
159
|
result = await _native_tool.run_async(args=arguments, tool_context=context)
|
|
141
160
|
return _normalize_tool_result(result, context)
|
|
142
|
-
except Exception
|
|
161
|
+
except Exception:
|
|
143
162
|
raise RuntimeError(
|
|
144
|
-
f"Harness MCP tool {_tool_name!r} on server {spec.name!r} failed
|
|
145
|
-
) from
|
|
163
|
+
f"Harness MCP tool {_tool_name!r} on server {spec.name!r} failed"
|
|
164
|
+
) from None
|
|
146
165
|
|
|
147
166
|
tools.append(
|
|
148
167
|
HarnessTool(
|
|
@@ -219,4 +238,10 @@ def _normalize_json_schema(value: Any) -> Any:
|
|
|
219
238
|
return value
|
|
220
239
|
|
|
221
240
|
|
|
222
|
-
__all__ = [
|
|
241
|
+
__all__ = [
|
|
242
|
+
"HARNESS_SANDBOX_TOOL_NAMES",
|
|
243
|
+
"HarnessTool",
|
|
244
|
+
"load_mcp_tools",
|
|
245
|
+
"sandbox_tools",
|
|
246
|
+
"tool_result_text",
|
|
247
|
+
]
|
ksadk/interaction/provider.py
CHANGED
|
@@ -47,6 +47,7 @@ class LangGraphInteractionProvider:
|
|
|
47
47
|
kind=payload_kind,
|
|
48
48
|
call_id=str(native_target.get("call_id") or record.interaction_id),
|
|
49
49
|
data=submission.response,
|
|
50
|
+
session_context=context.session_context,
|
|
50
51
|
)
|
|
51
52
|
return await context.adapter.resume(
|
|
52
53
|
context.handle,
|
ksadk/kernel/bootstrap.py
CHANGED
|
@@ -39,7 +39,7 @@ from ksadk.kernel.contract_fingerprints import (
|
|
|
39
39
|
)
|
|
40
40
|
from ksadk.kernel.contracts import RuntimeCapabilityMatrix
|
|
41
41
|
from ksadk.kernel.control import AgentKernel, default_capability_matrix
|
|
42
|
-
from ksadk.kernel.errors import InvalidCommandError
|
|
42
|
+
from ksadk.kernel.errors import InvalidCommandError, StaleFenceError
|
|
43
43
|
from ksadk.kernel.recovery import RecoveryCoordinator
|
|
44
44
|
from ksadk.kernel.runtime_identity import runtime_identity
|
|
45
45
|
from ksadk.kernel.store import AgentKernelStore, now_utc
|
|
@@ -465,8 +465,25 @@ class AgentKernelRuntime:
|
|
|
465
465
|
lease,
|
|
466
466
|
session_id=session_id,
|
|
467
467
|
)
|
|
468
|
-
if result.outcome
|
|
468
|
+
if result.outcome in {"claimed", "completed"}:
|
|
469
469
|
progressed = True
|
|
470
|
+
elif result.outcome == "terminal_failure":
|
|
471
|
+
if isinstance(result.error, StaleFenceError):
|
|
472
|
+
# 当前 activation 已失去 fence,不能继续触碰该
|
|
473
|
+
# session,也不应把正常 takeover 误判为坏数据。
|
|
474
|
+
self._heartbeat_sessions.discard(session_id)
|
|
475
|
+
self._last_renewed.pop(session_id, None)
|
|
476
|
+
self.lease_heartbeat.forget(session_id)
|
|
477
|
+
continue
|
|
478
|
+
failure = result.error or RuntimeError(
|
|
479
|
+
"agent kernel command failed without an error detail"
|
|
480
|
+
)
|
|
481
|
+
if not await self._quarantine_session(
|
|
482
|
+
session_id,
|
|
483
|
+
failure,
|
|
484
|
+
context="command execution",
|
|
485
|
+
):
|
|
486
|
+
return
|
|
470
487
|
self._store_failures = 0
|
|
471
488
|
except asyncio.CancelledError:
|
|
472
489
|
raise
|
|
@@ -609,7 +626,13 @@ class AgentKernelRuntime:
|
|
|
609
626
|
return False
|
|
610
627
|
return True
|
|
611
628
|
|
|
612
|
-
async def _quarantine_session(
|
|
629
|
+
async def _quarantine_session(
|
|
630
|
+
self,
|
|
631
|
+
session_id: str,
|
|
632
|
+
exc: Exception,
|
|
633
|
+
*,
|
|
634
|
+
context: str = "takeover recovery",
|
|
635
|
+
) -> bool:
|
|
613
636
|
"""隔离一个恢复失败的 session;返回 False 表示已触发进程级降级。
|
|
614
637
|
|
|
615
638
|
被隔离的 session 不再被本 runtime claim / 恢复 / 续约,其 inbox
|
|
@@ -631,9 +654,10 @@ class AgentKernelRuntime:
|
|
|
631
654
|
self._last_renewed.pop(session_id, None)
|
|
632
655
|
self.lease_heartbeat.forget(session_id)
|
|
633
656
|
logger.warning(
|
|
634
|
-
"agent kernel session %s quarantined after
|
|
657
|
+
"agent kernel session %s quarantined after %s "
|
|
635
658
|
"failed: agent_instance_id=%s error=%s: %s",
|
|
636
659
|
session_id,
|
|
660
|
+
context,
|
|
637
661
|
self.config.agent_instance_id,
|
|
638
662
|
type(exc).__name__,
|
|
639
663
|
exc,
|
ksadk/kernel/ingress.py
CHANGED
|
@@ -94,9 +94,22 @@ def get_agent_kernel() -> Any | None:
|
|
|
94
94
|
|
|
95
95
|
|
|
96
96
|
def kernel_route_active() -> bool:
|
|
97
|
-
"""
|
|
97
|
+
"""Whether public compatibility routes may self-admit through the kernel.
|
|
98
|
+
|
|
99
|
+
A hosted Runtime accepts AgentControl commands only with a permit issued by
|
|
100
|
+
Server. The public ``/v1/responses`` / legacy ``RunAgent`` routes do not
|
|
101
|
+
carry that permit, so routing them through ``trusted_context`` would create
|
|
102
|
+
a process-local signature that the hosted verifier must reject. Keep those
|
|
103
|
+
authenticated compatibility routes on their established executor path;
|
|
104
|
+
Server continues to use the dedicated ``/agent-kernel/v1/*`` ingress, which
|
|
105
|
+
validates the Server-issued permit independently of this selector.
|
|
106
|
+
"""
|
|
98
107
|
|
|
99
|
-
return
|
|
108
|
+
return (
|
|
109
|
+
kernel_ingress_enabled()
|
|
110
|
+
and get_agent_kernel() is not None
|
|
111
|
+
and authority_mode() != _AUTHORITY_HOSTED
|
|
112
|
+
)
|
|
100
113
|
|
|
101
114
|
|
|
102
115
|
# ---------------------------------------------------------------------------
|
ksadk/kernel/sqlite_store.py
CHANGED
|
@@ -1112,6 +1112,33 @@ class SQLiteAgentKernelStore:
|
|
|
1112
1112
|
)
|
|
1113
1113
|
return self._row_to_record(rows[0]) if rows else None
|
|
1114
1114
|
|
|
1115
|
+
async def get_terminal_receipt(
|
|
1116
|
+
self, interaction_id: str, *, tenant_id: str, agent_instance_id: str,
|
|
1117
|
+
session_id: str, run_id: str,
|
|
1118
|
+
) -> InteractionReceipt | None:
|
|
1119
|
+
"""Read the committed outcome inside a complete trusted scope.
|
|
1120
|
+
|
|
1121
|
+
Resolved alone does not mean approved. Pending/resolving records never
|
|
1122
|
+
yield an authorization receipt; callers must still match the request.
|
|
1123
|
+
"""
|
|
1124
|
+
if not all(isinstance(value, str) and value for value in (
|
|
1125
|
+
interaction_id, tenant_id, agent_instance_id, session_id, run_id
|
|
1126
|
+
)):
|
|
1127
|
+
raise InvalidCommandError("interaction receipt requires a complete trusted scope")
|
|
1128
|
+
row = await self._fetchone(
|
|
1129
|
+
await self._connect(),
|
|
1130
|
+
"SELECT * FROM kernel_interactions WHERE interaction_id=? AND tenant_id=?"
|
|
1131
|
+
" AND agent_instance_id=? AND session_id=? AND run_id=?",
|
|
1132
|
+
(interaction_id, tenant_id, agent_instance_id, session_id, run_id),
|
|
1133
|
+
)
|
|
1134
|
+
if row is None or not is_terminal(row["status"]):
|
|
1135
|
+
return None
|
|
1136
|
+
return InteractionReceipt(
|
|
1137
|
+
interaction_id=row["interaction_id"], revision=int(row["revision"]),
|
|
1138
|
+
status=row["status"], outcome=row["outcome"], event_id=row["event_id"],
|
|
1139
|
+
accepted_seq=row["accepted_seq"],
|
|
1140
|
+
)
|
|
1141
|
+
|
|
1115
1142
|
async def list_pending_interactions(
|
|
1116
1143
|
self, tenant_id: str, session_id: str
|
|
1117
1144
|
) -> list[InteractionRecord]:
|
ksadk/kernel/store.py
CHANGED
|
@@ -54,6 +54,9 @@ def command_digest(command: AgentControlCommand) -> str:
|
|
|
54
54
|
canonical["source"] = source
|
|
55
55
|
|
|
56
56
|
payload = dict(canonical.get("payload") or {})
|
|
57
|
+
# Admission derives this immutable snapshot from the current session. A
|
|
58
|
+
# retry after a tag update must still resolve to the first accepted command.
|
|
59
|
+
payload.pop("session_context", None)
|
|
57
60
|
if command.command_type == "submit_interaction":
|
|
58
61
|
payload.pop("token_ref", None)
|
|
59
62
|
canonical["payload"] = payload
|
ksadk/kernel/worker.py
CHANGED
|
@@ -109,6 +109,7 @@ class WorkResult:
|
|
|
109
109
|
message_id: str | None = None
|
|
110
110
|
run_id: str | None = None
|
|
111
111
|
last_seq: int | None = None
|
|
112
|
+
error: Exception | None = None
|
|
112
113
|
|
|
113
114
|
|
|
114
115
|
class AgentKernelWorker:
|
|
@@ -294,8 +295,10 @@ class AgentKernelWorker:
|
|
|
294
295
|
)
|
|
295
296
|
await self._store.discard_claim(message_id, expected_fence=fence)
|
|
296
297
|
return WorkResult(outcome="completed", message_id=message_id)
|
|
297
|
-
except StaleFenceError:
|
|
298
|
-
return WorkResult(
|
|
298
|
+
except StaleFenceError as error:
|
|
299
|
+
return WorkResult(
|
|
300
|
+
outcome="terminal_failure", message_id=message_id, error=error
|
|
301
|
+
)
|
|
299
302
|
except AgentKernelError as error:
|
|
300
303
|
if error.code == RUNTIME_INTERACTION_UNAVAILABLE:
|
|
301
304
|
# typed rejection:provider 诚实声明无法原生送达回包,
|
|
@@ -316,16 +319,46 @@ class AgentKernelWorker:
|
|
|
316
319
|
await self._store.discard_claim(message_id, expected_fence=fence)
|
|
317
320
|
return WorkResult(outcome="completed", message_id=message_id)
|
|
318
321
|
if error.retryable:
|
|
319
|
-
return WorkResult(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
+
return WorkResult(
|
|
323
|
+
outcome="retryable_failure", message_id=message_id, error=error
|
|
324
|
+
)
|
|
325
|
+
logger.error(
|
|
326
|
+
"agent kernel command failed permanently: "
|
|
327
|
+
"agent_instance_id=%s session_id=%s command_id=%s "
|
|
328
|
+
"command_type=%s error=%s: %s",
|
|
329
|
+
command.agent_instance_id,
|
|
330
|
+
command.session_id,
|
|
331
|
+
command.command_id,
|
|
332
|
+
command.command_type,
|
|
333
|
+
type(error).__name__,
|
|
334
|
+
error,
|
|
335
|
+
)
|
|
336
|
+
return WorkResult(
|
|
337
|
+
outcome="terminal_failure", message_id=message_id, error=error
|
|
338
|
+
)
|
|
339
|
+
except Exception as error:
|
|
322
340
|
# 未知异常绝不 ack 为成功:消息保持 claimed。
|
|
323
|
-
|
|
341
|
+
logger.exception(
|
|
342
|
+
"agent kernel command raised an unexpected exception: "
|
|
343
|
+
"agent_instance_id=%s session_id=%s command_id=%s "
|
|
344
|
+
"command_type=%s error=%s: %s",
|
|
345
|
+
command.agent_instance_id,
|
|
346
|
+
command.session_id,
|
|
347
|
+
command.command_id,
|
|
348
|
+
command.command_type,
|
|
349
|
+
type(error).__name__,
|
|
350
|
+
error,
|
|
351
|
+
)
|
|
352
|
+
return WorkResult(
|
|
353
|
+
outcome="terminal_failure", message_id=message_id, error=error
|
|
354
|
+
)
|
|
324
355
|
|
|
325
356
|
try:
|
|
326
357
|
await self._store.complete_claim(message_id, expected_fence=fence)
|
|
327
|
-
except StaleFenceError:
|
|
328
|
-
return WorkResult(
|
|
358
|
+
except StaleFenceError as error:
|
|
359
|
+
return WorkResult(
|
|
360
|
+
outcome="terminal_failure", message_id=message_id, error=error
|
|
361
|
+
)
|
|
329
362
|
return WorkResult(outcome="completed", message_id=message_id, run_id=run_id)
|
|
330
363
|
|
|
331
364
|
async def _message_id_for(self, command: AgentControlCommand) -> str:
|
|
@@ -407,6 +440,11 @@ class AgentKernelWorker:
|
|
|
407
440
|
# durable run_id 优先传给 adapter;adapter 不认时以
|
|
408
441
|
# runtime_run_id 映射显式记录两个 ID 的对应关系。
|
|
409
442
|
metadata={
|
|
443
|
+
**(
|
|
444
|
+
{"session_context": command.payload["session_context"]}
|
|
445
|
+
if "session_context" in command.payload
|
|
446
|
+
else {}
|
|
447
|
+
),
|
|
410
448
|
"command_id": str(command.command_id),
|
|
411
449
|
"run_id": run_id,
|
|
412
450
|
**continuation_metadata,
|
|
@@ -746,7 +784,17 @@ class AgentKernelWorker:
|
|
|
746
784
|
)
|
|
747
785
|
else:
|
|
748
786
|
request_schema = dict(event.request.schema_)
|
|
749
|
-
|
|
787
|
+
# Codex maps the native JSON-RPC request id to a stable canonical
|
|
788
|
+
# interaction id for replay. The live client, however, indexes its
|
|
789
|
+
# pending callback by the original request id. Preserve that id as
|
|
790
|
+
# the provider target or SubmitInteraction can find the durable
|
|
791
|
+
# record but cannot wake the blocked Codex callback.
|
|
792
|
+
native_call_id = (
|
|
793
|
+
event.source.native_event_id
|
|
794
|
+
or event.source.native_item_id
|
|
795
|
+
or event.interaction_id
|
|
796
|
+
)
|
|
797
|
+
native_target = {"call_id": native_call_id}
|
|
750
798
|
for key in ("checkpoint_id", "thread_id"):
|
|
751
799
|
value = execution.handle.native_ref.get(key)
|
|
752
800
|
if value is not None:
|
|
@@ -812,7 +860,13 @@ class AgentKernelWorker:
|
|
|
812
860
|
kind=RESUME_TARGET_KINDS[target_dict["kind"]],
|
|
813
861
|
id=str(target_dict["id"]),
|
|
814
862
|
)
|
|
815
|
-
resumed = await adapter.resume(
|
|
863
|
+
resumed = await adapter.resume(
|
|
864
|
+
handle,
|
|
865
|
+
target,
|
|
866
|
+
AdapterResumePayload(
|
|
867
|
+
kind="free_text", session_context=command.payload.get("session_context")
|
|
868
|
+
),
|
|
869
|
+
)
|
|
816
870
|
execution = self._replace_handle(execution, resumed)
|
|
817
871
|
self._start_stream(
|
|
818
872
|
execution,
|
|
@@ -910,6 +964,7 @@ class AgentKernelWorker:
|
|
|
910
964
|
context = InteractionResolveContext(
|
|
911
965
|
adapter=execution.adapter,
|
|
912
966
|
handle=execution.handle,
|
|
967
|
+
session_context=command.payload.get("session_context"),
|
|
913
968
|
activation_id=activation.activation_id,
|
|
914
969
|
fencing_token=fence,
|
|
915
970
|
)
|