agentengine-sdk-python 0.6.2__py3-none-any.whl → 0.6.9__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.6.9.dist-info/METADATA +179 -0
- agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
- {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
- agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
- agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
- agentengine_sdk_python-0.6.9.dist-info/top_level.txt +2 -0
- ksadk/__init__.py +13 -0
- ksadk/__main__.py +4 -0
- ksadk/a2a/__init__.py +15 -0
- ksadk/a2a/card_builder.py +64 -0
- ksadk/a2a/client.py +309 -0
- ksadk/a2a/executor.py +201 -0
- ksadk/a2a/server.py +79 -0
- ksadk/agents/__init__.py +20 -0
- ksadk/agents/base.py +370 -0
- ksadk/agents/context.py +38 -0
- ksadk/agents/event.py +35 -0
- ksadk/agents/loop_agent.py +71 -0
- ksadk/agents/parallel_agent.py +109 -0
- ksadk/agents/runner_adapter.py +24 -0
- ksadk/agents/sequential_agent.py +34 -0
- ksadk/api/__init__.py +3 -0
- ksadk/api/client.py +2227 -0
- ksadk/builders/__init__.py +20 -0
- ksadk/builders/base.py +66 -0
- ksadk/builders/code_builder.py +1990 -0
- ksadk/builders/container_builder.py +786 -0
- ksadk/builders/framework_requirements.py +59 -0
- ksadk/builders/ks3_uploader.py +389 -0
- ksadk/builders/mcp_builder.py +476 -0
- ksadk/builders/requirements_utils.py +75 -0
- ksadk/cli/__init__.py +531 -0
- ksadk/cli/__main__.py +4 -0
- ksadk/cli/agent_ref.py +204 -0
- ksadk/cli/cmd_a2a.py +167 -0
- ksadk/cli/cmd_agent.py +201 -0
- ksadk/cli/cmd_build.py +270 -0
- ksadk/cli/cmd_completion.py +304 -0
- ksadk/cli/cmd_config.py +758 -0
- ksadk/cli/cmd_create.py +2277 -0
- ksadk/cli/cmd_dashboard.py +900 -0
- ksadk/cli/cmd_deploy.py +704 -0
- ksadk/cli/cmd_destroy.py +345 -0
- ksadk/cli/cmd_files.py +1227 -0
- ksadk/cli/cmd_hermes.py +1259 -0
- ksadk/cli/cmd_invoke.py +1336 -0
- ksadk/cli/cmd_launch.py +564 -0
- ksadk/cli/cmd_mcp.py +1174 -0
- ksadk/cli/cmd_model.py +302 -0
- ksadk/cli/cmd_openclaw.py +3918 -0
- ksadk/cli/cmd_run.py +232 -0
- ksadk/cli/cmd_status.py +588 -0
- ksadk/cli/cmd_version.py +522 -0
- ksadk/cli/cmd_web.py +288 -0
- ksadk/cli/deploy_utils.py +87 -0
- ksadk/cli/dry_run.py +214 -0
- ksadk/cli/env_options.py +82 -0
- ksadk/cli/error_utils.py +525 -0
- ksadk/cli/global_options.py +31 -0
- ksadk/cli/local_runtime.py +97 -0
- ksadk/cli/model_catalog.py +136 -0
- ksadk/cli/network_options.py +410 -0
- ksadk/cli/resource_common.py +621 -0
- ksadk/cli/storage.py +84 -0
- ksadk/cli/ui.py +431 -0
- ksadk/cli/workflow_common.py +552 -0
- ksadk/common/__init__.py +14 -0
- ksadk/common/aicp_env.py +128 -0
- ksadk/common/auth.py +190 -0
- ksadk/common/constants.py +84 -0
- ksadk/common/llm_utils.py +61 -0
- ksadk/configs/__init__.py +61 -0
- ksadk/configs/env_registry.py +342 -0
- ksadk/configs/global_config.py +200 -0
- ksadk/configs/settings.py +706 -0
- ksadk/conversations/__init__.py +95 -0
- ksadk/conversations/attachment_storage.py +379 -0
- ksadk/conversations/attachments.py +774 -0
- ksadk/conversations/compaction_pipeline.py +387 -0
- ksadk/conversations/compaction_prompt.py +128 -0
- ksadk/conversations/context.py +303 -0
- ksadk/conversations/model_context.py +360 -0
- ksadk/conversations/model_options.py +136 -0
- ksadk/conversations/normalize.py +446 -0
- ksadk/conversations/reasoning_markup.py +91 -0
- ksadk/conversations/run_kinds.py +61 -0
- ksadk/conversations/run_status.py +53 -0
- ksadk/conversations/runtime.py +5208 -0
- ksadk/conversations/semantic_summary.py +359 -0
- ksadk/conversations/session_title.py +254 -0
- ksadk/deployment/__init__.py +83 -0
- ksadk/deployment/agent_access.py +226 -0
- ksadk/deployment/base.py +229 -0
- ksadk/deployment/manager.py +332 -0
- ksadk/deployment/providers/__init__.py +10 -0
- ksadk/deployment/providers/serverless.py +1105 -0
- ksadk/deployment/registry.py +120 -0
- ksadk/deployment/state.py +78 -0
- ksadk/deployment/ui_config.py +21 -0
- ksadk/detection/__init__.py +7 -0
- ksadk/detection/detector.py +431 -0
- ksadk/detection/mcp_detector.py +250 -0
- ksadk/hermes_terminal.py +467 -0
- ksadk/identity/__init__.py +17 -0
- ksadk/identity/resolver.py +385 -0
- ksadk/knowledge_base/__init__.py +62 -0
- ksadk/knowledge_base/adk_tool.py +47 -0
- ksadk/knowledge_base/client.py +297 -0
- ksadk/knowledge_base/langchain_tool.py +55 -0
- ksadk/knowledge_base/service.py +66 -0
- ksadk/knowledge_base/tool.py +50 -0
- ksadk/markdown.py +169 -0
- ksadk/mcp_runtime/__init__.py +231 -0
- ksadk/memory/__init__.py +57 -0
- ksadk/memory/adk/__init__.py +51 -0
- ksadk/memory/adk/backends/__init__.py +5 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
- ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
- ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
- ksadk/memory/adk/long_term_memory.py +273 -0
- ksadk/memory/adk/short_term_memory.py +289 -0
- ksadk/memory/adk_tool.py +31 -0
- ksadk/memory/backends/__init__.py +6 -0
- ksadk/memory/backends/base.py +103 -0
- ksadk/memory/backends/memory.py +112 -0
- ksadk/memory/backends/redis.py +146 -0
- ksadk/memory/langchain_tool.py +39 -0
- ksadk/memory/ltm_backend_factory.py +24 -0
- ksadk/memory/manager.py +215 -0
- ksadk/memory/service.py +172 -0
- ksadk/memory/tool.py +96 -0
- ksadk/model_policy.py +223 -0
- ksadk/openclaw_gateway.py +378 -0
- ksadk/runners/__init__.py +8 -0
- ksadk/runners/adk_runner.py +1135 -0
- ksadk/runners/base_runner.py +305 -0
- ksadk/runners/deepagents_runner.py +13 -0
- ksadk/runners/factory.py +73 -0
- ksadk/runners/langchain_runner.py +539 -0
- ksadk/runners/langgraph_runner.py +852 -0
- ksadk/runners/patch_langchain.py +187 -0
- ksadk/runners/remote_runner.py +667 -0
- ksadk/runners/usage_accumulator.py +38 -0
- ksadk/runners/utils/__init__.py +19 -0
- ksadk/runners/utils/langfuse.py +230 -0
- ksadk/runners/utils/loader.py +62 -0
- ksadk/runtime_context.py +166 -0
- ksadk/runtime_state.py +25 -0
- ksadk/sandbox/__init__.py +28 -0
- ksadk/sandbox/backends/__init__.py +9 -0
- ksadk/sandbox/backends/e2b.py +154 -0
- ksadk/sandbox/backends/local_process.py +131 -0
- ksadk/sandbox/base.py +101 -0
- ksadk/sandbox/factory.py +53 -0
- ksadk/sandbox/registry.py +187 -0
- ksadk/server/__init__.py +7 -0
- ksadk/server/api_models.py +73 -0
- ksadk/server/app.py +3789 -0
- ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
- ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
- ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
- ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
- ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
- ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
- ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
- ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
- ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
- ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
- ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
- ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
- ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
- ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
- ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
- ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
- ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
- ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
- ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
- ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
- ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
- ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
- ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
- ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
- ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
- ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
- ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
- ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
- ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
- ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
- ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
- ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
- ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
- ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
- ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
- ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
- ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
- ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
- ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
- ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
- ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
- ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
- ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
- ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
- ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
- ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
- ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
- ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
- ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
- ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
- ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
- ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
- ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
- ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
- ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
- ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
- ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
- ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
- ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
- ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
- ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
- ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
- ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
- ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
- ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
- ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
- ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
- ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
- ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
- ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
- ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
- ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
- ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
- ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
- ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
- ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
- ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
- ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
- ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
- ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
- ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
- ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
- ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
- ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
- ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
- ksadk/server/static/assets/index-DAURbCsP.css +1 -0
- ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
- ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
- ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
- ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
- ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
- ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
- ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
- ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
- ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
- ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
- ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
- ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
- ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
- ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
- ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
- ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
- ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
- ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
- ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
- ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
- ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
- ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
- ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
- ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
- ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
- ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
- ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
- ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
- ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
- ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
- ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
- ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
- ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
- ksadk/server/static/assets/properties-C357ku5U.js +1 -0
- ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
- ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
- ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
- ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
- ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
- ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
- ksadk/server/static/assets/r-DADKenSm.js +1 -0
- ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
- ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
- ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
- ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
- ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
- ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
- ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
- ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
- ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
- ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
- ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
- ksadk/server/static/assets/solr-BBopId9w.js +1 -0
- ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
- ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
- ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
- ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
- ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
- ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
- ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
- ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
- ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
- ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
- ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
- ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
- ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
- ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
- ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
- ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
- ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
- ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
- ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
- ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
- ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
- ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
- ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
- ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
- ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
- ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
- ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
- ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
- ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
- ksadk/server/static/favicon.svg +1 -0
- ksadk/server/static/icons.svg +24 -0
- ksadk/server/static/index.html +14 -0
- ksadk/server/terminal_sessions.py +551 -0
- ksadk/sessions/__init__.py +283 -0
- ksadk/sessions/base.py +354 -0
- ksadk/sessions/continuity.py +313 -0
- ksadk/sessions/errors.py +7 -0
- ksadk/sessions/in_memory.py +273 -0
- ksadk/sessions/local_service.py +949 -0
- ksadk/sessions/postgres_service.py +838 -0
- ksadk/sessions/sqlite_service.py +13 -0
- ksadk/skills/__init__.py +9 -0
- ksadk/skills/loader.py +46 -0
- ksadk/skills/models.py +120 -0
- ksadk/skills/package_store.py +104 -0
- ksadk/skills/runtime/__init__.py +17 -0
- ksadk/skills/runtime/agent.py +183 -0
- ksadk/skills/runtime/artifacts.py +39 -0
- ksadk/skills/runtime/backends/__init__.py +1 -0
- ksadk/skills/runtime/backends/disabled.py +8 -0
- ksadk/skills/runtime/backends/e2b.py +168 -0
- ksadk/skills/runtime/backends/local.py +95 -0
- ksadk/skills/runtime/base.py +103 -0
- ksadk/skills/runtime/executor.py +219 -0
- ksadk/skills/runtime/factory.py +37 -0
- ksadk/skills/runtime/loader.py +131 -0
- ksadk/skills/runtime/registry.py +150 -0
- ksadk/skills/runtime/request.py +67 -0
- ksadk/skills/service_client.py +239 -0
- ksadk/skills/service_env.py +58 -0
- ksadk/skills/tool_defs.py +221 -0
- ksadk/terminal_client.py +69 -0
- ksadk/terminal_exec_policy.py +229 -0
- ksadk/tools/__init__.py +17 -0
- ksadk/tools/gateway.py +230 -0
- ksadk/tools/result_budget.py +154 -0
- ksadk/toolsets/__init__.py +852 -0
- ksadk/toolsets/_langchain.py +11 -0
- ksadk/toolsets/platform.py +93 -0
- ksadk/toolsets/sandbox.py +310 -0
- ksadk/toolsets/skills.py +217 -0
- ksadk/toolsets/web.py +266 -0
- ksadk/toolsets/workspace.py +878 -0
- ksadk/toolsets/workspace_state.py +44 -0
- ksadk/tracing/__init__.py +37 -0
- ksadk/tracing/exporters/__init__.py +1 -0
- ksadk/tracing/exporters/inmemory_exporter.py +116 -0
- ksadk/tracing/exporters/langfuse_exporter.py +445 -0
- ksadk/tracing/setup.py +829 -0
- ksadk/tracing/span_utils.py +114 -0
- ksadk/tui/__init__.py +12 -0
- ksadk/tui/app.py +400 -0
- ksadk/tui/clipboard.py +100 -0
- ksadk/tui/widgets/__init__.py +22 -0
- ksadk/tui/widgets/assistant.py +89 -0
- ksadk/tui/widgets/base.py +54 -0
- ksadk/tui/widgets/chat_input.py +246 -0
- ksadk/tui/widgets/history.py +156 -0
- ksadk/tui/widgets/system.py +87 -0
- ksadk/tui/widgets/thinking.py +110 -0
- ksadk/tui/widgets/tool_call.py +161 -0
- ksadk/tui/widgets/user.py +37 -0
- ksadk/ui_config.py +168 -0
- ksadk/version.py +4 -0
- ksadk_runtime_common/__init__.py +20 -0
- ksadk_runtime_common/memory_backend/__init__.py +29 -0
- ksadk_runtime_common/memory_backend/manifest.py +79 -0
- ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
- ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
- ksadk_runtime_common/memory_backend/registry.py +56 -0
- ksadk_runtime_common/memory_backend/render.py +71 -0
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
- ksadk_runtime_common/workspace_files/__init__.py +29 -0
- ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
- ksadk_runtime_common/workspace_files/constants.py +9 -0
- ksadk_runtime_common/workspace_files/path_utils.py +71 -0
- ksadk_runtime_common/workspace_files/preview.py +96 -0
- ksadk_runtime_common/workspace_files/router.py +254 -0
- agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
- agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
- agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from ksadk.skills.service_env import public_skill_space_ids, skill_space_ids, user_skill_space_ids
|
|
6
|
+
from ksadk.toolsets._langchain import as_tool
|
|
7
|
+
from ksadk.toolsets.sandbox import sandbox_backend_name
|
|
8
|
+
from ksadk.toolsets.workspace import workspace_root
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _env(name: str, default: str = "") -> str:
|
|
12
|
+
return str(os.environ.get(name) or default).strip()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _skill_execution_backend() -> str:
|
|
16
|
+
explicit = _env("KSADK_SKILL_RUNTIME_BACKEND").lower()
|
|
17
|
+
if explicit:
|
|
18
|
+
return explicit
|
|
19
|
+
if _env("KSADK_SANDBOX_TEMPLATE_ID") or _env("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
|
|
20
|
+
return "e2b"
|
|
21
|
+
return "disabled"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def component_status() -> dict:
|
|
25
|
+
"""Report AgentEngine built-in toolset and runtime binding status."""
|
|
26
|
+
|
|
27
|
+
skill_runtime_backend = _skill_execution_backend()
|
|
28
|
+
sandbox_backend = sandbox_backend_name()
|
|
29
|
+
spaces = skill_space_ids()
|
|
30
|
+
return {
|
|
31
|
+
"ok": True,
|
|
32
|
+
"summary": {
|
|
33
|
+
"model": _env("OPENAI_MODEL_NAME") or _env("MODEL_NAME"),
|
|
34
|
+
"knowledge_base_bound": bool(_env("KSADK_KB_DATASET_ID")),
|
|
35
|
+
"long_term_memory_bound": bool(_env("KSADK_LTM_NAMESPACE")),
|
|
36
|
+
"skill_space_bound": bool(spaces),
|
|
37
|
+
"isolated_execution": "enabled" if skill_runtime_backend not in {"", "disabled", "none", "off"} else "not_enabled",
|
|
38
|
+
"sandbox_direct_tools": "enabled" if sandbox_backend not in {"", "disabled", "none", "off"} else "not_enabled",
|
|
39
|
+
},
|
|
40
|
+
"skill_space": {
|
|
41
|
+
"space_ids": spaces,
|
|
42
|
+
"user_space_ids": user_skill_space_ids(),
|
|
43
|
+
"public_space_ids": public_skill_space_ids(),
|
|
44
|
+
"service_url": _env("KSADK_SKILL_SERVICE_URL"),
|
|
45
|
+
"aicp_endpoint_mode": _env("KSADK_AICP_ENDPOINT_MODE", "auto"),
|
|
46
|
+
"tools": ["list_skills", "search_skills", "load_skill", "execute_skills"],
|
|
47
|
+
},
|
|
48
|
+
"skill_runtime": {
|
|
49
|
+
"backend": skill_runtime_backend,
|
|
50
|
+
"enabled": skill_runtime_backend not in {"", "disabled", "none", "off"},
|
|
51
|
+
"template_bound": bool(_env("KSADK_SANDBOX_TEMPLATE_ID") or _env("KSADK_SKILL_RUNTIME_TEMPLATE_ID")),
|
|
52
|
+
"request_protocol": "--request-file JSON envelope",
|
|
53
|
+
},
|
|
54
|
+
"sandbox": {
|
|
55
|
+
"backend": sandbox_backend,
|
|
56
|
+
"enabled": sandbox_backend not in {"", "disabled", "none", "off"},
|
|
57
|
+
"template_bound": bool(_env("KSADK_SANDBOX_TEMPLATE_ID") or _env("KSADK_SKILL_RUNTIME_TEMPLATE_ID")),
|
|
58
|
+
"tools": ["sandbox_status", "run_command", "run_code"],
|
|
59
|
+
},
|
|
60
|
+
"workspace": {
|
|
61
|
+
"root": str(workspace_root()),
|
|
62
|
+
"tools": [
|
|
63
|
+
"workspace_status",
|
|
64
|
+
"list_workspace_files",
|
|
65
|
+
"read_workspace_file",
|
|
66
|
+
"write_workspace_file",
|
|
67
|
+
"write_workspace_files",
|
|
68
|
+
"edit_workspace_file",
|
|
69
|
+
"lint_workspace_file",
|
|
70
|
+
"search_workspace_files",
|
|
71
|
+
"delete_workspace_file",
|
|
72
|
+
],
|
|
73
|
+
"boundary": "Workspace tools are confined to the AgentEngine UI workspace directory.",
|
|
74
|
+
"editing_model": "write tools support whole-file writes; edit_workspace_file supports exact snippet replacement; lint_workspace_file provides lightweight built-in checks.",
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def get_platform_tools() -> list:
|
|
80
|
+
tools = [as_tool(component_status)]
|
|
81
|
+
try:
|
|
82
|
+
from ksadk.knowledge_base.langchain_tool import search_knowledge_base
|
|
83
|
+
|
|
84
|
+
tools.append(search_knowledge_base)
|
|
85
|
+
except Exception:
|
|
86
|
+
pass
|
|
87
|
+
try:
|
|
88
|
+
from ksadk.memory.langchain_tool import load_memory, save_memory
|
|
89
|
+
|
|
90
|
+
tools.extend([load_memory, save_memory])
|
|
91
|
+
except Exception:
|
|
92
|
+
pass
|
|
93
|
+
return tools
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import shlex
|
|
5
|
+
import time
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Any
|
|
8
|
+
from uuid import uuid4
|
|
9
|
+
|
|
10
|
+
from ksadk.runtime_context import get_current_tool_execution_context_or_default
|
|
11
|
+
from ksadk.sandbox import SandboxError, SandboxInputFile, create_sandbox_backend
|
|
12
|
+
from ksadk.sandbox.registry import GLOBAL_SANDBOX_REGISTRY
|
|
13
|
+
from ksadk.tools.gateway import ToolPolicy, check_command_policy, default_tool_gateway
|
|
14
|
+
from ksadk.tools.result_budget import budget_text_fields
|
|
15
|
+
from ksadk.toolsets._langchain import as_tool
|
|
16
|
+
from ksadk.toolsets.workspace import workspace_root
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
_SANDBOX_TOOL_POLICIES = {
|
|
23
|
+
"sandbox_status": ToolPolicy(risk_level="low"),
|
|
24
|
+
"run_command": ToolPolicy(risk_level="high", side_effects=("sandbox_command_execution",)),
|
|
25
|
+
"run_code": ToolPolicy(risk_level="high", side_effects=("sandbox_code_execution",)),
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _gateway():
|
|
30
|
+
return default_tool_gateway(_SANDBOX_TOOL_POLICIES)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def sandbox_backend_name() -> str:
|
|
34
|
+
explicit = os.environ.get("KSADK_SANDBOX_BACKEND", "").strip().lower()
|
|
35
|
+
if explicit:
|
|
36
|
+
return explicit
|
|
37
|
+
if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
|
|
38
|
+
return "e2b"
|
|
39
|
+
return "none"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _sandbox_execution_backend_name() -> str:
|
|
43
|
+
explicit = os.environ.get("KSADK_SANDBOX_BACKEND", "").strip().lower()
|
|
44
|
+
return explicit or "e2b"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def sandbox_status() -> dict:
|
|
48
|
+
"""Report configured AgentEngine sandbox status and boundaries."""
|
|
49
|
+
|
|
50
|
+
return _gateway().invoke("sandbox_status", _sandbox_status_impl)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _sandbox_status_impl() -> dict[str, Any]:
|
|
54
|
+
backend = sandbox_backend_name()
|
|
55
|
+
timeout = int(os.environ.get("KSADK_SANDBOX_TIMEOUT") or os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT") or "600")
|
|
56
|
+
idle_ttl = _int_env("KSADK_SANDBOX_IDLE_TTL_SECONDS", 300)
|
|
57
|
+
max_sessions = _int_env("KSADK_SANDBOX_MAX_SESSIONS", 0)
|
|
58
|
+
template_id = os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID") or ""
|
|
59
|
+
isolated = backend not in {"local", "local_process", "pod", "pod_process"}
|
|
60
|
+
latest = GLOBAL_SANDBOX_REGISTRY.latest()
|
|
61
|
+
now = time.time()
|
|
62
|
+
return {
|
|
63
|
+
"ok": True,
|
|
64
|
+
"backend": backend,
|
|
65
|
+
"enabled": backend not in {"", "disabled", "none", "off"},
|
|
66
|
+
"isolated": isolated,
|
|
67
|
+
"template_bound": bool(template_id),
|
|
68
|
+
"template_id": template_id,
|
|
69
|
+
"timeout_seconds": timeout,
|
|
70
|
+
"ttl_seconds": _sandbox_ttl_seconds(),
|
|
71
|
+
"idle_ttl_seconds": idle_ttl,
|
|
72
|
+
"max_sessions": max_sessions,
|
|
73
|
+
"sandbox_id": latest.sandbox_id if latest else "",
|
|
74
|
+
"created_at": latest.created_at if latest else None,
|
|
75
|
+
"last_used_at": latest.last_used_at if latest else None,
|
|
76
|
+
"expires_at": latest.expires_at if latest else None,
|
|
77
|
+
"idle_seconds": int(now - latest.last_used_at) if latest else None,
|
|
78
|
+
"boundary": _sandbox_boundary(backend),
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def run_command(
|
|
83
|
+
command: str,
|
|
84
|
+
cwd: str | None = None,
|
|
85
|
+
timeout: int | None = None,
|
|
86
|
+
env: dict[str, str] | None = None,
|
|
87
|
+
background: bool = False,
|
|
88
|
+
approval: dict[str, Any] | None = None,
|
|
89
|
+
) -> dict[str, Any]:
|
|
90
|
+
"""Run a shell command inside the configured isolated sandbox."""
|
|
91
|
+
|
|
92
|
+
return _gateway().invoke("run_command", _run_command_impl, command, cwd, timeout, env, background, approval=approval)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _run_command_impl(
|
|
96
|
+
command: str,
|
|
97
|
+
cwd: str | None = None,
|
|
98
|
+
timeout: int | None = None,
|
|
99
|
+
env: dict[str, str] | None = None,
|
|
100
|
+
background: bool = False,
|
|
101
|
+
) -> dict[str, Any]:
|
|
102
|
+
command_text = str(command or "").strip()
|
|
103
|
+
if not command_text:
|
|
104
|
+
return {"ok": False, "error_message": "command is required"}
|
|
105
|
+
policy = check_command_policy(command_text)
|
|
106
|
+
if not policy.get("ok"):
|
|
107
|
+
return policy
|
|
108
|
+
if background:
|
|
109
|
+
return {"ok": False, "error_type": "background_not_supported", "error_message": "background commands are not supported in P0"}
|
|
110
|
+
try:
|
|
111
|
+
entry, _created = _sandbox_entry("ksadk-direct")
|
|
112
|
+
result = entry.session.run_command(command_text, timeout=timeout, env=env, cwd=cwd)
|
|
113
|
+
payload = {
|
|
114
|
+
"ok": True,
|
|
115
|
+
"backend": f"sandbox/{_sandbox_execution_backend_name()}",
|
|
116
|
+
"sandbox_id": entry.sandbox_id,
|
|
117
|
+
"command": command_text,
|
|
118
|
+
"stdout": result.stdout,
|
|
119
|
+
"stderr": result.stderr,
|
|
120
|
+
"exit_code": result.exit_code,
|
|
121
|
+
}
|
|
122
|
+
return budget_text_fields(payload, tool_name="run_command", fields=("stdout", "stderr"), metadata={"tool_use_id": entry.sandbox_id})
|
|
123
|
+
except SandboxError as exc:
|
|
124
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
125
|
+
except Exception as exc:
|
|
126
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def run_code(
|
|
130
|
+
code: str,
|
|
131
|
+
language: str = "python",
|
|
132
|
+
timeout: int | None = None,
|
|
133
|
+
env: dict[str, str] | None = None,
|
|
134
|
+
approval: dict[str, Any] | None = None,
|
|
135
|
+
) -> dict[str, Any]:
|
|
136
|
+
"""Run a code snippet through the sandbox; this is not a shell replacement."""
|
|
137
|
+
|
|
138
|
+
return _gateway().invoke("run_code", _run_code_impl, code, language, timeout, env, approval=approval)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _run_code_impl(
|
|
142
|
+
code: str,
|
|
143
|
+
language: str = "python",
|
|
144
|
+
timeout: int | None = None,
|
|
145
|
+
env: dict[str, str] | None = None,
|
|
146
|
+
) -> dict[str, Any]:
|
|
147
|
+
source = str(code or "")
|
|
148
|
+
if not source:
|
|
149
|
+
return {"ok": False, "error_message": "code is required"}
|
|
150
|
+
backend_name = _sandbox_execution_backend_name()
|
|
151
|
+
if not _sandbox_backend_isolated(backend_name):
|
|
152
|
+
return {
|
|
153
|
+
"ok": False,
|
|
154
|
+
"error_type": "isolated_sandbox_required",
|
|
155
|
+
"error_message": "run_code requires an isolated sandbox backend; local_process and pod_process are not supported for snippet execution",
|
|
156
|
+
"backend": backend_name,
|
|
157
|
+
"boundary": _sandbox_boundary(backend_name),
|
|
158
|
+
}
|
|
159
|
+
language_name = _normalize_language(language)
|
|
160
|
+
try:
|
|
161
|
+
suffix, command_prefix = _language_command(language_name)
|
|
162
|
+
except ValueError as exc:
|
|
163
|
+
return {"ok": False, "error_message": str(exc)}
|
|
164
|
+
|
|
165
|
+
path = f"/tmp/ksadk-run-code-{uuid4().hex}{suffix}"
|
|
166
|
+
try:
|
|
167
|
+
entry, _created = _sandbox_entry("ksadk-code")
|
|
168
|
+
entry.session.write_file(path, source)
|
|
169
|
+
command = f"{command_prefix} {shlex.quote(path)}"
|
|
170
|
+
result = entry.session.run_command(command, timeout=timeout, env=env)
|
|
171
|
+
payload = {
|
|
172
|
+
"ok": True,
|
|
173
|
+
"backend": f"sandbox/{_sandbox_execution_backend_name()}",
|
|
174
|
+
"sandbox_id": entry.sandbox_id,
|
|
175
|
+
"execution_model": "snippet_runner",
|
|
176
|
+
"boundary": _sandbox_boundary(_sandbox_execution_backend_name()),
|
|
177
|
+
"language": language_name,
|
|
178
|
+
"path": path,
|
|
179
|
+
"command": command,
|
|
180
|
+
"stdout": result.stdout,
|
|
181
|
+
"stderr": result.stderr,
|
|
182
|
+
"exit_code": result.exit_code,
|
|
183
|
+
}
|
|
184
|
+
return budget_text_fields(payload, tool_name="run_code", fields=("stdout", "stderr"), metadata={"tool_use_id": entry.sandbox_id})
|
|
185
|
+
except SandboxError as exc:
|
|
186
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
187
|
+
except Exception as exc:
|
|
188
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _normalize_language(language: str) -> str:
|
|
192
|
+
value = str(language or "python").strip().lower()
|
|
193
|
+
aliases = {
|
|
194
|
+
"py": "python",
|
|
195
|
+
"python3": "python",
|
|
196
|
+
"js": "javascript",
|
|
197
|
+
"node": "javascript",
|
|
198
|
+
"nodejs": "javascript",
|
|
199
|
+
"sh": "bash",
|
|
200
|
+
"shell": "bash",
|
|
201
|
+
}
|
|
202
|
+
return aliases.get(value, value)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _language_command(language: str) -> tuple[str, str]:
|
|
206
|
+
if language == "python":
|
|
207
|
+
return ".py", "python"
|
|
208
|
+
if language == "javascript":
|
|
209
|
+
return ".js", "node"
|
|
210
|
+
if language == "bash":
|
|
211
|
+
return ".sh", "bash"
|
|
212
|
+
raise ValueError(f"unsupported language: {language}")
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _sandbox_entry(prefix: str):
|
|
216
|
+
backend_name = _sandbox_execution_backend_name()
|
|
217
|
+
backend = create_sandbox_backend()
|
|
218
|
+
ttl = _sandbox_ttl_seconds()
|
|
219
|
+
idle_ttl = _int_env("KSADK_SANDBOX_IDLE_TTL_SECONDS", 300)
|
|
220
|
+
max_sessions = _int_env("KSADK_SANDBOX_MAX_SESSIONS", 0) or None
|
|
221
|
+
key = _sandbox_session_key(prefix)
|
|
222
|
+
isolated = _sandbox_backend_isolated(backend_name)
|
|
223
|
+
input_files = _workspace_input_files() if isolated else []
|
|
224
|
+
entry, created = GLOBAL_SANDBOX_REGISTRY.get_or_create(
|
|
225
|
+
key=key,
|
|
226
|
+
backend_name=backend_name,
|
|
227
|
+
backend=backend,
|
|
228
|
+
ttl_seconds=ttl,
|
|
229
|
+
idle_ttl_seconds=idle_ttl,
|
|
230
|
+
max_sessions=max_sessions,
|
|
231
|
+
input_files=input_files,
|
|
232
|
+
isolated=isolated,
|
|
233
|
+
)
|
|
234
|
+
logger.info(
|
|
235
|
+
"ksadk.sandbox.%s",
|
|
236
|
+
"create" if created else "reuse",
|
|
237
|
+
extra={
|
|
238
|
+
"sandbox_backend": backend_name,
|
|
239
|
+
"sandbox_id": entry.sandbox_id,
|
|
240
|
+
"isolated": isolated,
|
|
241
|
+
"workspace_input_files": len(input_files) if created else 0,
|
|
242
|
+
},
|
|
243
|
+
)
|
|
244
|
+
return entry, created
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def _sandbox_session_key(prefix: str) -> str:
|
|
248
|
+
explicit = os.environ.get("KSADK_SANDBOX_SESSION_ID")
|
|
249
|
+
if explicit:
|
|
250
|
+
return explicit
|
|
251
|
+
context = get_current_tool_execution_context_or_default()
|
|
252
|
+
if context.session_id:
|
|
253
|
+
return f"ksadk-session:{context.session_id}"
|
|
254
|
+
return f"{prefix}-shared"
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def _sandbox_backend_isolated(backend_name: str) -> bool:
|
|
258
|
+
return backend_name not in {"local", "local_process", "pod", "pod_process"}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def _workspace_input_files() -> list[SandboxInputFile]:
|
|
262
|
+
root = workspace_root()
|
|
263
|
+
if not root.exists():
|
|
264
|
+
return []
|
|
265
|
+
max_files = _int_env("KSADK_SANDBOX_SYNC_MAX_FILES", 2000)
|
|
266
|
+
max_file_bytes = _int_env("KSADK_SANDBOX_SYNC_MAX_FILE_BYTES", 2 * 1024 * 1024)
|
|
267
|
+
max_total_bytes = _int_env("KSADK_SANDBOX_SYNC_MAX_TOTAL_BYTES", 25 * 1024 * 1024)
|
|
268
|
+
skipped_dirs = {".git", "__pycache__", ".venv", "node_modules", ".pytest_cache"}
|
|
269
|
+
files: list[SandboxInputFile] = []
|
|
270
|
+
total_bytes = 0
|
|
271
|
+
for item in sorted(root.rglob("*")):
|
|
272
|
+
if len(files) >= max_files:
|
|
273
|
+
break
|
|
274
|
+
if any(part in skipped_dirs for part in item.relative_to(root).parts):
|
|
275
|
+
continue
|
|
276
|
+
if not item.is_file():
|
|
277
|
+
continue
|
|
278
|
+
size = item.stat().st_size
|
|
279
|
+
if size > max_file_bytes or total_bytes + size > max_total_bytes:
|
|
280
|
+
continue
|
|
281
|
+
relative = item.relative_to(root).as_posix()
|
|
282
|
+
files.append(SandboxInputFile(source=item, target_path=f"/workspace/{relative}"))
|
|
283
|
+
total_bytes += size
|
|
284
|
+
return files
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def _sandbox_ttl_seconds() -> int:
|
|
288
|
+
return _int_env("KSADK_SANDBOX_TTL_SECONDS", _int_env("KSADK_SANDBOX_TIMEOUT", 600))
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _int_env(name: str, default: int) -> int:
|
|
292
|
+
raw = os.environ.get(name)
|
|
293
|
+
if raw is None:
|
|
294
|
+
return int(default)
|
|
295
|
+
try:
|
|
296
|
+
return max(0, int(raw))
|
|
297
|
+
except ValueError:
|
|
298
|
+
return int(default)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def _sandbox_boundary(backend: str) -> str:
|
|
302
|
+
if backend in {"local", "local_process"}:
|
|
303
|
+
return "executes as a local child process; shares local filesystem, env allowlist, and network"
|
|
304
|
+
if backend in {"pod", "pod_process"}:
|
|
305
|
+
return "executes inside the agent pod; shares pod filesystem, env allowlist, network, and service account"
|
|
306
|
+
return "Sandbox tools execute commands and code only through the configured isolated sandbox backend; they never expose the host shell."
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def get_sandbox_tools() -> list:
|
|
310
|
+
return [as_tool(sandbox_status), as_tool(run_command), as_tool(run_code)]
|
ksadk/toolsets/skills.py
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import tempfile
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from ksadk.skills.loader import load_local_skill
|
|
9
|
+
from ksadk.skills.package_store import PackageStore, SkillPackageError
|
|
10
|
+
from ksadk.skills.runtime import loader as runtime_loader
|
|
11
|
+
from ksadk.skills.runtime.base import SkillRuntimeError
|
|
12
|
+
from ksadk.skills.runtime.factory import create_skill_runtime_backend
|
|
13
|
+
from ksadk.skills.runtime.registry import match_skill_refs, select_public_skill_refs
|
|
14
|
+
from ksadk.skills.service_client import SkillServiceClient
|
|
15
|
+
from ksadk.skills.service_env import (
|
|
16
|
+
public_skill_space_ids,
|
|
17
|
+
resolve_skill_service_url,
|
|
18
|
+
user_skill_space_ids,
|
|
19
|
+
)
|
|
20
|
+
from ksadk.skills.tool_defs import (
|
|
21
|
+
build_execute_skills_tool as build_runtime_execute_skills_tool,
|
|
22
|
+
load_remote_skill_manifests,
|
|
23
|
+
resolve_skill_space_ids,
|
|
24
|
+
)
|
|
25
|
+
from ksadk.tools.gateway import ToolPolicy, default_tool_gateway
|
|
26
|
+
from ksadk.toolsets._langchain import as_tool
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
_SKILL_TOOL_POLICIES = {
|
|
30
|
+
"list_skills": ToolPolicy(risk_level="low"),
|
|
31
|
+
"search_skills": ToolPolicy(risk_level="low"),
|
|
32
|
+
"load_skill": ToolPolicy(risk_level="low", side_effects=("skill_cache_write",)),
|
|
33
|
+
"execute_skills": ToolPolicy(risk_level="high", side_effects=("isolated_runtime_execution",)),
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _gateway():
|
|
38
|
+
return default_tool_gateway(_SKILL_TOOL_POLICIES)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def list_skills() -> dict[str, Any]:
|
|
42
|
+
"""List skills discoverable from configured Skill Spaces."""
|
|
43
|
+
|
|
44
|
+
try:
|
|
45
|
+
manifests = load_remote_skill_manifests(resolve_skill_space_ids())
|
|
46
|
+
return {
|
|
47
|
+
"ok": True,
|
|
48
|
+
"skills": manifests,
|
|
49
|
+
"skill_space_ids": resolve_skill_space_ids(),
|
|
50
|
+
}
|
|
51
|
+
except Exception as exc:
|
|
52
|
+
return {
|
|
53
|
+
"ok": False,
|
|
54
|
+
"error_type": type(exc).__name__,
|
|
55
|
+
"error_message": str(exc),
|
|
56
|
+
"skill_space_ids": resolve_skill_space_ids(),
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def load_skill(skill_name: str) -> dict[str, Any]:
|
|
61
|
+
"""Download and load a skill's SKILL.md instructions from configured Skill Spaces."""
|
|
62
|
+
|
|
63
|
+
target = str(skill_name or "").strip().lower()
|
|
64
|
+
if not target:
|
|
65
|
+
return {"ok": False, "error_message": "skill_name is required"}
|
|
66
|
+
try:
|
|
67
|
+
client = _skill_service_client()
|
|
68
|
+
available: list[str] = []
|
|
69
|
+
for space_id, skill in _iter_remote_skills(client):
|
|
70
|
+
if not skill.name:
|
|
71
|
+
continue
|
|
72
|
+
available.append(skill.name)
|
|
73
|
+
if skill.name.strip().lower() != target:
|
|
74
|
+
continue
|
|
75
|
+
package = _get_or_download_package(client, skill)
|
|
76
|
+
local_skill = load_local_skill(package.root_dir)
|
|
77
|
+
return {
|
|
78
|
+
"ok": True,
|
|
79
|
+
"execution_context": "outer_agent",
|
|
80
|
+
"name": local_skill.name,
|
|
81
|
+
"description": local_skill.description,
|
|
82
|
+
"space_id": space_id,
|
|
83
|
+
"skill_id": skill.skill_id,
|
|
84
|
+
"version_id": skill.version_id,
|
|
85
|
+
"version": skill.version,
|
|
86
|
+
"cache_hit": bool(getattr(package, "cache_hit", False)),
|
|
87
|
+
"root_dir": str(local_skill.root_dir),
|
|
88
|
+
"has_scripts_dir": (local_skill.root_dir / "scripts").is_dir(),
|
|
89
|
+
"script_files": _script_files(local_skill.root_dir),
|
|
90
|
+
"instructions": local_skill.body,
|
|
91
|
+
"usage": "Read these instructions and complete the user's task in the outer agent unless the skill explicitly requires isolated execution.",
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
"ok": False,
|
|
95
|
+
"error_message": f"Skill not found: {skill_name}",
|
|
96
|
+
"available_skills": available,
|
|
97
|
+
}
|
|
98
|
+
except Exception as exc:
|
|
99
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def search_skills(query: str, max_results: int = 10) -> dict[str, Any]:
|
|
103
|
+
"""Search skills by name, aliases, tags, description, and examples."""
|
|
104
|
+
|
|
105
|
+
query_text = str(query or "").strip()
|
|
106
|
+
if not query_text:
|
|
107
|
+
return {"ok": False, "error_message": "query is required"}
|
|
108
|
+
try:
|
|
109
|
+
client = _skill_service_client()
|
|
110
|
+
refs = [skill for _, skill in _iter_remote_skills(client)]
|
|
111
|
+
matches = match_skill_refs(refs, query_text, limit=max_results)
|
|
112
|
+
return {
|
|
113
|
+
"ok": True,
|
|
114
|
+
"query": query,
|
|
115
|
+
"results": [match.to_dict() for match in matches],
|
|
116
|
+
}
|
|
117
|
+
except Exception as exc:
|
|
118
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def execute_skills(
|
|
122
|
+
workflow_prompt: str,
|
|
123
|
+
skill_names: list[str] | str | None = None,
|
|
124
|
+
approval: dict[str, Any] | None = None,
|
|
125
|
+
) -> dict[str, Any]:
|
|
126
|
+
"""Execute a workflow through the configured Skill Runtime."""
|
|
127
|
+
|
|
128
|
+
return _gateway().invoke(
|
|
129
|
+
"execute_skills",
|
|
130
|
+
_execute_skills_impl,
|
|
131
|
+
workflow_prompt,
|
|
132
|
+
skill_names,
|
|
133
|
+
approval=approval,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _execute_skills_impl(workflow_prompt: str, skill_names: list[str] | str | None = None) -> dict[str, Any]:
|
|
138
|
+
try:
|
|
139
|
+
backend = create_skill_runtime_backend()
|
|
140
|
+
raw_tool = build_runtime_execute_skills_tool(backend=backend)
|
|
141
|
+
result = raw_tool(workflow_prompt, skill_names)
|
|
142
|
+
if isinstance(result, dict):
|
|
143
|
+
result.setdefault("execution_context", f"skill-runtime/{_skill_execution_backend()}")
|
|
144
|
+
return result
|
|
145
|
+
except SkillRuntimeError as exc:
|
|
146
|
+
return {
|
|
147
|
+
"ok": False,
|
|
148
|
+
"error_type": "skill_runtime_disabled",
|
|
149
|
+
"error_message": str(exc),
|
|
150
|
+
"hint": "Configure KSADK_SKILL_RUNTIME_BACKEND=local_process/e2b or KSADK_SANDBOX_TEMPLATE_ID for isolated Skill workflow execution.",
|
|
151
|
+
}
|
|
152
|
+
except Exception as exc:
|
|
153
|
+
return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def get_skill_tools() -> list:
|
|
157
|
+
return [as_tool(list_skills), as_tool(search_skills), as_tool(load_skill), as_tool(execute_skills)]
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _skill_execution_backend() -> str:
|
|
161
|
+
explicit = os.environ.get("KSADK_SKILL_RUNTIME_BACKEND", "").strip().lower()
|
|
162
|
+
if explicit:
|
|
163
|
+
return explicit
|
|
164
|
+
if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
|
|
165
|
+
return "e2b"
|
|
166
|
+
return "disabled"
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _skill_service_client() -> SkillServiceClient:
|
|
170
|
+
service_url = resolve_skill_service_url(require_spaces=True)
|
|
171
|
+
if not service_url:
|
|
172
|
+
raise ValueError("Skill Service URL is not configured")
|
|
173
|
+
return SkillServiceClient(
|
|
174
|
+
base_url=service_url,
|
|
175
|
+
token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
|
|
176
|
+
timeout=float(os.environ.get("KSADK_SKILL_MANIFEST_TIMEOUT", "10")),
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _iter_remote_skills(client: SkillServiceClient):
|
|
181
|
+
for space_id in user_skill_space_ids():
|
|
182
|
+
listing = client.list_skills_by_space_id(space_id)
|
|
183
|
+
for skill in listing.active_skills():
|
|
184
|
+
yield space_id, skill
|
|
185
|
+
if public_skill_space_ids():
|
|
186
|
+
listing = client.list_available_premade_skills()
|
|
187
|
+
for skill in select_public_skill_refs(listing.active_skills()):
|
|
188
|
+
yield listing.space_id or "public", skill
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _get_or_download_package(client: SkillServiceClient, skill):
|
|
192
|
+
cache_dir = Path(
|
|
193
|
+
os.environ.get("KSADK_SKILL_CACHE_DIR")
|
|
194
|
+
or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
|
|
195
|
+
)
|
|
196
|
+
store = PackageStore(cache_dir=cache_dir)
|
|
197
|
+
package = store.get_cached(skill)
|
|
198
|
+
if package is not None:
|
|
199
|
+
return package
|
|
200
|
+
archive = client.download_skill_archive(skill)
|
|
201
|
+
try:
|
|
202
|
+
return store.store_archive(skill, archive)
|
|
203
|
+
except SkillPackageError:
|
|
204
|
+
if not runtime_loader._allow_hash_mismatch():
|
|
205
|
+
raise
|
|
206
|
+
return runtime_loader._store_unverified_archive(store, skill, archive)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _script_files(root_dir: Path) -> list[str]:
|
|
210
|
+
scripts_dir = root_dir / "scripts"
|
|
211
|
+
if not scripts_dir.is_dir():
|
|
212
|
+
return []
|
|
213
|
+
return [
|
|
214
|
+
str(path.relative_to(root_dir))
|
|
215
|
+
for path in sorted(scripts_dir.rglob("*"))
|
|
216
|
+
if path.is_file()
|
|
217
|
+
][:20]
|