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.
Files changed (490) hide show
  1. agentengine_sdk_python-0.6.9.dist-info/METADATA +179 -0
  2. agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
  3. {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
  4. agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
  5. agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
  6. agentengine_sdk_python-0.6.9.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 +2227 -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 +2277 -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 +1259 -0
  46. ksadk/cli/cmd_invoke.py +1336 -0
  47. ksadk/cli/cmd_launch.py +564 -0
  48. ksadk/cli/cmd_mcp.py +1174 -0
  49. ksadk/cli/cmd_model.py +302 -0
  50. ksadk/cli/cmd_openclaw.py +3918 -0
  51. ksadk/cli/cmd_run.py +232 -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 +410 -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 +342 -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/model_context.py +360 -0
  83. ksadk/conversations/model_options.py +136 -0
  84. ksadk/conversations/normalize.py +446 -0
  85. ksadk/conversations/reasoning_markup.py +91 -0
  86. ksadk/conversations/run_kinds.py +61 -0
  87. ksadk/conversations/run_status.py +53 -0
  88. ksadk/conversations/runtime.py +5208 -0
  89. ksadk/conversations/semantic_summary.py +359 -0
  90. ksadk/conversations/session_title.py +254 -0
  91. ksadk/deployment/__init__.py +83 -0
  92. ksadk/deployment/agent_access.py +226 -0
  93. ksadk/deployment/base.py +229 -0
  94. ksadk/deployment/manager.py +332 -0
  95. ksadk/deployment/providers/__init__.py +10 -0
  96. ksadk/deployment/providers/serverless.py +1105 -0
  97. ksadk/deployment/registry.py +120 -0
  98. ksadk/deployment/state.py +78 -0
  99. ksadk/deployment/ui_config.py +21 -0
  100. ksadk/detection/__init__.py +7 -0
  101. ksadk/detection/detector.py +431 -0
  102. ksadk/detection/mcp_detector.py +250 -0
  103. ksadk/hermes_terminal.py +467 -0
  104. ksadk/identity/__init__.py +17 -0
  105. ksadk/identity/resolver.py +385 -0
  106. ksadk/knowledge_base/__init__.py +62 -0
  107. ksadk/knowledge_base/adk_tool.py +47 -0
  108. ksadk/knowledge_base/client.py +297 -0
  109. ksadk/knowledge_base/langchain_tool.py +55 -0
  110. ksadk/knowledge_base/service.py +66 -0
  111. ksadk/knowledge_base/tool.py +50 -0
  112. ksadk/markdown.py +169 -0
  113. ksadk/mcp_runtime/__init__.py +231 -0
  114. ksadk/memory/__init__.py +57 -0
  115. ksadk/memory/adk/__init__.py +51 -0
  116. ksadk/memory/adk/backends/__init__.py +5 -0
  117. ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
  118. ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
  119. ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
  120. ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
  121. ksadk/memory/adk/long_term_memory.py +273 -0
  122. ksadk/memory/adk/short_term_memory.py +289 -0
  123. ksadk/memory/adk_tool.py +31 -0
  124. ksadk/memory/backends/__init__.py +6 -0
  125. ksadk/memory/backends/base.py +103 -0
  126. ksadk/memory/backends/memory.py +112 -0
  127. ksadk/memory/backends/redis.py +146 -0
  128. ksadk/memory/langchain_tool.py +39 -0
  129. ksadk/memory/ltm_backend_factory.py +24 -0
  130. ksadk/memory/manager.py +215 -0
  131. ksadk/memory/service.py +172 -0
  132. ksadk/memory/tool.py +96 -0
  133. ksadk/model_policy.py +223 -0
  134. ksadk/openclaw_gateway.py +378 -0
  135. ksadk/runners/__init__.py +8 -0
  136. ksadk/runners/adk_runner.py +1135 -0
  137. ksadk/runners/base_runner.py +305 -0
  138. ksadk/runners/deepagents_runner.py +13 -0
  139. ksadk/runners/factory.py +73 -0
  140. ksadk/runners/langchain_runner.py +539 -0
  141. ksadk/runners/langgraph_runner.py +852 -0
  142. ksadk/runners/patch_langchain.py +187 -0
  143. ksadk/runners/remote_runner.py +667 -0
  144. ksadk/runners/usage_accumulator.py +38 -0
  145. ksadk/runners/utils/__init__.py +19 -0
  146. ksadk/runners/utils/langfuse.py +230 -0
  147. ksadk/runners/utils/loader.py +62 -0
  148. ksadk/runtime_context.py +166 -0
  149. ksadk/runtime_state.py +25 -0
  150. ksadk/sandbox/__init__.py +28 -0
  151. ksadk/sandbox/backends/__init__.py +9 -0
  152. ksadk/sandbox/backends/e2b.py +154 -0
  153. ksadk/sandbox/backends/local_process.py +131 -0
  154. ksadk/sandbox/base.py +101 -0
  155. ksadk/sandbox/factory.py +53 -0
  156. ksadk/sandbox/registry.py +187 -0
  157. ksadk/server/__init__.py +7 -0
  158. ksadk/server/api_models.py +73 -0
  159. ksadk/server/app.py +3789 -0
  160. ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
  161. ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
  162. ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  163. ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  164. ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  165. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  166. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  167. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  168. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  169. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  170. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  171. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  172. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  173. ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  174. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  175. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  176. ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  177. ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  178. ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  179. ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  180. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  181. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  182. ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  183. ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  184. ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  185. ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  186. ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  187. ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  188. ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  189. ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  190. ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  191. ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  192. ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  193. ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  194. ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  195. ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  196. ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  197. ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  198. ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  199. ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  200. ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  201. ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  202. ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  203. ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  204. ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  205. ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  206. ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  207. ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  208. ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  209. ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  210. ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  211. ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  212. ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  213. ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  214. ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  215. ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  216. ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  217. ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  218. ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  219. ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  220. ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  221. ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
  222. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
  223. ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
  224. ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
  226. ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
  227. ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
  228. ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
  229. ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
  230. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
  231. ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
  232. ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
  233. ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
  234. ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
  235. ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
  236. ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
  237. ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
  238. ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
  239. ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
  240. ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
  241. ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
  242. ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
  243. ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
  244. ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
  245. ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
  246. ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
  247. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
  248. ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
  249. ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
  250. ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
  251. ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
  252. ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
  253. ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
  254. ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
  255. ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
  256. ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
  257. ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
  258. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
  259. ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
  260. ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
  261. ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
  262. ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
  263. ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
  264. ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
  265. ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
  266. ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
  267. ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
  268. ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
  269. ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
  270. ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
  271. ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
  272. ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
  273. ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
  274. ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
  275. ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
  276. ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
  277. ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
  278. ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
  279. ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
  280. ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
  281. ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
  282. ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
  283. ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
  284. ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
  285. ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
  286. ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
  287. ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
  288. ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
  289. ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
  290. ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
  291. ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
  292. ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
  293. ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
  294. ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
  295. ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
  296. ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
  297. ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
  298. ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
  299. ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
  300. ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
  301. ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
  302. ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
  303. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
  304. ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
  305. ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
  306. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
  307. ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
  308. ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
  309. ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
  310. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
  311. ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
  312. ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
  313. ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
  314. ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
  315. ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
  316. ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
  317. ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
  318. ksadk/server/static/assets/index-DAURbCsP.css +1 -0
  319. ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
  320. ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
  321. ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
  322. ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
  323. ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
  324. ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
  325. ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
  326. ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
  327. ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
  328. ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
  329. ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
  330. ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
  331. ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
  332. ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
  333. ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
  334. ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
  335. ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
  336. ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
  337. ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
  338. ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
  339. ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
  340. ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
  341. ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
  342. ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
  343. ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
  344. ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
  345. ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
  346. ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
  347. ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
  348. ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
  349. ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
  350. ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
  351. ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
  352. ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
  353. ksadk/server/static/assets/properties-C357ku5U.js +1 -0
  354. ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
  355. ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
  356. ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
  357. ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
  358. ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
  359. ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
  360. ksadk/server/static/assets/r-DADKenSm.js +1 -0
  361. ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
  362. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
  363. ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
  364. ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
  365. ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
  366. ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
  367. ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
  368. ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
  369. ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
  370. ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
  371. ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
  372. ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
  373. ksadk/server/static/assets/solr-BBopId9w.js +1 -0
  374. ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
  375. ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
  376. ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
  377. ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
  378. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
  379. ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
  380. ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
  381. ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
  382. ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
  383. ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
  384. ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
  385. ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
  386. ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
  387. ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
  388. ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
  389. ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
  390. ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
  391. ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
  392. ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
  393. ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
  394. ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
  395. ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
  396. ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
  397. ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
  398. ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
  399. ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
  400. ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
  401. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
  402. ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
  403. ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
  404. ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
  405. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
  406. ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
  407. ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
  408. ksadk/server/static/favicon.svg +1 -0
  409. ksadk/server/static/icons.svg +24 -0
  410. ksadk/server/static/index.html +14 -0
  411. ksadk/server/terminal_sessions.py +551 -0
  412. ksadk/sessions/__init__.py +283 -0
  413. ksadk/sessions/base.py +354 -0
  414. ksadk/sessions/continuity.py +313 -0
  415. ksadk/sessions/errors.py +7 -0
  416. ksadk/sessions/in_memory.py +273 -0
  417. ksadk/sessions/local_service.py +949 -0
  418. ksadk/sessions/postgres_service.py +838 -0
  419. ksadk/sessions/sqlite_service.py +13 -0
  420. ksadk/skills/__init__.py +9 -0
  421. ksadk/skills/loader.py +46 -0
  422. ksadk/skills/models.py +120 -0
  423. ksadk/skills/package_store.py +104 -0
  424. ksadk/skills/runtime/__init__.py +17 -0
  425. ksadk/skills/runtime/agent.py +183 -0
  426. ksadk/skills/runtime/artifacts.py +39 -0
  427. ksadk/skills/runtime/backends/__init__.py +1 -0
  428. ksadk/skills/runtime/backends/disabled.py +8 -0
  429. ksadk/skills/runtime/backends/e2b.py +168 -0
  430. ksadk/skills/runtime/backends/local.py +95 -0
  431. ksadk/skills/runtime/base.py +103 -0
  432. ksadk/skills/runtime/executor.py +219 -0
  433. ksadk/skills/runtime/factory.py +37 -0
  434. ksadk/skills/runtime/loader.py +131 -0
  435. ksadk/skills/runtime/registry.py +150 -0
  436. ksadk/skills/runtime/request.py +67 -0
  437. ksadk/skills/service_client.py +239 -0
  438. ksadk/skills/service_env.py +58 -0
  439. ksadk/skills/tool_defs.py +221 -0
  440. ksadk/terminal_client.py +69 -0
  441. ksadk/terminal_exec_policy.py +229 -0
  442. ksadk/tools/__init__.py +17 -0
  443. ksadk/tools/gateway.py +230 -0
  444. ksadk/tools/result_budget.py +154 -0
  445. ksadk/toolsets/__init__.py +852 -0
  446. ksadk/toolsets/_langchain.py +11 -0
  447. ksadk/toolsets/platform.py +93 -0
  448. ksadk/toolsets/sandbox.py +310 -0
  449. ksadk/toolsets/skills.py +217 -0
  450. ksadk/toolsets/web.py +266 -0
  451. ksadk/toolsets/workspace.py +878 -0
  452. ksadk/toolsets/workspace_state.py +44 -0
  453. ksadk/tracing/__init__.py +37 -0
  454. ksadk/tracing/exporters/__init__.py +1 -0
  455. ksadk/tracing/exporters/inmemory_exporter.py +116 -0
  456. ksadk/tracing/exporters/langfuse_exporter.py +445 -0
  457. ksadk/tracing/setup.py +829 -0
  458. ksadk/tracing/span_utils.py +114 -0
  459. ksadk/tui/__init__.py +12 -0
  460. ksadk/tui/app.py +400 -0
  461. ksadk/tui/clipboard.py +100 -0
  462. ksadk/tui/widgets/__init__.py +22 -0
  463. ksadk/tui/widgets/assistant.py +89 -0
  464. ksadk/tui/widgets/base.py +54 -0
  465. ksadk/tui/widgets/chat_input.py +246 -0
  466. ksadk/tui/widgets/history.py +156 -0
  467. ksadk/tui/widgets/system.py +87 -0
  468. ksadk/tui/widgets/thinking.py +110 -0
  469. ksadk/tui/widgets/tool_call.py +161 -0
  470. ksadk/tui/widgets/user.py +37 -0
  471. ksadk/ui_config.py +168 -0
  472. ksadk/version.py +4 -0
  473. ksadk_runtime_common/__init__.py +20 -0
  474. ksadk_runtime_common/memory_backend/__init__.py +29 -0
  475. ksadk_runtime_common/memory_backend/manifest.py +79 -0
  476. ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
  477. ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
  478. ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
  479. ksadk_runtime_common/memory_backend/registry.py +56 -0
  480. ksadk_runtime_common/memory_backend/render.py +71 -0
  481. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
  482. ksadk_runtime_common/workspace_files/__init__.py +29 -0
  483. ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
  484. ksadk_runtime_common/workspace_files/constants.py +9 -0
  485. ksadk_runtime_common/workspace_files/path_utils.py +71 -0
  486. ksadk_runtime_common/workspace_files/preview.py +96 -0
  487. ksadk_runtime_common/workspace_files/router.py +254 -0
  488. agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
  489. agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
  490. agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
@@ -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
@@ -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
+ ]
@@ -0,0 +1,229 @@
1
+ """Shared remote terminal exec command policy."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import re
7
+ from collections.abc import Iterable, Sequence
8
+ from dataclasses import dataclass
9
+
10
+ SHELL_METACHARS = set("|&;<>()$`\\\n\r")
11
+ FORBIDDEN_LAUNCHERS = {
12
+ "bash",
13
+ "sh",
14
+ "zsh",
15
+ "fish",
16
+ "python",
17
+ "python3",
18
+ "node",
19
+ "npx",
20
+ "pnpm",
21
+ "npm",
22
+ "yarn",
23
+ "uv",
24
+ "uvx",
25
+ "hermes",
26
+ }
27
+
28
+ TERMINAL_EXEC_ALLOWLIST_ENV = "KSADK_TERMINAL_EXEC_SUBCOMMAND_ALLOWLIST"
29
+
30
+ COMMON_REMOTE_EXEC_PREFIXES: tuple[tuple[str, ...], ...] = (
31
+ ("cat",),
32
+ ("date",),
33
+ ("df",),
34
+ ("du",),
35
+ ("find",),
36
+ ("git", "diff"),
37
+ ("git", "log"),
38
+ ("git", "rev-parse"),
39
+ ("git", "show"),
40
+ ("git", "status"),
41
+ ("head",),
42
+ ("id",),
43
+ ("ls",),
44
+ ("ps",),
45
+ ("pwd",),
46
+ ("stat",),
47
+ ("tail",),
48
+ ("uname",),
49
+ ("wc",),
50
+ ("whoami",),
51
+ )
52
+
53
+
54
+ @dataclass(frozen=True)
55
+ class TerminalExecPolicy:
56
+ name: str
57
+ default_exact: tuple[tuple[str, ...], ...] = ()
58
+ default_prefixes: tuple[tuple[str, ...], ...] = ()
59
+ default_bounded_prefixes: tuple[tuple[tuple[str, ...], int, int], ...] = ()
60
+ env_names: tuple[str, ...] = (TERMINAL_EXEC_ALLOWLIST_ENV,)
61
+
62
+
63
+ GENERIC_TERMINAL_EXEC_POLICY = TerminalExecPolicy(
64
+ name="terminal",
65
+ default_prefixes=COMMON_REMOTE_EXEC_PREFIXES,
66
+ )
67
+
68
+ HERMES_TERMINAL_EXEC_POLICY = TerminalExecPolicy(
69
+ name="Hermes",
70
+ default_exact=(
71
+ ("cron", "list"),
72
+ ("cron", "status"),
73
+ ("config", "check"),
74
+ ("config", "env-path"),
75
+ ("config", "path"),
76
+ ("config", "show"),
77
+ ("doctor",),
78
+ ("gateway", "status"),
79
+ ("insights",),
80
+ ("sessions", "list"),
81
+ ("skills", "audit"),
82
+ ("skills", "check"),
83
+ ("skills", "list"),
84
+ ("status",),
85
+ ("tools", "list"),
86
+ ("version",),
87
+ ),
88
+ default_bounded_prefixes=(
89
+ (("sessions", "export"), 3, 3),
90
+ (("sessions", "show"), 3, 3),
91
+ ),
92
+ )
93
+
94
+ OPENCLAW_TERMINAL_EXEC_POLICY = TerminalExecPolicy(
95
+ name="OpenClaw",
96
+ default_prefixes=(
97
+ *COMMON_REMOTE_EXEC_PREFIXES,
98
+ ("openclaw", "channels", "login"),
99
+ ),
100
+ )
101
+
102
+ _ALLOWLIST_ENTRY_SPLIT_RE = re.compile(r"[\n;,]+")
103
+ _ALLOWLIST_TOKEN_SPLIT_RE = re.compile(r"\s+")
104
+
105
+
106
+ def normalize_exec_argv(
107
+ argv: Iterable[str],
108
+ *,
109
+ policy_name: str = "terminal",
110
+ allow_shell_metachars: bool = False,
111
+ allow_forbidden_launchers: bool = False,
112
+ ) -> list[str]:
113
+ normalized = [str(item).strip() for item in argv]
114
+ if not normalized:
115
+ raise ValueError(f"{policy_name} exec requires argv")
116
+ for index, item in enumerate(normalized):
117
+ if not item:
118
+ raise ValueError(f"{policy_name} exec argv contains an empty argument")
119
+ if not allow_shell_metachars and any(char in SHELL_METACHARS for char in item):
120
+ raise ValueError(f"{policy_name} exec does not allow shell metacharacters: {item}")
121
+ if index == 0 and item.startswith("-"):
122
+ raise ValueError(f"{policy_name} exec command is invalid: {item}")
123
+ if not allow_forbidden_launchers and index == 0 and item in FORBIDDEN_LAUNCHERS:
124
+ raise ValueError(f"{policy_name} exec launcher is not allowed: {item}")
125
+ return normalized
126
+
127
+
128
+ def validate_terminal_exec_argv(
129
+ argv: Iterable[str],
130
+ *,
131
+ policy: TerminalExecPolicy = GENERIC_TERMINAL_EXEC_POLICY,
132
+ ) -> list[str]:
133
+ if _env_allowlist_all(policy.env_names):
134
+ return normalize_exec_argv(
135
+ argv,
136
+ policy_name=policy.name,
137
+ allow_shell_metachars=True,
138
+ allow_forbidden_launchers=True,
139
+ )
140
+
141
+ normalized = normalize_exec_argv(argv, policy_name=policy.name)
142
+ allowed_exact = tuple(tuple(item) for item in policy.default_exact)
143
+ allowed_prefixes = (
144
+ tuple(tuple(item) for item in policy.default_prefixes)
145
+ + _env_allowlist_prefixes(policy.env_names, policy_name=policy.name)
146
+ )
147
+
148
+ if _matches_exact_or_prefix(
149
+ normalized,
150
+ allowed_exact=allowed_exact,
151
+ allowed_prefixes=allowed_prefixes,
152
+ allowed_bounded_prefixes=policy.default_bounded_prefixes,
153
+ ):
154
+ return normalized
155
+ suggested_prefix = normalized[0]
156
+ raise ValueError(
157
+ f"{policy.name} exec subcommand is not allowed: {' '.join(normalized)}. "
158
+ f"Set {TERMINAL_EXEC_ALLOWLIST_ENV}='{suggested_prefix}' to allow this prefix, "
159
+ f"or {TERMINAL_EXEC_ALLOWLIST_ENV}='*' to allow all remote exec commands."
160
+ )
161
+
162
+
163
+ def _env_allowlist_prefixes(
164
+ env_names: Sequence[str],
165
+ *,
166
+ policy_name: str,
167
+ ) -> tuple[tuple[str, ...], ...]:
168
+ prefixes: list[tuple[str, ...]] = []
169
+ seen: set[tuple[str, ...]] = set()
170
+ for env_name in env_names:
171
+ for prefix in _parse_allowlist_prefixes(os.getenv(env_name), policy_name=policy_name):
172
+ if prefix not in seen:
173
+ prefixes.append(prefix)
174
+ seen.add(prefix)
175
+ return tuple(prefixes)
176
+
177
+
178
+ def _env_allowlist_all(env_names: Sequence[str]) -> bool:
179
+ for env_name in env_names:
180
+ raw = os.getenv(env_name)
181
+ if not raw:
182
+ continue
183
+ for entry in _ALLOWLIST_ENTRY_SPLIT_RE.split(raw):
184
+ if entry.strip() == "*":
185
+ return True
186
+ return False
187
+
188
+
189
+ def _parse_allowlist_prefixes(raw: str | None, *, policy_name: str) -> tuple[tuple[str, ...], ...]:
190
+ if not raw:
191
+ return ()
192
+ prefixes: list[tuple[str, ...]] = []
193
+ for entry in _ALLOWLIST_ENTRY_SPLIT_RE.split(raw):
194
+ entry = entry.strip()
195
+ if not entry:
196
+ continue
197
+ if entry == "*":
198
+ continue
199
+ tokens = tuple(token for token in _ALLOWLIST_TOKEN_SPLIT_RE.split(entry) if token)
200
+ normalize_exec_argv(tokens, policy_name=policy_name)
201
+ prefixes.append(tokens)
202
+ return tuple(prefixes)
203
+
204
+
205
+ def _matches_exact_or_prefix(
206
+ argv: Sequence[str],
207
+ *,
208
+ allowed_exact: Sequence[Sequence[str]],
209
+ allowed_prefixes: Sequence[Sequence[str]],
210
+ allowed_bounded_prefixes: Sequence[tuple[Sequence[str], int, int]],
211
+ ) -> bool:
212
+ argv_tuple = tuple(argv)
213
+ for item in allowed_exact:
214
+ if argv_tuple == tuple(item):
215
+ return True
216
+ for prefix in allowed_prefixes:
217
+ prefix_tuple = tuple(prefix)
218
+ if prefix_tuple and argv_tuple[: len(prefix_tuple)] == prefix_tuple:
219
+ return True
220
+ for prefix, min_len, max_len in allowed_bounded_prefixes:
221
+ prefix_tuple = tuple(prefix)
222
+ if (
223
+ prefix_tuple
224
+ and argv_tuple[: len(prefix_tuple)] == prefix_tuple
225
+ and len(argv_tuple) >= min_len
226
+ and len(argv_tuple) <= max_len
227
+ ):
228
+ return True
229
+ return False
@@ -0,0 +1,17 @@
1
+ from __future__ import annotations
2
+
3
+ from ksadk.tools.gateway import (
4
+ ToolGateway,
5
+ ToolPolicy,
6
+ approval_interrupt_info_from_result,
7
+ check_command_policy,
8
+ default_tool_gateway,
9
+ )
10
+
11
+ __all__ = [
12
+ "ToolGateway",
13
+ "ToolPolicy",
14
+ "approval_interrupt_info_from_result",
15
+ "check_command_policy",
16
+ "default_tool_gateway",
17
+ ]