agentengine-sdk-python 0.8.3__py3-none-any.whl → 0.8.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +9 -8
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/RECORD +482 -245
- ksadk/_build_provenance.json +1 -1
- ksadk/api/client.py +105 -91
- ksadk/builders/code_builder.py +36 -9
- ksadk/builders/framework_requirements.py +2 -1
- ksadk/builders/ks3_uploader.py +36 -7
- ksadk/builders/managed_runtime_builder.py +1 -0
- ksadk/cli/__init__.py +32 -3
- ksadk/cli/cmd_managed_runtime.py +13 -1
- ksadk/cli/cmd_plugin.py +6 -1
- ksadk/cli/cmd_web.py +2 -5
- ksadk/cli/runtime_bootstrap.py +23 -1
- ksadk/codex/client.py +424 -96
- ksadk/codex/projection.py +24 -0
- ksadk/codex/runtime.py +56 -298
- ksadk/common/auth.py +16 -10
- ksadk/configs/env_registry.py +29 -1
- ksadk/conversations/message_projection.py +135 -14
- ksadk/conversations/projector.py +4 -6
- ksadk/conversations/runtime_invocation.py +5 -0
- ksadk/conversations/runtime_payloads.py +1 -0
- ksadk/conversations/runtime_preparation.py +30 -27
- ksadk/conversations/runtime_resume.py +50 -2
- ksadk/conversations/runtime_stream_events.py +5 -0
- ksadk/conversations/runtime_streaming.py +25 -7
- ksadk/deployment/env_forward.py +2 -2
- ksadk/deployment/providers/serverless.py +1 -1
- ksadk/events/adapters/_codex_validators.py +18 -7
- ksadk/events/adapters/langgraph.py +15 -1
- ksadk/events/canonical_store.py +3 -1
- ksadk/events/projections.py +1 -1
- ksadk/harness/config.py +2 -2
- ksadk/harness/runtime.py +27 -27
- ksadk/harness/tools.py +38 -13
- ksadk/interaction/provider.py +1 -0
- ksadk/interaction/providers/langgraph.py +1 -0
- ksadk/kernel/bootstrap.py +28 -4
- ksadk/kernel/ingress.py +15 -2
- ksadk/kernel/sqlite_store.py +27 -0
- ksadk/kernel/store.py +3 -0
- ksadk/kernel/worker.py +65 -10
- ksadk/knowledge_base/client.py +57 -27
- ksadk/mcp_runtime/__init__.py +12 -4
- ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
- ksadk/memory/adk/resilient_session_service.py +25 -17
- ksadk/memory/adk/short_term_memory.py +26 -9
- ksadk/memory/models.py +7 -4
- ksadk/memory/provider_resolver.py +3 -0
- ksadk/model_proxy/server.py +10 -5
- ksadk/plugins/__init__.py +4 -0
- ksadk/plugins/artifacts.py +275 -0
- ksadk/plugins/bridges/__init__.py +4 -2
- ksadk/plugins/bridges/codex.py +120 -13
- ksadk/plugins/bridges/dsh.py +340 -156
- ksadk/plugins/builtins.py +35 -36
- ksadk/plugins/bundle_security.py +28 -4
- ksadk/plugins/codex_manifest.py +983 -0
- ksadk/plugins/composition.py +8 -0
- ksadk/plugins/contracts.py +118 -0
- ksadk/plugins/delivery.py +153 -0
- ksadk/plugins/dsh_installation_digest.py +71 -0
- ksadk/plugins/dsh_toolchain.py +110 -21
- ksadk/plugins/ecosystem_probe.py +6 -6
- ksadk/plugins/host.py +102 -39
- ksadk/plugins/kernel_adapter.py +205 -0
- ksadk/plugins/providers/__init__.py +23 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
- ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
- ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
- ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
- ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
- ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
- ksadk/plugins/providers/codex.py +335 -69
- ksadk/plugins/providers/codex_native.py +368 -0
- ksadk/plugins/providers/codex_turn.py +301 -0
- ksadk/plugins/providers/dsh_capabilities.py +1389 -0
- ksadk/plugins/providers/dsh_mcp.py +467 -0
- ksadk/plugins/providers/harness.py +118 -113
- ksadk/plugins/providers/mcp_projection.py +150 -0
- ksadk/plugins/providers/platform_resources.py +657 -0
- ksadk/plugins/resolver.py +8 -1
- ksadk/resource_runtime/__init__.py +4 -0
- ksadk/resource_runtime/broker.py +616 -0
- ksadk/resource_runtime/build_artifacts.py +165 -0
- ksadk/resource_runtime/contracts.py +138 -0
- ksadk/resource_runtime/discovery_receipts.py +100 -0
- ksadk/resource_runtime/discovery_skills.py +172 -0
- ksadk/resource_runtime/errors.py +6 -0
- ksadk/resource_runtime/ipc.py +142 -0
- ksadk/resource_runtime/kernel_approval.py +165 -0
- ksadk/resource_runtime/knowledge.py +114 -0
- ksadk/resource_runtime/langgraph.py +94 -0
- ksadk/resource_runtime/leases.py +191 -0
- ksadk/resource_runtime/managed_projection.py +186 -0
- ksadk/resource_runtime/mcp_server.py +138 -0
- ksadk/resource_runtime/memory_provider.py +318 -0
- ksadk/resource_runtime/memory_receipts.py +34 -0
- ksadk/resource_runtime/operation_ledger.py +211 -0
- ksadk/resource_runtime/plugin_config.py +48 -0
- ksadk/resource_runtime/policy_authorization.py +54 -0
- ksadk/resource_runtime/process.py +110 -0
- ksadk/resource_runtime/skill_artifacts.py +153 -0
- ksadk/resource_runtime/skill_runtime.py +42 -0
- ksadk/resource_runtime/skill_workspace.py +118 -0
- ksadk/resource_runtime/skills.py +215 -0
- ksadk/resource_runtime/snapshots.py +180 -0
- ksadk/resource_runtime/socket_server.py +103 -0
- ksadk/resource_runtime/supervisor.py +380 -0
- ksadk/resource_runtime/worker.py +504 -0
- ksadk/runners/_langgraph_runner_streams.py +74 -6
- ksadk/runners/adk_runner.py +149 -11
- ksadk/runners/base_runner.py +29 -1
- ksadk/runners/langgraph_runner.py +475 -145
- ksadk/runtime/_runner_adapter/stream_mapping.py +142 -18
- ksadk/runtime/adapter.py +2 -0
- ksadk/runtime/conversation_execution.py +92 -16
- ksadk/runtime/executor.py +78 -2
- ksadk/runtime/factory.py +29 -273
- ksadk/runtime/framework_adapters.py +23 -0
- ksadk/runtime/preprocessing.py +10 -2
- ksadk/runtime/runner_adapter.py +73 -14
- ksadk/runtime_context.py +40 -2
- ksadk/sandbox/backends/e2b.py +52 -11
- ksadk/sandbox/backends/local_process.py +9 -0
- ksadk/sandbox/base.py +2 -0
- ksadk/sandbox/e2b_connection.py +66 -0
- ksadk/scheduler/sqlite_store.py +18 -0
- ksadk/server/composition.py +2 -0
- ksadk/server/factory.py +5 -0
- ksadk/server/persistence_capability.py +516 -0
- ksadk/server/routes/control.py +210 -46
- ksadk/server/routes/dependencies.py +15 -0
- ksadk/server/routes/models.py +47 -4
- ksadk/server/routes/projection.py +252 -12
- ksadk/server/routes/sessions.py +284 -107
- ksadk/server/routes/streaming.py +43 -9
- ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-b4C7upmO.js} +3 -3
- ksadk/server/static/assets/{MathMessageMarkdown-D9uB55Oh.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
- ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-BEBN4Ksz.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
- ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-bTohInsS.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
- ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
- ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
- ksadk/server/static/assets/{chunk-5VM5RSS4-bZ7ws-8m.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
- ksadk/server/static/assets/{cose-bilkent-JH36ORCC-CkonRdAS.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
- ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-UBpgon5q.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
- ksadk/server/static/assets/{dist-DdRBIceA.js → dist-B2_CVgKv.js} +1 -1
- ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-B3FR1SKK.js} +1 -1
- ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-BIr4DSRq.js} +1 -1
- ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-BgV_owcB.js} +1 -1
- ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-Bj730Ib4.js} +1 -1
- ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-BnaTiyzN.js} +1 -1
- ksadk/server/static/assets/{dist-C71CsujO.js → dist-C1NMAY5a.js} +1 -1
- ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-C5_ZAZsG.js} +1 -1
- ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-CB9iJrvg.js} +1 -1
- ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CFzsn6BG.js} +1 -1
- ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-Cf125P_m.js} +1 -1
- ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-ClYUxfeK.js} +1 -1
- ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-DFD6Qa6T.js} +1 -1
- ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DVCOWtha.js} +1 -1
- ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-D_ctSS2i.js} +1 -1
- ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-DiixqL0J.js} +1 -1
- ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-DoVSwoDb.js} +1 -1
- ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-DvFK7p5S.js} +1 -1
- ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-QfkEHOlb.js} +1 -1
- ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-btbmmX5O.js} +1 -1
- ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-fBO2v5Kt.js} +1 -1
- ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-ufY3F5p6.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
- ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
- ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
- ksadk/server/static/assets/index-DcTML1Up.css +2 -0
- ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
- ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
- ksadk/server/static/assets/{infoDiagram-RXCK75RN-CgoyWiDR.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
- ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-B4weu383.js} +1 -1
- ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-V-MgYHW1.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-CBijEX_c.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
- ksadk/server/static/assets/{pegDiagram-XKGWAZYB-BQVc9ia_.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
- ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
- ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
- ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
- ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
- ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
- ksadk/server/static/assets/{vennDiagram-4TSXK5OY-EnNl0DE7.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
- ksadk/server/static/index.html +2 -2
- ksadk/session_context.py +66 -0
- ksadk/sessions/__init__.py +11 -21
- ksadk/sessions/_local_service_sync.py +263 -1
- ksadk/sessions/base.py +176 -0
- ksadk/sessions/errors.py +4 -0
- ksadk/sessions/in_memory.py +309 -19
- ksadk/sessions/local_service.py +83 -1
- ksadk/sessions/persistence.py +275 -0
- ksadk/sessions/postgres_service.py +358 -0
- ksadk/sessions/resilience.py +8 -0
- ksadk/sessions/resilient.py +362 -4
- ksadk/sessions/topology.py +135 -0
- ksadk/skills/models.py +26 -4
- ksadk/skills/package_store.py +186 -38
- ksadk/skills/runtime/agent.py +31 -6
- ksadk/skills/runtime/artifact_delivery.py +139 -0
- ksadk/skills/runtime/backends/e2b.py +98 -6
- ksadk/skills/runtime/backends/local.py +73 -8
- ksadk/skills/runtime/base.py +3 -0
- ksadk/skills/runtime/executor.py +2 -0
- ksadk/skills/runtime/loader.py +10 -2
- ksadk/skills/runtime/pinned.py +114 -0
- ksadk/skills/runtime/request.py +31 -0
- ksadk/skills/service_client.py +167 -28
- ksadk/studio/api.py +224 -42
- ksadk/studio/api_catalog_routes.py +18 -0
- ksadk/studio/api_plugin_routes.py +526 -95
- ksadk/studio/api_resource_connections.py +183 -0
- ksadk/studio/authoring_coordinator.py +19 -14
- ksadk/studio/builder.py +76 -0
- ksadk/studio/cloud.py +342 -104
- ksadk/studio/cloud_shared_web.py +565 -0
- ksadk/studio/codex_agent_service.py +128 -26
- ksadk/studio/codex_builder.py +241 -2
- ksadk/studio/codex_credentials.py +90 -0
- ksadk/studio/codex_manifest.py +31 -4
- ksadk/studio/codex_plugin_store.py +746 -0
- ksadk/studio/codex_provider_build.py +231 -0
- ksadk/studio/codex_run.py +184 -25
- ksadk/studio/compatibility_report.py +12 -1
- ksadk/studio/compiler.py +78 -14
- ksadk/studio/contracts.py +132 -6
- ksadk/studio/dsh_application.py +137 -0
- ksadk/studio/dsh_capability_service.py +1107 -0
- ksadk/studio/dsh_models.py +59 -0
- ksadk/studio/dsh_provider_registration.py +320 -13
- ksadk/studio/hosted_kernel.py +88 -13
- ksadk/studio/mcp_runtime.py +11 -3
- ksadk/studio/model_client.py +2 -2
- ksadk/studio/plugin_composition.py +190 -23
- ksadk/studio/plugin_kernel_adapter.py +12 -112
- ksadk/studio/plugin_runtime.py +224 -45
- ksadk/studio/resource_authority.py +637 -0
- ksadk/studio/resource_binding_validation.py +77 -0
- ksadk/studio/resource_build_admission.py +196 -0
- ksadk/studio/resource_build_materializer.py +149 -0
- ksadk/studio/resource_catalog.py +143 -2
- ksadk/studio/resource_connections.py +220 -0
- ksadk/studio/run_service.py +462 -52
- ksadk/studio/runtime_source.py +15 -7
- ksadk/studio/scheduler_assistant.py +317 -0
- ksadk/studio/scheduler_runtime.py +9 -0
- ksadk/studio/scheduler_service.py +3 -0
- ksadk/studio/service.py +490 -44
- ksadk/studio/shared_web.py +446 -62
- ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
- ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
- ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
- ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
- ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
- ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
- ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
- ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
- ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
- ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
- ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
- ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
- ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
- ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
- ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
- ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
- ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
- ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
- ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
- ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
- ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
- ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
- ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
- ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
- ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
- ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
- ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
- ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
- ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
- ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
- ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
- ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
- ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
- ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
- ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
- ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
- ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
- ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
- ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
- ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
- ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
- ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
- ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
- ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
- ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
- ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
- ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
- ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
- ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
- ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
- ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
- ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
- ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
- ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
- ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
- ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
- ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
- ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
- ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
- ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
- ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
- ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
- ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
- ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
- ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
- ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
- ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
- ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
- ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
- ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
- ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
- ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
- ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
- ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
- ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
- ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
- ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
- ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
- ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
- ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
- ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
- ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
- ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
- ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
- ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
- ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
- ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
- ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
- ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
- ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
- ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
- ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
- ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
- ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
- ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
- ksadk/studio/static/index.html +2 -2
- ksadk/version.py +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +0 -1
- ksadk/server/static/assets/channel-s354Yo6o.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +0 -1
- ksadk/server/static/assets/index-B2k_urY8.js +0 -241
- ksadk/server/static/assets/index-ILPt6IWF.css +0 -2
- ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +0 -1
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
- ksadk/studio/static/assets/index-DXs1Eq4M.css +0 -1
- ksadk/studio/static/assets/index-DeDqwTsD.js +0 -283
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
ksadk/codex/runtime.py
CHANGED
|
@@ -19,19 +19,15 @@
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
21
|
import asyncio
|
|
22
|
-
import base64
|
|
23
|
-
import binascii
|
|
24
|
-
import hashlib
|
|
25
22
|
import json
|
|
26
23
|
import logging
|
|
27
|
-
import re
|
|
28
24
|
import time
|
|
29
25
|
from collections.abc import Mapping
|
|
30
26
|
from dataclasses import dataclass, field
|
|
31
|
-
from pathlib import Path
|
|
32
27
|
from typing import Any, AsyncIterator, Optional
|
|
33
28
|
|
|
34
|
-
from ksadk.codex.client import CodexClient
|
|
29
|
+
from ksadk.codex.client import CodexClient, CodexPluginBootstrap
|
|
30
|
+
from ksadk.codex.projection import CodexTurnProjection
|
|
35
31
|
from ksadk.events.adapters.codex import CodexAdapterContext, CodexEventAdapter
|
|
36
32
|
from ksadk.events.canonical import (
|
|
37
33
|
ErrorInfo,
|
|
@@ -108,12 +104,25 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
108
104
|
sandbox_read_only: bool = True,
|
|
109
105
|
turn_timeout_seconds: Optional[float] = None,
|
|
110
106
|
bound_skill_paths: Mapping[str, str] | None = None,
|
|
107
|
+
plugin_bootstrap: CodexPluginBootstrap | None = None,
|
|
108
|
+
turn_projector: CodexTurnProjection | None = None,
|
|
111
109
|
) -> None:
|
|
112
110
|
super().__init__(_CodexAsBaseRuntime(client))
|
|
113
111
|
self._client = client
|
|
114
112
|
self._sandbox_read_only = sandbox_read_only
|
|
115
113
|
self._turn_timeout_seconds = turn_timeout_seconds
|
|
116
|
-
|
|
114
|
+
if turn_projector is not None and bound_skill_paths:
|
|
115
|
+
raise ValueError("Skill paths must be owned by the supplied turn projector")
|
|
116
|
+
if turn_projector is None:
|
|
117
|
+
# Compatibility for direct SDK construction; production factories inject
|
|
118
|
+
# the same official projector, never a second input implementation.
|
|
119
|
+
from ksadk.plugins.providers.codex_turn import CodexTurnProjector
|
|
120
|
+
|
|
121
|
+
turn_projector = CodexTurnProjector(bound_skill_paths=bound_skill_paths)
|
|
122
|
+
self._turn_projector = turn_projector
|
|
123
|
+
self._plugin_bootstrap = plugin_bootstrap
|
|
124
|
+
self._plugin_bootstrap_lock = asyncio.Lock()
|
|
125
|
+
self._plugins_bootstrapped = False
|
|
117
126
|
self._threads: dict[str, _CodexThread] = {}
|
|
118
127
|
self._requests: dict[str, StartRequest] = {}
|
|
119
128
|
self._known_threads: set[str] = set()
|
|
@@ -155,27 +164,13 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
155
164
|
# ---- 六动词 ----
|
|
156
165
|
|
|
157
166
|
async def start(self, request: StartRequest) -> RunHandle:
|
|
167
|
+
# A failed bootstrap must leave no native thread behind. The success
|
|
168
|
+
# bit is set only after marketplace/add, every plugin/install, and the
|
|
169
|
+
# enabled-inventory reconciliation all complete on this same client.
|
|
170
|
+
await self._bootstrap_plugins_once()
|
|
158
171
|
# 新 thread 由后端分配真实 thread_id(thread_start);metadata 携带的 thread_id
|
|
159
172
|
# 表示接入既有 thread(resume 语义,run_turn 时按 resume 接入)。
|
|
160
|
-
|
|
161
|
-
skills = request.config.get("skills") if request.config else None
|
|
162
|
-
if isinstance(skills, list):
|
|
163
|
-
projected_skills = []
|
|
164
|
-
for item in skills:
|
|
165
|
-
if not isinstance(item, dict):
|
|
166
|
-
continue
|
|
167
|
-
name = str(item.get("name") or "").strip()
|
|
168
|
-
projected_skills.append(
|
|
169
|
-
{
|
|
170
|
-
**item,
|
|
171
|
-
"path": self._bound_skill_paths.get(
|
|
172
|
-
name, str(item.get("path") or "")
|
|
173
|
-
),
|
|
174
|
-
}
|
|
175
|
-
)
|
|
176
|
-
request = request.model_copy(
|
|
177
|
-
update={"config": {**request.config, "skills": projected_skills}}
|
|
178
|
-
)
|
|
173
|
+
request = self._turn_projector.prepare(request)
|
|
179
174
|
provided = request.metadata.get("thread_id")
|
|
180
175
|
if provided:
|
|
181
176
|
thread_id = str(provided)
|
|
@@ -219,6 +214,16 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
219
214
|
native_ref={"thread_id": thread_id, "user_id": request.user_id},
|
|
220
215
|
)
|
|
221
216
|
|
|
217
|
+
async def _bootstrap_plugins_once(self) -> None:
|
|
218
|
+
config = self._plugin_bootstrap
|
|
219
|
+
if config is None or self._plugins_bootstrapped:
|
|
220
|
+
return
|
|
221
|
+
async with self._plugin_bootstrap_lock:
|
|
222
|
+
if self._plugins_bootstrapped:
|
|
223
|
+
return
|
|
224
|
+
await self._client.bootstrap_plugins(config)
|
|
225
|
+
self._plugins_bootstrapped = True
|
|
226
|
+
|
|
222
227
|
def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
|
|
223
228
|
return self._stream_events(handle)
|
|
224
229
|
|
|
@@ -298,7 +303,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
298
303
|
elif payload.kind == "hitl_answer":
|
|
299
304
|
resolved = await self._client.resolve_interaction(
|
|
300
305
|
payload.call_id,
|
|
301
|
-
|
|
306
|
+
raw,
|
|
302
307
|
)
|
|
303
308
|
else:
|
|
304
309
|
raise ValueError("Codex live submit requires approval_decision or hitl_answer")
|
|
@@ -378,6 +383,12 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
378
383
|
self._do_not_persist.add(handle.run_id)
|
|
379
384
|
await self.close_all()
|
|
380
385
|
|
|
386
|
+
async def compact_session(self, thread_id: str, config: dict[str, Any]) -> dict[str, Any]:
|
|
387
|
+
"""Compact an existing native session using this build's client."""
|
|
388
|
+
await self._bootstrap_plugins_once()
|
|
389
|
+
await self._client.resume_thread(thread_id, config)
|
|
390
|
+
return await self._client.compact_thread(thread_id)
|
|
391
|
+
|
|
381
392
|
async def close_all(self) -> None:
|
|
382
393
|
"""Dispose every thread and the activation-owned App Server process.
|
|
383
394
|
|
|
@@ -391,9 +402,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
391
402
|
return
|
|
392
403
|
self._closed = True
|
|
393
404
|
threads = tuple(self._threads.values())
|
|
394
|
-
active_threads = tuple(
|
|
395
|
-
thread for thread in threads if thread.streaming and not thread.done
|
|
396
|
-
)
|
|
405
|
+
active_threads = tuple(thread for thread in threads if thread.streaming and not thread.done)
|
|
397
406
|
for thread in active_threads:
|
|
398
407
|
thread.interrupt_event.set()
|
|
399
408
|
try:
|
|
@@ -401,7 +410,10 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
401
410
|
await self._client.interrupt_active_turn(thread.thread_id)
|
|
402
411
|
finally:
|
|
403
412
|
# AsyncCodex.close owns terminate/wait/kill for the app-server child.
|
|
404
|
-
|
|
413
|
+
try:
|
|
414
|
+
await self._client.close()
|
|
415
|
+
finally:
|
|
416
|
+
self._turn_projector.close()
|
|
405
417
|
thread_ids = {
|
|
406
418
|
*self._known_threads,
|
|
407
419
|
*self._threads,
|
|
@@ -439,13 +451,10 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
439
451
|
|
|
440
452
|
request = thread.__dict__.get("_start_request")
|
|
441
453
|
resume_state = thread.__dict__.get("_resume")
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
else:
|
|
447
|
-
prompt = ""
|
|
448
|
-
run_input = _build_run_input(request, prompt)
|
|
454
|
+
projected = self._turn_projector.project(
|
|
455
|
+
request, resume_state.get("payload") if resume_state is not None else None,
|
|
456
|
+
)
|
|
457
|
+
run_input = projected.input
|
|
449
458
|
thread.streaming = True
|
|
450
459
|
thread.turn_id = thread.turn_id or f"turn_{thread.thread_id}"
|
|
451
460
|
try:
|
|
@@ -480,14 +489,12 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
480
489
|
) -> AsyncIterator[RuntimeEvent]:
|
|
481
490
|
request = thread.__dict__.get("_start_request") or thread.__dict__.get("_request_config")
|
|
482
491
|
adapter = CodexEventAdapter(
|
|
483
|
-
known_thread_ids=(thread.thread_id,)
|
|
484
|
-
if thread.continuation_preexisting
|
|
485
|
-
else (),
|
|
492
|
+
known_thread_ids=(thread.thread_id,) if thread.continuation_preexisting else (),
|
|
486
493
|
)
|
|
487
494
|
context = CodexAdapterContext(run_id=self._event_run_id(handle))
|
|
488
495
|
run_config: dict[str, Any] = {"sandbox_read_only": self._sandbox_read_only}
|
|
489
496
|
if request is not None and request.config:
|
|
490
|
-
for key in ("sandbox", "approval_mode", "summary", "collaboration_mode"):
|
|
497
|
+
for key in ("sandbox", "approval_mode", "summary", "collaboration_mode", "effort"):
|
|
491
498
|
value = request.config.get(key)
|
|
492
499
|
if key == "approval_mode" and value == "manual":
|
|
493
500
|
continue
|
|
@@ -554,8 +561,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
554
561
|
# finish promptly, close the transport *before* awaiting
|
|
555
562
|
# the waiter so MessageRouter.fail_all can release it.
|
|
556
563
|
drain_deadline = (
|
|
557
|
-
asyncio.get_running_loop().time()
|
|
558
|
-
+ _INTERRUPT_DRAIN_TIMEOUT_SECONDS
|
|
564
|
+
asyncio.get_running_loop().time() + _INTERRUPT_DRAIN_TIMEOUT_SECONDS
|
|
559
565
|
)
|
|
560
566
|
while True:
|
|
561
567
|
drain_remaining = max(
|
|
@@ -599,9 +605,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
599
605
|
# autoApprovalReview 不产生 canonical 事件(adapter 静默),但
|
|
600
606
|
# cancel 级联丢弃审批的契约依赖 runtime 的 pending 跟踪。
|
|
601
607
|
chunk_method = (
|
|
602
|
-
str((chunk or {}).get("method") or "")
|
|
603
|
-
if isinstance(chunk, dict)
|
|
604
|
-
else ""
|
|
608
|
+
str((chunk or {}).get("method") or "") if isinstance(chunk, dict) else ""
|
|
605
609
|
)
|
|
606
610
|
if chunk_method in {
|
|
607
611
|
"item/autoApprovalReview/started",
|
|
@@ -609,9 +613,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
609
613
|
}:
|
|
610
614
|
review_params = chunk.get("params") or {}
|
|
611
615
|
review_id = str(
|
|
612
|
-
review_params.get("reviewId")
|
|
613
|
-
or review_params.get("review_id")
|
|
614
|
-
or ""
|
|
616
|
+
review_params.get("reviewId") or review_params.get("review_id") or ""
|
|
615
617
|
)
|
|
616
618
|
if review_id:
|
|
617
619
|
if chunk_method.endswith("started"):
|
|
@@ -685,9 +687,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
685
687
|
framework="codex",
|
|
686
688
|
native_run_id=handle.run_id,
|
|
687
689
|
metadata={
|
|
688
|
-
"agent_id": (
|
|
689
|
-
str(request.agent_id or "codex") if request is not None else "codex"
|
|
690
|
-
),
|
|
690
|
+
"agent_id": (str(request.agent_id or "codex") if request is not None else "codex"),
|
|
691
691
|
"user_id": (
|
|
692
692
|
request.user_id
|
|
693
693
|
if request is not None
|
|
@@ -712,8 +712,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
712
712
|
"user_id": str(getattr(request, "user_id", "") or "user"),
|
|
713
713
|
"session_id": str(getattr(request, "session_id", "") or ""),
|
|
714
714
|
"invocation_id": str(
|
|
715
|
-
(getattr(request, "metadata", None) or {}).get("invocation_id")
|
|
716
|
-
or ""
|
|
715
|
+
(getattr(request, "metadata", None) or {}).get("invocation_id") or ""
|
|
717
716
|
),
|
|
718
717
|
}
|
|
719
718
|
merged = {**caller_scope, **dict(event.source.metadata or {})}
|
|
@@ -748,9 +747,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
748
747
|
"source": self._make_source(handle),
|
|
749
748
|
}
|
|
750
749
|
|
|
751
|
-
def _make_run_canceled(
|
|
752
|
-
self, handle: RunHandle, *, reason: str | None = None
|
|
753
|
-
) -> RunCanceled:
|
|
750
|
+
def _make_run_canceled(self, handle: RunHandle, *, reason: str | None = None) -> RunCanceled:
|
|
754
751
|
framework = "codex"
|
|
755
752
|
run_id = self._event_run_id(handle)
|
|
756
753
|
scope_id = stable_scope_id(framework, run_id)
|
|
@@ -786,9 +783,7 @@ class CodexRuntimeAdapter(RuntimeAdapter):
|
|
|
786
783
|
reason=reason,
|
|
787
784
|
)
|
|
788
785
|
|
|
789
|
-
def _make_run_failed(
|
|
790
|
-
self, handle: RunHandle, error_message: str
|
|
791
|
-
) -> RunFailed:
|
|
786
|
+
def _make_run_failed(self, handle: RunHandle, error_message: str) -> RunFailed:
|
|
792
787
|
framework = "codex"
|
|
793
788
|
run_id = self._event_run_id(handle)
|
|
794
789
|
scope_id = stable_scope_id(framework, run_id)
|
|
@@ -842,243 +837,6 @@ async def _anext_or_stop(gen: AsyncIterator[Any]) -> Any:
|
|
|
842
837
|
return _STREAM_STOP
|
|
843
838
|
|
|
844
839
|
|
|
845
|
-
def _resume_prompt(payload: Optional[ResumePayload]) -> Any:
|
|
846
|
-
if payload is None:
|
|
847
|
-
return ""
|
|
848
|
-
if isinstance(payload.data, str):
|
|
849
|
-
return payload.data
|
|
850
|
-
return json.dumps(payload.data, ensure_ascii=False, sort_keys=True)
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
def _coerce_prompt_text(value: Any) -> Any:
|
|
854
|
-
"""把 canonical message 形态的 input 压成 SDK 可接受的文本。
|
|
855
|
-
|
|
856
|
-
``openai-codex`` 0.147 的 run input 只接受 TextInput/str;请求侧没有
|
|
857
|
-
conversation preprocessing 时 ``request.input`` 可能是
|
|
858
|
-
``[{role, content}]`` 历史列表,直接透传会 ``unsupported input item``。
|
|
859
|
-
"""
|
|
860
|
-
if isinstance(value, str) or value is None:
|
|
861
|
-
return value
|
|
862
|
-
if isinstance(value, dict):
|
|
863
|
-
content = value.get("content") if "role" in value else value.get("text")
|
|
864
|
-
if isinstance(content, str):
|
|
865
|
-
return content
|
|
866
|
-
if isinstance(content, dict):
|
|
867
|
-
text = content.get("text") or content.get("content")
|
|
868
|
-
if isinstance(text, str):
|
|
869
|
-
return text
|
|
870
|
-
return str(value)
|
|
871
|
-
if isinstance(value, list):
|
|
872
|
-
texts = [
|
|
873
|
-
text
|
|
874
|
-
for text in (_coerce_prompt_text(item) for item in value)
|
|
875
|
-
if isinstance(text, str) and text
|
|
876
|
-
]
|
|
877
|
-
return "\n".join(texts) if texts else str(value)
|
|
878
|
-
return str(value)
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
def _request_prompt(request: StartRequest) -> Any:
|
|
882
|
-
"""Render canonical conversation history for a native Codex turn.
|
|
883
|
-
|
|
884
|
-
只传 user 消息历史 + 当前 input,不传 assistant 的完整回复(避免 codex 复述历史)。
|
|
885
|
-
assistant 回复用简短摘要代替,仅维持对话结构。
|
|
886
|
-
"""
|
|
887
|
-
# A resumed Codex thread already owns its transcript. Re-sending Studio's
|
|
888
|
-
# transport-neutral history would duplicate every prior turn after refresh.
|
|
889
|
-
if str(request.metadata.get("thread_id") or "").strip():
|
|
890
|
-
return (
|
|
891
|
-
request.input
|
|
892
|
-
if _is_structured_turn_input(request.input)
|
|
893
|
-
else _coerce_prompt_text(request.input)
|
|
894
|
-
)
|
|
895
|
-
|
|
896
|
-
conversation = request.conversation_preprocessing()
|
|
897
|
-
if conversation is None or not conversation.messages:
|
|
898
|
-
# Keep native text/image/mention parts intact for _build_run_input().
|
|
899
|
-
# Flattening this list turns an image dict into user-visible text.
|
|
900
|
-
return (
|
|
901
|
-
request.input
|
|
902
|
-
if _is_structured_turn_input(request.input)
|
|
903
|
-
else _coerce_prompt_text(request.input)
|
|
904
|
-
)
|
|
905
|
-
|
|
906
|
-
lines: list[str] = []
|
|
907
|
-
for message in conversation.messages:
|
|
908
|
-
content = message.get("content")
|
|
909
|
-
if not isinstance(content, str):
|
|
910
|
-
continue
|
|
911
|
-
role = str(message.get("role") or "user").strip().lower()
|
|
912
|
-
if role == "assistant":
|
|
913
|
-
# 不传完整回复,只标注"已回复",避免 codex 复述
|
|
914
|
-
summary = content[:80] + ("..." if len(content) > 80 else "")
|
|
915
|
-
lines.append(f"[上一轮已回复: {summary}]")
|
|
916
|
-
elif role == "user":
|
|
917
|
-
lines.append(f"User: {content}")
|
|
918
|
-
return "\n".join(lines) or request.input
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
def _is_structured_turn_input(value: Any) -> bool:
|
|
922
|
-
return isinstance(value, list) and any(
|
|
923
|
-
isinstance(item, dict) and isinstance(item.get("type"), str)
|
|
924
|
-
for item in value
|
|
925
|
-
)
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
def _build_run_input(request: Optional[StartRequest], prompt: Any) -> Any:
|
|
929
|
-
"""Compose Codex skills and native text/image/mention turn input."""
|
|
930
|
-
try:
|
|
931
|
-
from openai_codex import ImageInput, LocalImageInput, MentionInput, SkillInput, TextInput
|
|
932
|
-
except ImportError:
|
|
933
|
-
return prompt
|
|
934
|
-
skills: list[SkillInput] = []
|
|
935
|
-
if request is not None:
|
|
936
|
-
raw = request.config.get("skills") if request.config else None
|
|
937
|
-
if isinstance(raw, list):
|
|
938
|
-
for item in raw:
|
|
939
|
-
if not isinstance(item, dict):
|
|
940
|
-
continue
|
|
941
|
-
name = str(item.get("name") or "").strip()
|
|
942
|
-
path = str(item.get("path") or "").strip()
|
|
943
|
-
if name and path:
|
|
944
|
-
skills.append(SkillInput(name=name, path=path))
|
|
945
|
-
native_items: list[Any] = []
|
|
946
|
-
raw_input = request.input if request is not None else prompt
|
|
947
|
-
if isinstance(raw_input, list):
|
|
948
|
-
text_replaced = False
|
|
949
|
-
for item in raw_input:
|
|
950
|
-
if not isinstance(item, dict):
|
|
951
|
-
continue
|
|
952
|
-
kind = str(item.get("type") or "")
|
|
953
|
-
if not kind and "role" in item:
|
|
954
|
-
# canonical conversation message({role, content});当前 input
|
|
955
|
-
# 已由 prompt(或 conversation preprocessing)承载,跳过历史项。
|
|
956
|
-
continue
|
|
957
|
-
if kind in {"text", "input_text"}:
|
|
958
|
-
text = str(
|
|
959
|
-
prompt
|
|
960
|
-
if not text_replaced and isinstance(prompt, str)
|
|
961
|
-
else item.get("text") or ""
|
|
962
|
-
)
|
|
963
|
-
text_replaced = True
|
|
964
|
-
if text:
|
|
965
|
-
native_items.append(TextInput(text=text))
|
|
966
|
-
elif kind in {"image", "input_image"} and (
|
|
967
|
-
item.get("url") or item.get("image_url")
|
|
968
|
-
):
|
|
969
|
-
native_items.append(
|
|
970
|
-
ImageInput(url=str(item.get("url") or item.get("image_url")))
|
|
971
|
-
)
|
|
972
|
-
elif kind == "localImage" and item.get("path"):
|
|
973
|
-
native_items.append(LocalImageInput(path=str(item["path"])))
|
|
974
|
-
elif kind == "input_file" and (
|
|
975
|
-
item.get("file_data")
|
|
976
|
-
or str(item.get("file_url") or "").startswith("data:")
|
|
977
|
-
):
|
|
978
|
-
file_path = _materialize_inline_file(
|
|
979
|
-
str(item.get("file_data") or item.get("file_url")),
|
|
980
|
-
str(item.get("filename") or "attachment"),
|
|
981
|
-
)
|
|
982
|
-
if file_path is not None:
|
|
983
|
-
# App Server's ``mention`` input is presentation metadata:
|
|
984
|
-
# current Codex versions do not include it in the model's
|
|
985
|
-
# user message. Always add an explicit model-visible
|
|
986
|
-
# attachment context as well. Small textual files are
|
|
987
|
-
# inlined deterministically; binary/large files expose a
|
|
988
|
-
# sandbox-readable path that Codex can inspect with tools.
|
|
989
|
-
native_items.append(
|
|
990
|
-
TextInput(text=_attachment_context_text(file_path, item))
|
|
991
|
-
)
|
|
992
|
-
native_items.append(
|
|
993
|
-
MentionInput(name=file_path.name, path=str(file_path))
|
|
994
|
-
)
|
|
995
|
-
elif kind == "mention" and item.get("path"):
|
|
996
|
-
native_items.append(
|
|
997
|
-
MentionInput(
|
|
998
|
-
name=str(item.get("name") or item["path"]),
|
|
999
|
-
path=str(item["path"]),
|
|
1000
|
-
)
|
|
1001
|
-
)
|
|
1002
|
-
else:
|
|
1003
|
-
text = prompt if isinstance(prompt, str) else str(prompt or "")
|
|
1004
|
-
if text:
|
|
1005
|
-
native_items.append(TextInput(text=text))
|
|
1006
|
-
combined = [*skills, *native_items]
|
|
1007
|
-
if not combined:
|
|
1008
|
-
return prompt
|
|
1009
|
-
if len(combined) == 1 and isinstance(combined[0], TextInput) and not skills:
|
|
1010
|
-
return combined[0].text
|
|
1011
|
-
return combined
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
def _materialize_inline_file(data_url: str, filename: str) -> Path | None:
|
|
1015
|
-
"""Materialize a bounded Studio inline attachment for native Codex."""
|
|
1016
|
-
|
|
1017
|
-
match = re.fullmatch(r"data:([^;,]+)?;base64,([A-Za-z0-9+/=\s]+)", data_url)
|
|
1018
|
-
encoded = match.group(2) if match is not None else data_url.strip()
|
|
1019
|
-
try:
|
|
1020
|
-
payload = base64.b64decode(encoded, validate=True)
|
|
1021
|
-
except (ValueError, binascii.Error):
|
|
1022
|
-
return None
|
|
1023
|
-
if not payload or len(payload) > 10 * 1024 * 1024:
|
|
1024
|
-
return None
|
|
1025
|
-
safe_name = re.sub(r"[^A-Za-z0-9._-]+", "-", Path(filename).name).strip(".-")
|
|
1026
|
-
safe_name = safe_name[:120] or "attachment"
|
|
1027
|
-
digest = hashlib.sha256(payload).hexdigest()
|
|
1028
|
-
path = Path("/tmp/ksadk-codex-attachments") / digest / safe_name
|
|
1029
|
-
path.parent.mkdir(parents=True, exist_ok=True)
|
|
1030
|
-
if not path.exists():
|
|
1031
|
-
path.write_bytes(payload)
|
|
1032
|
-
return path
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
_MAX_INLINE_ATTACHMENT_TEXT_BYTES = 64 * 1024
|
|
1036
|
-
_TEXT_ATTACHMENT_SUFFIXES = {
|
|
1037
|
-
".csv",
|
|
1038
|
-
".html",
|
|
1039
|
-
".htm",
|
|
1040
|
-
".ini",
|
|
1041
|
-
".json",
|
|
1042
|
-
".jsonl",
|
|
1043
|
-
".log",
|
|
1044
|
-
".md",
|
|
1045
|
-
".py",
|
|
1046
|
-
".rst",
|
|
1047
|
-
".toml",
|
|
1048
|
-
".tsv",
|
|
1049
|
-
".txt",
|
|
1050
|
-
".xml",
|
|
1051
|
-
".yaml",
|
|
1052
|
-
".yml",
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
def _attachment_context_text(path: Path, item: Mapping[str, Any]) -> str:
|
|
1057
|
-
"""Build model-visible context for a materialized Responses input file."""
|
|
1058
|
-
|
|
1059
|
-
name = str(item.get("filename") or path.name).replace('"', "'")
|
|
1060
|
-
inline_data = item.get("inlineData")
|
|
1061
|
-
inline_mime = inline_data.get("mimeType") if isinstance(inline_data, Mapping) else None
|
|
1062
|
-
mime_type = str(item.get("mime_type") or inline_mime or "").strip().lower()
|
|
1063
|
-
source = str(item.get("file_data") or item.get("file_url") or "")
|
|
1064
|
-
data_url_match = re.match(r"data:([^;,]+)", source)
|
|
1065
|
-
if not mime_type and data_url_match is not None:
|
|
1066
|
-
mime_type = data_url_match.group(1).strip().lower()
|
|
1067
|
-
is_text = mime_type.startswith("text/") or path.suffix.lower() in _TEXT_ATTACHMENT_SUFFIXES
|
|
1068
|
-
header = f'<uploaded_attachment name="{name}" path="{path}">'
|
|
1069
|
-
if not is_text:
|
|
1070
|
-
return (
|
|
1071
|
-
f"{header}\n"
|
|
1072
|
-
"The uploaded file is available at the path above. Read it with an appropriate "
|
|
1073
|
-
"tool before answering questions about its contents.\n"
|
|
1074
|
-
"</uploaded_attachment>"
|
|
1075
|
-
)
|
|
1076
|
-
|
|
1077
|
-
raw = path.read_bytes()
|
|
1078
|
-
truncated = len(raw) > _MAX_INLINE_ATTACHMENT_TEXT_BYTES
|
|
1079
|
-
text = raw[:_MAX_INLINE_ATTACHMENT_TEXT_BYTES].decode("utf-8", errors="replace")
|
|
1080
|
-
suffix = "\n[attachment content truncated]" if truncated else ""
|
|
1081
|
-
return f"{header}\n{text}{suffix}\n</uploaded_attachment>"
|
|
1082
840
|
|
|
1083
841
|
|
|
1084
842
|
__all__ = ["CodexRuntimeAdapter"]
|
ksadk/common/auth.py
CHANGED
|
@@ -49,6 +49,8 @@ class AWSV4Auth:
|
|
|
49
49
|
secret_access_key: str = "",
|
|
50
50
|
region: str = "cn-beijing-6",
|
|
51
51
|
service: str = "aicp",
|
|
52
|
+
*,
|
|
53
|
+
allow_env_fallback: bool = True,
|
|
52
54
|
):
|
|
53
55
|
"""初始化签名器
|
|
54
56
|
|
|
@@ -57,17 +59,21 @@ class AWSV4Auth:
|
|
|
57
59
|
secret_access_key: 访问密钥 (SK),默认从环境变量读取
|
|
58
60
|
region: 区域 ID (如 cn-beijing-6)
|
|
59
61
|
service: 服务名称 (如 kmr, aicp, iam 等)
|
|
62
|
+
allow_env_fallback: 显式运行时连接设为 False,禁止继承宿主凭证
|
|
60
63
|
"""
|
|
61
|
-
self.access_key_id =
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
self.access_key_id = access_key_id
|
|
65
|
+
self.secret_access_key = secret_access_key
|
|
66
|
+
if allow_env_fallback:
|
|
67
|
+
self.access_key_id = (
|
|
68
|
+
self.access_key_id
|
|
69
|
+
or os.environ.get("KSYUN_ACCESS_KEY")
|
|
70
|
+
or os.environ.get("KS3_ACCESS_KEY", "")
|
|
71
|
+
)
|
|
72
|
+
self.secret_access_key = (
|
|
73
|
+
self.secret_access_key
|
|
74
|
+
or os.environ.get("KSYUN_SECRET_KEY")
|
|
75
|
+
or os.environ.get("KS3_SECRET_KEY", "")
|
|
76
|
+
)
|
|
71
77
|
self.region = region
|
|
72
78
|
self.service = service
|
|
73
79
|
|
ksadk/configs/env_registry.py
CHANGED
|
@@ -369,6 +369,12 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
|
|
|
369
369
|
sensitive=True,
|
|
370
370
|
),
|
|
371
371
|
EnvVarSpec("KSADK_KB_TOP_K", "knowledge_base", "Knowledge-base retrieval result count.", "5"),
|
|
372
|
+
EnvVarSpec(
|
|
373
|
+
"KSADK_CHECKPOINT_DSN",
|
|
374
|
+
"sessions",
|
|
375
|
+
"Framework-agnostic PostgreSQL checkpoint DSN.",
|
|
376
|
+
sensitive=True,
|
|
377
|
+
),
|
|
372
378
|
EnvVarSpec(
|
|
373
379
|
"KSADK_LANGGRAPH_CHECKPOINT_DSN",
|
|
374
380
|
"sessions",
|
|
@@ -384,6 +390,11 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
|
|
|
384
390
|
),
|
|
385
391
|
"false",
|
|
386
392
|
),
|
|
393
|
+
EnvVarSpec(
|
|
394
|
+
"KSADK_LANGGRAPH_POSTGRES_REQUIREMENTS",
|
|
395
|
+
"builders",
|
|
396
|
+
"Internal bundled LangGraph PostgreSQL checkpointer requirement constant.",
|
|
397
|
+
),
|
|
387
398
|
EnvVarSpec(
|
|
388
399
|
"KSADK_LOCAL_SKILLS_DIR", "skills", "Local directory containing extracted Skill packages."
|
|
389
400
|
),
|
|
@@ -461,6 +472,18 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
|
|
|
461
472
|
"model_proxy",
|
|
462
473
|
"Comma-separated model allowlist for the experimental model proxy.",
|
|
463
474
|
),
|
|
475
|
+
EnvVarSpec(
|
|
476
|
+
"KSADK_PERSISTENCE_PROBE_CACHE_TTL",
|
|
477
|
+
"sessions",
|
|
478
|
+
"PostgreSQL persistence readiness cache TTL seconds.",
|
|
479
|
+
"30",
|
|
480
|
+
),
|
|
481
|
+
EnvVarSpec(
|
|
482
|
+
"KSADK_PERSISTENCE_PROBE_TIMEOUT",
|
|
483
|
+
"sessions",
|
|
484
|
+
"PostgreSQL persistence readiness timeout seconds.",
|
|
485
|
+
"2",
|
|
486
|
+
),
|
|
464
487
|
EnvVarSpec("KSADK_PG_EVENTS_TABLE", "sessions", "Internal PostgreSQL events table constant."),
|
|
465
488
|
EnvVarSpec(
|
|
466
489
|
"KSADK_PG_SESSIONS_TABLE", "sessions", "Internal PostgreSQL sessions table constant."
|
|
@@ -498,6 +521,11 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
|
|
|
498
521
|
"skills",
|
|
499
522
|
"Comma-separated public Skill Space ids appended after user spaces.",
|
|
500
523
|
),
|
|
524
|
+
EnvVarSpec(
|
|
525
|
+
"KSADK_RESOURCE_IAM_ENDPOINT",
|
|
526
|
+
"platform_resources",
|
|
527
|
+
"Operator-owned IAM endpoint used to authorize Studio platform-resource bindings.",
|
|
528
|
+
),
|
|
501
529
|
EnvVarSpec(
|
|
502
530
|
"KSADK_RESPONSES_SESSION_HEADER",
|
|
503
531
|
"runners",
|
|
@@ -838,7 +866,7 @@ _ENV_VAR_REGISTRY_ITEMS: tuple[EnvVarSpec, ...] = (
|
|
|
838
866
|
"KSADK_WEB_VERSION",
|
|
839
867
|
"web",
|
|
840
868
|
"Published KsADK Web npm version used for a reproducible wheel build.",
|
|
841
|
-
"0.3.
|
|
869
|
+
"0.3.7",
|
|
842
870
|
),
|
|
843
871
|
EnvVarSpec(
|
|
844
872
|
"KSADK_WORKING_SET_MAX_FILES",
|