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,67 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from ksadk.skills.runtime.base import normalize_skill_names
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SkillWorkflowRequestError(ValueError):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class SkillWorkflowRequest:
|
|
17
|
+
workflow_prompt: str = ""
|
|
18
|
+
skill_names: list[str] = field(default_factory=list)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def parse_workflow_request(argv: list[str]) -> SkillWorkflowRequest:
|
|
22
|
+
args = list(argv)
|
|
23
|
+
has_prompt_file = "--prompt-file" in args
|
|
24
|
+
has_request_file = "--request-file" in args
|
|
25
|
+
if has_prompt_file and has_request_file:
|
|
26
|
+
raise SkillWorkflowRequestError("--prompt-file and --request-file cannot be used together")
|
|
27
|
+
|
|
28
|
+
if has_request_file:
|
|
29
|
+
return _request_from_json_file(_option_value(args, "--request-file"))
|
|
30
|
+
if has_prompt_file:
|
|
31
|
+
return SkillWorkflowRequest(workflow_prompt=Path(_option_value(args, "--prompt-file")).read_text(encoding="utf-8"))
|
|
32
|
+
if not args:
|
|
33
|
+
return SkillWorkflowRequest()
|
|
34
|
+
return SkillWorkflowRequest(workflow_prompt=args[0])
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _option_value(args: list[str], name: str) -> str:
|
|
38
|
+
try:
|
|
39
|
+
index = args.index(name)
|
|
40
|
+
value = args[index + 1]
|
|
41
|
+
except (ValueError, IndexError) as exc:
|
|
42
|
+
raise SkillWorkflowRequestError(f"{name} requires a file path") from exc
|
|
43
|
+
if value.startswith("--"):
|
|
44
|
+
raise SkillWorkflowRequestError(f"{name} requires a file path")
|
|
45
|
+
return value
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _request_from_json_file(path: str) -> SkillWorkflowRequest:
|
|
49
|
+
try:
|
|
50
|
+
payload = json.loads(Path(path).read_text(encoding="utf-8"))
|
|
51
|
+
except json.JSONDecodeError as exc:
|
|
52
|
+
raise SkillWorkflowRequestError(f"invalid request file JSON: {exc}") from exc
|
|
53
|
+
if not isinstance(payload, dict):
|
|
54
|
+
raise SkillWorkflowRequestError("request file must contain a JSON object")
|
|
55
|
+
prompt = payload.get("workflow_prompt", payload.get("prompt", ""))
|
|
56
|
+
skill_names = _skill_names_from_payload(payload)
|
|
57
|
+
return SkillWorkflowRequest(
|
|
58
|
+
workflow_prompt=str(prompt or ""),
|
|
59
|
+
skill_names=skill_names,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _skill_names_from_payload(payload: dict[str, Any]) -> list[str]:
|
|
64
|
+
for key in ("skill_names", "selected_skills"):
|
|
65
|
+
if key in payload:
|
|
66
|
+
return normalize_skill_names(payload.get(key))
|
|
67
|
+
return []
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from collections.abc import Mapping
|
|
5
|
+
from typing import Any
|
|
6
|
+
from urllib.parse import quote, urlsplit, urlunsplit
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
import requests
|
|
10
|
+
|
|
11
|
+
from ksadk.common.auth import AWSV4Auth
|
|
12
|
+
|
|
13
|
+
from ksadk.skills.models import SkillListResponse, SkillRef
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SkillServiceClient:
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
*,
|
|
20
|
+
base_url: str,
|
|
21
|
+
token: str = "",
|
|
22
|
+
access_key: str = "",
|
|
23
|
+
secret_key: str = "",
|
|
24
|
+
account_id: str = "",
|
|
25
|
+
region: str = "",
|
|
26
|
+
api_version: str = "",
|
|
27
|
+
sign_service: str = "",
|
|
28
|
+
extra_headers: Mapping[str, str] | None = None,
|
|
29
|
+
timeout: float = 60.0,
|
|
30
|
+
transport: httpx.BaseTransport | None = None,
|
|
31
|
+
):
|
|
32
|
+
self.base_url = _normalize_base_url(base_url)
|
|
33
|
+
self.token = token
|
|
34
|
+
self.access_key = access_key or _env("KSADK_SKILL_SERVICE_ACCESS_KEY", "KSYUN_ACCESS_KEY", "KS3_ACCESS_KEY")
|
|
35
|
+
self.secret_key = secret_key or _env("KSADK_SKILL_SERVICE_SECRET_KEY", "KSYUN_SECRET_KEY", "KS3_SECRET_KEY")
|
|
36
|
+
self.account_id = account_id or _env("KSADK_SKILL_SERVICE_ACCOUNT_ID", "KSYUN_ACCOUNT_ID")
|
|
37
|
+
self.logical_region = region or _env("KSADK_SKILL_SERVICE_REGION", "KSYUN_REGION") or "cn-beijing-6"
|
|
38
|
+
self.region = _normalize_control_region(self.logical_region)
|
|
39
|
+
self.custom_source = _resolve_custom_source(self.logical_region)
|
|
40
|
+
self.api_version = api_version or os.environ.get("KSADK_SKILL_SERVICE_API_VERSION", "2024-06-12")
|
|
41
|
+
self.sign_service = sign_service or os.environ.get("KSADK_SKILL_SERVICE_SIGN_SERVICE", "aicp")
|
|
42
|
+
self.extra_headers = dict(extra_headers or {})
|
|
43
|
+
self.timeout = timeout
|
|
44
|
+
self.transport = transport
|
|
45
|
+
self._requests_session: requests.Session | None = None
|
|
46
|
+
self._auth = AWSV4Auth(
|
|
47
|
+
access_key_id=self.access_key,
|
|
48
|
+
secret_access_key=self.secret_key,
|
|
49
|
+
region=self.region,
|
|
50
|
+
service=self.sign_service,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def action_url(self, action: str) -> str:
|
|
54
|
+
if self._is_kop_mode():
|
|
55
|
+
return (
|
|
56
|
+
f"{self._kop_base_url()}/?Action={quote(action.lstrip('/'))}"
|
|
57
|
+
f"&Version={quote(self.api_version)}"
|
|
58
|
+
)
|
|
59
|
+
return f"{self.base_url}/{action.lstrip('/')}"
|
|
60
|
+
|
|
61
|
+
def list_skill_spaces(self, *, page_number: int = 1, page_size: int = 100) -> dict[str, Any]:
|
|
62
|
+
return self._get_json(
|
|
63
|
+
"ListSkillSpaces",
|
|
64
|
+
{"PageNumber": page_number, "PageSize": page_size},
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def list_skills_by_space_id(self, space_id: str) -> SkillListResponse:
|
|
68
|
+
if self._is_kop_mode():
|
|
69
|
+
payload = self._get_json(
|
|
70
|
+
"ListSkillsBySpaceId",
|
|
71
|
+
{"SpaceId": space_id, "PageNumber": 1, "PageSize": 100},
|
|
72
|
+
)
|
|
73
|
+
else:
|
|
74
|
+
payload = self._get_json("ListSkillsBySpaceId", {"SpaceId": space_id})
|
|
75
|
+
return SkillListResponse.from_payload(payload, space_id=space_id)
|
|
76
|
+
|
|
77
|
+
def list_available_premade_skills(self) -> SkillListResponse:
|
|
78
|
+
payload = self._get_json("ListAvailablePremadeSkills", {})
|
|
79
|
+
return SkillListResponse.from_payload(payload, space_id="public", space_name="Public Skills")
|
|
80
|
+
|
|
81
|
+
def get_skill_download_url(self, skill: SkillRef) -> str:
|
|
82
|
+
action = "GetSkillDownloadUrl" if skill.version_id else "GetPremadeSkillDownloadUrl"
|
|
83
|
+
payload = self._get_json(
|
|
84
|
+
action,
|
|
85
|
+
{
|
|
86
|
+
"SkillId": skill.skill_id,
|
|
87
|
+
"VersionId": skill.version_id,
|
|
88
|
+
},
|
|
89
|
+
)
|
|
90
|
+
data = payload.get("Data") or payload.get("data") or {}
|
|
91
|
+
return str(data.get("DownloadUrl") or data.get("download_url") or "")
|
|
92
|
+
|
|
93
|
+
def download_skill_archive(self, skill: SkillRef) -> bytes:
|
|
94
|
+
download_url = self.get_skill_download_url(skill)
|
|
95
|
+
if not download_url:
|
|
96
|
+
raise ValueError(f"Skill Service did not return DownloadUrl for {skill.skill_id}")
|
|
97
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
98
|
+
response = client.get(download_url)
|
|
99
|
+
response.raise_for_status()
|
|
100
|
+
return response.content
|
|
101
|
+
|
|
102
|
+
def _get_json(self, action: str, params: dict[str, Any]) -> dict[str, Any]:
|
|
103
|
+
if self._is_kop_mode():
|
|
104
|
+
return self._get_json_kop(action, params)
|
|
105
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
106
|
+
response = client.get(self.action_url(action), params=params, headers=self._headers())
|
|
107
|
+
response.raise_for_status()
|
|
108
|
+
return self._decode_response(action, response)
|
|
109
|
+
|
|
110
|
+
def _post_json(self, action: str, payload: dict[str, Any]) -> dict[str, Any]:
|
|
111
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
112
|
+
response = client.post(self.action_url(action), json=payload, headers=self._headers())
|
|
113
|
+
response.raise_for_status()
|
|
114
|
+
return self._decode_response(action, response)
|
|
115
|
+
|
|
116
|
+
def _decode_response(self, action: str, response: httpx.Response) -> dict[str, Any]:
|
|
117
|
+
data = response.json()
|
|
118
|
+
if not isinstance(data, dict):
|
|
119
|
+
raise ValueError(f"Skill Service returned non-object response for {action}")
|
|
120
|
+
code = data.get("Code", data.get("code"))
|
|
121
|
+
if code not in (None, 0, 200, "0", "200"):
|
|
122
|
+
request_id = str(data.get("RequestId") or data.get("request_id") or "")
|
|
123
|
+
message = str(data.get("Message") or data.get("message") or "")
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"Skill Service {action} failed: code={code}, "
|
|
126
|
+
f"request_id={request_id}, message={message}"
|
|
127
|
+
)
|
|
128
|
+
return data
|
|
129
|
+
|
|
130
|
+
def _client_kwargs(self) -> dict[str, Any]:
|
|
131
|
+
kwargs: dict[str, Any] = {"timeout": self.timeout}
|
|
132
|
+
if self.transport is not None:
|
|
133
|
+
kwargs["transport"] = self.transport
|
|
134
|
+
return kwargs
|
|
135
|
+
|
|
136
|
+
def _headers(self, *, action: str = "") -> dict[str, str]:
|
|
137
|
+
headers = {"Accept": "application/json", "Content-Type": "application/json"}
|
|
138
|
+
if self.token:
|
|
139
|
+
headers["Authorization"] = f"Bearer {self.token}"
|
|
140
|
+
if self.account_id:
|
|
141
|
+
headers["X-Ksc-Account-Id"] = self.account_id
|
|
142
|
+
if self._is_kop_mode():
|
|
143
|
+
headers.update(
|
|
144
|
+
{
|
|
145
|
+
"Host": urlsplit(self._kop_base_url()).netloc,
|
|
146
|
+
"X-Ksc-Region": self.region,
|
|
147
|
+
"X-Ksc-Source": "ksadk-skill-runtime",
|
|
148
|
+
}
|
|
149
|
+
)
|
|
150
|
+
if self.custom_source:
|
|
151
|
+
headers["X-KSC-CUSTOM-SOURCE"] = self.custom_source
|
|
152
|
+
if action:
|
|
153
|
+
headers["X-Action"] = action
|
|
154
|
+
headers["X-Version"] = self.api_version
|
|
155
|
+
headers.update(self.extra_headers)
|
|
156
|
+
return headers
|
|
157
|
+
|
|
158
|
+
def _get_json_kop(self, action: str, params: dict[str, Any]) -> dict[str, Any]:
|
|
159
|
+
query = {"Action": action, "Version": self.api_version, **params}
|
|
160
|
+
headers = self._headers(action=action)
|
|
161
|
+
if self.transport is not None:
|
|
162
|
+
with httpx.Client(**self._client_kwargs()) as client:
|
|
163
|
+
response = client.get(self._kop_base_url() + "/", params=query, headers=headers)
|
|
164
|
+
response.raise_for_status()
|
|
165
|
+
return self._decode_response(action, response)
|
|
166
|
+
if not self._auth.is_enabled:
|
|
167
|
+
raise ValueError(
|
|
168
|
+
"AICP Skill Service endpoint requires signing credentials. "
|
|
169
|
+
"Set KSADK_SKILL_SERVICE_ACCESS_KEY/KSADK_SKILL_SERVICE_SECRET_KEY "
|
|
170
|
+
"or KSYUN_ACCESS_KEY/KSYUN_SECRET_KEY."
|
|
171
|
+
)
|
|
172
|
+
response = self._requests().get(
|
|
173
|
+
self._kop_base_url() + "/",
|
|
174
|
+
params=query,
|
|
175
|
+
headers=headers,
|
|
176
|
+
auth=self._auth.get_auth(),
|
|
177
|
+
timeout=self.timeout,
|
|
178
|
+
)
|
|
179
|
+
response.raise_for_status()
|
|
180
|
+
data = response.json()
|
|
181
|
+
if not isinstance(data, dict):
|
|
182
|
+
raise ValueError(f"Skill Service returned non-object response for {action}")
|
|
183
|
+
code = data.get("Code", data.get("code"))
|
|
184
|
+
if code not in (None, 0, 200, "0", "200"):
|
|
185
|
+
request_id = str(data.get("RequestId") or data.get("request_id") or "")
|
|
186
|
+
message = str(data.get("Message") or data.get("message") or data.get("Error") or "")
|
|
187
|
+
raise ValueError(
|
|
188
|
+
f"Skill Service {action} failed: code={code}, "
|
|
189
|
+
f"request_id={request_id}, message={message}"
|
|
190
|
+
)
|
|
191
|
+
return data
|
|
192
|
+
|
|
193
|
+
def _requests(self) -> requests.Session:
|
|
194
|
+
if self._requests_session is None:
|
|
195
|
+
self._requests_session = requests.Session()
|
|
196
|
+
return self._requests_session
|
|
197
|
+
|
|
198
|
+
def _is_kop_mode(self) -> bool:
|
|
199
|
+
host = urlsplit(self.base_url).netloc.lower()
|
|
200
|
+
return (
|
|
201
|
+
host.endswith("aicp.inner.api.ksyun.com")
|
|
202
|
+
or host.endswith("aicp.internal.api.ksyun.com")
|
|
203
|
+
or host.endswith("aicp.api.ksyun.com")
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
def _kop_base_url(self) -> str:
|
|
207
|
+
parsed = urlsplit(self.base_url)
|
|
208
|
+
return urlunsplit((parsed.scheme, parsed.netloc, "", "", "")).rstrip("/")
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _env(*names: str) -> str:
|
|
212
|
+
for name in names:
|
|
213
|
+
value = os.environ.get(name, "").strip()
|
|
214
|
+
if value:
|
|
215
|
+
return value
|
|
216
|
+
return ""
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _normalize_control_region(region: str) -> str:
|
|
220
|
+
region = (region or "cn-beijing-6").strip()
|
|
221
|
+
if region.lower() == "pre-online":
|
|
222
|
+
return os.environ.get("AGENTENGINE_PRE_CONTROL_REGION", "cn-beijing-6")
|
|
223
|
+
return region
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _resolve_custom_source(region: str) -> str:
|
|
227
|
+
if (region or "").strip().lower() == "pre-online":
|
|
228
|
+
return os.environ.get("AGENTENGINE_PRE_CUSTOM_SOURCE", "pre")
|
|
229
|
+
return ""
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _normalize_base_url(base_url: str) -> str:
|
|
233
|
+
parsed = urlsplit(base_url.strip())
|
|
234
|
+
path = parsed.path.rstrip("/")
|
|
235
|
+
if path.endswith("/openapi.json"):
|
|
236
|
+
path = path[: -len("/openapi.json")]
|
|
237
|
+
elif path.endswith("/docs"):
|
|
238
|
+
path = path[: -len("/docs")] + "/api/v1"
|
|
239
|
+
return urlunsplit((parsed.scheme, parsed.netloc, path, "", "")).rstrip("/")
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from ksadk.common.aicp_env import resolve_aicp_connection
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def parse_skill_space_ids(*raw_values: str) -> list[str]:
|
|
9
|
+
spaces: list[str] = []
|
|
10
|
+
seen: set[str] = set()
|
|
11
|
+
for raw in raw_values:
|
|
12
|
+
for part in raw.split(","):
|
|
13
|
+
space_id = part.strip()
|
|
14
|
+
if not space_id or space_id in seen:
|
|
15
|
+
continue
|
|
16
|
+
seen.add(space_id)
|
|
17
|
+
spaces.append(space_id)
|
|
18
|
+
return spaces
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def user_skill_space_ids() -> list[str]:
|
|
22
|
+
return parse_skill_space_ids(
|
|
23
|
+
os.environ.get("KSADK_SKILL_SPACE_IDS") or os.environ.get("SKILL_SPACE_ID") or ""
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def public_skill_space_ids() -> list[str]:
|
|
28
|
+
return parse_skill_space_ids(os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS") or "")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def skill_space_ids() -> list[str]:
|
|
32
|
+
return parse_skill_space_ids(
|
|
33
|
+
os.environ.get("KSADK_SKILL_SPACE_IDS") or os.environ.get("SKILL_SPACE_ID") or "",
|
|
34
|
+
os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS") or "",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def resolve_skill_service_url(*, require_spaces: bool = True) -> str:
|
|
39
|
+
explicit = os.environ.get("KSADK_SKILL_SERVICE_URL", "").strip()
|
|
40
|
+
if explicit:
|
|
41
|
+
return explicit
|
|
42
|
+
if require_spaces and not skill_space_ids():
|
|
43
|
+
return ""
|
|
44
|
+
|
|
45
|
+
connection = resolve_aicp_connection("KSADK_SKILL_SERVICE")
|
|
46
|
+
return f"{connection['scheme']}://{connection['endpoint']}".rstrip("/")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def should_resolve_child_skill_service_url() -> bool:
|
|
50
|
+
if os.environ.get("KSADK_SKILL_SERVICE_URL", "").strip():
|
|
51
|
+
return True
|
|
52
|
+
if os.environ.get("KSADK_SKILL_SERVICE_ENDPOINT", "").strip():
|
|
53
|
+
return True
|
|
54
|
+
if os.environ.get("KSADK_SKILL_SERVICE_SCHEME", "").strip():
|
|
55
|
+
return True
|
|
56
|
+
|
|
57
|
+
mode = os.environ.get("KSADK_AICP_ENDPOINT_MODE", "").strip().lower()
|
|
58
|
+
return mode not in {"", "auto", "detect"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from uuid import uuid4
|
|
5
|
+
|
|
6
|
+
from ksadk.skills.loader import LocalSkill
|
|
7
|
+
from ksadk.skills.models import SkillRef
|
|
8
|
+
from ksadk.skills.runtime.base import SkillRuntimeBackend, normalize_skill_names
|
|
9
|
+
from ksadk.skills.service_client import SkillServiceClient
|
|
10
|
+
from ksadk.skills.service_env import (
|
|
11
|
+
parse_skill_space_ids,
|
|
12
|
+
public_skill_space_ids,
|
|
13
|
+
resolve_skill_service_url,
|
|
14
|
+
should_resolve_child_skill_service_url,
|
|
15
|
+
skill_space_ids as configured_skill_space_ids,
|
|
16
|
+
user_skill_space_ids,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
RUNTIME_AGENT_ENV_NAMES = (
|
|
20
|
+
"KSADK_SKILL_SERVICE_URL",
|
|
21
|
+
"KSADK_SKILL_SERVICE_TOKEN",
|
|
22
|
+
"KSADK_SKILL_SERVICE_ACCESS_KEY",
|
|
23
|
+
"KSADK_SKILL_SERVICE_SECRET_KEY",
|
|
24
|
+
"KSADK_SKILL_SERVICE_ACCOUNT_ID",
|
|
25
|
+
"KSADK_SKILL_SERVICE_REGION",
|
|
26
|
+
"KSADK_SKILL_SERVICE_API_VERSION",
|
|
27
|
+
"KSADK_SKILL_SERVICE_SIGN_SERVICE",
|
|
28
|
+
"KSADK_SKILL_CACHE_DIR",
|
|
29
|
+
"KSADK_SKILL_WORKDIR",
|
|
30
|
+
"KSADK_SKILL_ARTIFACT_PROJECT",
|
|
31
|
+
"KSADK_PUBLIC_SKILL_SPACE_IDS",
|
|
32
|
+
"KSADK_PUBLIC_SKILL_ALLOWLIST",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
_SKILL_SERVICE_SECRET_FALLBACKS = {
|
|
36
|
+
"KSADK_SKILL_SERVICE_ACCESS_KEY": ("KSYUN_ACCESS_KEY", "KS3_ACCESS_KEY"),
|
|
37
|
+
"KSADK_SKILL_SERVICE_SECRET_KEY": ("KSYUN_SECRET_KEY", "KS3_SECRET_KEY"),
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def resolve_skill_space_ids() -> list[str]:
|
|
42
|
+
return configured_skill_space_ids()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def resolve_user_skill_space_ids() -> list[str]:
|
|
46
|
+
return user_skill_space_ids()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _parse_skill_space_ids(*raw_values: str) -> list[str]:
|
|
50
|
+
return parse_skill_space_ids(*raw_values)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def runtime_agent_env_from_process(skill_space_ids: list[str] | None = None) -> dict[str, str]:
|
|
54
|
+
env = {
|
|
55
|
+
name: value
|
|
56
|
+
for name in RUNTIME_AGENT_ENV_NAMES
|
|
57
|
+
if (value := os.environ.get(name))
|
|
58
|
+
}
|
|
59
|
+
if "KSADK_SKILL_SERVICE_ACCOUNT_ID" not in env and (
|
|
60
|
+
account_id := os.environ.get("KSYUN_ACCOUNT_ID")
|
|
61
|
+
):
|
|
62
|
+
env["KSADK_SKILL_SERVICE_ACCOUNT_ID"] = account_id
|
|
63
|
+
if "KSADK_SKILL_SERVICE_REGION" not in env and (region := os.environ.get("KSYUN_REGION")):
|
|
64
|
+
env["KSADK_SKILL_SERVICE_REGION"] = region
|
|
65
|
+
has_spaces = bool(skill_space_ids) or bool(resolve_skill_space_ids())
|
|
66
|
+
if has_spaces:
|
|
67
|
+
for target, sources in _SKILL_SERVICE_SECRET_FALLBACKS.items():
|
|
68
|
+
if target in env:
|
|
69
|
+
continue
|
|
70
|
+
for source in sources:
|
|
71
|
+
value = os.environ.get(source, "").strip()
|
|
72
|
+
if value:
|
|
73
|
+
env[target] = value
|
|
74
|
+
break
|
|
75
|
+
if has_spaces and should_resolve_child_skill_service_url() and "KSADK_SKILL_SERVICE_URL" not in env:
|
|
76
|
+
service_url = resolve_skill_service_url(require_spaces=False)
|
|
77
|
+
if service_url:
|
|
78
|
+
env["KSADK_SKILL_SERVICE_URL"] = service_url
|
|
79
|
+
return env
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def build_execute_skills_tool(
|
|
83
|
+
*,
|
|
84
|
+
backend: SkillRuntimeBackend,
|
|
85
|
+
skill_space_ids: list[str] | None = None,
|
|
86
|
+
session_id: str | None = None,
|
|
87
|
+
):
|
|
88
|
+
spaces = list(skill_space_ids or resolve_user_skill_space_ids())
|
|
89
|
+
default_session_id = session_id or f"ksadk-{uuid4().hex}"
|
|
90
|
+
|
|
91
|
+
def execute_skills(workflow_prompt: str, skill_names: list[str] | str | None = None) -> dict:
|
|
92
|
+
"""Execute a workflow with the configured Skill Runtime."""
|
|
93
|
+
|
|
94
|
+
result = backend.run_workflow(
|
|
95
|
+
workflow_prompt,
|
|
96
|
+
skill_space_ids=spaces,
|
|
97
|
+
skill_names=normalize_skill_names(skill_names),
|
|
98
|
+
session_id=default_session_id,
|
|
99
|
+
env=runtime_agent_env_from_process(spaces),
|
|
100
|
+
timeout=int(os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT", "900")),
|
|
101
|
+
)
|
|
102
|
+
return result.to_dict()
|
|
103
|
+
|
|
104
|
+
execute_skills.__name__ = "execute_skills"
|
|
105
|
+
return execute_skills
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def load_remote_skill_manifests(skill_space_ids: list[str] | None = None) -> list[dict[str, str]]:
|
|
109
|
+
spaces = list(skill_space_ids or resolve_skill_space_ids())
|
|
110
|
+
public_spaces = set(public_skill_space_ids())
|
|
111
|
+
user_spaces = [space_id for space_id in spaces if space_id not in public_spaces]
|
|
112
|
+
if not user_spaces and not public_spaces:
|
|
113
|
+
return []
|
|
114
|
+
|
|
115
|
+
service_url = resolve_skill_service_url(require_spaces=True)
|
|
116
|
+
if not service_url:
|
|
117
|
+
return []
|
|
118
|
+
|
|
119
|
+
client = SkillServiceClient(
|
|
120
|
+
base_url=service_url,
|
|
121
|
+
token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
|
|
122
|
+
timeout=float(os.environ.get("KSADK_SKILL_MANIFEST_TIMEOUT", "5")),
|
|
123
|
+
)
|
|
124
|
+
manifests: list[dict[str, str]] = []
|
|
125
|
+
seen: set[str] = set()
|
|
126
|
+
limit = _manifest_limit()
|
|
127
|
+
public_allowlist = {
|
|
128
|
+
name.lower() for name in normalize_skill_names(os.environ.get("KSADK_PUBLIC_SKILL_ALLOWLIST", ""))
|
|
129
|
+
}
|
|
130
|
+
for space_id in user_spaces:
|
|
131
|
+
listing = client.list_skills_by_space_id(space_id)
|
|
132
|
+
for skill in listing.active_skills():
|
|
133
|
+
item = _skill_manifest_item(skill, space_id=space_id)
|
|
134
|
+
name_key = item["name"].lower()
|
|
135
|
+
if not item["name"] or name_key in seen:
|
|
136
|
+
continue
|
|
137
|
+
seen.add(name_key)
|
|
138
|
+
manifests.append(item)
|
|
139
|
+
if len(manifests) >= limit:
|
|
140
|
+
return manifests
|
|
141
|
+
if public_spaces:
|
|
142
|
+
listing = client.list_available_premade_skills()
|
|
143
|
+
for skill in listing.active_skills():
|
|
144
|
+
if public_allowlist and skill.name.lower() not in public_allowlist:
|
|
145
|
+
continue
|
|
146
|
+
item = _skill_manifest_item(skill, space_id=listing.space_id or "public")
|
|
147
|
+
name_key = item["name"].lower()
|
|
148
|
+
if not item["name"] or name_key in seen:
|
|
149
|
+
continue
|
|
150
|
+
seen.add(name_key)
|
|
151
|
+
manifests.append(item)
|
|
152
|
+
if len(manifests) >= limit:
|
|
153
|
+
return manifests
|
|
154
|
+
return manifests
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def build_skill_manifest_instruction(manifests: list[dict[str, str]]) -> str:
|
|
158
|
+
if not manifests:
|
|
159
|
+
return ""
|
|
160
|
+
|
|
161
|
+
lines = [
|
|
162
|
+
"",
|
|
163
|
+
"Available remote skills are listed below. Use them only when they match the user's task.",
|
|
164
|
+
"When a skill is useful, call execute_skills with the original workflow_prompt and skill_names set to the exact skill name.",
|
|
165
|
+
"Do not assume full skill instructions are already loaded; execute_skills loads selected skills on demand.",
|
|
166
|
+
"",
|
|
167
|
+
"Remote skills:",
|
|
168
|
+
]
|
|
169
|
+
for item in manifests:
|
|
170
|
+
description = item.get("description") or "No description"
|
|
171
|
+
version = item.get("version") or ""
|
|
172
|
+
suffix = f" ({version})" if version else ""
|
|
173
|
+
lines.append(f"- {item['name']}{suffix}: {description}")
|
|
174
|
+
return "\n".join(lines)
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _skill_manifest_item(skill: SkillRef, *, space_id: str) -> dict[str, str]:
|
|
178
|
+
item = {
|
|
179
|
+
"name": str(skill.name or "").strip(),
|
|
180
|
+
"description": _single_line(skill.description),
|
|
181
|
+
"version": str(skill.version or "").strip(),
|
|
182
|
+
"space_id": str(space_id or "").strip(),
|
|
183
|
+
}
|
|
184
|
+
if skill.aliases:
|
|
185
|
+
item["aliases"] = _single_line(", ".join(skill.aliases))
|
|
186
|
+
if skill.tags:
|
|
187
|
+
item["tags"] = _single_line(", ".join(skill.tags))
|
|
188
|
+
return item
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _single_line(value: str, *, limit: int = 240) -> str:
|
|
192
|
+
text = " ".join(str(value or "").split())
|
|
193
|
+
return text[:limit].rstrip()
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def _manifest_limit() -> int:
|
|
197
|
+
try:
|
|
198
|
+
return max(1, int(os.environ.get("KSADK_SKILL_MANIFEST_LIMIT", "30")))
|
|
199
|
+
except ValueError:
|
|
200
|
+
return 30
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def build_skills_tool(skills: list[LocalSkill]):
|
|
204
|
+
def skills_tool(action: str = "list") -> dict:
|
|
205
|
+
"""List locally loaded skills and their instructions."""
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
"action": action,
|
|
209
|
+
"skills": [
|
|
210
|
+
{
|
|
211
|
+
"name": skill.name,
|
|
212
|
+
"description": skill.description,
|
|
213
|
+
"body": skill.body,
|
|
214
|
+
"root_dir": str(skill.root_dir),
|
|
215
|
+
}
|
|
216
|
+
for skill in skills
|
|
217
|
+
],
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
skills_tool.__name__ = "skills_tool"
|
|
221
|
+
return skills_tool
|
ksadk/terminal_client.py
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""通用远程终端 websocket client。
|
|
2
|
+
|
|
3
|
+
当前 Hermes 与 OpenClaw runtime proxy 都使用同一套 `ks-terminal.v1`
|
|
4
|
+
协议。Hermes 仍保留 `ksadk.hermes_terminal` 的兼容入口;新框架应优先
|
|
5
|
+
引用本模块,避免把协议命名绑定到某一个框架。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any, Mapping, Sequence
|
|
11
|
+
|
|
12
|
+
from ksadk.hermes_terminal import (
|
|
13
|
+
TERMINAL_SUBPROTOCOL,
|
|
14
|
+
TERMINAL_WS_PATH,
|
|
15
|
+
TerminalSize,
|
|
16
|
+
build_start_frame,
|
|
17
|
+
build_terminal_exec_validator,
|
|
18
|
+
build_terminal_ws_url,
|
|
19
|
+
detect_terminal_size,
|
|
20
|
+
run_hermes_terminal_session,
|
|
21
|
+
validate_terminal_exec_argv,
|
|
22
|
+
)
|
|
23
|
+
from ksadk.terminal_exec_policy import GENERIC_TERMINAL_EXEC_POLICY, TerminalExecPolicy
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def run_terminal_session(
|
|
27
|
+
*,
|
|
28
|
+
endpoint: str,
|
|
29
|
+
api_key: str | None = None,
|
|
30
|
+
session_id: str | None = None,
|
|
31
|
+
insecure: bool = False,
|
|
32
|
+
mode: str = "tui",
|
|
33
|
+
argv: Sequence[str] | None = None,
|
|
34
|
+
cwd: str | None = None,
|
|
35
|
+
options: Mapping[str, Any] | None = None,
|
|
36
|
+
exec_policy: TerminalExecPolicy | None = None,
|
|
37
|
+
stdin: Any | None = None,
|
|
38
|
+
stdout: Any | None = None,
|
|
39
|
+
) -> int:
|
|
40
|
+
"""Attach to a framework-native terminal session over ks-terminal.v1."""
|
|
41
|
+
|
|
42
|
+
return await run_hermes_terminal_session(
|
|
43
|
+
endpoint=endpoint,
|
|
44
|
+
api_key=api_key,
|
|
45
|
+
session_id=session_id,
|
|
46
|
+
insecure=insecure,
|
|
47
|
+
mode=mode,
|
|
48
|
+
argv=argv,
|
|
49
|
+
cwd=cwd,
|
|
50
|
+
options=options,
|
|
51
|
+
stdin=stdin,
|
|
52
|
+
stdout=stdout,
|
|
53
|
+
exec_argv_validator=(
|
|
54
|
+
build_terminal_exec_validator(exec_policy)
|
|
55
|
+
if exec_policy is not None and exec_policy != GENERIC_TERMINAL_EXEC_POLICY
|
|
56
|
+
else validate_terminal_exec_argv
|
|
57
|
+
),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
__all__ = [
|
|
62
|
+
"TERMINAL_SUBPROTOCOL",
|
|
63
|
+
"TERMINAL_WS_PATH",
|
|
64
|
+
"TerminalSize",
|
|
65
|
+
"build_start_frame",
|
|
66
|
+
"build_terminal_ws_url",
|
|
67
|
+
"detect_terminal_size",
|
|
68
|
+
"run_terminal_session",
|
|
69
|
+
]
|