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.
Files changed (486) hide show
  1. agentengine_sdk_python-0.7.0.dist-info/METADATA +181 -0
  2. agentengine_sdk_python-0.7.0.dist-info/RECORD +482 -0
  3. {agentengine_sdk_python-0.6.4.dist-info → agentengine_sdk_python-0.7.0.dist-info}/WHEEL +1 -1
  4. agentengine_sdk_python-0.7.0.dist-info/entry_points.txt +3 -0
  5. agentengine_sdk_python-0.7.0.dist-info/licenses/LICENSE +175 -0
  6. agentengine_sdk_python-0.7.0.dist-info/top_level.txt +2 -0
  7. ksadk/__init__.py +13 -0
  8. ksadk/__main__.py +4 -0
  9. ksadk/a2a/__init__.py +15 -0
  10. ksadk/a2a/card_builder.py +64 -0
  11. ksadk/a2a/client.py +309 -0
  12. ksadk/a2a/executor.py +201 -0
  13. ksadk/a2a/server.py +79 -0
  14. ksadk/agents/__init__.py +20 -0
  15. ksadk/agents/base.py +370 -0
  16. ksadk/agents/context.py +38 -0
  17. ksadk/agents/event.py +35 -0
  18. ksadk/agents/loop_agent.py +71 -0
  19. ksadk/agents/parallel_agent.py +109 -0
  20. ksadk/agents/runner_adapter.py +24 -0
  21. ksadk/agents/sequential_agent.py +34 -0
  22. ksadk/api/__init__.py +3 -0
  23. ksadk/api/client.py +2246 -0
  24. ksadk/builders/__init__.py +20 -0
  25. ksadk/builders/base.py +66 -0
  26. ksadk/builders/code_builder.py +1990 -0
  27. ksadk/builders/container_builder.py +786 -0
  28. ksadk/builders/framework_requirements.py +59 -0
  29. ksadk/builders/ks3_uploader.py +389 -0
  30. ksadk/builders/mcp_builder.py +476 -0
  31. ksadk/builders/requirements_utils.py +75 -0
  32. ksadk/cli/__init__.py +531 -0
  33. ksadk/cli/__main__.py +4 -0
  34. ksadk/cli/agent_ref.py +204 -0
  35. ksadk/cli/cmd_a2a.py +167 -0
  36. ksadk/cli/cmd_agent.py +201 -0
  37. ksadk/cli/cmd_build.py +270 -0
  38. ksadk/cli/cmd_completion.py +304 -0
  39. ksadk/cli/cmd_config.py +758 -0
  40. ksadk/cli/cmd_create.py +2304 -0
  41. ksadk/cli/cmd_dashboard.py +900 -0
  42. ksadk/cli/cmd_deploy.py +704 -0
  43. ksadk/cli/cmd_destroy.py +345 -0
  44. ksadk/cli/cmd_files.py +1227 -0
  45. ksadk/cli/cmd_hermes.py +1263 -0
  46. ksadk/cli/cmd_invoke.py +1503 -0
  47. ksadk/cli/cmd_launch.py +564 -0
  48. ksadk/cli/cmd_mcp.py +1179 -0
  49. ksadk/cli/cmd_model.py +302 -0
  50. ksadk/cli/cmd_openclaw.py +3922 -0
  51. ksadk/cli/cmd_run.py +239 -0
  52. ksadk/cli/cmd_status.py +588 -0
  53. ksadk/cli/cmd_version.py +522 -0
  54. ksadk/cli/cmd_web.py +288 -0
  55. ksadk/cli/deploy_utils.py +87 -0
  56. ksadk/cli/dry_run.py +214 -0
  57. ksadk/cli/env_options.py +82 -0
  58. ksadk/cli/error_utils.py +525 -0
  59. ksadk/cli/global_options.py +31 -0
  60. ksadk/cli/local_runtime.py +97 -0
  61. ksadk/cli/model_catalog.py +136 -0
  62. ksadk/cli/network_options.py +412 -0
  63. ksadk/cli/resource_common.py +621 -0
  64. ksadk/cli/storage.py +84 -0
  65. ksadk/cli/ui.py +431 -0
  66. ksadk/cli/workflow_common.py +552 -0
  67. ksadk/common/__init__.py +14 -0
  68. ksadk/common/aicp_env.py +128 -0
  69. ksadk/common/auth.py +190 -0
  70. ksadk/common/constants.py +84 -0
  71. ksadk/common/llm_utils.py +61 -0
  72. ksadk/configs/__init__.py +61 -0
  73. ksadk/configs/env_registry.py +343 -0
  74. ksadk/configs/global_config.py +200 -0
  75. ksadk/configs/settings.py +706 -0
  76. ksadk/conversations/__init__.py +95 -0
  77. ksadk/conversations/attachment_storage.py +379 -0
  78. ksadk/conversations/attachments.py +774 -0
  79. ksadk/conversations/compaction_pipeline.py +387 -0
  80. ksadk/conversations/compaction_prompt.py +128 -0
  81. ksadk/conversations/context.py +303 -0
  82. ksadk/conversations/message_projection.py +269 -0
  83. ksadk/conversations/model_context.py +370 -0
  84. ksadk/conversations/model_options.py +136 -0
  85. ksadk/conversations/normalize.py +446 -0
  86. ksadk/conversations/reasoning_markup.py +91 -0
  87. ksadk/conversations/run_kinds.py +61 -0
  88. ksadk/conversations/run_status.py +53 -0
  89. ksadk/conversations/runtime.py +5276 -0
  90. ksadk/conversations/semantic_summary.py +359 -0
  91. ksadk/conversations/session_title.py +254 -0
  92. ksadk/deployment/__init__.py +83 -0
  93. ksadk/deployment/agent_access.py +226 -0
  94. ksadk/deployment/base.py +229 -0
  95. ksadk/deployment/manager.py +332 -0
  96. ksadk/deployment/providers/__init__.py +10 -0
  97. ksadk/deployment/providers/serverless.py +1115 -0
  98. ksadk/deployment/registry.py +120 -0
  99. ksadk/deployment/state.py +78 -0
  100. ksadk/deployment/ui_config.py +21 -0
  101. ksadk/detection/__init__.py +7 -0
  102. ksadk/detection/detector.py +431 -0
  103. ksadk/detection/mcp_detector.py +250 -0
  104. ksadk/hermes_terminal.py +467 -0
  105. ksadk/identity/__init__.py +17 -0
  106. ksadk/identity/resolver.py +385 -0
  107. ksadk/knowledge_base/__init__.py +62 -0
  108. ksadk/knowledge_base/adk_tool.py +47 -0
  109. ksadk/knowledge_base/client.py +297 -0
  110. ksadk/knowledge_base/langchain_tool.py +55 -0
  111. ksadk/knowledge_base/service.py +66 -0
  112. ksadk/knowledge_base/tool.py +50 -0
  113. ksadk/markdown.py +169 -0
  114. ksadk/mcp_runtime/__init__.py +231 -0
  115. ksadk/memory/__init__.py +57 -0
  116. ksadk/memory/adk/__init__.py +51 -0
  117. ksadk/memory/adk/backends/__init__.py +5 -0
  118. ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
  119. ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
  120. ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
  121. ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
  122. ksadk/memory/adk/long_term_memory.py +273 -0
  123. ksadk/memory/adk/resilient_session_service.py +268 -0
  124. ksadk/memory/adk/short_term_memory.py +304 -0
  125. ksadk/memory/adk_tool.py +31 -0
  126. ksadk/memory/backends/__init__.py +6 -0
  127. ksadk/memory/backends/base.py +103 -0
  128. ksadk/memory/backends/memory.py +112 -0
  129. ksadk/memory/backends/redis.py +146 -0
  130. ksadk/memory/langchain_tool.py +39 -0
  131. ksadk/memory/ltm_backend_factory.py +24 -0
  132. ksadk/memory/manager.py +215 -0
  133. ksadk/memory/service.py +172 -0
  134. ksadk/memory/tool.py +96 -0
  135. ksadk/model_policy.py +223 -0
  136. ksadk/openclaw_gateway.py +378 -0
  137. ksadk/runners/__init__.py +8 -0
  138. ksadk/runners/adk_runner.py +1994 -0
  139. ksadk/runners/base_runner.py +305 -0
  140. ksadk/runners/deepagents_runner.py +13 -0
  141. ksadk/runners/factory.py +73 -0
  142. ksadk/runners/langchain_runner.py +751 -0
  143. ksadk/runners/langgraph_runner.py +985 -0
  144. ksadk/runners/patch_langchain.py +187 -0
  145. ksadk/runners/remote_runner.py +792 -0
  146. ksadk/runners/usage_accumulator.py +38 -0
  147. ksadk/runners/utils/__init__.py +19 -0
  148. ksadk/runners/utils/langfuse.py +230 -0
  149. ksadk/runners/utils/loader.py +62 -0
  150. ksadk/runtime_context.py +166 -0
  151. ksadk/runtime_state.py +25 -0
  152. ksadk/sandbox/__init__.py +28 -0
  153. ksadk/sandbox/backends/__init__.py +9 -0
  154. ksadk/sandbox/backends/e2b.py +154 -0
  155. ksadk/sandbox/backends/local_process.py +131 -0
  156. ksadk/sandbox/base.py +101 -0
  157. ksadk/sandbox/factory.py +53 -0
  158. ksadk/sandbox/registry.py +187 -0
  159. ksadk/server/__init__.py +7 -0
  160. ksadk/server/api_models.py +73 -0
  161. ksadk/server/app.py +3931 -0
  162. ksadk/server/static/assets/ArtifactsPanel-D-SSn2ee.js +1 -0
  163. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +9 -0
  164. ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  165. ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  166. ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  167. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  168. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  169. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  170. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  171. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  172. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  173. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  174. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  175. ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  176. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  177. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  178. ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  179. ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  180. ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  181. ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  182. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  183. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  184. ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  185. ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  186. ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  187. ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  188. ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  189. ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  190. ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  191. ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  192. ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  193. ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  194. ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  195. ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  196. ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  197. ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  198. ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  199. ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  200. ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  201. ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  202. ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  203. ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  204. ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  205. ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  206. ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  207. ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  208. ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  209. ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  210. ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  211. ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  212. ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  213. ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  214. ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  215. ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  216. ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  217. ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  218. ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  219. ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  220. ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  221. ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  222. ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +8 -0
  224. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
  225. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +303 -0
  226. ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
  227. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +1 -0
  228. ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
  229. ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
  230. ksadk/server/static/assets/arc-BA13sHc9.js +1 -0
  231. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +1 -0
  232. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-DzJzgVoL.js +36 -0
  233. ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
  234. ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
  235. ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
  236. ksadk/server/static/assets/blockDiagram-GPEHLZMM-UTdVcZhn.js +132 -0
  237. ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
  238. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dix0GD4m.js +10 -0
  239. ksadk/server/static/assets/channel-CTuydARX.js +1 -0
  240. ksadk/server/static/assets/chunk-2J33WTMH-C2JxuZ42.js +1 -0
  241. ksadk/server/static/assets/chunk-4BX2VUAB-Be57QPgD.js +1 -0
  242. ksadk/server/static/assets/chunk-55IACEB6-WjSuy4nv.js +1 -0
  243. ksadk/server/static/assets/chunk-727SXJPM-BOovP-b5.js +206 -0
  244. ksadk/server/static/assets/chunk-AQP2D5EJ-DOmZNmWj.js +231 -0
  245. ksadk/server/static/assets/chunk-FMBD7UC4-DzwlodkU.js +15 -0
  246. ksadk/server/static/assets/chunk-ND2GUHAM-DMqAikEU.js +1 -0
  247. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +1 -0
  248. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +1 -0
  249. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +1 -0
  250. ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
  251. ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
  252. ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
  253. ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
  254. ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
  255. ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
  256. ksadk/server/static/assets/cose-bilkent-S5V4N54A-Zhy2GBnP.js +1 -0
  257. ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
  258. ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
  259. ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
  260. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
  261. ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
  262. ksadk/server/static/assets/dagre-BM42HDAG-CbKrtIUz.js +4 -0
  263. ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
  264. ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
  265. ksadk/server/static/assets/diagram-2AECGRRQ-BRApgQRK.js +43 -0
  266. ksadk/server/static/assets/diagram-5GNKFQAL-D0xbnDiK.js +10 -0
  267. ksadk/server/static/assets/diagram-KO2AKTUF-CVugVI9L.js +3 -0
  268. ksadk/server/static/assets/diagram-LMA3HP47-DozUGgee.js +24 -0
  269. ksadk/server/static/assets/diagram-OG6HWLK6-ZOYsKlru.js +24 -0
  270. ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
  271. ksadk/server/static/assets/dist-2hInLS_J.js +9 -0
  272. ksadk/server/static/assets/dist-8EEyGgDx.js +1 -0
  273. ksadk/server/static/assets/dist-8_SfK1IP.js +1 -0
  274. ksadk/server/static/assets/dist-B0NP_Z0z.js +23 -0
  275. ksadk/server/static/assets/dist-BIJVDMuB.js +1 -0
  276. ksadk/server/static/assets/dist-BmlMPsCc.js +2 -0
  277. ksadk/server/static/assets/dist-BrCcQ47T.js +1 -0
  278. ksadk/server/static/assets/dist-BssVmjIo.js +6 -0
  279. ksadk/server/static/assets/dist-C3HIIaN5.js +1 -0
  280. ksadk/server/static/assets/dist-CPBtqRTW.js +1 -0
  281. ksadk/server/static/assets/dist-CkEKJFtk.js +1 -0
  282. ksadk/server/static/assets/dist-D-JMdWPQ.js +1 -0
  283. ksadk/server/static/assets/dist-D-xOD048.js +1 -0
  284. ksadk/server/static/assets/dist-D57wnGWd.js +1 -0
  285. ksadk/server/static/assets/dist-DL_NKc_z.js +1 -0
  286. ksadk/server/static/assets/dist-DMezvBGJ.js +1 -0
  287. ksadk/server/static/assets/dist-DmFaq_Iy.js +1 -0
  288. ksadk/server/static/assets/dist-Dp0k7bWI.js +1 -0
  289. ksadk/server/static/assets/dist-DpKtt4Bo.js +1 -0
  290. ksadk/server/static/assets/dist-DyOkZmze.js +11 -0
  291. ksadk/server/static/assets/dist-DyWsb78Q.js +1 -0
  292. ksadk/server/static/assets/dist-gX6GOLKq.js +1 -0
  293. ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
  294. ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
  295. ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
  296. ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
  297. ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
  298. ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
  299. ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
  300. ksadk/server/static/assets/erDiagram-TEJ5UH35-Bk-9bgE5.js +85 -0
  301. ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
  302. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +1 -0
  303. ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
  304. ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
  305. ksadk/server/static/assets/flowDiagram-I6XJVG4X-Dn9kZVuZ.js +162 -0
  306. ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
  307. ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
  308. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BGxXlJqm.js +292 -0
  309. ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
  310. ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
  311. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +1 -0
  312. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-C7Q0X-wi.js +106 -0
  313. ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
  314. ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
  315. ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
  316. ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
  317. ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
  318. ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
  319. ksadk/server/static/assets/index-C00Lwg3L.js +165 -0
  320. ksadk/server/static/assets/index-DAURbCsP.css +1 -0
  321. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +1 -0
  322. ksadk/server/static/assets/infoDiagram-5YYISTIA-BO_CSqq5.js +2 -0
  323. ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
  324. ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-eYLPLd46.js +70 -0
  325. ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
  326. ksadk/server/static/assets/journeyDiagram-JHISSGLW-De9geSb0.js +139 -0
  327. ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
  328. ksadk/server/static/assets/kanban-definition-UN3LZRKU-Cs80kQto.js +89 -0
  329. ksadk/server/static/assets/katex-DSrCFD8n.js +265 -0
  330. ksadk/server/static/assets/linear-CN9sbKTF.js +1 -0
  331. ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
  332. ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
  333. ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
  334. ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
  335. ksadk/server/static/assets/mermaid-parser.core-DlgSBU8l.js +161 -0
  336. ksadk/server/static/assets/mindmap-definition-RKZ34NQL-9afz7Oug.js +96 -0
  337. ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
  338. ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
  339. ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
  340. ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
  341. ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
  342. ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
  343. ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
  344. ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
  345. ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
  346. ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
  347. ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
  348. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +1 -0
  349. ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
  350. ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
  351. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +1 -0
  352. ksadk/server/static/assets/pieDiagram-4H26LBE5-DPv_VstN.js +30 -0
  353. ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
  354. ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
  355. ksadk/server/static/assets/properties-C357ku5U.js +1 -0
  356. ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
  357. ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
  358. ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
  359. ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
  360. ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
  361. ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-o77wZ1XK.js +7 -0
  362. ksadk/server/static/assets/r-DADKenSm.js +1 -0
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +1 -0
  364. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-BYVw81VC.js +84 -0
  365. ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
  366. ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
  367. ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-B7nZFMKT.js +40 -0
  368. ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
  369. ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
  370. ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-BGRRrFw5.js +162 -0
  371. ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
  372. ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
  373. ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
  374. ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
  375. ksadk/server/static/assets/solr-BBopId9w.js +1 -0
  376. ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
  377. ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
  378. ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
  379. ksadk/server/static/assets/stateDiagram-AJRCARHV-BUfHCoPs.js +1 -0
  380. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +1 -0
  381. ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
  382. ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
  383. ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
  384. ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
  385. ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
  386. ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
  387. ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
  388. ksadk/server/static/assets/timeline-definition-PNZ67QCA-FbCTGrf9.js +120 -0
  389. ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
  390. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +1 -0
  391. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +1 -0
  392. ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
  393. ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
  394. ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
  395. ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
  396. ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
  397. ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
  398. ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
  399. ksadk/server/static/assets/vennDiagram-CIIHVFJN-DWgwtPsJ.js +34 -0
  400. ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
  401. ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
  402. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +1 -0
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-2x8G-tTM.js +78 -0
  404. ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
  405. ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
  406. ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
  407. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-Drma3AYl.js +7 -0
  408. ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
  409. ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
  410. ksadk/server/static/favicon.svg +1 -0
  411. ksadk/server/static/icons.svg +24 -0
  412. ksadk/server/static/index.html +14 -0
  413. ksadk/server/terminal_sessions.py +551 -0
  414. ksadk/sessions/__init__.py +279 -0
  415. ksadk/sessions/base.py +354 -0
  416. ksadk/sessions/continuity.py +337 -0
  417. ksadk/sessions/errors.py +7 -0
  418. ksadk/sessions/in_memory.py +273 -0
  419. ksadk/sessions/local_service.py +949 -0
  420. ksadk/sessions/postgres_service.py +901 -0
  421. ksadk/sessions/resilience.py +52 -0
  422. ksadk/sessions/resilient.py +360 -0
  423. ksadk/sessions/sqlite_service.py +13 -0
  424. ksadk/skills/__init__.py +9 -0
  425. ksadk/skills/loader.py +46 -0
  426. ksadk/skills/models.py +120 -0
  427. ksadk/skills/package_store.py +104 -0
  428. ksadk/skills/runtime/__init__.py +17 -0
  429. ksadk/skills/runtime/agent.py +183 -0
  430. ksadk/skills/runtime/artifacts.py +39 -0
  431. ksadk/skills/runtime/backends/__init__.py +1 -0
  432. ksadk/skills/runtime/backends/disabled.py +8 -0
  433. ksadk/skills/runtime/backends/e2b.py +168 -0
  434. ksadk/skills/runtime/backends/local.py +95 -0
  435. ksadk/skills/runtime/base.py +103 -0
  436. ksadk/skills/runtime/executor.py +219 -0
  437. ksadk/skills/runtime/factory.py +37 -0
  438. ksadk/skills/runtime/loader.py +131 -0
  439. ksadk/skills/runtime/registry.py +150 -0
  440. ksadk/skills/runtime/request.py +67 -0
  441. ksadk/skills/service_client.py +239 -0
  442. ksadk/skills/service_env.py +58 -0
  443. ksadk/skills/tool_defs.py +221 -0
  444. ksadk/terminal_client.py +69 -0
  445. ksadk/terminal_exec_policy.py +229 -0
  446. ksadk/tools/__init__.py +17 -0
  447. ksadk/tools/gateway.py +230 -0
  448. ksadk/tools/result_budget.py +154 -0
  449. ksadk/toolsets/__init__.py +854 -0
  450. ksadk/toolsets/_langchain.py +11 -0
  451. ksadk/toolsets/platform.py +93 -0
  452. ksadk/toolsets/sandbox.py +310 -0
  453. ksadk/toolsets/skills.py +217 -0
  454. ksadk/toolsets/web.py +266 -0
  455. ksadk/toolsets/workspace.py +917 -0
  456. ksadk/toolsets/workspace_state.py +44 -0
  457. ksadk/tracing/__init__.py +37 -0
  458. ksadk/tracing/exporters/__init__.py +1 -0
  459. ksadk/tracing/exporters/inmemory_exporter.py +116 -0
  460. ksadk/tracing/exporters/langfuse_exporter.py +445 -0
  461. ksadk/tracing/setup.py +892 -0
  462. ksadk/tracing/span_utils.py +114 -0
  463. ksadk/tui/__init__.py +27 -0
  464. ksadk/tui/loop.py +1877 -0
  465. ksadk/tui/stream_render.py +68 -0
  466. ksadk/ui_config.py +168 -0
  467. ksadk/version.py +4 -0
  468. ksadk_runtime_common/__init__.py +20 -0
  469. ksadk_runtime_common/memory_backend/__init__.py +29 -0
  470. ksadk_runtime_common/memory_backend/manifest.py +79 -0
  471. ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
  472. ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
  473. ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
  474. ksadk_runtime_common/memory_backend/registry.py +56 -0
  475. ksadk_runtime_common/memory_backend/render.py +71 -0
  476. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
  477. ksadk_runtime_common/workspace_files/__init__.py +29 -0
  478. ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
  479. ksadk_runtime_common/workspace_files/constants.py +9 -0
  480. ksadk_runtime_common/workspace_files/path_utils.py +71 -0
  481. ksadk_runtime_common/workspace_files/preview.py +96 -0
  482. ksadk_runtime_common/workspace_files/router.py +254 -0
  483. agentengine_sdk_python/__init__.py +0 -3
  484. agentengine_sdk_python-0.6.4.dist-info/METADATA +0 -48
  485. agentengine_sdk_python-0.6.4.dist-info/RECORD +0 -5
  486. agentengine_sdk_python-0.6.4.dist-info/top_level.txt +0 -1
@@ -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
+ ]