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,103 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Protocol, Sequence
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SkillRuntimeError(RuntimeError):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class SandboxInputFile:
|
|
15
|
+
source: Path
|
|
16
|
+
target_path: str
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class SkillRuntimeResult:
|
|
21
|
+
runtime_id: str = ""
|
|
22
|
+
exit_code: int | None = None
|
|
23
|
+
stdout: str = ""
|
|
24
|
+
stderr: str = ""
|
|
25
|
+
duration_ms: int = 0
|
|
26
|
+
timed_out: bool = False
|
|
27
|
+
error_type: str | None = None
|
|
28
|
+
error_message: str | None = None
|
|
29
|
+
output_files: list[str] = field(default_factory=list)
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def ok(self) -> bool:
|
|
33
|
+
return self.exit_code == 0 and not self.error_type and not self.timed_out
|
|
34
|
+
|
|
35
|
+
def to_dict(self) -> dict[str, object]:
|
|
36
|
+
return {
|
|
37
|
+
"runtime_id": self.runtime_id,
|
|
38
|
+
"exit_code": self.exit_code,
|
|
39
|
+
"stdout": self.stdout,
|
|
40
|
+
"stderr": self.stderr,
|
|
41
|
+
"duration_ms": self.duration_ms,
|
|
42
|
+
"timed_out": self.timed_out,
|
|
43
|
+
"error_type": self.error_type,
|
|
44
|
+
"error_message": self.error_message,
|
|
45
|
+
"output_files": list(self.output_files),
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class SkillRuntimeBackend(Protocol):
|
|
50
|
+
def run_workflow(
|
|
51
|
+
self,
|
|
52
|
+
workflow_prompt: str,
|
|
53
|
+
*,
|
|
54
|
+
skill_space_ids: list[str],
|
|
55
|
+
session_id: str,
|
|
56
|
+
skill_names: list[str] | None = None,
|
|
57
|
+
env: dict[str, str] | None = None,
|
|
58
|
+
input_files: list[SandboxInputFile] | None = None,
|
|
59
|
+
timeout: int = 900,
|
|
60
|
+
) -> SkillRuntimeResult:
|
|
61
|
+
...
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def parse_output_files(stdout: str) -> list[str]:
|
|
65
|
+
for line in stdout.splitlines():
|
|
66
|
+
if not line.startswith("workflow_result="):
|
|
67
|
+
continue
|
|
68
|
+
raw = line.split("=", 1)[1]
|
|
69
|
+
try:
|
|
70
|
+
payload = json.loads(raw)
|
|
71
|
+
except json.JSONDecodeError:
|
|
72
|
+
return []
|
|
73
|
+
output_files = payload.get("output_files") if isinstance(payload, dict) else None
|
|
74
|
+
if isinstance(output_files, list):
|
|
75
|
+
return [str(item) for item in output_files]
|
|
76
|
+
return []
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def normalize_skill_names(skill_names: Sequence[str] | str | None) -> list[str]:
|
|
80
|
+
if skill_names is None:
|
|
81
|
+
return []
|
|
82
|
+
|
|
83
|
+
raw_values: list[str]
|
|
84
|
+
if isinstance(skill_names, str):
|
|
85
|
+
raw_values = [skill_names]
|
|
86
|
+
else:
|
|
87
|
+
raw_values = [str(item) for item in skill_names]
|
|
88
|
+
|
|
89
|
+
normalized: list[str] = []
|
|
90
|
+
seen: set[str] = set()
|
|
91
|
+
for raw in raw_values:
|
|
92
|
+
for part in raw.split(","):
|
|
93
|
+
name = part.strip()
|
|
94
|
+
key = name.lower()
|
|
95
|
+
if not name or key in seen:
|
|
96
|
+
continue
|
|
97
|
+
seen.add(key)
|
|
98
|
+
normalized.append(name)
|
|
99
|
+
return normalized
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def format_skill_names_env(skill_names: Sequence[str] | str | None) -> str:
|
|
103
|
+
return ",".join(normalize_skill_names(skill_names))
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import subprocess
|
|
6
|
+
import tempfile
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from ksadk.skills.loader import LocalSkill
|
|
11
|
+
from ksadk.skills.runtime.artifacts import (
|
|
12
|
+
collect_output_dir_artifacts,
|
|
13
|
+
merge_artifacts,
|
|
14
|
+
parse_artifact_lines,
|
|
15
|
+
)
|
|
16
|
+
from ksadk.skills.runtime.base import normalize_skill_names
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class WorkflowExecution:
|
|
21
|
+
status: str
|
|
22
|
+
executed_skill: str = ""
|
|
23
|
+
output_files: list[str] = field(default_factory=list)
|
|
24
|
+
commands: list[dict[str, object]] = field(default_factory=list)
|
|
25
|
+
selected_skills: list[str] = field(default_factory=list)
|
|
26
|
+
loaded_skills: list[str] = field(default_factory=list)
|
|
27
|
+
artifacts: list[str] = field(default_factory=list)
|
|
28
|
+
warnings: list[str] = field(default_factory=list)
|
|
29
|
+
error: str = ""
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def execute_workflow(
|
|
33
|
+
prompt: str,
|
|
34
|
+
skills: list[LocalSkill],
|
|
35
|
+
*,
|
|
36
|
+
selected_skill_names: list[str] | None = None,
|
|
37
|
+
) -> WorkflowExecution:
|
|
38
|
+
selected = normalize_skill_names(selected_skill_names)
|
|
39
|
+
loaded = [skill.name for skill in skills]
|
|
40
|
+
if not skills:
|
|
41
|
+
return WorkflowExecution(status="no_skills", selected_skills=selected, loaded_skills=loaded)
|
|
42
|
+
|
|
43
|
+
for skill in _candidate_skills(skills, selected):
|
|
44
|
+
if _can_run_web_artifacts_builder(skill, prompt):
|
|
45
|
+
result = _run_web_artifacts_builder(skill)
|
|
46
|
+
_attach_context(result, selected=selected, loaded=loaded)
|
|
47
|
+
return result
|
|
48
|
+
|
|
49
|
+
for skill in _candidate_skills(skills, selected):
|
|
50
|
+
if _can_run_generic_workflow(skill):
|
|
51
|
+
result = _run_generic_workflow(skill, prompt)
|
|
52
|
+
_attach_context(result, selected=selected, loaded=loaded)
|
|
53
|
+
return result
|
|
54
|
+
|
|
55
|
+
return WorkflowExecution(
|
|
56
|
+
status="skipped",
|
|
57
|
+
selected_skills=selected,
|
|
58
|
+
loaded_skills=loaded,
|
|
59
|
+
warnings=["No loaded skill exposes an executable workflow entrypoint."],
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _candidate_skills(skills: list[LocalSkill], selected: list[str]) -> list[LocalSkill]:
|
|
64
|
+
if not selected:
|
|
65
|
+
return skills
|
|
66
|
+
selected_keys = {name.lower() for name in selected}
|
|
67
|
+
return [skill for skill in skills if skill.name.lower() in selected_keys]
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _attach_context(result: WorkflowExecution, *, selected: list[str], loaded: list[str]) -> None:
|
|
71
|
+
result.selected_skills = selected
|
|
72
|
+
result.loaded_skills = loaded
|
|
73
|
+
if not result.artifacts:
|
|
74
|
+
result.artifacts = list(result.output_files)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _can_run_web_artifacts_builder(skill: LocalSkill, prompt: str) -> bool:
|
|
78
|
+
if skill.name != "web-artifacts-builder":
|
|
79
|
+
return False
|
|
80
|
+
init_script = skill.root_dir / "scripts" / "init-artifact.sh"
|
|
81
|
+
bundle_script = skill.root_dir / "scripts" / "bundle-artifact.sh"
|
|
82
|
+
if not init_script.exists() or not bundle_script.exists():
|
|
83
|
+
return False
|
|
84
|
+
normalized = prompt.lower()
|
|
85
|
+
return any(marker in normalized for marker in ("web-artifacts-builder", "artifact", "bundle", "html", "react"))
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _can_run_generic_workflow(skill: LocalSkill) -> bool:
|
|
89
|
+
return (skill.root_dir / "scripts" / "run-workflow.sh").exists()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _run_web_artifacts_builder(skill: LocalSkill) -> WorkflowExecution:
|
|
93
|
+
workdir = _skill_workdir()
|
|
94
|
+
project_name = _safe_project_name(os.environ.get("KSADK_SKILL_ARTIFACT_PROJECT") or "ksadk-artifact")
|
|
95
|
+
project_dir = workdir / project_name
|
|
96
|
+
workdir.mkdir(parents=True, exist_ok=True)
|
|
97
|
+
if project_dir.exists():
|
|
98
|
+
shutil.rmtree(project_dir)
|
|
99
|
+
|
|
100
|
+
timeout = _runtime_timeout()
|
|
101
|
+
commands: list[dict[str, object]] = []
|
|
102
|
+
init_result = _run_command(
|
|
103
|
+
["bash", str(skill.root_dir / "scripts" / "init-artifact.sh"), project_name],
|
|
104
|
+
cwd=workdir,
|
|
105
|
+
timeout=timeout,
|
|
106
|
+
)
|
|
107
|
+
commands.append(init_result)
|
|
108
|
+
if init_result["exit_code"] != 0:
|
|
109
|
+
return WorkflowExecution(status="failed", executed_skill=skill.name, commands=commands)
|
|
110
|
+
|
|
111
|
+
bundle_result = _run_command(
|
|
112
|
+
["bash", str(skill.root_dir / "scripts" / "bundle-artifact.sh")],
|
|
113
|
+
cwd=project_dir,
|
|
114
|
+
timeout=timeout,
|
|
115
|
+
)
|
|
116
|
+
commands.append(bundle_result)
|
|
117
|
+
output_files = [str(project_dir / "bundle.html")] if (project_dir / "bundle.html").exists() else []
|
|
118
|
+
status = "ok" if bundle_result["exit_code"] == 0 and output_files else "failed"
|
|
119
|
+
return WorkflowExecution(
|
|
120
|
+
status=status,
|
|
121
|
+
executed_skill=skill.name,
|
|
122
|
+
output_files=output_files,
|
|
123
|
+
artifacts=list(output_files),
|
|
124
|
+
commands=commands,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def _run_generic_workflow(skill: LocalSkill, prompt: str) -> WorkflowExecution:
|
|
129
|
+
workdir = _skill_workdir()
|
|
130
|
+
workdir.mkdir(parents=True, exist_ok=True)
|
|
131
|
+
output_dir = workdir / "artifacts"
|
|
132
|
+
timeout = _runtime_timeout()
|
|
133
|
+
command = _run_command(
|
|
134
|
+
["bash", str(skill.root_dir / "scripts" / "run-workflow.sh")],
|
|
135
|
+
cwd=workdir,
|
|
136
|
+
timeout=timeout,
|
|
137
|
+
extra_env={
|
|
138
|
+
"KSADK_WORKFLOW_PROMPT": prompt,
|
|
139
|
+
"KSADK_SKILL_WORKDIR": str(workdir),
|
|
140
|
+
"KSADK_SKILL_OUTPUT_DIR": str(output_dir),
|
|
141
|
+
"KSADK_SKILL_ROOT_DIR": str(skill.root_dir),
|
|
142
|
+
},
|
|
143
|
+
)
|
|
144
|
+
artifacts = merge_artifacts(
|
|
145
|
+
parse_artifact_lines(str(command.get("stdout") or "")),
|
|
146
|
+
collect_output_dir_artifacts(output_dir),
|
|
147
|
+
)
|
|
148
|
+
status = "ok" if command["exit_code"] == 0 else "failed"
|
|
149
|
+
return WorkflowExecution(
|
|
150
|
+
status=status,
|
|
151
|
+
executed_skill=skill.name,
|
|
152
|
+
output_files=list(artifacts),
|
|
153
|
+
artifacts=list(artifacts),
|
|
154
|
+
commands=[command],
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _skill_workdir() -> Path:
|
|
159
|
+
return Path(
|
|
160
|
+
os.environ.get("KSADK_SKILL_WORKDIR")
|
|
161
|
+
or Path(tempfile.gettempdir()) / "ksadk-skill-workflow"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _run_command(
|
|
166
|
+
args: list[str],
|
|
167
|
+
*,
|
|
168
|
+
cwd: Path,
|
|
169
|
+
timeout: int,
|
|
170
|
+
extra_env: dict[str, str] | None = None,
|
|
171
|
+
) -> dict[str, object]:
|
|
172
|
+
env = os.environ.copy()
|
|
173
|
+
env.setdefault("CI", "1")
|
|
174
|
+
env.update(extra_env or {})
|
|
175
|
+
try:
|
|
176
|
+
completed = subprocess.run(
|
|
177
|
+
args,
|
|
178
|
+
cwd=str(cwd),
|
|
179
|
+
text=True,
|
|
180
|
+
capture_output=True,
|
|
181
|
+
timeout=timeout,
|
|
182
|
+
check=False,
|
|
183
|
+
env=env,
|
|
184
|
+
)
|
|
185
|
+
return {
|
|
186
|
+
"command": " ".join(args),
|
|
187
|
+
"cwd": str(cwd),
|
|
188
|
+
"exit_code": completed.returncode,
|
|
189
|
+
"stdout": _tail(completed.stdout),
|
|
190
|
+
"stderr": _tail(completed.stderr),
|
|
191
|
+
}
|
|
192
|
+
except subprocess.TimeoutExpired as exc:
|
|
193
|
+
return {
|
|
194
|
+
"command": " ".join(args),
|
|
195
|
+
"cwd": str(cwd),
|
|
196
|
+
"exit_code": None,
|
|
197
|
+
"timed_out": True,
|
|
198
|
+
"stdout": _tail(exc.stdout or ""),
|
|
199
|
+
"stderr": _tail(exc.stderr or ""),
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _runtime_timeout() -> int:
|
|
204
|
+
try:
|
|
205
|
+
return int(os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT", "900"))
|
|
206
|
+
except ValueError:
|
|
207
|
+
return 900
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _safe_project_name(raw: str) -> str:
|
|
211
|
+
sanitized = "".join(ch if ch.isalnum() or ch in {"-", "_"} else "-" for ch in raw).strip("-_")
|
|
212
|
+
return sanitized[:80] or "ksadk-artifact"
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _tail(value: str | bytes, limit: int = 4000) -> str:
|
|
216
|
+
text = value.decode("utf-8", errors="replace") if isinstance(value, bytes) else value
|
|
217
|
+
if len(text) <= limit:
|
|
218
|
+
return text
|
|
219
|
+
return text[-limit:]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from ksadk.skills.runtime.base import SkillRuntimeBackend
|
|
6
|
+
from ksadk.skills.runtime.backends.disabled import DisabledSkillRuntimeBackend
|
|
7
|
+
from ksadk.skills.runtime.backends.e2b import E2BSkillRuntimeBackend
|
|
8
|
+
from ksadk.skills.runtime.backends.local import LocalProcessSkillRuntimeBackend
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _resolve_backend(backend: str | None = None) -> str:
|
|
12
|
+
if backend is not None:
|
|
13
|
+
return backend.strip().lower()
|
|
14
|
+
|
|
15
|
+
explicit = os.environ.get("KSADK_SKILL_RUNTIME_BACKEND")
|
|
16
|
+
if explicit is not None:
|
|
17
|
+
return explicit.strip().lower()
|
|
18
|
+
|
|
19
|
+
sandbox_backend = os.environ.get("KSADK_SANDBOX_BACKEND", "").strip().lower()
|
|
20
|
+
if sandbox_backend and sandbox_backend not in {"disabled", "none", "off"}:
|
|
21
|
+
return sandbox_backend
|
|
22
|
+
|
|
23
|
+
if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
|
|
24
|
+
return "e2b"
|
|
25
|
+
|
|
26
|
+
return "disabled"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def create_skill_runtime_backend(backend: str | None = None) -> SkillRuntimeBackend:
|
|
30
|
+
resolved = _resolve_backend(backend)
|
|
31
|
+
if resolved in {"", "disabled", "none", "off"}:
|
|
32
|
+
return DisabledSkillRuntimeBackend()
|
|
33
|
+
if resolved == "local_process":
|
|
34
|
+
return LocalProcessSkillRuntimeBackend.from_env()
|
|
35
|
+
if resolved == "e2b":
|
|
36
|
+
return E2BSkillRuntimeBackend.from_env()
|
|
37
|
+
raise ValueError(f"Unsupported skill runtime backend: {resolved}")
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import tempfile
|
|
6
|
+
from dataclasses import dataclass, field
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import httpx
|
|
10
|
+
|
|
11
|
+
from ksadk.skills.loader import LocalSkill, load_local_skill
|
|
12
|
+
from ksadk.skills.models import SkillRef
|
|
13
|
+
from ksadk.skills.package_store import PackageStore, SkillPackageError
|
|
14
|
+
from ksadk.skills.runtime import registry
|
|
15
|
+
from ksadk.skills.service_client import SkillServiceClient
|
|
16
|
+
from ksadk.skills.service_env import resolve_skill_service_url
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class SkillLoadResult:
|
|
21
|
+
skills: list[LocalSkill] = field(default_factory=list)
|
|
22
|
+
warnings: list[str] = field(default_factory=list)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def load_skills(
|
|
26
|
+
*,
|
|
27
|
+
prompt: str = "",
|
|
28
|
+
skill_names: list[str] | None = None,
|
|
29
|
+
service_transport: httpx.BaseTransport | None = None,
|
|
30
|
+
) -> SkillLoadResult:
|
|
31
|
+
warnings: list[str] = []
|
|
32
|
+
skills: list[LocalSkill] = []
|
|
33
|
+
skills.extend(load_local_skills())
|
|
34
|
+
|
|
35
|
+
service_url = resolve_skill_service_url(require_spaces=True)
|
|
36
|
+
if not service_url:
|
|
37
|
+
return SkillLoadResult(skills=skills, warnings=warnings)
|
|
38
|
+
|
|
39
|
+
cache_dir = Path(
|
|
40
|
+
os.environ.get("KSADK_SKILL_CACHE_DIR")
|
|
41
|
+
or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
|
|
42
|
+
)
|
|
43
|
+
client = SkillServiceClient(
|
|
44
|
+
base_url=service_url,
|
|
45
|
+
token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
|
|
46
|
+
transport=service_transport,
|
|
47
|
+
)
|
|
48
|
+
store = PackageStore(cache_dir=cache_dir)
|
|
49
|
+
selected_refs: list[SkillRef] = []
|
|
50
|
+
seen_names: set[str] = {skill.name.lower() for skill in skills if skill.name}
|
|
51
|
+
for space_id in registry.user_skill_space_ids():
|
|
52
|
+
listing = client.list_skills_by_space_id(space_id)
|
|
53
|
+
selected_refs.extend(
|
|
54
|
+
registry.dedupe_skill_refs(
|
|
55
|
+
registry.select_remote_skill_refs(
|
|
56
|
+
listing.active_skills(),
|
|
57
|
+
prompt,
|
|
58
|
+
skill_names=skill_names,
|
|
59
|
+
),
|
|
60
|
+
seen_names=seen_names,
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
if registry.public_skill_space_ids():
|
|
65
|
+
listing = client.list_available_premade_skills()
|
|
66
|
+
selected_refs.extend(
|
|
67
|
+
registry.dedupe_skill_refs(
|
|
68
|
+
registry.select_public_skill_refs(listing.active_skills()),
|
|
69
|
+
seen_names=seen_names,
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
for skill in selected_refs:
|
|
74
|
+
package = store.get_cached(skill)
|
|
75
|
+
if package is None:
|
|
76
|
+
archive = client.download_skill_archive(skill)
|
|
77
|
+
try:
|
|
78
|
+
package = store.store_archive(skill, archive)
|
|
79
|
+
except SkillPackageError as exc:
|
|
80
|
+
if not _allow_hash_mismatch():
|
|
81
|
+
raise
|
|
82
|
+
package = _store_unverified_archive(store, skill, archive)
|
|
83
|
+
warnings.append(str(exc))
|
|
84
|
+
skills.append(load_local_skill(package.root_dir))
|
|
85
|
+
return SkillLoadResult(skills=skills, warnings=warnings)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def load_local_skills() -> list[LocalSkill]:
|
|
89
|
+
skills_dir = os.environ.get("KSADK_LOCAL_SKILLS_DIR", "").strip()
|
|
90
|
+
if not skills_dir:
|
|
91
|
+
return []
|
|
92
|
+
root = Path(skills_dir)
|
|
93
|
+
if not root.exists():
|
|
94
|
+
return []
|
|
95
|
+
return [
|
|
96
|
+
load_local_skill(path)
|
|
97
|
+
for path in sorted(root.iterdir())
|
|
98
|
+
if path.is_dir() and (path / "SKILL.md").exists()
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _allow_hash_mismatch() -> bool:
|
|
103
|
+
return os.environ.get("KSADK_SKILL_ALLOW_HASH_MISMATCH", "").strip().lower() in {
|
|
104
|
+
"1",
|
|
105
|
+
"true",
|
|
106
|
+
"yes",
|
|
107
|
+
"on",
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _store_unverified_archive(store: PackageStore, skill: SkillRef, archive: bytes):
|
|
112
|
+
skill_dir = store.cache_dir / f"unverified-{skill.cache_key or skill.name or 'skill'}"
|
|
113
|
+
if skill_dir.exists():
|
|
114
|
+
shutil.rmtree(skill_dir)
|
|
115
|
+
skill_dir.mkdir(parents=True, exist_ok=True)
|
|
116
|
+
archive_path = skill_dir / "archive.zip"
|
|
117
|
+
extract_dir = skill_dir / "extracted"
|
|
118
|
+
archive_path.write_bytes(archive)
|
|
119
|
+
extract_dir.mkdir(parents=True, exist_ok=True)
|
|
120
|
+
store._safe_extract(archive_path, extract_dir)
|
|
121
|
+
return type(
|
|
122
|
+
"UnverifiedSkillPackage",
|
|
123
|
+
(),
|
|
124
|
+
{
|
|
125
|
+
"ref": skill,
|
|
126
|
+
"archive_path": archive_path,
|
|
127
|
+
"extract_dir": extract_dir,
|
|
128
|
+
"root_dir": store._find_skill_root(extract_dir),
|
|
129
|
+
"cache_hit": False,
|
|
130
|
+
},
|
|
131
|
+
)()
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
from ksadk.skills.models import SkillRef
|
|
7
|
+
from ksadk.skills.runtime.base import normalize_skill_names
|
|
8
|
+
from ksadk.skills.service_env import (
|
|
9
|
+
parse_skill_space_ids,
|
|
10
|
+
public_skill_space_ids as configured_public_skill_space_ids,
|
|
11
|
+
skill_space_ids as configured_skill_space_ids,
|
|
12
|
+
user_skill_space_ids as configured_user_skill_space_ids,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def skill_space_ids() -> list[str]:
|
|
17
|
+
return configured_skill_space_ids()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def user_skill_space_ids() -> list[str]:
|
|
21
|
+
return configured_user_skill_space_ids()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def public_skill_space_ids() -> list[str]:
|
|
25
|
+
return configured_public_skill_space_ids()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def parse_space_ids(*raw_values: str) -> list[str]:
|
|
29
|
+
return parse_skill_space_ids(*raw_values)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def dedupe_skill_refs(skill_refs: list[SkillRef], *, seen_names: set[str]) -> list[SkillRef]:
|
|
33
|
+
selected: list[SkillRef] = []
|
|
34
|
+
seen_keys: set[str] = set()
|
|
35
|
+
for skill in skill_refs:
|
|
36
|
+
name_key = skill.name.lower() if skill.name else ""
|
|
37
|
+
key = skill.cache_key or skill.skill_id or skill.name
|
|
38
|
+
if not name_key or name_key in seen_names or key in seen_keys:
|
|
39
|
+
continue
|
|
40
|
+
seen_names.add(name_key)
|
|
41
|
+
seen_keys.add(key)
|
|
42
|
+
selected.append(skill)
|
|
43
|
+
return selected
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def select_public_skill_refs(skill_refs: list[SkillRef]) -> list[SkillRef]:
|
|
47
|
+
allowlist = {name.lower() for name in normalize_skill_names(os.environ.get("KSADK_PUBLIC_SKILL_ALLOWLIST", ""))}
|
|
48
|
+
if not allowlist:
|
|
49
|
+
return [skill for skill in skill_refs if skill.name]
|
|
50
|
+
return [
|
|
51
|
+
skill
|
|
52
|
+
for skill in skill_refs
|
|
53
|
+
if skill.name and skill.name.lower() in allowlist
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def select_remote_skill_refs(
|
|
58
|
+
skill_refs: list[SkillRef],
|
|
59
|
+
prompt: str,
|
|
60
|
+
*,
|
|
61
|
+
skill_names: list[str] | None = None,
|
|
62
|
+
) -> list[SkillRef]:
|
|
63
|
+
if not prompt and not normalize_skill_names(skill_names):
|
|
64
|
+
return []
|
|
65
|
+
return [match.skill for match in match_skill_refs(skill_refs, prompt, skill_names=skill_names)]
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class SkillMatch:
|
|
69
|
+
def __init__(self, skill: SkillRef, score: int, reason: str):
|
|
70
|
+
self.skill = skill
|
|
71
|
+
self.score = score
|
|
72
|
+
self.reason = reason
|
|
73
|
+
|
|
74
|
+
def to_dict(self) -> dict[str, object]:
|
|
75
|
+
return {
|
|
76
|
+
"name": self.skill.name,
|
|
77
|
+
"description": self.skill.description,
|
|
78
|
+
"version": self.skill.version,
|
|
79
|
+
"score": self.score,
|
|
80
|
+
"reason": self.reason,
|
|
81
|
+
"aliases": list(self.skill.aliases),
|
|
82
|
+
"tags": list(self.skill.tags),
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def match_skill_refs(
|
|
87
|
+
skill_refs: list[SkillRef],
|
|
88
|
+
prompt: str,
|
|
89
|
+
*,
|
|
90
|
+
skill_names: list[str] | None = None,
|
|
91
|
+
limit: int | None = None,
|
|
92
|
+
) -> list[SkillMatch]:
|
|
93
|
+
requested_names = {name.lower() for name in normalize_skill_names(skill_names)}
|
|
94
|
+
normalized_prompt = prompt.lower()
|
|
95
|
+
prompt_tokens = _tokens(normalized_prompt)
|
|
96
|
+
matches: list[SkillMatch] = []
|
|
97
|
+
seen: set[str] = set()
|
|
98
|
+
for skill in skill_refs:
|
|
99
|
+
if not skill.name:
|
|
100
|
+
continue
|
|
101
|
+
skill_name = skill.name.lower()
|
|
102
|
+
if requested_names:
|
|
103
|
+
if skill_name not in requested_names:
|
|
104
|
+
continue
|
|
105
|
+
score, reason = 100, "exact_name"
|
|
106
|
+
else:
|
|
107
|
+
score, reason = _metadata_score(skill, normalized_prompt, prompt_tokens)
|
|
108
|
+
if score <= 0:
|
|
109
|
+
continue
|
|
110
|
+
key = skill.cache_key or skill.skill_id or skill.name
|
|
111
|
+
if key in seen:
|
|
112
|
+
continue
|
|
113
|
+
seen.add(key)
|
|
114
|
+
matches.append(SkillMatch(skill=skill, score=score, reason=reason))
|
|
115
|
+
matches.sort(key=lambda item: (-item.score, item.skill.name.lower()))
|
|
116
|
+
if limit is not None:
|
|
117
|
+
return matches[: max(0, limit)]
|
|
118
|
+
return matches
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _metadata_score(skill: SkillRef, normalized_prompt: str, prompt_tokens: set[str]) -> tuple[int, str]:
|
|
122
|
+
if skill.name and skill.name.lower() in normalized_prompt:
|
|
123
|
+
return 90, "name"
|
|
124
|
+
for alias in skill.aliases:
|
|
125
|
+
if alias.lower() in normalized_prompt:
|
|
126
|
+
return 80, "alias"
|
|
127
|
+
for tag in skill.tags:
|
|
128
|
+
tag_key = tag.lower()
|
|
129
|
+
if tag_key and (tag_key in normalized_prompt or tag_key in prompt_tokens):
|
|
130
|
+
return 65, "tag"
|
|
131
|
+
|
|
132
|
+
text = " ".join(
|
|
133
|
+
[
|
|
134
|
+
skill.description or "",
|
|
135
|
+
" ".join(skill.examples),
|
|
136
|
+
]
|
|
137
|
+
).lower()
|
|
138
|
+
skill_tokens = _tokens(text)
|
|
139
|
+
overlap = prompt_tokens & skill_tokens
|
|
140
|
+
if overlap:
|
|
141
|
+
return min(55, 20 + len(overlap) * 10), "metadata"
|
|
142
|
+
return 0, ""
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _tokens(value: str) -> set[str]:
|
|
146
|
+
return {
|
|
147
|
+
token
|
|
148
|
+
for token in re.split(r"[^0-9a-zA-Z\u4e00-\u9fff]+", value.lower())
|
|
149
|
+
if len(token) >= 2
|
|
150
|
+
}
|