agentengine-sdk-python 0.6.2__py3-none-any.whl → 0.6.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentengine_sdk_python-0.6.9.dist-info/METADATA +179 -0
- agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
- {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
- agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
- agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
- agentengine_sdk_python-0.6.9.dist-info/top_level.txt +2 -0
- ksadk/__init__.py +13 -0
- ksadk/__main__.py +4 -0
- ksadk/a2a/__init__.py +15 -0
- ksadk/a2a/card_builder.py +64 -0
- ksadk/a2a/client.py +309 -0
- ksadk/a2a/executor.py +201 -0
- ksadk/a2a/server.py +79 -0
- ksadk/agents/__init__.py +20 -0
- ksadk/agents/base.py +370 -0
- ksadk/agents/context.py +38 -0
- ksadk/agents/event.py +35 -0
- ksadk/agents/loop_agent.py +71 -0
- ksadk/agents/parallel_agent.py +109 -0
- ksadk/agents/runner_adapter.py +24 -0
- ksadk/agents/sequential_agent.py +34 -0
- ksadk/api/__init__.py +3 -0
- ksadk/api/client.py +2227 -0
- ksadk/builders/__init__.py +20 -0
- ksadk/builders/base.py +66 -0
- ksadk/builders/code_builder.py +1990 -0
- ksadk/builders/container_builder.py +786 -0
- ksadk/builders/framework_requirements.py +59 -0
- ksadk/builders/ks3_uploader.py +389 -0
- ksadk/builders/mcp_builder.py +476 -0
- ksadk/builders/requirements_utils.py +75 -0
- ksadk/cli/__init__.py +531 -0
- ksadk/cli/__main__.py +4 -0
- ksadk/cli/agent_ref.py +204 -0
- ksadk/cli/cmd_a2a.py +167 -0
- ksadk/cli/cmd_agent.py +201 -0
- ksadk/cli/cmd_build.py +270 -0
- ksadk/cli/cmd_completion.py +304 -0
- ksadk/cli/cmd_config.py +758 -0
- ksadk/cli/cmd_create.py +2277 -0
- ksadk/cli/cmd_dashboard.py +900 -0
- ksadk/cli/cmd_deploy.py +704 -0
- ksadk/cli/cmd_destroy.py +345 -0
- ksadk/cli/cmd_files.py +1227 -0
- ksadk/cli/cmd_hermes.py +1259 -0
- ksadk/cli/cmd_invoke.py +1336 -0
- ksadk/cli/cmd_launch.py +564 -0
- ksadk/cli/cmd_mcp.py +1174 -0
- ksadk/cli/cmd_model.py +302 -0
- ksadk/cli/cmd_openclaw.py +3918 -0
- ksadk/cli/cmd_run.py +232 -0
- ksadk/cli/cmd_status.py +588 -0
- ksadk/cli/cmd_version.py +522 -0
- ksadk/cli/cmd_web.py +288 -0
- ksadk/cli/deploy_utils.py +87 -0
- ksadk/cli/dry_run.py +214 -0
- ksadk/cli/env_options.py +82 -0
- ksadk/cli/error_utils.py +525 -0
- ksadk/cli/global_options.py +31 -0
- ksadk/cli/local_runtime.py +97 -0
- ksadk/cli/model_catalog.py +136 -0
- ksadk/cli/network_options.py +410 -0
- ksadk/cli/resource_common.py +621 -0
- ksadk/cli/storage.py +84 -0
- ksadk/cli/ui.py +431 -0
- ksadk/cli/workflow_common.py +552 -0
- ksadk/common/__init__.py +14 -0
- ksadk/common/aicp_env.py +128 -0
- ksadk/common/auth.py +190 -0
- ksadk/common/constants.py +84 -0
- ksadk/common/llm_utils.py +61 -0
- ksadk/configs/__init__.py +61 -0
- ksadk/configs/env_registry.py +342 -0
- ksadk/configs/global_config.py +200 -0
- ksadk/configs/settings.py +706 -0
- ksadk/conversations/__init__.py +95 -0
- ksadk/conversations/attachment_storage.py +379 -0
- ksadk/conversations/attachments.py +774 -0
- ksadk/conversations/compaction_pipeline.py +387 -0
- ksadk/conversations/compaction_prompt.py +128 -0
- ksadk/conversations/context.py +303 -0
- ksadk/conversations/model_context.py +360 -0
- ksadk/conversations/model_options.py +136 -0
- ksadk/conversations/normalize.py +446 -0
- ksadk/conversations/reasoning_markup.py +91 -0
- ksadk/conversations/run_kinds.py +61 -0
- ksadk/conversations/run_status.py +53 -0
- ksadk/conversations/runtime.py +5208 -0
- ksadk/conversations/semantic_summary.py +359 -0
- ksadk/conversations/session_title.py +254 -0
- ksadk/deployment/__init__.py +83 -0
- ksadk/deployment/agent_access.py +226 -0
- ksadk/deployment/base.py +229 -0
- ksadk/deployment/manager.py +332 -0
- ksadk/deployment/providers/__init__.py +10 -0
- ksadk/deployment/providers/serverless.py +1105 -0
- ksadk/deployment/registry.py +120 -0
- ksadk/deployment/state.py +78 -0
- ksadk/deployment/ui_config.py +21 -0
- ksadk/detection/__init__.py +7 -0
- ksadk/detection/detector.py +431 -0
- ksadk/detection/mcp_detector.py +250 -0
- ksadk/hermes_terminal.py +467 -0
- ksadk/identity/__init__.py +17 -0
- ksadk/identity/resolver.py +385 -0
- ksadk/knowledge_base/__init__.py +62 -0
- ksadk/knowledge_base/adk_tool.py +47 -0
- ksadk/knowledge_base/client.py +297 -0
- ksadk/knowledge_base/langchain_tool.py +55 -0
- ksadk/knowledge_base/service.py +66 -0
- ksadk/knowledge_base/tool.py +50 -0
- ksadk/markdown.py +169 -0
- ksadk/mcp_runtime/__init__.py +231 -0
- ksadk/memory/__init__.py +57 -0
- ksadk/memory/adk/__init__.py +51 -0
- ksadk/memory/adk/backends/__init__.py +5 -0
- ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
- ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
- ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
- ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
- ksadk/memory/adk/long_term_memory.py +273 -0
- ksadk/memory/adk/short_term_memory.py +289 -0
- ksadk/memory/adk_tool.py +31 -0
- ksadk/memory/backends/__init__.py +6 -0
- ksadk/memory/backends/base.py +103 -0
- ksadk/memory/backends/memory.py +112 -0
- ksadk/memory/backends/redis.py +146 -0
- ksadk/memory/langchain_tool.py +39 -0
- ksadk/memory/ltm_backend_factory.py +24 -0
- ksadk/memory/manager.py +215 -0
- ksadk/memory/service.py +172 -0
- ksadk/memory/tool.py +96 -0
- ksadk/model_policy.py +223 -0
- ksadk/openclaw_gateway.py +378 -0
- ksadk/runners/__init__.py +8 -0
- ksadk/runners/adk_runner.py +1135 -0
- ksadk/runners/base_runner.py +305 -0
- ksadk/runners/deepagents_runner.py +13 -0
- ksadk/runners/factory.py +73 -0
- ksadk/runners/langchain_runner.py +539 -0
- ksadk/runners/langgraph_runner.py +852 -0
- ksadk/runners/patch_langchain.py +187 -0
- ksadk/runners/remote_runner.py +667 -0
- ksadk/runners/usage_accumulator.py +38 -0
- ksadk/runners/utils/__init__.py +19 -0
- ksadk/runners/utils/langfuse.py +230 -0
- ksadk/runners/utils/loader.py +62 -0
- ksadk/runtime_context.py +166 -0
- ksadk/runtime_state.py +25 -0
- ksadk/sandbox/__init__.py +28 -0
- ksadk/sandbox/backends/__init__.py +9 -0
- ksadk/sandbox/backends/e2b.py +154 -0
- ksadk/sandbox/backends/local_process.py +131 -0
- ksadk/sandbox/base.py +101 -0
- ksadk/sandbox/factory.py +53 -0
- ksadk/sandbox/registry.py +187 -0
- ksadk/server/__init__.py +7 -0
- ksadk/server/api_models.py +73 -0
- ksadk/server/app.py +3789 -0
- ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
- ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
- ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
- ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
- ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
- ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
- ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
- ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
- ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
- ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
- ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
- ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
- ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
- ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
- ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
- ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
- ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
- ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
- ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
- ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
- ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
- ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
- ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
- ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
- ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
- ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
- ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
- ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
- ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
- ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
- ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
- ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
- ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
- ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
- ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
- ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
- ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
- ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
- ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
- ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
- ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
- ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
- ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
- ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
- ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
- ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
- ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
- ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
- ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
- ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
- ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
- ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
- ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
- ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
- ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
- ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
- ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
- ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
- ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
- ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
- ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
- ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
- ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
- ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
- ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
- ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
- ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
- ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
- ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
- ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
- ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
- ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
- ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
- ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
- ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
- ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
- ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
- ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
- ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
- ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
- ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
- ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
- ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
- ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
- ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
- ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
- ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
- ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
- ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
- ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
- ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
- ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
- ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
- ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
- ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
- ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
- ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
- ksadk/server/static/assets/index-DAURbCsP.css +1 -0
- ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
- ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
- ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
- ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
- ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
- ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
- ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
- ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
- ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
- ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
- ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
- ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
- ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
- ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
- ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
- ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
- ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
- ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
- ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
- ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
- ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
- ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
- ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
- ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
- ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
- ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
- ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
- ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
- ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
- ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
- ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
- ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
- ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
- ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
- ksadk/server/static/assets/properties-C357ku5U.js +1 -0
- ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
- ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
- ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
- ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
- ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
- ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
- ksadk/server/static/assets/r-DADKenSm.js +1 -0
- ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
- ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
- ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
- ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
- ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
- ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
- ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
- ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
- ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
- ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
- ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
- ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
- ksadk/server/static/assets/solr-BBopId9w.js +1 -0
- ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
- ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
- ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
- ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
- ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
- ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
- ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
- ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
- ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
- ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
- ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
- ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
- ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
- ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
- ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
- ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
- ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
- ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
- ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
- ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
- ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
- ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
- ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
- ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
- ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
- ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
- ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
- ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
- ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
- ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
- ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
- ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
- ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
- ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
- ksadk/server/static/favicon.svg +1 -0
- ksadk/server/static/icons.svg +24 -0
- ksadk/server/static/index.html +14 -0
- ksadk/server/terminal_sessions.py +551 -0
- ksadk/sessions/__init__.py +283 -0
- ksadk/sessions/base.py +354 -0
- ksadk/sessions/continuity.py +313 -0
- ksadk/sessions/errors.py +7 -0
- ksadk/sessions/in_memory.py +273 -0
- ksadk/sessions/local_service.py +949 -0
- ksadk/sessions/postgres_service.py +838 -0
- ksadk/sessions/sqlite_service.py +13 -0
- ksadk/skills/__init__.py +9 -0
- ksadk/skills/loader.py +46 -0
- ksadk/skills/models.py +120 -0
- ksadk/skills/package_store.py +104 -0
- ksadk/skills/runtime/__init__.py +17 -0
- ksadk/skills/runtime/agent.py +183 -0
- ksadk/skills/runtime/artifacts.py +39 -0
- ksadk/skills/runtime/backends/__init__.py +1 -0
- ksadk/skills/runtime/backends/disabled.py +8 -0
- ksadk/skills/runtime/backends/e2b.py +168 -0
- ksadk/skills/runtime/backends/local.py +95 -0
- ksadk/skills/runtime/base.py +103 -0
- ksadk/skills/runtime/executor.py +219 -0
- ksadk/skills/runtime/factory.py +37 -0
- ksadk/skills/runtime/loader.py +131 -0
- ksadk/skills/runtime/registry.py +150 -0
- ksadk/skills/runtime/request.py +67 -0
- ksadk/skills/service_client.py +239 -0
- ksadk/skills/service_env.py +58 -0
- ksadk/skills/tool_defs.py +221 -0
- ksadk/terminal_client.py +69 -0
- ksadk/terminal_exec_policy.py +229 -0
- ksadk/tools/__init__.py +17 -0
- ksadk/tools/gateway.py +230 -0
- ksadk/tools/result_budget.py +154 -0
- ksadk/toolsets/__init__.py +852 -0
- ksadk/toolsets/_langchain.py +11 -0
- ksadk/toolsets/platform.py +93 -0
- ksadk/toolsets/sandbox.py +310 -0
- ksadk/toolsets/skills.py +217 -0
- ksadk/toolsets/web.py +266 -0
- ksadk/toolsets/workspace.py +878 -0
- ksadk/toolsets/workspace_state.py +44 -0
- ksadk/tracing/__init__.py +37 -0
- ksadk/tracing/exporters/__init__.py +1 -0
- ksadk/tracing/exporters/inmemory_exporter.py +116 -0
- ksadk/tracing/exporters/langfuse_exporter.py +445 -0
- ksadk/tracing/setup.py +829 -0
- ksadk/tracing/span_utils.py +114 -0
- ksadk/tui/__init__.py +12 -0
- ksadk/tui/app.py +400 -0
- ksadk/tui/clipboard.py +100 -0
- ksadk/tui/widgets/__init__.py +22 -0
- ksadk/tui/widgets/assistant.py +89 -0
- ksadk/tui/widgets/base.py +54 -0
- ksadk/tui/widgets/chat_input.py +246 -0
- ksadk/tui/widgets/history.py +156 -0
- ksadk/tui/widgets/system.py +87 -0
- ksadk/tui/widgets/thinking.py +110 -0
- ksadk/tui/widgets/tool_call.py +161 -0
- ksadk/tui/widgets/user.py +37 -0
- ksadk/ui_config.py +168 -0
- ksadk/version.py +4 -0
- ksadk_runtime_common/__init__.py +20 -0
- ksadk_runtime_common/memory_backend/__init__.py +29 -0
- ksadk_runtime_common/memory_backend/manifest.py +79 -0
- ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
- ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
- ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
- ksadk_runtime_common/memory_backend/registry.py +56 -0
- ksadk_runtime_common/memory_backend/render.py +71 -0
- ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
- ksadk_runtime_common/workspace_files/__init__.py +29 -0
- ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
- ksadk_runtime_common/workspace_files/constants.py +9 -0
- ksadk_runtime_common/workspace_files/path_utils.py +71 -0
- ksadk_runtime_common/workspace_files/preview.py +96 -0
- ksadk_runtime_common/workspace_files/router.py +254 -0
- agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
- agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
- agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
ksadk/hermes_terminal.py
ADDED
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
"""Hermes native terminal websocket client helpers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import contextlib
|
|
7
|
+
import ctypes
|
|
8
|
+
import io
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import shutil
|
|
12
|
+
import signal
|
|
13
|
+
import ssl
|
|
14
|
+
import sys
|
|
15
|
+
from ctypes import wintypes
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from typing import Any, Callable, Iterable, Mapping, Sequence
|
|
18
|
+
from urllib.parse import urlsplit, urlunsplit
|
|
19
|
+
|
|
20
|
+
from ksadk.terminal_exec_policy import (
|
|
21
|
+
GENERIC_TERMINAL_EXEC_POLICY,
|
|
22
|
+
HERMES_TERMINAL_EXEC_POLICY,
|
|
23
|
+
SHELL_METACHARS,
|
|
24
|
+
TerminalExecPolicy,
|
|
25
|
+
)
|
|
26
|
+
from ksadk.terminal_exec_policy import (
|
|
27
|
+
validate_terminal_exec_argv as validate_exec_argv_with_policy,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
TERMINAL_SUBPROTOCOL = "ks-terminal.v1"
|
|
31
|
+
TERMINAL_WS_PATH = "/_ksadk/terminal/ws"
|
|
32
|
+
|
|
33
|
+
_PAIRING_PLATFORMS = {
|
|
34
|
+
"discord",
|
|
35
|
+
"dingtalk",
|
|
36
|
+
"email",
|
|
37
|
+
"feishu",
|
|
38
|
+
"homeassistant",
|
|
39
|
+
"mattermost",
|
|
40
|
+
"matrix",
|
|
41
|
+
"signal",
|
|
42
|
+
"slack",
|
|
43
|
+
"telegram",
|
|
44
|
+
"wecom",
|
|
45
|
+
"wecom_callback",
|
|
46
|
+
"webhook",
|
|
47
|
+
"weixin",
|
|
48
|
+
"whatsapp",
|
|
49
|
+
"wpsxiezuo",
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_WINDOWS_INPUT_FLAGS = {
|
|
53
|
+
"ENABLE_PROCESSED_INPUT": 0x0001,
|
|
54
|
+
"ENABLE_LINE_INPUT": 0x0002,
|
|
55
|
+
"ENABLE_ECHO_INPUT": 0x0004,
|
|
56
|
+
"ENABLE_QUICK_EDIT_MODE": 0x0040,
|
|
57
|
+
"ENABLE_EXTENDED_FLAGS": 0x0080,
|
|
58
|
+
"ENABLE_VIRTUAL_TERMINAL_INPUT": 0x0200,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass(frozen=True)
|
|
63
|
+
class TerminalSize:
|
|
64
|
+
cols: int
|
|
65
|
+
rows: int
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def build_terminal_ws_url(endpoint: str) -> str:
|
|
69
|
+
"""Build the Hermes native terminal websocket URL for an agent endpoint."""
|
|
70
|
+
parsed = urlsplit((endpoint or "").strip())
|
|
71
|
+
if not parsed.scheme or not parsed.netloc:
|
|
72
|
+
raise ValueError(f"invalid endpoint: {endpoint}")
|
|
73
|
+
|
|
74
|
+
if parsed.scheme == "https":
|
|
75
|
+
ws_scheme = "wss"
|
|
76
|
+
elif parsed.scheme == "http":
|
|
77
|
+
ws_scheme = "ws"
|
|
78
|
+
else:
|
|
79
|
+
ws_scheme = parsed.scheme
|
|
80
|
+
|
|
81
|
+
base_path = parsed.path.rstrip("/")
|
|
82
|
+
ws_path = f"{base_path}{TERMINAL_WS_PATH}" if base_path else TERMINAL_WS_PATH
|
|
83
|
+
return urlunsplit((ws_scheme, parsed.netloc, ws_path, "", ""))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def build_start_frame(
|
|
87
|
+
*,
|
|
88
|
+
mode: str,
|
|
89
|
+
argv: Sequence[str],
|
|
90
|
+
cols: int,
|
|
91
|
+
rows: int,
|
|
92
|
+
cwd: str | None = None,
|
|
93
|
+
options: Mapping[str, Any] | None = None,
|
|
94
|
+
) -> str:
|
|
95
|
+
normalized_mode = str(mode or "").strip().lower()
|
|
96
|
+
if normalized_mode not in {"tui", "exec", "pairing", "connect"}:
|
|
97
|
+
raise ValueError(f"unsupported terminal mode: {mode}")
|
|
98
|
+
payload = {
|
|
99
|
+
"type": "start",
|
|
100
|
+
"mode": normalized_mode,
|
|
101
|
+
"argv": [str(item) for item in argv],
|
|
102
|
+
"cols": int(cols),
|
|
103
|
+
"rows": int(rows),
|
|
104
|
+
}
|
|
105
|
+
normalized_cwd = str(cwd or "").strip()
|
|
106
|
+
if normalized_cwd:
|
|
107
|
+
payload["cwd"] = normalized_cwd
|
|
108
|
+
if options:
|
|
109
|
+
payload["options"] = dict(options)
|
|
110
|
+
return json.dumps(payload, ensure_ascii=False)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def detect_terminal_size() -> TerminalSize:
|
|
114
|
+
size = shutil.get_terminal_size(fallback=(80, 24))
|
|
115
|
+
return TerminalSize(cols=int(size.columns or 80), rows=int(size.lines or 24))
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def validate_hermes_exec_argv(argv: Iterable[str]) -> list[str]:
|
|
119
|
+
return validate_exec_argv_with_policy(argv, policy=HERMES_TERMINAL_EXEC_POLICY)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def validate_terminal_exec_argv(argv: Iterable[str]) -> list[str]:
|
|
123
|
+
return validate_exec_argv_with_policy(argv, policy=GENERIC_TERMINAL_EXEC_POLICY)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def build_terminal_exec_validator(policy: TerminalExecPolicy) -> Callable[[Iterable[str]], list[str]]:
|
|
127
|
+
def _validator(argv: Iterable[str]) -> list[str]:
|
|
128
|
+
return validate_exec_argv_with_policy(argv, policy=policy)
|
|
129
|
+
|
|
130
|
+
return _validator
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def validate_hermes_pairing_argv(argv: Iterable[str]) -> list[str]:
|
|
134
|
+
normalized = [str(item).strip() for item in argv]
|
|
135
|
+
if not normalized:
|
|
136
|
+
raise ValueError("Hermes pairing requires a subcommand")
|
|
137
|
+
for item in normalized:
|
|
138
|
+
if not item:
|
|
139
|
+
raise ValueError("Hermes pairing argv contains an empty argument")
|
|
140
|
+
if item.startswith("-"):
|
|
141
|
+
raise ValueError(f"Hermes pairing does not allow shell/options: {item}")
|
|
142
|
+
if any(char in SHELL_METACHARS for char in item):
|
|
143
|
+
raise ValueError(f"Hermes pairing does not allow shell metacharacters: {item}")
|
|
144
|
+
|
|
145
|
+
action = normalized[0]
|
|
146
|
+
if action == "list":
|
|
147
|
+
if len(normalized) != 1:
|
|
148
|
+
raise ValueError(f"Hermes pairing subcommand is not allowed: {' '.join(normalized)}")
|
|
149
|
+
return normalized
|
|
150
|
+
if action == "clear-pending":
|
|
151
|
+
if len(normalized) != 1:
|
|
152
|
+
raise ValueError(f"Hermes pairing subcommand is not allowed: {' '.join(normalized)}")
|
|
153
|
+
return normalized
|
|
154
|
+
if action in {"approve", "revoke"}:
|
|
155
|
+
if len(normalized) != 3:
|
|
156
|
+
raise ValueError(f"Hermes pairing subcommand is not allowed: {' '.join(normalized)}")
|
|
157
|
+
platform = normalized[1].lower()
|
|
158
|
+
if platform not in _PAIRING_PLATFORMS:
|
|
159
|
+
raise ValueError(f"Hermes pairing platform is not allowed: {normalized[1]}")
|
|
160
|
+
normalized[1] = platform
|
|
161
|
+
return normalized
|
|
162
|
+
raise ValueError(f"Hermes pairing subcommand is not allowed: {' '.join(normalized)}")
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@contextlib.contextmanager
|
|
166
|
+
def _raw_terminal(stdin: Any):
|
|
167
|
+
if not hasattr(stdin, "fileno") or not hasattr(stdin, "isatty") or not stdin.isatty():
|
|
168
|
+
yield
|
|
169
|
+
return
|
|
170
|
+
|
|
171
|
+
if sys.platform == "win32":
|
|
172
|
+
with _windows_raw_terminal(stdin):
|
|
173
|
+
yield
|
|
174
|
+
return
|
|
175
|
+
|
|
176
|
+
try:
|
|
177
|
+
import termios
|
|
178
|
+
import tty
|
|
179
|
+
except ImportError:
|
|
180
|
+
yield
|
|
181
|
+
return
|
|
182
|
+
|
|
183
|
+
fd = stdin.fileno()
|
|
184
|
+
old_attrs = termios.tcgetattr(fd)
|
|
185
|
+
try:
|
|
186
|
+
tty.setraw(fd)
|
|
187
|
+
yield
|
|
188
|
+
finally:
|
|
189
|
+
termios.tcsetattr(fd, termios.TCSADRAIN, old_attrs)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@contextlib.contextmanager
|
|
193
|
+
def _windows_raw_terminal(stdin: Any, *, kernel32: Any | None = None, msvcrt_module: Any | None = None):
|
|
194
|
+
if not hasattr(stdin, "fileno") or not hasattr(stdin, "isatty") or not stdin.isatty():
|
|
195
|
+
yield
|
|
196
|
+
return
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
if kernel32 is None:
|
|
200
|
+
kernel32 = ctypes.windll.kernel32
|
|
201
|
+
if msvcrt_module is None:
|
|
202
|
+
import msvcrt as msvcrt_module # type: ignore[no-redef]
|
|
203
|
+
except Exception:
|
|
204
|
+
yield
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
try:
|
|
208
|
+
fd = stdin.fileno()
|
|
209
|
+
handle = msvcrt_module.get_osfhandle(fd)
|
|
210
|
+
except Exception:
|
|
211
|
+
yield
|
|
212
|
+
return
|
|
213
|
+
|
|
214
|
+
original_mode = wintypes.DWORD()
|
|
215
|
+
try:
|
|
216
|
+
if not kernel32.GetConsoleMode(handle, ctypes.byref(original_mode)):
|
|
217
|
+
yield
|
|
218
|
+
return
|
|
219
|
+
except Exception:
|
|
220
|
+
yield
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
raw_mode = int(original_mode.value)
|
|
224
|
+
raw_mode &= ~(
|
|
225
|
+
_WINDOWS_INPUT_FLAGS["ENABLE_PROCESSED_INPUT"]
|
|
226
|
+
| _WINDOWS_INPUT_FLAGS["ENABLE_LINE_INPUT"]
|
|
227
|
+
| _WINDOWS_INPUT_FLAGS["ENABLE_ECHO_INPUT"]
|
|
228
|
+
| _WINDOWS_INPUT_FLAGS["ENABLE_QUICK_EDIT_MODE"]
|
|
229
|
+
)
|
|
230
|
+
raw_mode |= (
|
|
231
|
+
_WINDOWS_INPUT_FLAGS["ENABLE_EXTENDED_FLAGS"]
|
|
232
|
+
| _WINDOWS_INPUT_FLAGS["ENABLE_VIRTUAL_TERMINAL_INPUT"]
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
if not kernel32.SetConsoleMode(handle, raw_mode):
|
|
237
|
+
yield
|
|
238
|
+
return
|
|
239
|
+
except Exception:
|
|
240
|
+
yield
|
|
241
|
+
return
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
yield
|
|
245
|
+
finally:
|
|
246
|
+
with contextlib.suppress(Exception):
|
|
247
|
+
kernel32.SetConsoleMode(handle, int(original_mode.value))
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
async def _connect_websocket(ws_url: str, headers: dict[str, str], ssl_context: ssl.SSLContext | None):
|
|
251
|
+
try:
|
|
252
|
+
import websockets
|
|
253
|
+
except ImportError as e:
|
|
254
|
+
raise RuntimeError("missing dependency websockets, please install ksadk with websocket support") from e
|
|
255
|
+
|
|
256
|
+
kwargs: dict[str, Any] = {"subprotocols": [TERMINAL_SUBPROTOCOL]}
|
|
257
|
+
if ssl_context is not None:
|
|
258
|
+
kwargs["ssl"] = ssl_context
|
|
259
|
+
try:
|
|
260
|
+
return websockets.connect(ws_url, additional_headers=headers or None, **kwargs)
|
|
261
|
+
except TypeError:
|
|
262
|
+
return websockets.connect(ws_url, extra_headers=headers or None, **kwargs)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def _write_stdout(stdout: Any, data: bytes) -> None:
|
|
266
|
+
if not data:
|
|
267
|
+
return
|
|
268
|
+
buffer = getattr(stdout, "buffer", stdout)
|
|
269
|
+
try:
|
|
270
|
+
buffer.write(data)
|
|
271
|
+
buffer.flush()
|
|
272
|
+
return
|
|
273
|
+
except TypeError:
|
|
274
|
+
text = data.decode("utf-8", errors="replace")
|
|
275
|
+
stdout.write(text)
|
|
276
|
+
stdout.flush()
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
async def _recv_loop(ws: Any, stdout: Any) -> int:
|
|
280
|
+
async for message in ws:
|
|
281
|
+
if isinstance(message, bytes):
|
|
282
|
+
_write_stdout(stdout, message)
|
|
283
|
+
continue
|
|
284
|
+
|
|
285
|
+
if not isinstance(message, str):
|
|
286
|
+
continue
|
|
287
|
+
try:
|
|
288
|
+
payload = json.loads(message)
|
|
289
|
+
except json.JSONDecodeError:
|
|
290
|
+
_write_stdout(stdout, message.encode("utf-8", errors="replace"))
|
|
291
|
+
continue
|
|
292
|
+
if not isinstance(payload, dict):
|
|
293
|
+
continue
|
|
294
|
+
|
|
295
|
+
msg_type = payload.get("type")
|
|
296
|
+
if msg_type == "ready":
|
|
297
|
+
continue
|
|
298
|
+
if msg_type == "error":
|
|
299
|
+
raise RuntimeError(str(payload.get("message") or "Hermes terminal error"))
|
|
300
|
+
if msg_type == "exit":
|
|
301
|
+
return int(payload.get("code") or payload.get("exit_code") or 0)
|
|
302
|
+
return 0
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
async def _stdin_loop(ws: Any, stdin: Any) -> None:
|
|
306
|
+
if not hasattr(stdin, "fileno"):
|
|
307
|
+
return
|
|
308
|
+
try:
|
|
309
|
+
fd = stdin.fileno()
|
|
310
|
+
except (OSError, ValueError, io.UnsupportedOperation):
|
|
311
|
+
return
|
|
312
|
+
while True:
|
|
313
|
+
chunk = await _read_stdin_chunk(fd)
|
|
314
|
+
if not chunk:
|
|
315
|
+
with contextlib.suppress(Exception):
|
|
316
|
+
await ws.send(json.dumps({"type": "stdin_eof"}, ensure_ascii=False))
|
|
317
|
+
return
|
|
318
|
+
await ws.send(chunk)
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
async def _read_stdin_chunk(fd: int) -> bytes:
|
|
322
|
+
"""Read stdin in a way that can be cancelled when the remote PTY exits."""
|
|
323
|
+
loop = asyncio.get_running_loop()
|
|
324
|
+
future: asyncio.Future[bytes] = loop.create_future()
|
|
325
|
+
|
|
326
|
+
def _on_readable() -> None:
|
|
327
|
+
if future.done():
|
|
328
|
+
return
|
|
329
|
+
try:
|
|
330
|
+
future.set_result(os.read(fd, 4096))
|
|
331
|
+
except Exception as exc: # pragma: no cover - defensive fd error path
|
|
332
|
+
future.set_exception(exc)
|
|
333
|
+
|
|
334
|
+
try:
|
|
335
|
+
loop.add_reader(fd, _on_readable)
|
|
336
|
+
except (NotImplementedError, RuntimeError):
|
|
337
|
+
return await asyncio.to_thread(os.read, fd, 4096)
|
|
338
|
+
|
|
339
|
+
try:
|
|
340
|
+
return await future
|
|
341
|
+
finally:
|
|
342
|
+
with contextlib.suppress(Exception):
|
|
343
|
+
loop.remove_reader(fd)
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
async def _send_control(ws: Any, payload: dict[str, Any]) -> None:
|
|
347
|
+
await ws.send(json.dumps(payload, ensure_ascii=False))
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
async def run_hermes_terminal_session(
|
|
351
|
+
*,
|
|
352
|
+
endpoint: str,
|
|
353
|
+
api_key: str | None = None,
|
|
354
|
+
session_id: str | None = None,
|
|
355
|
+
insecure: bool = False,
|
|
356
|
+
mode: str = "tui",
|
|
357
|
+
argv: Sequence[str] | None = None,
|
|
358
|
+
cwd: str | None = None,
|
|
359
|
+
options: Mapping[str, Any] | None = None,
|
|
360
|
+
stdin: Any | None = None,
|
|
361
|
+
stdout: Any | None = None,
|
|
362
|
+
exec_argv_validator: Callable[[Iterable[str]], list[str]] | None = None,
|
|
363
|
+
) -> int:
|
|
364
|
+
"""Attach to a Hermes native terminal session over the platform websocket."""
|
|
365
|
+
normalized_mode = str(mode or "tui").strip().lower()
|
|
366
|
+
normalized_argv = list(argv or [])
|
|
367
|
+
if normalized_mode == "exec":
|
|
368
|
+
validator = exec_argv_validator or validate_hermes_exec_argv
|
|
369
|
+
normalized_argv = validator(normalized_argv)
|
|
370
|
+
elif normalized_mode == "pairing":
|
|
371
|
+
normalized_argv = validate_hermes_pairing_argv(normalized_argv)
|
|
372
|
+
elif normalized_mode == "connect":
|
|
373
|
+
if normalized_argv:
|
|
374
|
+
raise ValueError(f"Hermes connect does not allow argv: {' '.join(normalized_argv)}")
|
|
375
|
+
elif normalized_mode != "tui":
|
|
376
|
+
raise ValueError(f"unsupported terminal mode: {mode}")
|
|
377
|
+
|
|
378
|
+
stdin_was_provided = stdin is not None
|
|
379
|
+
stdin = stdin or sys.stdin
|
|
380
|
+
stdout = stdout or sys.stdout
|
|
381
|
+
ws_url = build_terminal_ws_url(endpoint)
|
|
382
|
+
|
|
383
|
+
headers: dict[str, str] = {}
|
|
384
|
+
if api_key:
|
|
385
|
+
headers["Authorization"] = f"Bearer {api_key}"
|
|
386
|
+
if session_id:
|
|
387
|
+
headers["X-Session-Id"] = session_id
|
|
388
|
+
|
|
389
|
+
ssl_context = None
|
|
390
|
+
if insecure and ws_url.startswith("wss://"):
|
|
391
|
+
ssl_context = ssl.create_default_context()
|
|
392
|
+
ssl_context.check_hostname = False
|
|
393
|
+
ssl_context.verify_mode = ssl.CERT_NONE
|
|
394
|
+
|
|
395
|
+
connection = await _connect_websocket(ws_url, headers, ssl_context)
|
|
396
|
+
async with connection as ws:
|
|
397
|
+
if getattr(ws, "subprotocol", TERMINAL_SUBPROTOCOL) not in {None, TERMINAL_SUBPROTOCOL}:
|
|
398
|
+
raise RuntimeError(f"server rejected terminal subprotocol {TERMINAL_SUBPROTOCOL}")
|
|
399
|
+
|
|
400
|
+
size = detect_terminal_size()
|
|
401
|
+
await ws.send(
|
|
402
|
+
build_start_frame(
|
|
403
|
+
mode=normalized_mode,
|
|
404
|
+
argv=normalized_argv,
|
|
405
|
+
cols=size.cols,
|
|
406
|
+
rows=size.rows,
|
|
407
|
+
cwd=cwd,
|
|
408
|
+
options=options,
|
|
409
|
+
)
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
loop = asyncio.get_running_loop()
|
|
413
|
+
previous_winch = None
|
|
414
|
+
previous_int = None
|
|
415
|
+
|
|
416
|
+
def _schedule_resize(*_args):
|
|
417
|
+
current = detect_terminal_size()
|
|
418
|
+
loop.create_task(
|
|
419
|
+
_send_control(ws, {"type": "resize", "cols": current.cols, "rows": current.rows})
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
def _schedule_sigint(*_args):
|
|
423
|
+
loop.create_task(_send_control(ws, {"type": "signal", "signal": "SIGINT"}))
|
|
424
|
+
|
|
425
|
+
try:
|
|
426
|
+
if hasattr(signal, "SIGWINCH"):
|
|
427
|
+
previous_winch = signal.getsignal(signal.SIGWINCH)
|
|
428
|
+
signal.signal(signal.SIGWINCH, _schedule_resize)
|
|
429
|
+
previous_int = signal.getsignal(signal.SIGINT)
|
|
430
|
+
signal.signal(signal.SIGINT, _schedule_sigint)
|
|
431
|
+
except (ValueError, RuntimeError):
|
|
432
|
+
previous_winch = None
|
|
433
|
+
previous_int = None
|
|
434
|
+
|
|
435
|
+
try:
|
|
436
|
+
with _raw_terminal(stdin):
|
|
437
|
+
recv_task = asyncio.create_task(_recv_loop(ws, stdout))
|
|
438
|
+
if (
|
|
439
|
+
normalized_mode in {"exec", "pairing"}
|
|
440
|
+
and not stdin_was_provided
|
|
441
|
+
and (not hasattr(stdin, "isatty") or not stdin.isatty())
|
|
442
|
+
):
|
|
443
|
+
await _send_control(ws, {"type": "stdin_eof"})
|
|
444
|
+
return int(await recv_task or 0)
|
|
445
|
+
|
|
446
|
+
stdin_task = asyncio.create_task(_stdin_loop(ws, stdin))
|
|
447
|
+
done, pending = await asyncio.wait(
|
|
448
|
+
{recv_task, stdin_task},
|
|
449
|
+
return_when=asyncio.FIRST_COMPLETED,
|
|
450
|
+
)
|
|
451
|
+
if recv_task in done:
|
|
452
|
+
stdin_task.cancel()
|
|
453
|
+
with contextlib.suppress(asyncio.CancelledError):
|
|
454
|
+
await stdin_task
|
|
455
|
+
return int(recv_task.result() or 0)
|
|
456
|
+
|
|
457
|
+
# stdin EOF is only an input-side event; keep receiving until
|
|
458
|
+
# the remote PTY exits so command output and exit code are not lost.
|
|
459
|
+
stdin_task.result()
|
|
460
|
+
return int(await recv_task or 0)
|
|
461
|
+
finally:
|
|
462
|
+
if previous_winch is not None and hasattr(signal, "SIGWINCH"):
|
|
463
|
+
with contextlib.suppress(Exception):
|
|
464
|
+
signal.signal(signal.SIGWINCH, previous_winch)
|
|
465
|
+
if previous_int is not None:
|
|
466
|
+
with contextlib.suppress(Exception):
|
|
467
|
+
signal.signal(signal.SIGINT, previous_int)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""ksadk 身份反查模块:从 AK/SK 反查金山云子账号 user uuid + 主账号 ID。"""
|
|
2
|
+
|
|
3
|
+
from ksadk.identity.resolver import (
|
|
4
|
+
ResolvedIdentity,
|
|
5
|
+
get_cached_identity,
|
|
6
|
+
get_cached_user_uuid,
|
|
7
|
+
invalidate_cache,
|
|
8
|
+
resolve_identity,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"ResolvedIdentity",
|
|
13
|
+
"get_cached_identity",
|
|
14
|
+
"get_cached_user_uuid",
|
|
15
|
+
"invalidate_cache",
|
|
16
|
+
"resolve_identity",
|
|
17
|
+
]
|