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