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,525 @@
1
+ """CLI 异常分类、结构化错误输出与兼容提示。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass, field
6
+ import os
7
+ import re
8
+ import sys
9
+ from typing import Any, Optional, Sequence, Tuple
10
+
11
+ import click
12
+
13
+ from ksadk.cli.dry_run import is_global_dry_run_enabled
14
+ from ksadk.cli.ui import emit_json, is_json_output, print_error, print_info
15
+
16
+ _SERVER_API_ERROR_RE = re.compile(
17
+ r"Server API Error \(Code:\s*([^)]+)\):\s*(.+)",
18
+ re.IGNORECASE,
19
+ )
20
+
21
+ EXIT_CODE_USAGE = 2
22
+ EXIT_CODE_RESOLUTION = 3
23
+ EXIT_CODE_AUTH = 4
24
+ EXIT_CODE_VALIDATION = 5
25
+ EXIT_CODE_REMOTE = 6
26
+ EXIT_CODE_CANCELLED = 7
27
+
28
+
29
+ @dataclass
30
+ class CLIError(Exception):
31
+ """Structured CLI error with stable code and exit semantics."""
32
+
33
+ code: str
34
+ message: str
35
+ exit_code: int
36
+ hints: list[str] = field(default_factory=list)
37
+ details: dict[str, Any] = field(default_factory=dict)
38
+ context: str | None = None
39
+ show_help: bool = False
40
+ argv: list[str] = field(default_factory=list)
41
+
42
+ def __str__(self) -> str:
43
+ return self.message
44
+
45
+
46
+ def is_debug_mode_enabled() -> bool:
47
+ return os.getenv("AGENTENGINE_DEBUG", "").strip().lower() in {
48
+ "1",
49
+ "true",
50
+ "yes",
51
+ "on",
52
+ }
53
+
54
+
55
+ def parse_server_api_error(err: Exception | str) -> Tuple[Optional[int], str]:
56
+ if isinstance(err, BaseException):
57
+ try:
58
+ from ksadk.api import AgentEngineAPIError
59
+
60
+ if isinstance(err, AgentEngineAPIError):
61
+ return err.code, err.message
62
+ except Exception:
63
+ pass
64
+
65
+ text = str(err or "").strip()
66
+ match = _SERVER_API_ERROR_RE.search(text)
67
+ if not match:
68
+ if text:
69
+ return None, text
70
+ if isinstance(err, BaseException):
71
+ return None, err.__class__.__name__
72
+ return None, "Unknown error"
73
+
74
+ raw_code = match.group(1).strip()
75
+ msg = match.group(2).strip() or "Unknown API error"
76
+ try:
77
+ code = int(raw_code)
78
+ except ValueError:
79
+ code = None
80
+ return code, msg
81
+
82
+
83
+ def _extract_agentengine_error_details(err: Exception | str) -> dict[str, Any]:
84
+ if isinstance(err, BaseException):
85
+ try:
86
+ from ksadk.api import AgentEngineAPIError
87
+
88
+ if isinstance(err, AgentEngineAPIError):
89
+ return dict(getattr(err, "details", {}) or {})
90
+ except Exception:
91
+ pass
92
+ return {}
93
+
94
+
95
+ def _looks_like_missing_cloud_credentials(details: dict[str, Any], msg_lower: str) -> bool:
96
+ remote_code = str(details.get("remote_error_code") or "").strip().lower()
97
+ if remote_code in {"missingaccesskey", "missingsecretkey"}:
98
+ return True
99
+ markers = (
100
+ "missingaccesskey",
101
+ "missingsecretkey",
102
+ "access key is missing",
103
+ "secret key is missing",
104
+ )
105
+ return any(marker in msg_lower for marker in markers)
106
+
107
+
108
+ def _looks_like_invalid_cloud_credentials(details: dict[str, Any], msg_lower: str) -> bool:
109
+ remote_code = str(details.get("remote_error_code") or "").strip().lower()
110
+ if remote_code in {
111
+ "invalidaccesskey",
112
+ "invalidsignature",
113
+ "signaturedoesnotmatch",
114
+ "signaturemismatch",
115
+ "invalidclienttokenid",
116
+ "authfailure",
117
+ }:
118
+ return True
119
+ markers = (
120
+ "invalidaccesskey",
121
+ "invalidsignature",
122
+ "signaturedoesnotmatch",
123
+ "signature mismatch",
124
+ "access key id you provided does not exist",
125
+ "the security token included in the request is invalid",
126
+ "authfailure",
127
+ )
128
+ return any(marker in msg_lower for marker in markers)
129
+
130
+
131
+ def _looks_like_runtime_permission_error(details: dict[str, Any], msg_lower: str, code: int | None) -> bool:
132
+ remote_code = str(details.get("remote_error_code") or "").strip().lower()
133
+ if remote_code in {"accessdenied", "accessdeniedexception", "unauthorized", "unauthorizedoperation"}:
134
+ return True
135
+ if code in {401, 403} and (
136
+ ("权限" in msg_lower)
137
+ or ("permission" in msg_lower)
138
+ or ("access denied" in msg_lower)
139
+ or ("当前账号没有" in msg_lower)
140
+ or ("未授予" in msg_lower)
141
+ ):
142
+ return True
143
+ return False
144
+
145
+
146
+ def _credential_setup_hints() -> list[str]:
147
+ return [
148
+ "请检查当前 shell 或项目 `.env` 中是否设置了 `KSYUN_ACCESS_KEY` / `KSYUN_SECRET_KEY`(兼容 `KS3_ACCESS_KEY` / `KS3_SECRET_KEY`)。",
149
+ "先到 AgentEngine Runtime 控制台确认账号是否具备运行时权限: https://ksp.console.ksyun.com/#/agentEngineRuntime",
150
+ "如当前子账号没有权限,请到 IAM 授权页授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
151
+ "如果还没有金山云 AK/SK,请让主账号先到 IAM 控制台创建子账号并生成访问密钥: https://uc.console.ksyun.com/pro/iam/",
152
+ ]
153
+
154
+
155
+ def _invalid_credential_hints() -> list[str]:
156
+ return [
157
+ "请检查当前 shell 或项目 `.env` 中的 `KSYUN_ACCESS_KEY` / `KSYUN_SECRET_KEY` 是否填写正确,且没有多余空格。",
158
+ "确认该 AK/SK 未被禁用、删除或重置,并且属于当前要操作的金山云账号。",
159
+ "如需确认账号是否具备 AgentEngine Runtime 权限,可先查看: https://ksp.console.ksyun.com/#/agentEngineRuntime",
160
+ "如果凭证属于子账号但仍然被拒绝,请到 IAM 授权页检查授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
161
+ ]
162
+
163
+
164
+ def _runtime_permission_hints() -> list[str]:
165
+ return [
166
+ "请先到 AgentEngine Runtime 控制台确认当前账号是否具备运行时权限: https://ksp.console.ksyun.com/#/agentEngineRuntime",
167
+ "如当前子账号没有权限,请到 IAM 授权页授权: https://uc.console.ksyun.com/pro/iam/#/permission/authorize",
168
+ "如果还没有可用的金山云 AK/SK,请让主账号先到 IAM 控制台创建子账号并生成访问密钥: https://uc.console.ksyun.com/pro/iam/",
169
+ ]
170
+
171
+
172
+ def infer_help_command(argv: Optional[Sequence[str]] = None) -> str:
173
+ args = [a for a in (list(argv) if argv is not None else sys.argv[1:]) if a]
174
+ if args and not args[0].startswith("-"):
175
+ return f"agentengine {args[0]} --help"
176
+ return "agentengine --help"
177
+
178
+
179
+ def _matches_resource_not_found(msg_lower: str, args: Sequence[str], *, resource: str) -> bool:
180
+ if "not found" not in msg_lower:
181
+ return False
182
+ if resource in msg_lower:
183
+ return True
184
+ if not args:
185
+ return False
186
+ if resource == "agent":
187
+ return args[0] in {"agent", "status", "invoke", "delete", "dashboard", "version"}
188
+ return args[0] == resource
189
+
190
+
191
+ def explain_exception(err: Exception, argv: Optional[Sequence[str]] = None) -> Tuple[str, list[str]]:
192
+ cli_error = cli_error_from_exception(err, argv=argv)
193
+ return cli_error.message, cli_error.hints
194
+
195
+
196
+ def usage_error(
197
+ message: str,
198
+ *,
199
+ hints: Sequence[str] | None = None,
200
+ details: dict[str, Any] | None = None,
201
+ context: str | None = None,
202
+ show_help: bool = False,
203
+ argv: Sequence[str] | None = None,
204
+ ) -> CLIError:
205
+ return CLIError(
206
+ code="usage_error",
207
+ message=message,
208
+ exit_code=EXIT_CODE_USAGE,
209
+ hints=list(hints or []),
210
+ details=dict(details or {}),
211
+ context=context,
212
+ show_help=show_help,
213
+ argv=list(argv or []),
214
+ )
215
+
216
+
217
+ def resolution_error(
218
+ message: str,
219
+ *,
220
+ hints: Sequence[str] | None = None,
221
+ details: dict[str, Any] | None = None,
222
+ context: str | None = None,
223
+ show_help: bool = False,
224
+ argv: Sequence[str] | None = None,
225
+ ) -> CLIError:
226
+ return CLIError(
227
+ code="resolution_error",
228
+ message=message,
229
+ exit_code=EXIT_CODE_RESOLUTION,
230
+ hints=list(hints or []),
231
+ details=dict(details or {}),
232
+ context=context,
233
+ show_help=show_help,
234
+ argv=list(argv or []),
235
+ )
236
+
237
+
238
+ def auth_error(
239
+ message: str = "鉴权失败。",
240
+ *,
241
+ hints: Sequence[str] | None = None,
242
+ details: dict[str, Any] | None = None,
243
+ context: str | None = None,
244
+ argv: Sequence[str] | None = None,
245
+ ) -> CLIError:
246
+ return CLIError(
247
+ code="auth_error",
248
+ message=message,
249
+ exit_code=EXIT_CODE_AUTH,
250
+ hints=list(
251
+ hints
252
+ or [
253
+ "请检查 KSYUN_ACCESS_KEY / KSYUN_SECRET_KEY 是否正确。",
254
+ "如使用子账号,请确认已授予对应接口权限。",
255
+ ]
256
+ ),
257
+ details=dict(details or {}),
258
+ context=context,
259
+ argv=list(argv or []),
260
+ )
261
+
262
+
263
+ def validation_error(
264
+ message: str,
265
+ *,
266
+ hints: Sequence[str] | None = None,
267
+ details: dict[str, Any] | None = None,
268
+ context: str | None = None,
269
+ argv: Sequence[str] | None = None,
270
+ ) -> CLIError:
271
+ return CLIError(
272
+ code="validation_error",
273
+ message=message,
274
+ exit_code=EXIT_CODE_VALIDATION,
275
+ hints=list(hints or []),
276
+ details=dict(details or {}),
277
+ context=context,
278
+ argv=list(argv or []),
279
+ )
280
+
281
+
282
+ def remote_error(
283
+ message: str,
284
+ *,
285
+ hints: Sequence[str] | None = None,
286
+ details: dict[str, Any] | None = None,
287
+ context: str | None = None,
288
+ argv: Sequence[str] | None = None,
289
+ ) -> CLIError:
290
+ return CLIError(
291
+ code="remote_error",
292
+ message=message,
293
+ exit_code=EXIT_CODE_REMOTE,
294
+ hints=list(hints or []),
295
+ details=dict(details or {}),
296
+ context=context,
297
+ argv=list(argv or []),
298
+ )
299
+
300
+
301
+ def cancelled_error(
302
+ message: str = "已取消。",
303
+ *,
304
+ hints: Sequence[str] | None = None,
305
+ details: dict[str, Any] | None = None,
306
+ context: str | None = None,
307
+ argv: Sequence[str] | None = None,
308
+ ) -> CLIError:
309
+ return CLIError(
310
+ code="cancelled",
311
+ message=message,
312
+ exit_code=EXIT_CODE_CANCELLED,
313
+ hints=list(hints or []),
314
+ details=dict(details or {}),
315
+ context=context,
316
+ argv=list(argv or []),
317
+ )
318
+
319
+
320
+ def unsupported_json_output_error(command: str, *, suggestion: str | None = None) -> CLIError:
321
+ hints = [suggestion] if suggestion else []
322
+ return usage_error(
323
+ f"`{command}` 暂不支持 `--output json`。",
324
+ hints=hints,
325
+ details={"command": command, "output": "json"},
326
+ )
327
+
328
+
329
+ def ensure_json_output_supported(command: str, *, suggestion: str | None = None) -> None:
330
+ if is_json_output():
331
+ abort_with_cli_error(unsupported_json_output_error(command, suggestion=suggestion))
332
+
333
+
334
+ def unsupported_dry_run_error(command: str, *, suggestion: str | None = None) -> CLIError:
335
+ hints = [suggestion] if suggestion else []
336
+ return usage_error(
337
+ f"`{command}` 暂不支持 `--dry-run`。",
338
+ hints=hints,
339
+ details={"command": command, "dry_run": True},
340
+ )
341
+
342
+
343
+ def ensure_dry_run_supported(command: str, *, suggestion: str | None = None) -> None:
344
+ if is_global_dry_run_enabled():
345
+ abort_with_cli_error(unsupported_dry_run_error(command, suggestion=suggestion))
346
+
347
+
348
+ def cli_error_from_exception(
349
+ err: Exception,
350
+ *,
351
+ context: str | None = None,
352
+ argv: Optional[Sequence[str]] = None,
353
+ show_help: bool = False,
354
+ ) -> CLIError:
355
+ if isinstance(err, CLIError):
356
+ if context and not err.context:
357
+ err.context = context
358
+ if show_help and not err.show_help:
359
+ err.show_help = True
360
+ if argv and not err.argv:
361
+ err.argv = list(argv)
362
+ return err
363
+
364
+ if isinstance(err, click.Abort):
365
+ return cancelled_error(context=context, argv=argv)
366
+ if isinstance(err, click.BadParameter):
367
+ return usage_error(str(err), context=context, show_help=show_help, argv=argv)
368
+ if isinstance(err, click.UsageError):
369
+ return usage_error(str(err), context=context, show_help=True, argv=argv)
370
+ if isinstance(err, FileNotFoundError):
371
+ return resolution_error(str(err), context=context, argv=argv)
372
+ if isinstance(err, ValueError):
373
+ return validation_error(str(err), context=context, argv=argv)
374
+
375
+ code, msg = parse_server_api_error(err)
376
+ details = _extract_agentengine_error_details(err)
377
+ args = [a for a in (list(argv) if argv is not None else sys.argv[1:]) if a]
378
+ msg_lower = (msg or "").lower()
379
+
380
+ summary = msg or err.__class__.__name__
381
+ hints: list[str] = []
382
+ error_code = "remote_error"
383
+ exit_code = EXIT_CODE_REMOTE
384
+
385
+ if code == 404 and len(args) >= 2 and args[0] == "dashboard" and args[1] == "share":
386
+ summary = "未找到 Dashboard 分享链接或目标 Agent。"
387
+ hints.append("请先执行 `agentengine dashboard share list --agent <AgentName|AgentId>` 查看分享链接。")
388
+ hints.append("如需先确认 Agent,请执行 `agentengine agent list`。")
389
+ error_code = "resolution_error"
390
+ exit_code = EXIT_CODE_RESOLUTION
391
+ elif code == 404 and args and args[0] == "version":
392
+ summary = "未找到目标 Agent 或版本。"
393
+ hints.append("请先执行 `agentengine agent list` 确认目标 Agent。")
394
+ hints.append("然后执行 `agentengine version list --agent <AgentName|AgentId>` 查看版本。")
395
+ error_code = "resolution_error"
396
+ exit_code = EXIT_CODE_RESOLUTION
397
+ elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="agent"):
398
+ summary = "未找到 Agent。"
399
+ hints.append("请确认 Agent 名称/ID 是否正确,可先执行 `agentengine agent list` 查看已部署 Agent。")
400
+ if len(args) >= 2 and args[0] == "dashboard" and args[1] == "list":
401
+ hints.append("`agentengine dashboard list` 不是有效命令。")
402
+ hints.append("如果要查看分享链接,请使用 `agentengine dashboard share list --agent <AgentName|AgentId>`。")
403
+ elif args and args[0] == "dashboard":
404
+ hints.append("可显式指定 Agent:`agentengine dashboard open --agent <AgentName|AgentId>`。")
405
+ error_code = "resolution_error"
406
+ exit_code = EXIT_CODE_RESOLUTION
407
+ elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="mcp"):
408
+ summary = "未找到 MCP。"
409
+ hints.append("请确认 MCP 名称/ID 是否正确,可先执行 `agentengine mcp list` 查看已部署 MCP。")
410
+ error_code = "resolution_error"
411
+ exit_code = EXIT_CODE_RESOLUTION
412
+ elif code == 404 and _matches_resource_not_found(msg_lower, args, resource="openclaw"):
413
+ summary = "未找到 OpenClaw。"
414
+ hints.append("请确认 OpenClaw 名称/ID 是否正确,可先执行 `agentengine openclaw list` 查看已部署实例。")
415
+ error_code = "resolution_error"
416
+ exit_code = EXIT_CODE_RESOLUTION
417
+ elif _looks_like_missing_cloud_credentials(details, msg_lower):
418
+ return auth_error(
419
+ message="未检测到金山云 AK/SK。",
420
+ hints=_credential_setup_hints(),
421
+ details={"server_code": code, **details},
422
+ context=context,
423
+ argv=argv,
424
+ )
425
+ elif _looks_like_invalid_cloud_credentials(details, msg_lower):
426
+ return auth_error(
427
+ message="金山云 AK/SK 不正确或已失效。",
428
+ hints=_invalid_credential_hints(),
429
+ details={"server_code": code, **details},
430
+ context=context,
431
+ argv=argv,
432
+ )
433
+ elif _looks_like_runtime_permission_error(details, msg_lower, code):
434
+ return auth_error(
435
+ message="当前金山云账号没有 AgentEngine Runtime 所需权限。",
436
+ hints=_runtime_permission_hints(),
437
+ details={"server_code": code, **details},
438
+ context=context,
439
+ argv=argv,
440
+ )
441
+ elif code in {401, 403}:
442
+ return auth_error(context=context, argv=argv)
443
+ elif code == 429:
444
+ summary = "请求过于频繁。"
445
+ hints.append("请稍后重试,或降低并发/轮询频率。")
446
+ elif code is not None and code >= 500:
447
+ summary = f"服务端暂时不可用 (Code: {code})。"
448
+ hints.append("请稍后重试;若持续失败请联系平台侧排查。")
449
+ elif code is not None and 400 <= code < 500:
450
+ error_code = "validation_error"
451
+ exit_code = EXIT_CODE_VALIDATION
452
+ summary = f"服务端返回错误 (Code: {code}): {msg}"
453
+
454
+ return CLIError(
455
+ code=error_code,
456
+ message=summary,
457
+ exit_code=exit_code,
458
+ hints=hints,
459
+ details=({"server_code": code, **details} if code is not None else dict(details)),
460
+ context=context,
461
+ show_help=show_help,
462
+ argv=list(argv or []),
463
+ )
464
+
465
+
466
+ def emit_cli_error(err: CLIError) -> None:
467
+ hints = list(err.hints)
468
+ if err.show_help:
469
+ hints.append(f"运行 `{infer_help_command(argv=err.argv)}` 查看参数说明。")
470
+
471
+ if is_json_output():
472
+ emit_json(
473
+ {
474
+ "ok": False,
475
+ "error": {
476
+ "code": err.code,
477
+ "message": err.message,
478
+ "details": err.details or {},
479
+ },
480
+ "hints": hints,
481
+ }
482
+ )
483
+ return
484
+
485
+ if err.context:
486
+ print_error(f"{err.context}: {err.message}")
487
+ else:
488
+ print_error(f"错误: {err.message}")
489
+ for hint in hints:
490
+ print_info(f"提示: {hint}")
491
+
492
+
493
+ def abort_with_cli_error(
494
+ err: Exception | CLIError,
495
+ *,
496
+ context: str | None = None,
497
+ argv: Optional[Sequence[str]] = None,
498
+ show_help: bool = False,
499
+ ) -> None:
500
+ """Emit a structured CLI error and terminate with its canonical exit code."""
501
+ cli_error = cli_error_from_exception(
502
+ err,
503
+ context=context,
504
+ argv=argv,
505
+ show_help=show_help,
506
+ )
507
+ emit_cli_error(cli_error)
508
+ raise SystemExit(cli_error.exit_code)
509
+
510
+
511
+ def print_exception(
512
+ context: Optional[str],
513
+ err: Exception,
514
+ *,
515
+ show_help: bool = False,
516
+ argv: Optional[Sequence[str]] = None,
517
+ ) -> None:
518
+ emit_cli_error(
519
+ cli_error_from_exception(
520
+ err,
521
+ context=context,
522
+ argv=argv,
523
+ show_help=show_help,
524
+ )
525
+ )
@@ -0,0 +1,31 @@
1
+ """Framework-level common CLI options."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import click
6
+
7
+ from ksadk.cli.dry_run import build_dry_run_click_option
8
+ from ksadk.cli.ui import build_no_color_click_option, build_output_click_option
9
+
10
+
11
+ def _has_long_option(command: click.Command, option_name: str) -> bool:
12
+ return any(
13
+ isinstance(param, click.Option) and option_name in param.opts
14
+ for param in command.params
15
+ )
16
+
17
+
18
+ def ensure_global_cli_options(command: click.Command) -> click.Command:
19
+ """Inject hidden common options into groups/commands that do not declare them locally."""
20
+ if not _has_long_option(command, "--dry-run"):
21
+ command.params.insert(0, build_dry_run_click_option(hidden=True, expose_value=False))
22
+ if not _has_long_option(command, "--output"):
23
+ command.params.insert(0, build_output_click_option(hidden=True, expose_value=False))
24
+ if not _has_long_option(command, "--no-color"):
25
+ command.params.insert(0, build_no_color_click_option(hidden=True, expose_value=False))
26
+
27
+ if isinstance(command, click.Group):
28
+ for subcommand in command.commands.values():
29
+ ensure_global_cli_options(subcommand)
30
+
31
+ return command
@@ -0,0 +1,97 @@
1
+ """Helpers for local commands that execute user Agent code."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ from pathlib import Path
7
+ import site
8
+ import sys
9
+ from typing import Sequence
10
+
11
+
12
+ LOCAL_RUNTIME_VENV_REEXEC_ENV = "AGENTENGINE_LOCAL_RUNTIME_VENV_REEXEC"
13
+ LEGACY_WEB_VENV_REEXEC_ENV = "AGENTENGINE_WEB_VENV_REEXEC"
14
+
15
+
16
+ def find_project_venv_python(agent_path: Path) -> Path | None:
17
+ for candidate in (
18
+ agent_path / ".venv" / "bin" / "python",
19
+ agent_path / ".venv" / "Scripts" / "python.exe",
20
+ agent_path / "venv" / "bin" / "python",
21
+ agent_path / "venv" / "Scripts" / "python.exe",
22
+ ):
23
+ if candidate.exists():
24
+ return candidate.absolute()
25
+ return None
26
+
27
+
28
+ def is_current_python(python_path: Path) -> bool:
29
+ try:
30
+ return Path(sys.executable).absolute() == python_path.absolute()
31
+ except OSError:
32
+ return False
33
+
34
+
35
+ def prepend_env_path(env: dict[str, str], key: str, value: str) -> None:
36
+ existing = env.get(key)
37
+ paths = existing.split(os.pathsep) if existing else []
38
+ if value not in paths:
39
+ paths.insert(0, value)
40
+ env[key] = os.pathsep.join(paths)
41
+
42
+
43
+ def _current_site_package_paths() -> list[str]:
44
+ paths: list[str] = []
45
+
46
+ def _add(value: object) -> None:
47
+ path = str(value or "")
48
+ if path and path not in paths and Path(path).exists():
49
+ paths.append(path)
50
+
51
+ try:
52
+ for path in site.getsitepackages():
53
+ _add(path)
54
+ except Exception:
55
+ pass
56
+ try:
57
+ _add(site.getusersitepackages())
58
+ except Exception:
59
+ pass
60
+ for path in sys.path:
61
+ if "site-packages" in path or "dist-packages" in path:
62
+ _add(path)
63
+ return paths
64
+
65
+
66
+ def _build_bootstrap_code() -> str:
67
+ ksadk_root = str(Path(__file__).resolve().parents[2])
68
+ site_paths = _current_site_package_paths()
69
+ return (
70
+ "import site, sys; "
71
+ f"[site.addsitedir(p) for p in {site_paths!r} if p not in sys.path]; "
72
+ f"sys.path.insert(0, {ksadk_root!r}); "
73
+ "from ksadk.cli import main; main()"
74
+ )
75
+
76
+
77
+ def reexec_with_project_venv_if_needed(
78
+ agent_path: Path,
79
+ command_args: Sequence[str],
80
+ *,
81
+ reexec_env: str = LOCAL_RUNTIME_VENV_REEXEC_ENV,
82
+ ) -> None:
83
+ """Re-run local agent commands inside the project's virtualenv when present."""
84
+ if os.environ.get(reexec_env) or os.environ.get(LEGACY_WEB_VENV_REEXEC_ENV):
85
+ return
86
+
87
+ venv_python = find_project_venv_python(agent_path)
88
+ if not venv_python or is_current_python(venv_python):
89
+ return
90
+
91
+ env = os.environ.copy()
92
+ env[reexec_env] = "1"
93
+ env["VIRTUAL_ENV"] = str(venv_python.parents[1])
94
+ prepend_env_path(env, "PATH", str(venv_python.parent))
95
+
96
+ args = [str(venv_python), "-c", _build_bootstrap_code(), *command_args]
97
+ os.execvpe(str(venv_python), args, env)