agentengine-sdk-python 0.6.4__py3-none-any.whl → 0.7.0__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.7.0.dist-info/METADATA +181 -0
- agentengine_sdk_python-0.7.0.dist-info/RECORD +482 -0
- {agentengine_sdk_python-0.6.4.dist-info → agentengine_sdk_python-0.7.0.dist-info}/WHEEL +1 -1
- agentengine_sdk_python-0.7.0.dist-info/entry_points.txt +3 -0
- agentengine_sdk_python-0.7.0.dist-info/licenses/LICENSE +175 -0
- agentengine_sdk_python-0.7.0.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 +2246 -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 +2304 -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 +1263 -0
- ksadk/cli/cmd_invoke.py +1503 -0
- ksadk/cli/cmd_launch.py +564 -0
- ksadk/cli/cmd_mcp.py +1179 -0
- ksadk/cli/cmd_model.py +302 -0
- ksadk/cli/cmd_openclaw.py +3922 -0
- ksadk/cli/cmd_run.py +239 -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 +412 -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 +343 -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/message_projection.py +269 -0
- ksadk/conversations/model_context.py +370 -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 +5276 -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 +1115 -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/resilient_session_service.py +268 -0
- ksadk/memory/adk/short_term_memory.py +304 -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 +1994 -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 +751 -0
- ksadk/runners/langgraph_runner.py +985 -0
- ksadk/runners/patch_langchain.py +187 -0
- ksadk/runners/remote_runner.py +792 -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 +3931 -0
- ksadk/server/static/assets/ArtifactsPanel-D-SSn2ee.js +1 -0
- ksadk/server/static/assets/CodeBlock-P16VOLYi.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-CdGiQWHR.js +8 -0
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
- ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
- ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.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-BA13sHc9.js +1 -0
- ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +1 -0
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-DzJzgVoL.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-UTdVcZhn.js +132 -0
- ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dix0GD4m.js +10 -0
- ksadk/server/static/assets/channel-CTuydARX.js +1 -0
- ksadk/server/static/assets/chunk-2J33WTMH-C2JxuZ42.js +1 -0
- ksadk/server/static/assets/chunk-4BX2VUAB-Be57QPgD.js +1 -0
- ksadk/server/static/assets/chunk-55IACEB6-WjSuy4nv.js +1 -0
- ksadk/server/static/assets/chunk-727SXJPM-BOovP-b5.js +206 -0
- ksadk/server/static/assets/chunk-AQP2D5EJ-DOmZNmWj.js +231 -0
- ksadk/server/static/assets/chunk-FMBD7UC4-DzwlodkU.js +15 -0
- ksadk/server/static/assets/chunk-ND2GUHAM-DMqAikEU.js +1 -0
- ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.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-Zhy2GBnP.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-CbKrtIUz.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-BRApgQRK.js +43 -0
- ksadk/server/static/assets/diagram-5GNKFQAL-D0xbnDiK.js +10 -0
- ksadk/server/static/assets/diagram-KO2AKTUF-CVugVI9L.js +3 -0
- ksadk/server/static/assets/diagram-LMA3HP47-DozUGgee.js +24 -0
- ksadk/server/static/assets/diagram-OG6HWLK6-ZOYsKlru.js +24 -0
- ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
- ksadk/server/static/assets/dist-2hInLS_J.js +9 -0
- ksadk/server/static/assets/dist-8EEyGgDx.js +1 -0
- ksadk/server/static/assets/dist-8_SfK1IP.js +1 -0
- ksadk/server/static/assets/dist-B0NP_Z0z.js +23 -0
- ksadk/server/static/assets/dist-BIJVDMuB.js +1 -0
- ksadk/server/static/assets/dist-BmlMPsCc.js +2 -0
- ksadk/server/static/assets/dist-BrCcQ47T.js +1 -0
- ksadk/server/static/assets/dist-BssVmjIo.js +6 -0
- ksadk/server/static/assets/dist-C3HIIaN5.js +1 -0
- ksadk/server/static/assets/dist-CPBtqRTW.js +1 -0
- ksadk/server/static/assets/dist-CkEKJFtk.js +1 -0
- ksadk/server/static/assets/dist-D-JMdWPQ.js +1 -0
- ksadk/server/static/assets/dist-D-xOD048.js +1 -0
- ksadk/server/static/assets/dist-D57wnGWd.js +1 -0
- ksadk/server/static/assets/dist-DL_NKc_z.js +1 -0
- ksadk/server/static/assets/dist-DMezvBGJ.js +1 -0
- ksadk/server/static/assets/dist-DmFaq_Iy.js +1 -0
- ksadk/server/static/assets/dist-Dp0k7bWI.js +1 -0
- ksadk/server/static/assets/dist-DpKtt4Bo.js +1 -0
- ksadk/server/static/assets/dist-DyOkZmze.js +11 -0
- ksadk/server/static/assets/dist-DyWsb78Q.js +1 -0
- ksadk/server/static/assets/dist-gX6GOLKq.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-Bk-9bgE5.js +85 -0
- ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
- ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.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-Dn9kZVuZ.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-BGxXlJqm.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-BIao9Yjg.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-C7Q0X-wi.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-C00Lwg3L.js +165 -0
- ksadk/server/static/assets/index-DAURbCsP.css +1 -0
- ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +1 -0
- ksadk/server/static/assets/infoDiagram-5YYISTIA-BO_CSqq5.js +2 -0
- ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
- ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-eYLPLd46.js +70 -0
- ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
- ksadk/server/static/assets/journeyDiagram-JHISSGLW-De9geSb0.js +139 -0
- ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
- ksadk/server/static/assets/kanban-definition-UN3LZRKU-Cs80kQto.js +89 -0
- ksadk/server/static/assets/katex-DSrCFD8n.js +265 -0
- ksadk/server/static/assets/linear-CN9sbKTF.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-DlgSBU8l.js +161 -0
- ksadk/server/static/assets/mindmap-definition-RKZ34NQL-9afz7Oug.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-CGkyRxlg.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-M0uWAf4n.js +1 -0
- ksadk/server/static/assets/pieDiagram-4H26LBE5-DPv_VstN.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-o77wZ1XK.js +7 -0
- ksadk/server/static/assets/r-DADKenSm.js +1 -0
- ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +1 -0
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-BYVw81VC.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-B7nZFMKT.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-BGRRrFw5.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-BUfHCoPs.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.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-FbCTGrf9.js +120 -0
- ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
- ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.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-DWgwtPsJ.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-BEQz7wyy.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-2x8G-tTM.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-Drma3AYl.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 +279 -0
- ksadk/sessions/base.py +354 -0
- ksadk/sessions/continuity.py +337 -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 +901 -0
- ksadk/sessions/resilience.py +52 -0
- ksadk/sessions/resilient.py +360 -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 +854 -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 +917 -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 +892 -0
- ksadk/tracing/span_utils.py +114 -0
- ksadk/tui/__init__.py +27 -0
- ksadk/tui/loop.py +1877 -0
- ksadk/tui/stream_render.py +68 -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/__init__.py +0 -3
- agentengine_sdk_python-0.6.4.dist-info/METADATA +0 -48
- agentengine_sdk_python-0.6.4.dist-info/RECORD +0 -5
- agentengine_sdk_python-0.6.4.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import shutil
|
|
5
|
+
import zipfile
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from ksadk.skills.models import SkillRef
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SkillPackageError(RuntimeError):
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class SkillPackage:
|
|
18
|
+
ref: SkillRef
|
|
19
|
+
archive_path: Path
|
|
20
|
+
extract_dir: Path
|
|
21
|
+
root_dir: Path
|
|
22
|
+
cache_hit: bool = False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PackageStore:
|
|
26
|
+
def __init__(self, cache_dir: str | Path):
|
|
27
|
+
self.cache_dir = Path(cache_dir)
|
|
28
|
+
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
29
|
+
|
|
30
|
+
def store_archive(self, ref: SkillRef, content: bytes) -> SkillPackage:
|
|
31
|
+
self._verify_hash(ref, content)
|
|
32
|
+
skill_dir = self._skill_dir(ref)
|
|
33
|
+
archive_path = skill_dir / "archive.zip"
|
|
34
|
+
extract_dir = skill_dir / "extracted"
|
|
35
|
+
|
|
36
|
+
if archive_path.exists() and extract_dir.exists():
|
|
37
|
+
cached = self.get_cached(ref)
|
|
38
|
+
if cached is not None:
|
|
39
|
+
return cached
|
|
40
|
+
|
|
41
|
+
if skill_dir.exists():
|
|
42
|
+
shutil.rmtree(skill_dir)
|
|
43
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
44
|
+
archive_path.write_bytes(content)
|
|
45
|
+
extract_dir.mkdir(parents=True, exist_ok=True)
|
|
46
|
+
self._safe_extract(archive_path, extract_dir)
|
|
47
|
+
|
|
48
|
+
return SkillPackage(
|
|
49
|
+
ref=ref,
|
|
50
|
+
archive_path=archive_path,
|
|
51
|
+
extract_dir=extract_dir,
|
|
52
|
+
root_dir=self._find_skill_root(extract_dir),
|
|
53
|
+
cache_hit=False,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def get_cached(self, ref: SkillRef) -> SkillPackage | None:
|
|
57
|
+
skill_dir = self._skill_dir(ref)
|
|
58
|
+
archive_path = skill_dir / "archive.zip"
|
|
59
|
+
extract_dir = skill_dir / "extracted"
|
|
60
|
+
if not archive_path.exists() or not extract_dir.exists():
|
|
61
|
+
return None
|
|
62
|
+
content = archive_path.read_bytes()
|
|
63
|
+
try:
|
|
64
|
+
self._verify_hash(ref, content)
|
|
65
|
+
except SkillPackageError:
|
|
66
|
+
return None
|
|
67
|
+
return SkillPackage(
|
|
68
|
+
ref=ref,
|
|
69
|
+
archive_path=archive_path,
|
|
70
|
+
extract_dir=extract_dir,
|
|
71
|
+
root_dir=self._find_skill_root(extract_dir),
|
|
72
|
+
cache_hit=True,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
def _skill_dir(self, ref: SkillRef) -> Path:
|
|
76
|
+
return self.cache_dir / (ref.cache_key or ref.name or "skill")
|
|
77
|
+
|
|
78
|
+
def _verify_hash(self, ref: SkillRef, content: bytes) -> None:
|
|
79
|
+
if not ref.content_hash:
|
|
80
|
+
return
|
|
81
|
+
if ref.content_hash.algorithm != "sha256":
|
|
82
|
+
raise SkillPackageError(f"Unsupported ContentHash algorithm: {ref.content_hash.algorithm}")
|
|
83
|
+
actual = hashlib.sha256(content).hexdigest()
|
|
84
|
+
if actual.lower() != ref.content_hash.value.lower():
|
|
85
|
+
raise SkillPackageError(
|
|
86
|
+
f"ContentHash mismatch for {ref.name}: expected {ref.content_hash.render()}, got sha256:{actual}"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def _safe_extract(self, archive_path: Path, extract_dir: Path) -> None:
|
|
90
|
+
base = extract_dir.resolve()
|
|
91
|
+
with zipfile.ZipFile(archive_path) as archive:
|
|
92
|
+
for member in archive.infolist():
|
|
93
|
+
target = (extract_dir / member.filename).resolve()
|
|
94
|
+
if not str(target).startswith(str(base) + "/") and target != base:
|
|
95
|
+
raise SkillPackageError(f"unsafe zip member: {member.filename}")
|
|
96
|
+
archive.extractall(extract_dir)
|
|
97
|
+
|
|
98
|
+
def _find_skill_root(self, extract_dir: Path) -> Path:
|
|
99
|
+
if (extract_dir / "SKILL.md").exists():
|
|
100
|
+
return extract_dir
|
|
101
|
+
candidates = sorted(path.parent for path in extract_dir.rglob("SKILL.md"))
|
|
102
|
+
if not candidates:
|
|
103
|
+
raise SkillPackageError(f"SKILL.md not found under {extract_dir}")
|
|
104
|
+
return candidates[0]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from ksadk.skills.runtime.base import (
|
|
2
|
+
SandboxInputFile,
|
|
3
|
+
SkillRuntimeBackend,
|
|
4
|
+
SkillRuntimeError,
|
|
5
|
+
SkillRuntimeResult,
|
|
6
|
+
)
|
|
7
|
+
from ksadk.skills.runtime.factory import create_skill_runtime_backend
|
|
8
|
+
from ksadk.skills.runtime.request import SkillWorkflowRequest
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"SandboxInputFile",
|
|
12
|
+
"SkillRuntimeBackend",
|
|
13
|
+
"SkillRuntimeError",
|
|
14
|
+
"SkillRuntimeResult",
|
|
15
|
+
"SkillWorkflowRequest",
|
|
16
|
+
"create_skill_runtime_backend",
|
|
17
|
+
]
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import subprocess
|
|
6
|
+
import sys
|
|
7
|
+
from dataclasses import asdict
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
|
|
12
|
+
from ksadk.skills.loader import LocalSkill
|
|
13
|
+
from ksadk.skills.models import SkillRef
|
|
14
|
+
from ksadk.skills.package_store import PackageStore
|
|
15
|
+
from ksadk.skills.runtime.base import normalize_skill_names
|
|
16
|
+
from ksadk.skills.runtime.executor import (
|
|
17
|
+
WorkflowExecution,
|
|
18
|
+
execute_workflow,
|
|
19
|
+
_can_run_web_artifacts_builder as _executor_can_run_web_artifacts_builder,
|
|
20
|
+
_run_command as _executor_run_command,
|
|
21
|
+
_run_web_artifacts_builder as _executor_run_web_artifacts_builder,
|
|
22
|
+
_runtime_timeout as _executor_runtime_timeout,
|
|
23
|
+
_safe_project_name as _executor_safe_project_name,
|
|
24
|
+
_tail as _executor_tail,
|
|
25
|
+
)
|
|
26
|
+
from ksadk.skills.runtime.request import (
|
|
27
|
+
SkillWorkflowRequest,
|
|
28
|
+
SkillWorkflowRequestError,
|
|
29
|
+
parse_workflow_request,
|
|
30
|
+
)
|
|
31
|
+
from ksadk.skills.runtime import loader as runtime_loader
|
|
32
|
+
from ksadk.skills.runtime import registry as runtime_registry
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _skill_space_ids() -> list[str]:
|
|
36
|
+
return runtime_registry.skill_space_ids()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _user_skill_space_ids() -> list[str]:
|
|
40
|
+
return runtime_registry.user_skill_space_ids()
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _public_skill_space_ids() -> list[str]:
|
|
44
|
+
return runtime_registry.public_skill_space_ids()
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _parse_space_ids(*raw_values: str) -> list[str]:
|
|
48
|
+
return runtime_registry.parse_space_ids(*raw_values)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
_SKILL_LOAD_WARNINGS: list[str] = []
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _load_skills(
|
|
55
|
+
*,
|
|
56
|
+
prompt: str = "",
|
|
57
|
+
skill_names: list[str] | None = None,
|
|
58
|
+
service_transport: httpx.BaseTransport | None = None,
|
|
59
|
+
) -> list[LocalSkill]:
|
|
60
|
+
result = runtime_loader.load_skills(
|
|
61
|
+
prompt=prompt,
|
|
62
|
+
skill_names=skill_names,
|
|
63
|
+
service_transport=service_transport,
|
|
64
|
+
)
|
|
65
|
+
_SKILL_LOAD_WARNINGS.extend(result.warnings)
|
|
66
|
+
return result.skills
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _dedupe_skill_refs(skill_refs: list[SkillRef], *, seen_names: set[str]) -> list[SkillRef]:
|
|
70
|
+
return runtime_registry.dedupe_skill_refs(skill_refs, seen_names=seen_names)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _select_public_skill_refs(skill_refs: list[SkillRef]) -> list[SkillRef]:
|
|
74
|
+
return runtime_registry.select_public_skill_refs(skill_refs)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _allow_hash_mismatch() -> bool:
|
|
78
|
+
return runtime_loader._allow_hash_mismatch()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _store_unverified_archive(store: PackageStore, skill: SkillRef, archive: bytes):
|
|
82
|
+
return runtime_loader._store_unverified_archive(store, skill, archive)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _select_remote_skill_refs(
|
|
86
|
+
skill_refs: list[SkillRef],
|
|
87
|
+
prompt: str,
|
|
88
|
+
*,
|
|
89
|
+
skill_names: list[str] | None = None,
|
|
90
|
+
) -> list[SkillRef]:
|
|
91
|
+
return runtime_registry.select_remote_skill_refs(skill_refs, prompt, skill_names=skill_names)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _load_local_skills() -> list[LocalSkill]:
|
|
95
|
+
return runtime_loader.load_local_skills()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def run_agent(
|
|
99
|
+
argv: list[str] | None = None,
|
|
100
|
+
*,
|
|
101
|
+
service_transport: httpx.BaseTransport | None = None,
|
|
102
|
+
) -> int:
|
|
103
|
+
_SKILL_LOAD_WARNINGS.clear()
|
|
104
|
+
args = list(argv if argv is not None else sys.argv[1:])
|
|
105
|
+
try:
|
|
106
|
+
request = _resolve_request(args)
|
|
107
|
+
except SkillWorkflowRequestError as exc:
|
|
108
|
+
execution = WorkflowExecution(status="failed", error=str(exc))
|
|
109
|
+
print("workflow=")
|
|
110
|
+
print(f"skill_spaces={','.join(_skill_space_ids())}")
|
|
111
|
+
print("loaded_skills=")
|
|
112
|
+
print(f"workflow_result={json.dumps(asdict(execution), ensure_ascii=False, sort_keys=True)}")
|
|
113
|
+
return 1
|
|
114
|
+
|
|
115
|
+
prompt = request.workflow_prompt
|
|
116
|
+
selected_skill_names = request.skill_names or _selected_skill_names()
|
|
117
|
+
loaded_skills = _load_skills(
|
|
118
|
+
prompt=prompt,
|
|
119
|
+
skill_names=selected_skill_names,
|
|
120
|
+
service_transport=service_transport,
|
|
121
|
+
)
|
|
122
|
+
execution = _execute_workflow(prompt, loaded_skills, selected_skill_names=selected_skill_names)
|
|
123
|
+
print(f"workflow={prompt}")
|
|
124
|
+
print(f"skill_spaces={','.join(_skill_space_ids())}")
|
|
125
|
+
print(f"loaded_skills={','.join(skill.name for skill in loaded_skills)}")
|
|
126
|
+
print(f"selected_skills={json.dumps(selected_skill_names, ensure_ascii=False, sort_keys=True)}")
|
|
127
|
+
if _SKILL_LOAD_WARNINGS:
|
|
128
|
+
print(f"skill_warnings={json.dumps(_SKILL_LOAD_WARNINGS, ensure_ascii=False, sort_keys=True)}")
|
|
129
|
+
print(f"workflow_result={json.dumps(asdict(execution), ensure_ascii=False, sort_keys=True)}")
|
|
130
|
+
return 0 if execution.status != "failed" else 1
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _resolve_request(args: list[str]) -> SkillWorkflowRequest:
|
|
134
|
+
return parse_workflow_request(args)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _selected_skill_names() -> list[str]:
|
|
138
|
+
return normalize_skill_names(os.environ.get("KSADK_SELECTED_SKILL_NAMES", ""))
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _execute_workflow(
|
|
142
|
+
prompt: str,
|
|
143
|
+
skills: list[LocalSkill],
|
|
144
|
+
*,
|
|
145
|
+
selected_skill_names: list[str] | None = None,
|
|
146
|
+
) -> WorkflowExecution:
|
|
147
|
+
return execute_workflow(prompt, skills, selected_skill_names=selected_skill_names)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _can_run_web_artifacts_builder(skill: LocalSkill, prompt: str) -> bool:
|
|
151
|
+
return _executor_can_run_web_artifacts_builder(skill, prompt)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _run_web_artifacts_builder(skill: LocalSkill) -> WorkflowExecution:
|
|
155
|
+
return _executor_run_web_artifacts_builder(skill)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _run_command(args: list[str], *, cwd: Path, timeout: int) -> dict[str, object]:
|
|
159
|
+
return _executor_run_command(args, cwd=cwd, timeout=timeout)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _runtime_timeout() -> int:
|
|
163
|
+
return _executor_runtime_timeout()
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def _safe_project_name(raw: str) -> str:
|
|
167
|
+
return _executor_safe_project_name(raw)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _tail(value: str | bytes, limit: int = 4000) -> str:
|
|
171
|
+
return _executor_tail(value, limit=limit)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _resolve_prompt(args: list[str]) -> str:
|
|
175
|
+
return _resolve_request(args).workflow_prompt
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def main(argv: list[str] | None = None) -> int:
|
|
179
|
+
return run_agent(argv)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
if __name__ == "__main__":
|
|
183
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def parse_artifact_lines(stdout: str) -> list[str]:
|
|
7
|
+
artifacts: list[str] = []
|
|
8
|
+
seen: set[str] = set()
|
|
9
|
+
for line in stdout.splitlines():
|
|
10
|
+
if not line.startswith("artifact="):
|
|
11
|
+
continue
|
|
12
|
+
value = line.split("=", 1)[1].strip()
|
|
13
|
+
if not value or value in seen:
|
|
14
|
+
continue
|
|
15
|
+
seen.add(value)
|
|
16
|
+
artifacts.append(value)
|
|
17
|
+
return artifacts
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def collect_output_dir_artifacts(output_dir: Path) -> list[str]:
|
|
21
|
+
if not output_dir.is_dir():
|
|
22
|
+
return []
|
|
23
|
+
return [
|
|
24
|
+
str(path)
|
|
25
|
+
for path in sorted(output_dir.rglob("*"))
|
|
26
|
+
if path.is_file()
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def merge_artifacts(*groups: list[str]) -> list[str]:
|
|
31
|
+
merged: list[str] = []
|
|
32
|
+
seen: set[str] = set()
|
|
33
|
+
for group in groups:
|
|
34
|
+
for item in group:
|
|
35
|
+
if item in seen:
|
|
36
|
+
continue
|
|
37
|
+
seen.add(item)
|
|
38
|
+
merged.append(item)
|
|
39
|
+
return merged
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Skill Runtime backend implementations."""
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from ksadk.skills.runtime.base import SkillRuntimeError, SkillRuntimeResult
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DisabledSkillRuntimeBackend:
|
|
7
|
+
def run_workflow(self, *args, **kwargs) -> SkillRuntimeResult:
|
|
8
|
+
raise SkillRuntimeError("Skill Runtime is disabled")
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import time
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from ksadk.sandbox import (
|
|
9
|
+
E2BSandboxBackend,
|
|
10
|
+
SandboxInputFile as RuntimeSandboxInputFile,
|
|
11
|
+
SandboxSpec,
|
|
12
|
+
)
|
|
13
|
+
from ksadk.skills.runtime.base import (
|
|
14
|
+
SandboxInputFile,
|
|
15
|
+
SkillRuntimeError,
|
|
16
|
+
SkillRuntimeResult,
|
|
17
|
+
format_skill_names_env,
|
|
18
|
+
normalize_skill_names,
|
|
19
|
+
parse_output_files,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _bool_env(name: str, default: bool = True) -> bool:
|
|
24
|
+
raw = os.environ.get(name)
|
|
25
|
+
if raw is None:
|
|
26
|
+
return default
|
|
27
|
+
return raw.strip().lower() in {"1", "true", "yes", "on"}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _redact(value: str) -> str:
|
|
31
|
+
redacted = value
|
|
32
|
+
for key_name in (
|
|
33
|
+
"E2B_API_KEY",
|
|
34
|
+
"KSADK_SKILL_SERVICE_TOKEN",
|
|
35
|
+
"KSADK_SKILL_SERVICE_ACCESS_KEY",
|
|
36
|
+
"KSADK_SKILL_SERVICE_SECRET_KEY",
|
|
37
|
+
"KSYUN_ACCESS_KEY",
|
|
38
|
+
"KSYUN_SECRET_KEY",
|
|
39
|
+
"KS3_ACCESS_KEY",
|
|
40
|
+
"KS3_SECRET_KEY",
|
|
41
|
+
):
|
|
42
|
+
secret = os.environ.get(key_name)
|
|
43
|
+
if secret:
|
|
44
|
+
redacted = redacted.replace(secret, "[REDACTED]")
|
|
45
|
+
return redacted
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class E2BSkillRuntimeBackend:
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
*,
|
|
52
|
+
sandbox_cls: Any | None = None,
|
|
53
|
+
template_id: str,
|
|
54
|
+
timeout: int = 900,
|
|
55
|
+
allow_internet_access: bool = True,
|
|
56
|
+
):
|
|
57
|
+
if not template_id:
|
|
58
|
+
raise SkillRuntimeError(
|
|
59
|
+
"KSADK_SANDBOX_TEMPLATE_ID is required for E2B backend "
|
|
60
|
+
"(KSADK_SKILL_RUNTIME_TEMPLATE_ID is a compatibility alias)"
|
|
61
|
+
)
|
|
62
|
+
self.template_id = template_id
|
|
63
|
+
self.timeout = timeout
|
|
64
|
+
self.allow_internet_access = allow_internet_access
|
|
65
|
+
self.sandbox_backend = E2BSandboxBackend(
|
|
66
|
+
spec=SandboxSpec(
|
|
67
|
+
template_id=template_id,
|
|
68
|
+
timeout=timeout,
|
|
69
|
+
allow_internet_access=allow_internet_access,
|
|
70
|
+
metadata={"component": "skill-runtime"},
|
|
71
|
+
),
|
|
72
|
+
sandbox_cls=sandbox_cls,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def from_env(cls) -> "E2BSkillRuntimeBackend":
|
|
77
|
+
try:
|
|
78
|
+
from e2b import Sandbox
|
|
79
|
+
except ImportError as exc:
|
|
80
|
+
raise SkillRuntimeError(
|
|
81
|
+
"e2b>=2.0.0 is required for KSADK_SKILL_RUNTIME_BACKEND=e2b"
|
|
82
|
+
) from exc
|
|
83
|
+
return cls(
|
|
84
|
+
sandbox_cls=Sandbox,
|
|
85
|
+
template_id=(
|
|
86
|
+
os.environ.get("KSADK_SANDBOX_TEMPLATE_ID")
|
|
87
|
+
or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID")
|
|
88
|
+
or ""
|
|
89
|
+
),
|
|
90
|
+
timeout=int(os.environ.get("KSADK_SANDBOX_TIMEOUT") or os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT") or "900"),
|
|
91
|
+
allow_internet_access=_bool_env(
|
|
92
|
+
"KSADK_SANDBOX_ALLOW_INTERNET_ACCESS",
|
|
93
|
+
_bool_env("KSADK_SKILL_RUNTIME_ALLOW_INTERNET_ACCESS", True),
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def run_workflow(
|
|
98
|
+
self,
|
|
99
|
+
workflow_prompt: str,
|
|
100
|
+
*,
|
|
101
|
+
skill_space_ids: list[str],
|
|
102
|
+
session_id: str,
|
|
103
|
+
skill_names: list[str] | None = None,
|
|
104
|
+
env: dict[str, str] | None = None,
|
|
105
|
+
input_files: list[SandboxInputFile] | None = None,
|
|
106
|
+
timeout: int = 900,
|
|
107
|
+
) -> SkillRuntimeResult:
|
|
108
|
+
session = None
|
|
109
|
+
started = time.monotonic()
|
|
110
|
+
effective_timeout = timeout or self.timeout
|
|
111
|
+
try:
|
|
112
|
+
sandbox_env = {
|
|
113
|
+
"KSADK_SKILL_SPACE_IDS": ",".join(skill_space_ids),
|
|
114
|
+
"SKILL_SPACE_ID": skill_space_ids[0] if skill_space_ids else "",
|
|
115
|
+
}
|
|
116
|
+
if public_spaces := os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS"):
|
|
117
|
+
sandbox_env["KSADK_PUBLIC_SKILL_SPACE_IDS"] = public_spaces
|
|
118
|
+
selected_skill_names = format_skill_names_env(skill_names)
|
|
119
|
+
if selected_skill_names:
|
|
120
|
+
sandbox_env["KSADK_SELECTED_SKILL_NAMES"] = selected_skill_names
|
|
121
|
+
sandbox_env.update(env or {})
|
|
122
|
+
session = self.sandbox_backend.create_session(
|
|
123
|
+
session_id=session_id,
|
|
124
|
+
env=sandbox_env,
|
|
125
|
+
input_files=[
|
|
126
|
+
RuntimeSandboxInputFile(source=item.source, target_path=item.target_path)
|
|
127
|
+
for item in input_files or []
|
|
128
|
+
],
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
request_path = "/tmp/ksadk-workflow-request.json"
|
|
132
|
+
session.write_file(
|
|
133
|
+
request_path,
|
|
134
|
+
json.dumps(
|
|
135
|
+
{
|
|
136
|
+
"workflow_prompt": workflow_prompt,
|
|
137
|
+
"skill_names": normalize_skill_names(skill_names),
|
|
138
|
+
},
|
|
139
|
+
ensure_ascii=False,
|
|
140
|
+
).encode("utf-8"),
|
|
141
|
+
)
|
|
142
|
+
command = f"python -u /home/ksadk/agent.py --request-file {request_path}"
|
|
143
|
+
result = session.run_command(command, timeout=effective_timeout, env=sandbox_env)
|
|
144
|
+
stdout = result.stdout
|
|
145
|
+
return SkillRuntimeResult(
|
|
146
|
+
runtime_id=session.sandbox_id,
|
|
147
|
+
exit_code=result.exit_code,
|
|
148
|
+
stdout=stdout,
|
|
149
|
+
stderr=result.stderr,
|
|
150
|
+
duration_ms=int((time.monotonic() - started) * 1000),
|
|
151
|
+
output_files=parse_output_files(stdout),
|
|
152
|
+
)
|
|
153
|
+
except Exception as exc:
|
|
154
|
+
error_type = type(exc).__name__
|
|
155
|
+
return SkillRuntimeResult(
|
|
156
|
+
runtime_id=session.sandbox_id if session is not None else "",
|
|
157
|
+
exit_code=None,
|
|
158
|
+
duration_ms=int((time.monotonic() - started) * 1000),
|
|
159
|
+
timed_out="timeout" in error_type.lower(),
|
|
160
|
+
error_type=error_type,
|
|
161
|
+
error_message=_redact(str(exc)),
|
|
162
|
+
)
|
|
163
|
+
finally:
|
|
164
|
+
if session is not None:
|
|
165
|
+
try:
|
|
166
|
+
session.kill()
|
|
167
|
+
except Exception:
|
|
168
|
+
pass
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
import subprocess
|
|
6
|
+
import sys
|
|
7
|
+
import tempfile
|
|
8
|
+
import time
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from ksadk.skills.runtime.base import (
|
|
12
|
+
SandboxInputFile,
|
|
13
|
+
SkillRuntimeResult,
|
|
14
|
+
format_skill_names_env,
|
|
15
|
+
normalize_skill_names,
|
|
16
|
+
parse_output_files,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class LocalProcessSkillRuntimeBackend:
|
|
21
|
+
def __init__(self, agent_path: str | Path, timeout: int = 900):
|
|
22
|
+
self.agent_path = Path(agent_path)
|
|
23
|
+
self.timeout = timeout
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def from_env(cls) -> "LocalProcessSkillRuntimeBackend":
|
|
27
|
+
agent_path = os.environ.get("KSADK_SKILL_RUNTIME_AGENT_PATH") or str(
|
|
28
|
+
Path(__file__).resolve().parents[1] / "agent.py"
|
|
29
|
+
)
|
|
30
|
+
timeout = int(os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT", "900"))
|
|
31
|
+
return cls(agent_path=agent_path, timeout=timeout)
|
|
32
|
+
|
|
33
|
+
def run_workflow(
|
|
34
|
+
self,
|
|
35
|
+
workflow_prompt: str,
|
|
36
|
+
*,
|
|
37
|
+
skill_space_ids: list[str],
|
|
38
|
+
session_id: str,
|
|
39
|
+
skill_names: list[str] | None = None,
|
|
40
|
+
env: dict[str, str] | None = None,
|
|
41
|
+
input_files: list[SandboxInputFile] | None = None,
|
|
42
|
+
timeout: int = 900,
|
|
43
|
+
) -> SkillRuntimeResult:
|
|
44
|
+
started = time.monotonic()
|
|
45
|
+
runtime_env = os.environ.copy()
|
|
46
|
+
runtime_env.update(env or {})
|
|
47
|
+
runtime_env["KSADK_SKILL_SPACE_IDS"] = ",".join(skill_space_ids)
|
|
48
|
+
runtime_env["SKILL_SPACE_ID"] = skill_space_ids[0] if skill_space_ids else ""
|
|
49
|
+
if public_spaces := os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS"):
|
|
50
|
+
runtime_env["KSADK_PUBLIC_SKILL_SPACE_IDS"] = public_spaces
|
|
51
|
+
selected_skill_names = format_skill_names_env(skill_names)
|
|
52
|
+
if selected_skill_names:
|
|
53
|
+
runtime_env["KSADK_SELECTED_SKILL_NAMES"] = selected_skill_names
|
|
54
|
+
else:
|
|
55
|
+
runtime_env.pop("KSADK_SELECTED_SKILL_NAMES", None)
|
|
56
|
+
try:
|
|
57
|
+
with tempfile.TemporaryDirectory(prefix="ksadk-skill-runtime-") as tmp_dir:
|
|
58
|
+
request_path = Path(tmp_dir) / "workflow-request.json"
|
|
59
|
+
request_path.write_text(
|
|
60
|
+
json.dumps(
|
|
61
|
+
{
|
|
62
|
+
"workflow_prompt": workflow_prompt,
|
|
63
|
+
"skill_names": normalize_skill_names(skill_names),
|
|
64
|
+
},
|
|
65
|
+
ensure_ascii=False,
|
|
66
|
+
),
|
|
67
|
+
encoding="utf-8",
|
|
68
|
+
)
|
|
69
|
+
completed = subprocess.run(
|
|
70
|
+
[sys.executable, "-u", str(self.agent_path), "--request-file", str(request_path)],
|
|
71
|
+
text=True,
|
|
72
|
+
capture_output=True,
|
|
73
|
+
timeout=timeout or self.timeout,
|
|
74
|
+
env=runtime_env,
|
|
75
|
+
check=False,
|
|
76
|
+
)
|
|
77
|
+
return SkillRuntimeResult(
|
|
78
|
+
runtime_id=f"local:{session_id}",
|
|
79
|
+
exit_code=completed.returncode,
|
|
80
|
+
stdout=completed.stdout,
|
|
81
|
+
stderr=completed.stderr,
|
|
82
|
+
duration_ms=int((time.monotonic() - started) * 1000),
|
|
83
|
+
output_files=parse_output_files(completed.stdout),
|
|
84
|
+
)
|
|
85
|
+
except subprocess.TimeoutExpired as exc:
|
|
86
|
+
return SkillRuntimeResult(
|
|
87
|
+
runtime_id=f"local:{session_id}",
|
|
88
|
+
exit_code=None,
|
|
89
|
+
stdout=exc.stdout or "",
|
|
90
|
+
stderr=exc.stderr or "",
|
|
91
|
+
duration_ms=int((time.monotonic() - started) * 1000),
|
|
92
|
+
timed_out=True,
|
|
93
|
+
error_type="TimeoutExpired",
|
|
94
|
+
error_message=f"Skill workflow timed out after {timeout or self.timeout}s",
|
|
95
|
+
)
|