agentengine-sdk-python 0.8.2__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.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
- agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
- ksadk/_build_provenance.json +1 -0
- ksadk/agui/_agent_helpers.py +4 -0
- ksadk/api/client.py +108 -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 +4 -0
- ksadk/cli/__init__.py +38 -3
- ksadk/cli/cmd_managed_runtime.py +13 -1
- ksadk/cli/cmd_plugin.py +662 -0
- 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 +83 -283
- ksadk/common/auth.py +16 -10
- ksadk/configs/env_registry.py +59 -3
- ksadk/configs/settings.py +9 -0
- ksadk/context_engine/contributors.py +73 -8
- ksadk/conversations/__init__.py +19 -0
- ksadk/conversations/context.py +104 -24
- ksadk/conversations/contracts.py +266 -0
- ksadk/conversations/message_projection.py +154 -15
- ksadk/conversations/projector.py +614 -0
- ksadk/conversations/reducer.py +98 -0
- 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/_v1_compat/projection.py +2 -0
- ksadk/events/adapters/_codex_validators.py +18 -7
- ksadk/events/adapters/codex.py +190 -0
- ksadk/events/adapters/langgraph.py +15 -1
- ksadk/events/canonical_store.py +3 -1
- ksadk/events/projections.py +1 -1
- ksadk/harness/__init__.py +45 -35
- ksadk/harness/config.py +2 -2
- ksadk/harness/runtime.py +75 -16
- 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/contract_fingerprints.py +5 -4
- ksadk/kernel/contracts.py +8 -0
- ksadk/kernel/control.py +1 -0
- ksadk/kernel/ingress.py +36 -2
- ksadk/kernel/memory_store.py +1 -0
- ksadk/kernel/postgres_store.py +1 -0
- ksadk/kernel/sqlite_store.py +28 -0
- ksadk/kernel/store.py +3 -0
- ksadk/kernel/worker.py +76 -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/memory/providers/local_sqlite.py +7 -0
- ksadk/model_proxy/server.py +10 -5
- ksadk/plugins/__init__.py +171 -0
- ksadk/plugins/artifacts.py +275 -0
- ksadk/plugins/bridges/__init__.py +47 -0
- ksadk/plugins/bridges/codex.py +659 -0
- ksadk/plugins/bridges/dsh.py +1300 -0
- ksadk/plugins/builtins.py +746 -0
- ksadk/plugins/bundle.py +246 -0
- ksadk/plugins/bundle_security.py +191 -0
- ksadk/plugins/codex_manifest.py +983 -0
- ksadk/plugins/composition.py +537 -0
- ksadk/plugins/context_contributor.py +437 -0
- ksadk/plugins/contracts.py +569 -0
- ksadk/plugins/delivery.py +153 -0
- ksadk/plugins/dsh_installation_digest.py +71 -0
- ksadk/plugins/dsh_toolchain.py +1024 -0
- ksadk/plugins/ecosystem_bridge.py +1105 -0
- ksadk/plugins/ecosystem_probe.py +191 -0
- ksadk/plugins/host.py +787 -0
- ksadk/plugins/kernel_adapter.py +205 -0
- ksadk/plugins/providers/__init__.py +108 -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-codex/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
- ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -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/bundles/ksadk-harness/cordis.patch.yml +3 -0
- ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
- ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
- ksadk/plugins/providers/codex.py +988 -0
- ksadk/plugins/providers/codex_dsh.py +83 -0
- ksadk/plugins/providers/codex_native.py +368 -0
- ksadk/plugins/providers/codex_turn.py +301 -0
- ksadk/plugins/providers/dsh.py +951 -0
- ksadk/plugins/providers/dsh_capabilities.py +1389 -0
- ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
- ksadk/plugins/providers/dsh_mcp.py +467 -0
- ksadk/plugins/providers/harness.py +632 -0
- ksadk/plugins/providers/harness_dsh.py +91 -0
- ksadk/plugins/providers/legacy.py +215 -0
- ksadk/plugins/providers/legacy_catalog.py +100 -0
- ksadk/plugins/providers/mcp_projection.py +150 -0
- ksadk/plugins/providers/platform_resources.py +657 -0
- ksadk/plugins/providers/shipped_dsh.py +370 -0
- ksadk/plugins/resolver.py +338 -0
- ksadk/plugins/subagent_providers/__init__.py +12 -0
- ksadk/plugins/subagent_providers/codex.py +443 -0
- ksadk/plugins/subagents.py +333 -0
- 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 +193 -60
- ksadk/runtime/adapter.py +3 -0
- ksadk/runtime/conversation_execution.py +92 -16
- ksadk/runtime/executor.py +78 -2
- ksadk/runtime/factory.py +30 -200
- ksadk/runtime/framework_adapters.py +41 -0
- ksadk/runtime/preprocessing.py +10 -2
- ksadk/runtime/runner_adapter.py +78 -14
- ksadk/runtime_context.py +40 -2
- ksadk/sandbox/__init__.py +2 -1
- 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/sandbox/factory.py +72 -0
- ksadk/scheduler/__init__.py +18 -0
- ksadk/scheduler/calendar.py +102 -0
- ksadk/scheduler/contracts.py +254 -0
- ksadk/scheduler/dispatcher.py +129 -0
- ksadk/scheduler/engine.py +416 -0
- ksadk/scheduler/sqlite_store.py +581 -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-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
- ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
- ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
- ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
- ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
- ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
- ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
- ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
- ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
- ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
- ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.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-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
- ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
- ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
- ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
- ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
- ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
- ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
- ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
- ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.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-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
- ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
- ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
- ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
- ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
- ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
- ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
- ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
- ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
- ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
- ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
- ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
- ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
- ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
- ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
- ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
- ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
- ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
- ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
- ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
- ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
- ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
- ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
- ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
- ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
- ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
- ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
- ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
- ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
- ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
- ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
- ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
- ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.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-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
- ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.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-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
- ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
- ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
- ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
- ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
- ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
- ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
- ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.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-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
- ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
- ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
- ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.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-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
- ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
- ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
- ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
- ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
- ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
- ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.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-DAVJf1TX.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-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
- ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
- ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.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 +211 -24
- ksadk/studio/agent_lifecycle.py +26 -20
- ksadk/studio/api.py +714 -90
- ksadk/studio/api_catalog_routes.py +23 -0
- ksadk/studio/api_contracts.py +34 -1
- ksadk/studio/api_plugin_routes.py +911 -0
- ksadk/studio/api_resource_connections.py +183 -0
- ksadk/studio/attachment_store.py +187 -0
- ksadk/studio/authoring.py +10 -4
- ksadk/studio/authoring_coordinator.py +31 -16
- ksadk/studio/builder.py +199 -43
- ksadk/studio/cloud.py +346 -104
- ksadk/studio/cloud_shared_web.py +565 -0
- ksadk/studio/codex_agent_service.py +140 -27
- ksadk/studio/codex_builder.py +294 -16
- ksadk/studio/codex_credentials.py +90 -0
- ksadk/studio/codex_manifest.py +51 -4
- ksadk/studio/codex_plugin_store.py +746 -0
- ksadk/studio/codex_provider_build.py +231 -0
- ksadk/studio/codex_run.py +200 -29
- ksadk/studio/compatibility_report.py +456 -0
- ksadk/studio/compiler.py +84 -15
- ksadk/studio/contracts.py +249 -4
- 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 +1075 -0
- ksadk/studio/event_store.py +54 -6
- ksadk/studio/framework_run.py +37 -4
- ksadk/studio/hosted_kernel.py +89 -14
- ksadk/studio/mcp_runtime.py +11 -3
- ksadk/studio/model_client.py +2 -2
- ksadk/studio/operations.py +12 -2
- ksadk/studio/plugin_composition.py +468 -0
- ksadk/studio/plugin_kernel_adapter.py +28 -0
- ksadk/studio/plugin_runtime.py +831 -0
- 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 +149 -3
- ksadk/studio/resource_connections.py +220 -0
- ksadk/studio/run_service.py +1144 -96
- ksadk/studio/runtime_source.py +24 -8
- ksadk/studio/scheduler_assistant.py +317 -0
- ksadk/studio/scheduler_runtime.py +383 -0
- ksadk/studio/scheduler_service.py +214 -0
- ksadk/studio/service.py +1131 -95
- ksadk/studio/shared_web.py +610 -87
- ksadk/studio/soul.py +52 -0
- 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/studio/validator.py +1 -1
- ksadk/studio/workspace.py +1 -0
- ksadk/version.py +1 -1
- ksadk_runtime_common/workspace_files/path_utils.py +41 -0
- agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
- ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
- ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
- ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
- ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
- ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
- ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
- ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
- ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
- ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
- ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
- ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
- ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
- ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
- ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
- ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
- ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
- ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
- ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
- ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
- ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
- ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
- ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
- ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
- ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
- ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
- ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
- ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
- {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
ksadk/runtime/runner_adapter.py
CHANGED
|
@@ -54,6 +54,7 @@ from ksadk.runtime.adapter import (
|
|
|
54
54
|
)
|
|
55
55
|
from ksadk.runtime.preprocessing import PreparedRuntimeStart, prepare_runtime_start
|
|
56
56
|
from ksadk.runtime.runner_loading import ensure_runner_loaded
|
|
57
|
+
from ksadk.runtime_context import session_invocation_context
|
|
57
58
|
|
|
58
59
|
logger = logging.getLogger(__name__)
|
|
59
60
|
|
|
@@ -138,6 +139,10 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
138
139
|
|
|
139
140
|
# ---- 框架钩子(子类按需 override) ----
|
|
140
141
|
|
|
142
|
+
def _requires_stable_stream_context(self) -> bool:
|
|
143
|
+
"""Whether one Task must own the runner generator for its lifetime."""
|
|
144
|
+
return self._runtime_type == "adk"
|
|
145
|
+
|
|
141
146
|
def capabilities(self) -> RuntimeCapabilityMatrix:
|
|
142
147
|
"""诚实矩阵:cancel 经 asyncio 任务打断(emulated,过 conformance);
|
|
143
148
|
resume/checkpoint 依赖 runner 声明的原生 checkpoint;attach/durable_restore
|
|
@@ -170,8 +175,12 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
170
175
|
submit_interaction=_unavailable("runtime_no_live_interaction_channel"),
|
|
171
176
|
attach=(
|
|
172
177
|
RuntimeCapability(supported=True, mode="native")
|
|
173
|
-
if
|
|
174
|
-
else _unavailable(
|
|
178
|
+
if durable_supported
|
|
179
|
+
else _unavailable(
|
|
180
|
+
"runner_no_durable_attach_seam"
|
|
181
|
+
if not attach_seam
|
|
182
|
+
else "attach_requires_cross_process_checkpoint"
|
|
183
|
+
)
|
|
175
184
|
),
|
|
176
185
|
steer=_unavailable("runtime_no_native_steer"),
|
|
177
186
|
inject=_unavailable("runtime_no_native_inject"),
|
|
@@ -185,6 +194,11 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
185
194
|
if durable_supported
|
|
186
195
|
else _unavailable("durable_restore_requires_cross_process_checkpoint")
|
|
187
196
|
),
|
|
197
|
+
# A generic Runner cannot claim interaction delivery merely from a
|
|
198
|
+
# checkpoint capability. ADK is forward-only and only the
|
|
199
|
+
# LangGraph specialization below binds a checkpoint to the
|
|
200
|
+
# original interrupt identity.
|
|
201
|
+
interaction_mode="unavailable",
|
|
188
202
|
)
|
|
189
203
|
|
|
190
204
|
async def durable_restore(self, handle: RunHandle) -> RunHandle:
|
|
@@ -267,6 +281,15 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
267
281
|
self._active_runs[run_id] = _ActiveRun(invocation_id=run_id, session_id=request.session_id)
|
|
268
282
|
# 暂存 start 输入,供 stream() 使用。
|
|
269
283
|
self._active_runs[run_id].__dict__["_start_request"] = request
|
|
284
|
+
snapshot = request.metadata.get("session_context")
|
|
285
|
+
if snapshot is not None:
|
|
286
|
+
self._active_runs[run_id].__dict__["_tag_context"] = session_invocation_context(
|
|
287
|
+
snapshot,
|
|
288
|
+
agent_id=request.agent_id or "",
|
|
289
|
+
user_id=request.user_id,
|
|
290
|
+
session_id=request.session_id,
|
|
291
|
+
runner_type=self._runtime_type,
|
|
292
|
+
)
|
|
270
293
|
if prepared_start is not None:
|
|
271
294
|
self._active_runs[run_id].__dict__["_prepared_start"] = prepared_start
|
|
272
295
|
return handle
|
|
@@ -302,6 +325,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
302
325
|
f"runner for {self._runtime_type!r} has no durable "
|
|
303
326
|
"attach_runtime_handle capability"
|
|
304
327
|
)
|
|
328
|
+
ensure_runner_loaded(self._runner, runtime_type=self._runtime_type)
|
|
305
329
|
restored = attach(handle)
|
|
306
330
|
if inspect.isawaitable(restored):
|
|
307
331
|
restored = await restored
|
|
@@ -360,11 +384,14 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
360
384
|
self._require_native_checkpoint_capability()
|
|
361
385
|
self._known_runs.add(handle.run_id)
|
|
362
386
|
prepared_start: PreparedRuntimeStart | None = None
|
|
387
|
+
resume_invocation_id = handle.run_id
|
|
363
388
|
raw_start_request = handle.native_ref.pop(RESUME_START_REQUEST_NATIVE_KEY, None)
|
|
364
389
|
if isinstance(raw_start_request, Mapping):
|
|
365
|
-
|
|
366
|
-
|
|
390
|
+
resume_request = StartRequest.model_validate(raw_start_request)
|
|
391
|
+
resume_invocation_id = str(
|
|
392
|
+
resume_request.metadata.get("invocation_id") or handle.run_id
|
|
367
393
|
)
|
|
394
|
+
prepared_start = await prepare_runtime_start(resume_request, self._runner)
|
|
368
395
|
# _resume_native 返回的 runner_input 覆盖存到 run 上,下一次 stream() 经
|
|
369
396
|
# _build_runner_input 消费,以框架原生方式真驱动恢复。
|
|
370
397
|
override = await self._resume_native(handle, target, payload)
|
|
@@ -387,7 +414,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
387
414
|
return handle
|
|
388
415
|
if resume_key in self._consumed_resumes:
|
|
389
416
|
self._active_runs[handle.run_id] = _ActiveRun(
|
|
390
|
-
invocation_id=
|
|
417
|
+
invocation_id=resume_invocation_id,
|
|
391
418
|
session_id=handle.session_id,
|
|
392
419
|
resume_key=resume_key,
|
|
393
420
|
resume_fingerprint=resume_fingerprint,
|
|
@@ -404,11 +431,19 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
404
431
|
raise ValueError(f"run {handle.run_id!r} already has an active or pending resume")
|
|
405
432
|
|
|
406
433
|
run = _ActiveRun(
|
|
407
|
-
invocation_id=
|
|
434
|
+
invocation_id=resume_invocation_id,
|
|
408
435
|
session_id=handle.session_id,
|
|
409
436
|
resume_key=resume_key,
|
|
410
437
|
resume_fingerprint=resume_fingerprint,
|
|
411
438
|
)
|
|
439
|
+
if payload is not None and payload.session_context is not None:
|
|
440
|
+
run.__dict__["_tag_context"] = session_invocation_context(
|
|
441
|
+
payload.session_context,
|
|
442
|
+
agent_id=str(handle.native_ref.get("agent_id") or ""),
|
|
443
|
+
user_id=str(handle.native_ref.get("user_id") or ""),
|
|
444
|
+
session_id=handle.session_id,
|
|
445
|
+
runner_type=self._runtime_type,
|
|
446
|
+
)
|
|
412
447
|
if prepared_start is not None:
|
|
413
448
|
run.__dict__["_prepared_start"] = prepared_start
|
|
414
449
|
if override:
|
|
@@ -504,23 +539,30 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
504
539
|
if run is None:
|
|
505
540
|
run = _ActiveRun(invocation_id=handle.run_id, session_id=handle.session_id)
|
|
506
541
|
self._active_runs[handle.run_id] = run
|
|
542
|
+
event_handle = (
|
|
543
|
+
handle
|
|
544
|
+
if run.invocation_id == handle.run_id
|
|
545
|
+
else handle.model_copy(update={"run_id": run.invocation_id})
|
|
546
|
+
)
|
|
507
547
|
|
|
508
548
|
# 消费 pending cancel:start 时若已记 pending,立即中断该 turn。
|
|
509
549
|
if handle.run_id in self._pending_cancels:
|
|
510
550
|
self._pending_cancels.discard(handle.run_id)
|
|
511
|
-
yield self._make_run_canceled(
|
|
551
|
+
yield self._make_run_canceled(
|
|
552
|
+
event_handle, reason=CancelResult.PENDING_CANCEL_RECORDED.value
|
|
553
|
+
)
|
|
512
554
|
return
|
|
513
555
|
|
|
514
556
|
if run.skip_runner:
|
|
515
557
|
run.done = True
|
|
516
558
|
self._active_runs.pop(handle.run_id, None)
|
|
517
|
-
yield self._make_run_completed(
|
|
559
|
+
yield self._make_run_completed(event_handle)
|
|
518
560
|
return
|
|
519
561
|
|
|
520
562
|
if run.resume_key is not None:
|
|
521
563
|
self._consumed_resumes.add(run.resume_key)
|
|
522
564
|
|
|
523
|
-
yield self._make_run_started(
|
|
565
|
+
yield self._make_run_started(event_handle)
|
|
524
566
|
|
|
525
567
|
request = run.__dict__.get("_start_request")
|
|
526
568
|
runner_input = self._build_runner_input(handle, request)
|
|
@@ -528,7 +570,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
528
570
|
terminal_event_seen = False
|
|
529
571
|
approval_interrupted = False
|
|
530
572
|
try:
|
|
531
|
-
gen = self._map_runner_stream(
|
|
573
|
+
gen = self._map_runner_stream(event_handle, runner_input, active_run=run)
|
|
532
574
|
run.stream = gen
|
|
533
575
|
async for event in gen:
|
|
534
576
|
yield event
|
|
@@ -555,18 +597,38 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
555
597
|
|
|
556
598
|
if run.interrupt_event.is_set() and not terminal_event_seen:
|
|
557
599
|
yield self._make_run_canceled(
|
|
558
|
-
|
|
600
|
+
event_handle, reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value
|
|
559
601
|
)
|
|
560
602
|
elif approval_interrupted and not terminal_event_seen:
|
|
561
|
-
yield self._make_run_interrupted(
|
|
603
|
+
yield self._make_run_interrupted(event_handle, reason="input_required")
|
|
562
604
|
elif not terminal_event_seen:
|
|
563
|
-
yield self._make_run_completed(
|
|
605
|
+
yield self._make_run_completed(
|
|
606
|
+
event_handle, run=run, metrics=run.completion_metrics
|
|
607
|
+
)
|
|
564
608
|
finally:
|
|
565
609
|
run.stream = None
|
|
566
610
|
run.done = True
|
|
567
611
|
self._active_runs.pop(handle.run_id, None)
|
|
568
612
|
|
|
569
613
|
def _build_runner_input(self, handle: RunHandle, request: Optional[StartRequest]) -> dict:
|
|
614
|
+
result = self._build_base_runner_input(handle, request)
|
|
615
|
+
run = self._active_runs.get(handle.run_id)
|
|
616
|
+
context = run.__dict__.get("_tag_context") if run is not None else None
|
|
617
|
+
if context is not None:
|
|
618
|
+
existing_context = result.get("platform_context")
|
|
619
|
+
result["platform_context"] = (
|
|
620
|
+
{**existing_context, "session": context.session.to_payload()}
|
|
621
|
+
if isinstance(existing_context, dict)
|
|
622
|
+
else context.to_payload()
|
|
623
|
+
)
|
|
624
|
+
result["metadata"] = {
|
|
625
|
+
key: value
|
|
626
|
+
for key, value in dict(result.get("metadata") or {}).items()
|
|
627
|
+
if key != "session_context"
|
|
628
|
+
}
|
|
629
|
+
return result
|
|
630
|
+
|
|
631
|
+
def _build_base_runner_input(self, handle: RunHandle, request: Optional[StartRequest]) -> dict:
|
|
570
632
|
# resume 覆盖优先:_resume_native 注入的 checkpoint_resume + framework_ref
|
|
571
633
|
# 直接作为 runner 输入,驱动框架原生恢复。
|
|
572
634
|
run = self._active_runs.get(handle.run_id)
|
|
@@ -583,7 +645,9 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
|
|
|
583
645
|
{
|
|
584
646
|
"input": override.get("input"),
|
|
585
647
|
"session_id": handle.session_id,
|
|
586
|
-
"invocation_id":
|
|
648
|
+
"invocation_id": str(
|
|
649
|
+
merged.get("invocation_id") or handle.run_id
|
|
650
|
+
),
|
|
587
651
|
"metadata": {
|
|
588
652
|
**(dict(base_metadata) if isinstance(base_metadata, Mapping) else {}),
|
|
589
653
|
**dict(override.get("metadata") or {}),
|
ksadk/runtime_context.py
CHANGED
|
@@ -3,7 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
from contextlib import contextmanager
|
|
4
4
|
from contextvars import ContextVar, Token
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import Any, Iterator
|
|
6
|
+
from typing import Any, Iterator, Mapping
|
|
7
|
+
|
|
8
|
+
from ksadk.session_context import SessionContext
|
|
7
9
|
|
|
8
10
|
|
|
9
11
|
@dataclass
|
|
@@ -30,9 +32,10 @@ class PlatformInvocationContext:
|
|
|
30
32
|
# Request-scoped runtime control. It is intentionally separate from
|
|
31
33
|
# public caller metadata so built-in tools can enforce it consistently.
|
|
32
34
|
tool_approval_mode: str = ""
|
|
35
|
+
session: SessionContext = field(default_factory=SessionContext)
|
|
33
36
|
|
|
34
37
|
def to_payload(self) -> dict[str, Any]:
|
|
35
|
-
|
|
38
|
+
payload = {
|
|
36
39
|
"agent_id": self.agent_id,
|
|
37
40
|
"user_id": self.user_id,
|
|
38
41
|
"account_id": self.account_id,
|
|
@@ -52,6 +55,10 @@ class PlatformInvocationContext:
|
|
|
52
55
|
"model_options": dict(self.model_options or {}),
|
|
53
56
|
}
|
|
54
57
|
|
|
58
|
+
if self.session.tags or self.session.revision:
|
|
59
|
+
payload["session"] = self.session.to_payload()
|
|
60
|
+
return payload
|
|
61
|
+
|
|
55
62
|
|
|
56
63
|
@dataclass
|
|
57
64
|
class ToolExecutionContext:
|
|
@@ -179,3 +186,34 @@ def tool_execution_scope(
|
|
|
179
186
|
yield context
|
|
180
187
|
finally:
|
|
181
188
|
reset_current_tool_execution_context(token)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def get_current_session_context() -> SessionContext:
|
|
192
|
+
"""Read the current immutable snapshot in LangChain, LangGraph or ADK code."""
|
|
193
|
+
context = get_current_invocation_context()
|
|
194
|
+
return context.session if context is not None else SessionContext()
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def get_current_session_tags() -> Mapping[str, str]:
|
|
198
|
+
"""Return read-only business labels; these are not authorization claims."""
|
|
199
|
+
return get_current_session_context().tags
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def session_invocation_context(snapshot, *, agent_id="", user_id="", session_id="", runner_type=""):
|
|
203
|
+
"""Build the narrow context for kernel starts without conversation preprocessing."""
|
|
204
|
+
return PlatformInvocationContext(
|
|
205
|
+
agent_id=agent_id,
|
|
206
|
+
user_id=user_id,
|
|
207
|
+
session_id=session_id,
|
|
208
|
+
runner_type=runner_type,
|
|
209
|
+
history=[],
|
|
210
|
+
input_content=[],
|
|
211
|
+
input_messages=[],
|
|
212
|
+
input_parts=[],
|
|
213
|
+
attachments=[],
|
|
214
|
+
attachment_results=[],
|
|
215
|
+
current_attachments=[],
|
|
216
|
+
current_attachment_results=[],
|
|
217
|
+
has_current_files=False,
|
|
218
|
+
session=SessionContext.from_payload(snapshot),
|
|
219
|
+
)
|
ksadk/sandbox/__init__.py
CHANGED
|
@@ -12,7 +12,7 @@ from ksadk.sandbox.base import (
|
|
|
12
12
|
SandboxSpec,
|
|
13
13
|
SandboxType,
|
|
14
14
|
)
|
|
15
|
-
from ksadk.sandbox.factory import create_sandbox_backend, sandbox_spec_from_env
|
|
15
|
+
from ksadk.sandbox.factory import create_sandbox_backend, sandbox_spec_from_env, setup_sandbox_api_url_if_needed
|
|
16
16
|
|
|
17
17
|
__all__ = [
|
|
18
18
|
"E2BSandboxBackend",
|
|
@@ -28,4 +28,5 @@ __all__ = [
|
|
|
28
28
|
"SandboxType",
|
|
29
29
|
"create_sandbox_backend",
|
|
30
30
|
"sandbox_spec_from_env",
|
|
31
|
+
"setup_sandbox_api_url_if_needed",
|
|
31
32
|
]
|
ksadk/sandbox/backends/e2b.py
CHANGED
|
@@ -12,6 +12,7 @@ from ksadk.sandbox.base import (
|
|
|
12
12
|
SandboxSession,
|
|
13
13
|
SandboxSpec,
|
|
14
14
|
)
|
|
15
|
+
from ksadk.sandbox.e2b_connection import ExplicitE2BConnection
|
|
15
16
|
|
|
16
17
|
logger = logging.getLogger(__name__)
|
|
17
18
|
|
|
@@ -81,6 +82,22 @@ class E2BSandboxSession:
|
|
|
81
82
|
def read_file(self, path: str) -> str:
|
|
82
83
|
return str(self._sandbox.files.read(path))
|
|
83
84
|
|
|
85
|
+
def read_file_bytes(self, path: str, *, max_bytes: int) -> bytes:
|
|
86
|
+
if type(max_bytes) is not int or max_bytes < 1:
|
|
87
|
+
raise ValueError("File download limit must be positive")
|
|
88
|
+
stream = self._sandbox.files.read(path, format="stream", request_timeout=30)
|
|
89
|
+
content = bytearray()
|
|
90
|
+
try:
|
|
91
|
+
for chunk in stream:
|
|
92
|
+
if len(content) + len(chunk) > max_bytes:
|
|
93
|
+
raise ValueError("Sandbox file exceeds download limit")
|
|
94
|
+
content.extend(chunk)
|
|
95
|
+
finally:
|
|
96
|
+
close = getattr(stream, "close", None)
|
|
97
|
+
if close is not None:
|
|
98
|
+
close()
|
|
99
|
+
return bytes(content)
|
|
100
|
+
|
|
84
101
|
def run_command(
|
|
85
102
|
self,
|
|
86
103
|
command: str,
|
|
@@ -116,19 +133,24 @@ class E2BSandboxBackend:
|
|
|
116
133
|
*,
|
|
117
134
|
spec: SandboxSpec,
|
|
118
135
|
sandbox_cls: Any | None = None,
|
|
136
|
+
connection: ExplicitE2BConnection | None = None,
|
|
119
137
|
):
|
|
120
138
|
if not spec.template_id:
|
|
121
139
|
raise SandboxError("E2B sandbox backend requires a template id")
|
|
122
140
|
self.spec = spec
|
|
123
141
|
self.sandbox_cls = sandbox_cls
|
|
142
|
+
self.connection = (
|
|
143
|
+
ExplicitE2BConnection.model_validate(connection.model_dump())
|
|
144
|
+
if connection is not None else None
|
|
145
|
+
)
|
|
124
146
|
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
)
|
|
147
|
+
def check_available(self) -> None:
|
|
148
|
+
"""Validate local SDK/connection configuration without creating a sandbox."""
|
|
149
|
+
if self.connection is not None:
|
|
150
|
+
self.connection.sdk_options()
|
|
151
|
+
self._sandbox_class()
|
|
152
|
+
|
|
153
|
+
def _sandbox_class(self):
|
|
132
154
|
sandbox_cls = self.sandbox_cls
|
|
133
155
|
if sandbox_cls is None:
|
|
134
156
|
try:
|
|
@@ -138,6 +160,17 @@ class E2BSandboxBackend:
|
|
|
138
160
|
"e2b>=2.15.3,<2.25.0 is required for KSADK_SANDBOX_BACKEND=e2b"
|
|
139
161
|
) from exc
|
|
140
162
|
sandbox_cls = Sandbox
|
|
163
|
+
return sandbox_cls
|
|
164
|
+
|
|
165
|
+
def create_session(
|
|
166
|
+
self,
|
|
167
|
+
*,
|
|
168
|
+
session_id: str,
|
|
169
|
+
env: dict[str, str] | None = None,
|
|
170
|
+
input_files: list[SandboxInputFile] | None = None,
|
|
171
|
+
) -> SandboxSession:
|
|
172
|
+
connection_options = self.connection.sdk_options() if self.connection is not None else {}
|
|
173
|
+
sandbox_cls = self._sandbox_class()
|
|
141
174
|
|
|
142
175
|
metadata = {
|
|
143
176
|
"runtime": "ksadk",
|
|
@@ -152,12 +185,20 @@ class E2BSandboxBackend:
|
|
|
152
185
|
metadata=metadata,
|
|
153
186
|
envs=runtime_env,
|
|
154
187
|
allow_internet_access=self.spec.allow_internet_access,
|
|
188
|
+
**connection_options,
|
|
155
189
|
)
|
|
156
190
|
session = self._wrap_sandbox(sandbox)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
191
|
+
try:
|
|
192
|
+
self._wait_until_ready(session, runtime_env)
|
|
193
|
+
session.write_files(
|
|
194
|
+
[(item.target_path, item.source.read_bytes()) for item in input_files or []]
|
|
195
|
+
)
|
|
196
|
+
except BaseException:
|
|
197
|
+
try:
|
|
198
|
+
session.kill()
|
|
199
|
+
except Exception:
|
|
200
|
+
logger.warning("E2B sandbox cleanup failed after initialization failure")
|
|
201
|
+
raise
|
|
161
202
|
return session
|
|
162
203
|
|
|
163
204
|
def _wrap_sandbox(self, sandbox: Any) -> E2BSandboxSession:
|
|
@@ -38,6 +38,15 @@ class LocalProcessSandboxSession:
|
|
|
38
38
|
def read_file(self, path: str) -> str:
|
|
39
39
|
return self._resolve_workspace_path(path).read_text(encoding="utf-8")
|
|
40
40
|
|
|
41
|
+
def read_file_bytes(self, path: str, *, max_bytes: int) -> bytes:
|
|
42
|
+
if type(max_bytes) is not int or max_bytes < 1:
|
|
43
|
+
raise ValueError("File download limit must be positive")
|
|
44
|
+
with self._resolve_workspace_path(path).open("rb") as source:
|
|
45
|
+
content = source.read(max_bytes + 1)
|
|
46
|
+
if len(content) > max_bytes:
|
|
47
|
+
raise ValueError("Sandbox file exceeds download limit")
|
|
48
|
+
return content
|
|
49
|
+
|
|
41
50
|
def run_command(
|
|
42
51
|
self,
|
|
43
52
|
command: str,
|
ksadk/sandbox/base.py
CHANGED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Explicit E2B connection for dedicated, environment-isolated resource workers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
import re
|
|
7
|
+
from urllib.parse import urlsplit
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, Field, SecretStr, model_validator
|
|
10
|
+
|
|
11
|
+
from ksadk.sandbox.base import SandboxError
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ExplicitE2BConnection(BaseModel):
|
|
15
|
+
model_config = ConfigDict(extra="forbid", frozen=True, hide_input_in_errors=True)
|
|
16
|
+
|
|
17
|
+
api_url: str = Field(strict=True)
|
|
18
|
+
domain: str = Field(strict=True)
|
|
19
|
+
api_key: SecretStr = Field(min_length=1, repr=False)
|
|
20
|
+
|
|
21
|
+
@model_validator(mode="after")
|
|
22
|
+
def validate_target(self):
|
|
23
|
+
url = urlsplit(self.api_url)
|
|
24
|
+
if (
|
|
25
|
+
url.scheme != "https"
|
|
26
|
+
or not url.hostname
|
|
27
|
+
or url.username is not None
|
|
28
|
+
or url.password is not None
|
|
29
|
+
or url.query
|
|
30
|
+
or url.fragment
|
|
31
|
+
or url.path not in {"", "/"}
|
|
32
|
+
or any(c.isspace() for c in self.api_url)
|
|
33
|
+
):
|
|
34
|
+
raise ValueError("E2B API target must be an explicit HTTPS origin")
|
|
35
|
+
if not re.fullmatch(r"[a-zA-Z0-9]+(?:[.-][a-zA-Z0-9-]+)*", self.domain):
|
|
36
|
+
raise ValueError("E2B domain must be an explicit hostname")
|
|
37
|
+
return self
|
|
38
|
+
|
|
39
|
+
def sdk_options(self) -> dict:
|
|
40
|
+
"""Credential-bearing arguments for SDK creation only, never for logs/archives.
|
|
41
|
+
|
|
42
|
+
E2B 2.15.3 uses boolean-or defaults for debug and sandbox URL. Passing
|
|
43
|
+
False/None cannot disable their env fallback; dedicated workers omit them.
|
|
44
|
+
"""
|
|
45
|
+
contaminated = (
|
|
46
|
+
"E2B_DEBUG",
|
|
47
|
+
"E2B_SANDBOX_URL",
|
|
48
|
+
"E2B_ACCESS_TOKEN",
|
|
49
|
+
"HTTP_PROXY",
|
|
50
|
+
"HTTPS_PROXY",
|
|
51
|
+
"ALL_PROXY",
|
|
52
|
+
"http_proxy",
|
|
53
|
+
"https_proxy",
|
|
54
|
+
"all_proxy",
|
|
55
|
+
"SSL_CERT_FILE",
|
|
56
|
+
"SSL_CERT_DIR",
|
|
57
|
+
)
|
|
58
|
+
if any(os.environ.get(name) for name in contaminated):
|
|
59
|
+
raise SandboxError("E2B explicit connections require an isolated worker environment")
|
|
60
|
+
return {
|
|
61
|
+
"api_key": self.api_key.get_secret_value(),
|
|
62
|
+
"api_url": self.api_url,
|
|
63
|
+
"domain": self.domain,
|
|
64
|
+
"debug": False,
|
|
65
|
+
"request_timeout": 30,
|
|
66
|
+
}
|
ksadk/sandbox/factory.py
CHANGED
|
@@ -16,11 +16,83 @@ def bool_env(name: str, default: bool = True) -> bool:
|
|
|
16
16
|
return raw.strip().lower() in {"1", "true", "yes", "on"}
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
def _resolve_sandbox_api_url() -> str:
|
|
20
|
+
"""Probe sandbox control-plane URL at runtime (in-Pod).
|
|
21
|
+
|
|
22
|
+
agentengine-server injects public E2B_API_URL on the management cluster.
|
|
23
|
+
public_only compute pods can reach the public address directly; private_only
|
|
24
|
+
pods have no public egress. Strategy: try the original (public) URL first;
|
|
25
|
+
if reachable keep it, otherwise fall back to the 198 public-service-net
|
|
26
|
+
internal address. Mirrors KSPMAS get_kspmas_api_base(): probe runs in-Pod.
|
|
27
|
+
"""
|
|
28
|
+
raw = (os.environ.get("E2B_API_URL") or "").strip()
|
|
29
|
+
if not raw:
|
|
30
|
+
return raw
|
|
31
|
+
|
|
32
|
+
from urllib.parse import urlsplit, urlunsplit
|
|
33
|
+
|
|
34
|
+
parsed = urlsplit(raw)
|
|
35
|
+
host = (parsed.hostname or "").lower()
|
|
36
|
+
if host.endswith(".sdns.ksyun.com"):
|
|
37
|
+
return raw
|
|
38
|
+
if not host.endswith(".sandbox.ksyun.com"):
|
|
39
|
+
return raw
|
|
40
|
+
|
|
41
|
+
parts = host.split(".")
|
|
42
|
+
region = ""
|
|
43
|
+
if len(parts) >= 4 and parts[0] == "mgr":
|
|
44
|
+
region = parts[1]
|
|
45
|
+
elif len(parts) >= 4:
|
|
46
|
+
region = parts[1] if parts[1] != "sandbox" else ""
|
|
47
|
+
if not region:
|
|
48
|
+
return raw
|
|
49
|
+
|
|
50
|
+
import socket
|
|
51
|
+
|
|
52
|
+
port = parsed.port or (443 if parsed.scheme == "https" else 80)
|
|
53
|
+
|
|
54
|
+
# 1) Try the original (public) URL first; reachable => keep it.
|
|
55
|
+
try:
|
|
56
|
+
s = socket.socket()
|
|
57
|
+
s.settimeout(1.5)
|
|
58
|
+
s.connect((host, port))
|
|
59
|
+
s.close()
|
|
60
|
+
return raw
|
|
61
|
+
except OSError:
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
# 2) Public unreachable (e.g. private_only node) => fall back to internal.
|
|
65
|
+
internal_host = f"sandbox.{region}.sandbox.sdns.ksyun.com"
|
|
66
|
+
try:
|
|
67
|
+
s = socket.socket()
|
|
68
|
+
s.settimeout(1.5)
|
|
69
|
+
s.connect((internal_host, port))
|
|
70
|
+
s.close()
|
|
71
|
+
except OSError:
|
|
72
|
+
return raw
|
|
73
|
+
|
|
74
|
+
internal_url = urlunsplit((parsed.scheme or "https", internal_host, parsed.path, parsed.query, ""))
|
|
75
|
+
return internal_url
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def setup_sandbox_api_url_if_needed() -> None:
|
|
79
|
+
"""Override E2B_API_URL to internal address before creating E2B backend.
|
|
80
|
+
|
|
81
|
+
Only runs in managed runtime (AGENT_RUNTIME_ID / K8S); local dev unaffected.
|
|
82
|
+
"""
|
|
83
|
+
if not os.environ.get("AGENT_RUNTIME_ID") and not os.environ.get("KUBERNETES_SERVICE_HOST"):
|
|
84
|
+
return
|
|
85
|
+
resolved = _resolve_sandbox_api_url()
|
|
86
|
+
if resolved != (os.environ.get("E2B_API_URL") or ""):
|
|
87
|
+
os.environ["E2B_API_URL"] = resolved
|
|
88
|
+
|
|
89
|
+
|
|
19
90
|
def create_sandbox_backend(
|
|
20
91
|
backend: str | None = None,
|
|
21
92
|
*,
|
|
22
93
|
sandbox_cls: Any | None = None,
|
|
23
94
|
) -> SandboxBackend:
|
|
95
|
+
setup_sandbox_api_url_if_needed()
|
|
24
96
|
resolved = (backend or os.environ.get("KSADK_SANDBOX_BACKEND") or "e2b").strip().lower()
|
|
25
97
|
if resolved in {"local", "local_process"}:
|
|
26
98
|
return LocalProcessSandboxBackend(
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Local Scheduler Lite contracts and deterministic calendar calculations."""
|
|
2
|
+
|
|
3
|
+
from ksadk.scheduler.calendar import next_schedule_time
|
|
4
|
+
from ksadk.scheduler.contracts import ScheduledTask, ScheduleOccurrence, ScheduleSpec
|
|
5
|
+
from ksadk.scheduler.dispatcher import AgentControlSchedulerDispatcher
|
|
6
|
+
from ksadk.scheduler.engine import SchedulerDispatchError, SchedulerEngine
|
|
7
|
+
from ksadk.scheduler.sqlite_store import SchedulerSQLiteStore
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"ScheduleOccurrence",
|
|
11
|
+
"ScheduledTask",
|
|
12
|
+
"ScheduleSpec",
|
|
13
|
+
"AgentControlSchedulerDispatcher",
|
|
14
|
+
"SchedulerDispatchError",
|
|
15
|
+
"SchedulerEngine",
|
|
16
|
+
"SchedulerSQLiteStore",
|
|
17
|
+
"next_schedule_time",
|
|
18
|
+
]
|