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
ksadk/cli/cmd_web.py ADDED
@@ -0,0 +1,288 @@
1
+ """ksadk web - 启动统一本地 Web UI。"""
2
+
3
+ import click
4
+ import webbrowser
5
+ from pathlib import Path
6
+ import os
7
+ import yaml
8
+ from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
9
+ from ksadk.cli.local_runtime import reexec_with_project_venv_if_needed
10
+ from ksadk.cli.ui import (
11
+ print_error,
12
+ print_info,
13
+ print_kv,
14
+ print_success,
15
+ print_title,
16
+ )
17
+ from ksadk.configs import setup_environment
18
+ from ksadk.detection import FrameworkDetector
19
+ from ksadk.runners.factory import create_runner
20
+
21
+
22
+ _PERSISTENT_STM_FRAMEWORKS = {"adk", "langgraph", "langchain", "deepagents"}
23
+ _STM_ENV_NAMES = (
24
+ "KSADK_STM_BACKEND",
25
+ "KSADK_STM_PATH",
26
+ "KSADK_STM_URL",
27
+ "KSADK_STM_DB_PATH",
28
+ "KSADK_STM_DB_URL",
29
+ )
30
+ _SESSION_ENV_NAMES = (
31
+ "KSADK_SESSION_BACKEND",
32
+ "AGENTENGINE_SESSION_BACKEND",
33
+ "KSADK_SESSION_PATH",
34
+ "KSADK_SESSION_DSN",
35
+ )
36
+ _CHECKPOINT_ENV_NAMES = (
37
+ "KSADK_CHECKPOINT_BACKEND",
38
+ "KSADK_CHECKPOINT_PATH",
39
+ "KSADK_LANGGRAPH_CHECKPOINT_DSN",
40
+ )
41
+ _LOCAL_UI_ENV_NAMES = ("AGENTENGINE_UI_DIR",)
42
+
43
+
44
+ def _normalize_ui_path(path: str | None) -> str:
45
+ value = str(path or "/").strip() or "/"
46
+ if not value.startswith("/"):
47
+ value = "/" + value
48
+ return value.rstrip("/") or "/"
49
+
50
+
51
+ def _load_agentengine_config(agent_path: Path) -> dict:
52
+ for file_name in ("agentengine.yaml", "ksadk.yaml", "ksadk.yml"):
53
+ config_path = agent_path / file_name
54
+ if not config_path.exists():
55
+ continue
56
+ try:
57
+ payload = yaml.safe_load(config_path.read_text(encoding="utf-8-sig")) or {}
58
+ return payload if isinstance(payload, dict) else {}
59
+ except Exception:
60
+ return {}
61
+ return {}
62
+
63
+
64
+ def _project_dotenv_values(agent_path: Path) -> dict[str, str]:
65
+ env_path = agent_path / ".env"
66
+ if not env_path.exists():
67
+ return {}
68
+ try:
69
+ from dotenv import dotenv_values
70
+ except ImportError:
71
+ return {}
72
+ values: dict[str, str] = {}
73
+ for key, value in dotenv_values(env_path, encoding="utf-8-sig").items():
74
+ if key and value is not None:
75
+ values[str(key)] = str(value)
76
+ return values
77
+
78
+
79
+ def _explicit_env_names_excluding_project_dotenv(
80
+ names: tuple[str, ...],
81
+ project_dotenv: dict[str, str],
82
+ ) -> set[str]:
83
+ explicit: set[str] = set()
84
+ for name in names:
85
+ current = os.environ.get(name)
86
+ if current is None:
87
+ continue
88
+ if project_dotenv.get(name) == current:
89
+ continue
90
+ explicit.add(name)
91
+ return explicit
92
+
93
+
94
+ def _configure_custom_ui_env(agent_path: Path) -> str:
95
+ config = _load_agentengine_config(agent_path)
96
+ if str(config.get("ui_profile") or "").strip().lower() != "custom":
97
+ return "/"
98
+
99
+ bundle_path = str(config.get("ui_bundle_path") or "").strip()
100
+ if not bundle_path:
101
+ return "/"
102
+ bundle_dir = agent_path / bundle_path
103
+ if not (bundle_dir / "index.html").is_file():
104
+ return "/"
105
+
106
+ ui_path = _normalize_ui_path(str(config.get("ui_path") or "/"))
107
+ os.environ["KSADK_UI_PROFILE"] = "custom"
108
+ os.environ["KSADK_UI_PATH"] = ui_path
109
+ os.environ["KSADK_UI_BUNDLE_PATH"] = bundle_path
110
+ return ui_path
111
+
112
+
113
+ def _ensure_langgraph_sqlite_checkpoint_available() -> None:
114
+ try:
115
+ import langgraph.checkpoint.sqlite.aio # noqa: F401
116
+ except ImportError:
117
+ print_error(
118
+ "本地 LangGraph checkpoint 需要安装 langgraph-checkpoint-sqlite:\n"
119
+ " pip install langgraph-checkpoint-sqlite\n"
120
+ "或显式设置 KSADK_CHECKPOINT_BACKEND=memory/postgres。"
121
+ )
122
+ raise SystemExit(1)
123
+
124
+
125
+ def _configure_langgraph_checkpoint_env(
126
+ agent_path: Path,
127
+ *,
128
+ explicit_checkpoint_env_names: set[str],
129
+ ) -> None:
130
+ checkpoint_backend = str(os.environ.get("KSADK_CHECKPOINT_BACKEND") or "").strip().lower()
131
+ if checkpoint_backend == "local":
132
+ checkpoint_backend = "sqlite"
133
+ os.environ["KSADK_CHECKPOINT_BACKEND"] = "sqlite"
134
+
135
+ if checkpoint_backend == "sqlite":
136
+ _ensure_langgraph_sqlite_checkpoint_available()
137
+ os.environ.setdefault(
138
+ "KSADK_CHECKPOINT_PATH",
139
+ str(agent_path / ".agentengine" / "ui" / "checkpoints.sqlite"),
140
+ )
141
+ os.environ.pop("KSADK_LANGGRAPH_CHECKPOINT_DSN", None)
142
+ return
143
+
144
+ if explicit_checkpoint_env_names.intersection(_CHECKPOINT_ENV_NAMES):
145
+ return
146
+
147
+ _ensure_langgraph_sqlite_checkpoint_available()
148
+ os.environ["KSADK_CHECKPOINT_BACKEND"] = "sqlite"
149
+ os.environ["KSADK_CHECKPOINT_PATH"] = str(
150
+ agent_path / ".agentengine" / "ui" / "checkpoints.sqlite"
151
+ )
152
+ os.environ.pop("KSADK_LANGGRAPH_CHECKPOINT_DSN", None)
153
+
154
+
155
+ def _default_project_stm_if_unset(
156
+ framework: str,
157
+ agent_path: Path,
158
+ *,
159
+ explicit_session_env_names: set[str] | None = None,
160
+ explicit_checkpoint_env_names: set[str] | None = None,
161
+ ) -> None:
162
+ if framework not in _PERSISTENT_STM_FRAMEWORKS:
163
+ return
164
+ explicit_session_env_names = explicit_session_env_names or set()
165
+ explicit_checkpoint_env_names = explicit_checkpoint_env_names or set()
166
+ session_db_path = str(agent_path / ".agentengine" / "ui" / "sessions.sqlite")
167
+ if not any(name in os.environ for name in _STM_ENV_NAMES):
168
+ os.environ["KSADK_STM_BACKEND"] = "sqlite"
169
+ os.environ["KSADK_STM_PATH"] = session_db_path
170
+ if not explicit_session_env_names.intersection(_SESSION_ENV_NAMES):
171
+ os.environ["KSADK_SESSION_BACKEND"] = "local"
172
+ os.environ["KSADK_SESSION_PATH"] = session_db_path
173
+ os.environ.pop("KSADK_SESSION_DSN", None)
174
+ os.environ.pop("AGENTENGINE_SESSION_BACKEND", None)
175
+ if framework == "langgraph":
176
+ _configure_langgraph_checkpoint_env(
177
+ agent_path,
178
+ explicit_checkpoint_env_names=explicit_checkpoint_env_names,
179
+ )
180
+
181
+
182
+ @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
183
+ @click.argument("agent_dir", default=".", type=click.Path(exists=True))
184
+ @click.option("--port", "-p", default=8080, help="Web UI 端口")
185
+ @click.option("--model", help="指定模型名称 (覆盖 .env 配置)")
186
+ @click.option("--no-open", is_flag=True, help="仅打印 URL,不自动打开浏览器")
187
+ def web(agent_dir: str, port: int, model: str, no_open: bool):
188
+ """启动本地统一 Web UI(Invoke UI)
189
+
190
+ \b
191
+ AGENT_DIR: Agent 项目目录 (默认: 当前目录)
192
+
193
+ \b
194
+ 用途说明:
195
+ 本地调试 Agent Invoke UI(非云端 Dashboard)
196
+ 所有受支持框架统一使用 ksadk 内建 Web UI
197
+ """
198
+ ensure_json_output_supported(
199
+ "agentengine web",
200
+ suggestion="请改用 `agentengine dashboard open` 或 `agentengine agent status --output json`。",
201
+ )
202
+
203
+ agent_path = Path(agent_dir).resolve()
204
+ command_args = ["web", str(agent_path), "--port", str(port)]
205
+ if model:
206
+ command_args.extend(["--model", model])
207
+ reexec_with_project_venv_if_needed(agent_path, command_args)
208
+ project_dotenv = _project_dotenv_values(agent_path)
209
+ explicit_session_env_names = _explicit_env_names_excluding_project_dotenv(
210
+ (*_STM_ENV_NAMES, *_SESSION_ENV_NAMES),
211
+ project_dotenv,
212
+ )
213
+ explicit_checkpoint_env_names = _explicit_env_names_excluding_project_dotenv(
214
+ _CHECKPOINT_ENV_NAMES,
215
+ project_dotenv,
216
+ )
217
+ explicit_local_ui_env_names = _explicit_env_names_excluding_project_dotenv(
218
+ _LOCAL_UI_ENV_NAMES,
219
+ project_dotenv,
220
+ )
221
+
222
+ print_title("启动本地调试 Web UI")
223
+ print_kv("项目目录", str(agent_path))
224
+
225
+ # 设置模型名称 (CLI 参数优先级最高)
226
+ if model:
227
+ os.environ["MODEL_NAME"] = model
228
+ os.environ["OPENAI_MODEL_NAME"] = model
229
+ print_kv("指定模型", model, value_style="#58a6ff")
230
+
231
+ setup_environment(agent_path)
232
+
233
+ # 检测框架
234
+ detector = FrameworkDetector(str(agent_path))
235
+ result = detector.detect()
236
+
237
+ if result.type.value == "unknown":
238
+ print_error("未检测到支持的框架")
239
+ raise SystemExit(1)
240
+
241
+ # Map framework types to display names
242
+ framework_map = {
243
+ "adk": "ADK",
244
+ "langchain": "LangChain",
245
+ "langgraph": "LangGraph",
246
+ "deepagents": "DeepAgents",
247
+ }
248
+ display_name = framework_map.get(result.type.value, result.name)
249
+ print_kv("框架", display_name, value_style="#2da44e")
250
+
251
+ # 本地 UI 的持久化目录与项目根绑定
252
+ os.environ["KSADK_PROJECT_DIR"] = str(agent_path)
253
+ local_ui_dir = str(agent_path / ".agentengine" / "ui")
254
+ if "AGENTENGINE_UI_DIR" not in explicit_local_ui_env_names:
255
+ os.environ["AGENTENGINE_UI_DIR"] = local_ui_dir
256
+ else:
257
+ os.environ.setdefault("AGENTENGINE_UI_DIR", local_ui_dir)
258
+ _default_project_stm_if_unset(
259
+ result.type.value,
260
+ agent_path,
261
+ explicit_session_env_names=explicit_session_env_names,
262
+ explicit_checkpoint_env_names=explicit_checkpoint_env_names,
263
+ )
264
+ launch_path = _configure_custom_ui_env(agent_path)
265
+
266
+ try:
267
+ print_info("初始化 Runner...")
268
+ runner = create_runner(result, str(agent_path))
269
+ except Exception as e:
270
+ print_exception("Runner 初始化失败", e)
271
+ raise SystemExit(1)
272
+
273
+ print_success("启动统一 Web UI")
274
+ launch_url = f"http://localhost:{port}{launch_path if launch_path != '/' else ''}"
275
+ print_kv("Web UI", launch_url, value_style="#58a6ff")
276
+ print_kv("Agent", result.name)
277
+ print_info("按 Ctrl+C 停止")
278
+
279
+ if not no_open:
280
+ webbrowser.open(launch_url)
281
+
282
+ try:
283
+ runner.run_server(port=port)
284
+ except KeyboardInterrupt:
285
+ raise SystemExit(0)
286
+ except Exception as e:
287
+ print_exception("统一 Web UI 启动失败", e)
288
+ raise SystemExit(1)
@@ -0,0 +1,87 @@
1
+ import os
2
+ import click
3
+ from ksadk.api import AgentEngineClient
4
+
5
+ async def auto_release_version(agent_id: str, region: str, deploy_name: str):
6
+ """部署成功后自动创建版本快照"""
7
+ from datetime import datetime
8
+
9
+ access_key = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
10
+ secret_key = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
11
+
12
+ client = AgentEngineClient(
13
+ access_key=access_key,
14
+ secret_key=secret_key,
15
+ region=region,
16
+ )
17
+
18
+ try:
19
+ description = "部署后自动发布"
20
+ result = await client.release_version(
21
+ agent_id=agent_id,
22
+ tag=None, # 自动生成
23
+ description=description
24
+ )
25
+
26
+ click.echo("")
27
+ click.secho(f"✓ 版本快照已创建: {result.get('tag')}", fg="green")
28
+ except Exception as e:
29
+ # 版本创建失败不阻断部署流程
30
+ click.secho(f"⚠ 版本快照创建失败: {e}", fg="yellow")
31
+ finally:
32
+ await client.close()
33
+
34
+
35
+ async def auto_rollback_to_previous(agent_id: str, region: str):
36
+ """部署失败时自动回滚到上一版本"""
37
+
38
+ access_key = os.getenv("KSYUN_ACCESS_KEY") or os.getenv("KS3_ACCESS_KEY")
39
+ secret_key = os.getenv("KSYUN_SECRET_KEY") or os.getenv("KS3_SECRET_KEY")
40
+
41
+ client = AgentEngineClient(
42
+ access_key=access_key,
43
+ secret_key=secret_key,
44
+ region=region,
45
+ )
46
+
47
+ try:
48
+ # 获取版本列表,找到最近的历史版本
49
+ versions_result = await client.list_versions(agent_id, page=1, size=5)
50
+ versions = versions_result.get("versions", [])
51
+
52
+ # 找到需要回滚的目标版本 (统一 snake_case)
53
+ target_version = None
54
+ for v in versions:
55
+ if (v.get("status") or "").lower() == "current":
56
+ target_version = v
57
+ break
58
+
59
+ # 如果没有 Current,则找最新的 Historical
60
+ if not target_version:
61
+ for v in versions:
62
+ if (v.get("status") or "").lower() == "historical":
63
+ target_version = v
64
+ break
65
+
66
+ if not target_version:
67
+ click.secho("⚠ 无可用稳定版本,跳过自动回滚", fg="yellow")
68
+ return
69
+
70
+ target_tag = target_version.get("tag")
71
+ click.echo("")
72
+ click.secho(f"⏪ 正在自动回滚到版本: {target_tag}...", fg="yellow")
73
+
74
+ # 执行回滚
75
+ result = await client.rollback_version(
76
+ agent_id=agent_id,
77
+ target_tag=target_tag,
78
+ ks3_access_key=access_key,
79
+ ks3_secret_key=secret_key
80
+ )
81
+
82
+ click.secho(f"✓ 已回滚到版本: {target_tag}", fg="green")
83
+
84
+ except Exception as e:
85
+ click.secho(f"⚠ 自动回滚失败: {e}", fg="red")
86
+ finally:
87
+ await client.close()
ksadk/cli/dry_run.py ADDED
@@ -0,0 +1,214 @@
1
+ """CLI dry-run utilities."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ import os
8
+ from typing import Any, Awaitable, Callable, Optional, TypeVar
9
+
10
+ import click
11
+ from click.core import ParameterSource
12
+
13
+ from ksadk.api.client import DryRunExit
14
+ from ksadk.cli.resource_common import build_dry_run_envelope
15
+ from ksadk.cli.ui import emit_json, is_json_output
16
+
17
+ _T = TypeVar("_T")
18
+ _DEFAULT_DONE_MSG = "✅ Dry Run Completed: 请求已打印,未执行实际变更。"
19
+ _GLOBAL_DRY_RUN_ENV = "AGENTENGINE_GLOBAL_DRY_RUN"
20
+ _MASKED_VALUE = "***"
21
+ _SENSITIVE_KEY_TOKENS = (
22
+ "authorization",
23
+ "api_key",
24
+ "apikey",
25
+ "token",
26
+ "secret",
27
+ "password",
28
+ "signature",
29
+ "accesskey",
30
+ "access_key",
31
+ )
32
+
33
+
34
+ def is_global_dry_run_enabled() -> bool:
35
+ return os.getenv(_GLOBAL_DRY_RUN_ENV, "").strip().lower() in {
36
+ "1",
37
+ "true",
38
+ "yes",
39
+ "on",
40
+ }
41
+
42
+
43
+ def effective_dry_run(local_dry_run: bool = False) -> bool:
44
+ return bool(local_dry_run or is_global_dry_run_enabled())
45
+
46
+
47
+ def _set_dry_run_callback(ctx: click.Context, _param: click.Parameter, value: bool):
48
+ ctx.ensure_object(dict)
49
+ inherited = False
50
+ if ctx.parent is not None and isinstance(ctx.parent.obj, dict):
51
+ inherited = bool(ctx.parent.obj.get("dry_run"))
52
+
53
+ source = ctx.get_parameter_source("dry_run")
54
+ selected = inherited if source == ParameterSource.DEFAULT else bool(value)
55
+
56
+ if selected:
57
+ os.environ[_GLOBAL_DRY_RUN_ENV] = "1"
58
+ else:
59
+ os.environ.pop(_GLOBAL_DRY_RUN_ENV, None)
60
+
61
+ ctx.obj["dry_run"] = selected
62
+ return selected
63
+
64
+
65
+ def dry_run_option(
66
+ help_text: str = "只打印 curl 请求,不执行",
67
+ *,
68
+ hidden: bool = False,
69
+ expose_value: bool = True,
70
+ ):
71
+ """Reusable Click option for dry-run support."""
72
+ return click.option(
73
+ "--dry-run",
74
+ "dry_run",
75
+ is_flag=True,
76
+ default=False,
77
+ hidden=hidden,
78
+ expose_value=expose_value,
79
+ callback=_set_dry_run_callback,
80
+ help=help_text,
81
+ )
82
+
83
+
84
+ def build_dry_run_click_option(
85
+ help_text: str = "只打印 curl 请求,不执行",
86
+ *,
87
+ hidden: bool = False,
88
+ expose_value: bool = True,
89
+ ) -> click.Option:
90
+ """Build a dry-run option for command injection."""
91
+ return click.Option(
92
+ ["--dry-run", "dry_run"],
93
+ is_flag=True,
94
+ default=False,
95
+ hidden=hidden,
96
+ expose_value=expose_value,
97
+ callback=_set_dry_run_callback,
98
+ help=help_text,
99
+ )
100
+
101
+
102
+ def _is_sensitive_key(key: Any) -> bool:
103
+ text = str(key or "").strip().lower().replace("-", "_")
104
+ if not text:
105
+ return False
106
+ return any(token in text for token in _SENSITIVE_KEY_TOKENS)
107
+
108
+
109
+ def _mask_if_sensitive(value: Any, *, sensitive: bool) -> Any:
110
+ if not sensitive:
111
+ return value
112
+ if value is None:
113
+ return None
114
+ return _MASKED_VALUE
115
+
116
+
117
+ def _sanitize_dry_run_value(value: Any, *, parent_key: str | None = None) -> Any:
118
+ if isinstance(value, dict):
119
+ env_key = str(value.get("Key") or "")
120
+ env_sensitive = bool(value.get("IsSensitive")) or _is_sensitive_key(env_key)
121
+ sanitized: dict[str, Any] = {}
122
+ for key, item in value.items():
123
+ key_text = str(key)
124
+ item_sensitive = env_sensitive and key_text == "Value"
125
+ if not item_sensitive and _is_sensitive_key(key_text):
126
+ item_sensitive = True
127
+ sanitized[key_text] = _mask_if_sensitive(
128
+ _sanitize_dry_run_value(item, parent_key=key_text),
129
+ sensitive=item_sensitive,
130
+ )
131
+ return sanitized
132
+ if isinstance(value, list):
133
+ return [_sanitize_dry_run_value(item, parent_key=parent_key) for item in value]
134
+ if isinstance(value, tuple):
135
+ return tuple(_sanitize_dry_run_value(item, parent_key=parent_key) for item in value)
136
+ return _mask_if_sensitive(value, sensitive=_is_sensitive_key(parent_key))
137
+
138
+
139
+ def _shell_quote_single(value: str) -> str:
140
+ return value.replace("'", "'\"'\"'")
141
+
142
+
143
+ def _build_redacted_curl(method: Any, url: Any, headers: Any, body: Any) -> str:
144
+ method_text = str(method or "REQUEST")
145
+ url_text = str(url or "")
146
+ lines = [f'curl -X {method_text} "{url_text}" \\']
147
+ if isinstance(headers, dict):
148
+ for key, value in headers.items():
149
+ lines.append(f' -H "{key}: {value}" \\')
150
+ if body is not None:
151
+ body_text = json.dumps(body, ensure_ascii=False)
152
+ lines.append(f" -d '{_shell_quote_single(body_text)}'")
153
+ elif lines:
154
+ lines[-1] = lines[-1].rstrip(" \\")
155
+ return "\n".join(lines)
156
+
157
+
158
+ def sanitize_dry_run_request(payload: dict[str, Any] | None) -> dict[str, Any]:
159
+ """Redact secrets from dry-run request payloads before printing or JSON output."""
160
+ if not payload:
161
+ return {}
162
+ safe_payload = _sanitize_dry_run_value(dict(payload or {}))
163
+ if not isinstance(safe_payload, dict):
164
+ return {}
165
+ safe_payload["curl"] = _build_redacted_curl(
166
+ safe_payload.get("method"),
167
+ safe_payload.get("url"),
168
+ safe_payload.get("headers"),
169
+ safe_payload.get("body"),
170
+ )
171
+ return safe_payload
172
+
173
+
174
+ def run_async_with_dry_run(
175
+ coro: Awaitable[_T],
176
+ *,
177
+ dry_run: bool,
178
+ done_message: str = _DEFAULT_DONE_MSG,
179
+ on_dry_run: Optional[Callable[[DryRunExit], None]] = None,
180
+ dry_run_resource: str | None = None,
181
+ dry_run_action: str | None = None,
182
+ dry_run_hints: Optional[list[str]] = None,
183
+ ) -> Optional[_T]:
184
+ """Run async coroutine and swallow DryRunExit in dry-run mode."""
185
+ _ = dry_run
186
+ try:
187
+ return asyncio.run(coro)
188
+ except DryRunExit as exc:
189
+ safe_payload = sanitize_dry_run_request(exc.payload or {})
190
+ if on_dry_run:
191
+ on_dry_run(DryRunExit(str(exc), payload=safe_payload))
192
+ elif is_json_output() and dry_run_resource and dry_run_action:
193
+ emit_json(
194
+ build_dry_run_envelope(
195
+ resource=dry_run_resource,
196
+ action=dry_run_action,
197
+ request=safe_payload,
198
+ hints=dry_run_hints or [],
199
+ )
200
+ )
201
+ elif safe_payload:
202
+ click.echo("=" * 60)
203
+ click.echo(f"Dry Run Mode: {safe_payload.get('method', 'REQUEST')} {safe_payload.get('url', '')}")
204
+ click.echo("=" * 60)
205
+ click.echo(f"Headers: {safe_payload.get('headers')}")
206
+ if safe_payload.get("body") is not None:
207
+ click.echo(f"Body: {safe_payload.get('body')}")
208
+ if safe_payload.get("curl"):
209
+ click.echo("\nCurl Command:")
210
+ click.echo(str(safe_payload["curl"]))
211
+ click.echo("=" * 60)
212
+ if not is_json_output():
213
+ click.echo(done_message)
214
+ return None
@@ -0,0 +1,82 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import re
5
+ from pathlib import Path
6
+
7
+ import click
8
+
9
+ _ENV_KEY_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
10
+
11
+
12
+ def parse_env_pairs(items: tuple[str, ...] | list[str] | None) -> dict[str, str]:
13
+ """Parse repeated KEY=VALUE CLI env options."""
14
+ parsed: dict[str, str] = {}
15
+ for raw_item in items or ():
16
+ item = str(raw_item or "").strip()
17
+ if not item or "=" not in item:
18
+ raise ValueError(f"自定义环境变量格式错误: {raw_item!r},应为 KEY=VALUE")
19
+ key, value = item.split("=", 1)
20
+ key = key.strip()
21
+ if not _ENV_KEY_PATTERN.fullmatch(key):
22
+ raise ValueError(f"自定义环境变量名不合法: {key!r},请使用合法的环境变量名")
23
+ parsed[key] = value
24
+ return parsed
25
+
26
+
27
+ def load_env_file(env_file: str | None, *, base_dir: Path | None = None) -> dict[str, str]:
28
+ """Load explicit runtime env variables from a dotenv or JSON object file."""
29
+ if not env_file:
30
+ return {}
31
+
32
+ path = Path(env_file)
33
+ if not path.is_absolute() and base_dir is not None:
34
+ path = base_dir / path
35
+ if not path.exists():
36
+ raise ValueError(f"环境变量文件不存在: {path}")
37
+
38
+ if path.suffix.lower() == ".json":
39
+ raw = json.loads(path.read_text(encoding="utf-8-sig"))
40
+ if not isinstance(raw, dict):
41
+ raise ValueError(f"环境变量 JSON 文件必须是对象: {path}")
42
+ items = raw.items()
43
+ else:
44
+ from dotenv import dotenv_values
45
+
46
+ items = dotenv_values(path, encoding="utf-8-sig").items()
47
+
48
+ parsed: dict[str, str] = {}
49
+ for raw_key, raw_value in items:
50
+ if not raw_key or raw_value is None:
51
+ continue
52
+ key = str(raw_key).lstrip("\ufeff").strip()
53
+ if not _ENV_KEY_PATTERN.fullmatch(key):
54
+ raise ValueError(f"环境变量名不合法: {key!r},文件: {path}")
55
+ parsed[key] = str(raw_value)
56
+ return parsed
57
+
58
+
59
+ def resolve_explicit_env_vars(
60
+ *,
61
+ env_file: str | None,
62
+ env_pairs: tuple[str, ...] | list[str] | None,
63
+ base_dir: Path,
64
+ ) -> dict[str, str]:
65
+ env_vars = load_env_file(env_file, base_dir=base_dir)
66
+ env_vars.update(parse_env_pairs(env_pairs))
67
+ return env_vars
68
+
69
+
70
+ def env_options(func):
71
+ func = click.option(
72
+ "--env-file",
73
+ type=click.Path(exists=False, dir_okay=False),
74
+ help="额外运行时环境变量文件,支持 .env 或 JSON 对象",
75
+ )(func)
76
+ func = click.option(
77
+ "--env",
78
+ "extra_env",
79
+ multiple=True,
80
+ help="额外透传运行时环境变量,格式 KEY=VALUE,可重复传入",
81
+ )(func)
82
+ return func