agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
ksadk/cli/__init__.py CHANGED
@@ -67,6 +67,7 @@ ROOT_HELP_COMMANDS = {
67
67
  "completion",
68
68
  "dashboard",
69
69
  "deploy",
70
+ "eval",
70
71
  "files",
71
72
  "init",
72
73
  "hermes",
@@ -74,6 +75,7 @@ ROOT_HELP_COMMANDS = {
74
75
  "mcp",
75
76
  "openclaw",
76
77
  "run",
78
+ "studio",
77
79
  "version",
78
80
  "web",
79
81
  }
@@ -81,12 +83,13 @@ ROOT_HELP_TOOL_COMMANDS = {
81
83
  "config",
82
84
  }
83
85
  SHORT_HELP_MAP = {
84
- "a2a": "暴露 A2A 服务与 Agent Card",
86
+ "a2a": "A2A 协议服务与本地试调",
85
87
  "agent": "Agent 资源管理",
86
88
  "build": "构建部署制品",
87
89
  "completion": "Shell 补全管理",
88
90
  "dashboard": "打开云端 Agent Dashboard",
89
91
  "deploy": "部署到云端",
92
+ "eval": "评测本地、A2A 或 Codex Agent",
90
93
  "files": "管理 workspace 文件",
91
94
  "hermes": "Hermes Agent 资源管理",
92
95
  "init": "创建新项目",
@@ -94,6 +97,7 @@ SHORT_HELP_MAP = {
94
97
  "mcp": "MCP 资源管理",
95
98
  "openclaw": "OpenClaw 资源管理",
96
99
  "run": "运行 Agent",
100
+ "studio": "启动本地 Agent 构建控制台",
97
101
  "version": "Agent 版本管理",
98
102
  "web": "本地调试 Agent Invoke UI",
99
103
  "config": "项目配置与模型设置",
@@ -173,6 +177,8 @@ class ColoredHelpGroup(click.Group):
173
177
  _write_colored_help_row(formatter, "agentengine init", "初始化项目")
174
178
  _write_colored_help_row(formatter, "agentengine run", "运行 API Server")
175
179
  _write_colored_help_row(formatter, "agentengine web", "本地调试 Agent Invoke UI")
180
+ _write_colored_help_row(formatter, "agentengine studio", "本地 Agent 构建控制台")
181
+ _write_colored_help_row(formatter, "agentengine eval", "评测本地、A2A 或 Codex Agent")
176
182
 
177
183
  # 云端部署
178
184
  formatter.write(click.style(" 🚀 云端部署:\n\n", fg="blue", bold=True))
@@ -180,6 +186,10 @@ class ColoredHelpGroup(click.Group):
180
186
  _write_colored_help_row(formatter, "agentengine deploy", "部署到云端")
181
187
  _write_colored_help_row(formatter, "agentengine launch", "一键构建+部署")
182
188
  _write_colored_help_row(formatter, "agentengine agent", "Agent 资源管理")
189
+ _write_colored_help_row(formatter, "agentengine version", "Agent 版本管理")
190
+ _write_colored_help_row(formatter, "agentengine mcp", "MCP 资源管理")
191
+ _write_colored_help_row(formatter, "agentengine a2a", "A2A 协议服务与本地试调")
192
+ _write_colored_help_row(formatter, "agentengine files", "管理云端 workspace 文件")
183
193
  _write_colored_help_row(formatter, "agentengine dashboard", "打开云端 Agent Dashboard")
184
194
  _write_colored_help_row(formatter, "agentengine hermes", "Hermes Agent 资源管理")
185
195
  _write_colored_help_row(formatter, "agentengine openclaw", "OpenClaw 资源管理")
@@ -187,13 +197,11 @@ class ColoredHelpGroup(click.Group):
187
197
  # 配置与工具
188
198
  formatter.write(click.style(" 🧰 配置:\n\n", fg="yellow", bold=True))
189
199
  _write_colored_help_row(formatter, "agentengine config", "项目配置向导与模型配置")
200
+ _write_colored_help_row(formatter, "agentengine completion", "Shell 补全管理")
190
201
 
191
202
  # 自定义 Options 格式化
192
203
  self.format_options_colored(ctx, formatter)
193
204
 
194
- # 自定义 Commands 格式化
195
- self.format_commands_colored(ctx, formatter)
196
-
197
205
  def format_options_colored(self, ctx, formatter):
198
206
  """自定义选项格式化"""
199
207
  formatter.write(click.style(" ⚙️ 选项:\n\n", fg="yellow", bold=True))
@@ -212,7 +220,8 @@ class ColoredHelpGroup(click.Group):
212
220
  formatter.write_paragraph()
213
221
  formatter.write_text("AgentEngine CLI")
214
222
  formatter.write_text(
215
- "支持 Hermes / OpenClaw / DeepAgents / LangGraph / LangChain / Google ADK 的本地运行与云端部署。"
223
+ "支持 Hermes / OpenClaw / DeepAgents / LangGraph / LangChain / Google ADK "
224
+ "的本地运行与云端部署。"
216
225
  )
217
226
 
218
227
  formatter.write_paragraph()
@@ -236,61 +245,6 @@ class ColoredHelpGroup(click.Group):
236
245
  formatter.write_paragraph()
237
246
  formatter.write_text("使用 `agentengine <command> --help` 查看子命令帮助。")
238
247
 
239
- def format_commands_colored(self, ctx, formatter):
240
- """自定义命令列表格式,更简洁美观"""
241
- icon_map = {
242
- "a2a": "↔️",
243
- "agent": "🤖",
244
- "build": "🔨",
245
- "completion": "⌨️",
246
- "dashboard": "🖥️",
247
- "deploy": "🚀",
248
- "files": "📄",
249
- "hermes": "⌁",
250
- "init": "📁",
251
- "launch": "✨",
252
- "mcp": "🔌",
253
- "openclaw": "🦞",
254
- "run": "▶️",
255
- "version": "🏷️",
256
- "web": "🌐",
257
- }
258
-
259
- commands = []
260
- for subcommand in self.list_commands(ctx):
261
- cmd = self.get_command(ctx, subcommand)
262
- if cmd is None:
263
- continue
264
- if getattr(cmd, "hidden", False):
265
- continue
266
- if subcommand not in ROOT_HELP_COMMANDS:
267
- continue
268
- commands.append((subcommand, cmd))
269
-
270
- if not commands:
271
- return
272
-
273
- formatter.write(click.style("\n 📋 可用命令:\n\n", fg="magenta", bold=True))
274
-
275
- # Emoji、变体选择符和 CJK 字符的 Python len 与终端 cell 宽度不同。
276
- # 这里按 cell 宽度补齐,保证命令列和说明列在真实终端里同列。
277
- icon_width = max(_terminal_cell_width(icon) for icon in icon_map.values())
278
- max_cmd_width = max(max(_terminal_cell_width(name) for name, _ in commands), 16)
279
-
280
- for subcommand, cmd in commands:
281
- # 使用预定义的简短描述
282
- help_text = SHORT_HELP_MAP.get(subcommand, "")
283
- if not help_text and cmd.help:
284
- # 只取 docstring 第一行
285
- help_text = cmd.help.split("\n")[0].strip()
286
-
287
- # 格式化输出
288
- icon = icon_map.get(subcommand, "•")
289
- icon_cell = _pad_to_terminal_cells(icon, icon_width)
290
- name_cell = _pad_to_terminal_cells(subcommand, max_cmd_width)
291
- formatter.write(click.style(f" {icon_cell} ", fg="cyan"))
292
- formatter.write(click.style(f"{name_cell} ", fg="cyan"))
293
- formatter.write(click.style(f"{help_text}\n\n", fg="white"))
294
248
 
295
249
  @click.group(cls=ColoredHelpGroup, context_settings=CONTEXT_SETTINGS)
296
250
  @click.version_option(version=VERSION, prog_name="AgentEngine")
@@ -311,138 +265,108 @@ def _add_command_once(group: click.Group, command, *, name: str | None = None):
311
265
  group.add_command(command, name=name)
312
266
 
313
267
 
314
- def _register_commands():
315
- from ksadk.cli.cmd_create import create
316
- from ksadk.cli.cmd_deploy import deploy
317
- from ksadk.cli.cmd_run import run
318
- from ksadk.cli.cmd_web import web
268
+ def _unavailable_command_stub(cmd_name: str, module_path: str, exc: Exception) -> click.Group:
269
+ """命令加载失败时的**显式降级** stub:``-h`` 可见失败原因,调用报显式错误。
319
270
 
320
- # 注册现有命令
321
- _add_command_once(cli, run)
322
- _add_command_once(cli, deploy)
323
- _add_command_once(cli, web)
271
+ 替代 ``except ImportError: pass`` 静默吞(goal-16 Windows bug:``agentengine a2a -h``
272
+ 曾因 cmd_a2a import 失败被吞而报 "No such command 'a2a'")。降级后 ``-h`` 仍退出 0
273
+ 并显示失败原因,调用子命令报显式 ClickException——失败显式可见,不再静默。
274
+ """
324
275
 
325
- # init 作为主命令 (PRD 规范)
326
- _add_command_once(cli, create, name="init")
276
+ @click.group(
277
+ cmd_name,
278
+ context_settings=dict(help_option_names=["-h", "--help"]),
279
+ help=f"(加载失败){cmd_name} 命令不可用:{exc}",
280
+ invoke_without_command=True,
281
+ no_args_is_help=False,
282
+ )
283
+ def _stub():
284
+ raise click.ClickException(f"命令 {cmd_name!r} 不可用:加载 {module_path} 失败({exc})")
327
285
 
328
- # 注册新命令 (如果存在)
329
- try:
330
- from ksadk.cli.cmd_a2a import a2a
331
-
332
- _add_command_once(cli, a2a)
333
- except ImportError:
334
- pass
286
+ return _stub
335
287
 
336
- try:
337
- from ksadk.cli.cmd_files import files
338
288
 
339
- _add_command_once(cli, files)
340
- except ImportError:
341
- pass
342
-
343
- try:
344
- from ksadk.cli.cmd_config import config
345
-
346
- _add_command_once(cli, config)
347
- except ImportError:
348
- pass
349
-
350
- try:
351
- from ksadk.cli.cmd_model import model
352
-
353
- _add_command_once(cli, model)
354
- except ImportError:
355
- pass
356
-
357
- try:
358
- from ksadk.cli.cmd_build import build
359
-
360
- _add_command_once(cli, build)
361
- except ImportError:
362
- pass
363
-
364
- try:
365
- from ksadk.cli.cmd_launch import launch
366
-
367
- _add_command_once(cli, launch)
368
- except ImportError:
369
- pass
370
-
371
- try:
372
- from ksadk.cli.cmd_agent import agent
373
-
374
- _add_command_once(cli, agent)
375
- except ImportError:
376
- pass
289
+ def _warn_unavailable_optional_command(
290
+ cmd_names: tuple[str, ...], module_path: str, exc: Exception
291
+ ) -> None:
292
+ """Print actionable startup guidance while retaining the explicit command stub."""
293
+ command_list = ", ".join(repr(name) for name in cmd_names)
294
+ message = (
295
+ f"WARNING: optional command {command_list} is unavailable because {module_path} "
296
+ f"could not load: {exc}. The remaining ksadk commands are still available."
297
+ )
298
+ if "a2a" in cmd_names:
299
+ message += (
300
+ " KsADK 0.8 requires a2a-sdk==1.1.0; activate the intended virtual environment and "
301
+ 'run `python -m pip install --upgrade "ksadk[a2a]"`. A2A 0.3 projects must use a '
302
+ "separate environment."
303
+ )
304
+ click.echo(message, err=True)
377
305
 
378
- try:
379
- from ksadk.cli.cmd_status import status
380
306
 
381
- _add_command_once(cli, status)
382
- except ImportError:
383
- pass
307
+ def _register_optional_command(cli: click.Group, module_path: str, *cmd_names: str) -> None:
308
+ """注册可选命令组;导入或依赖 API 不兼容时注册显式降级 stub(不静默吞)。"""
309
+ import importlib
384
310
 
385
311
  try:
386
- from ksadk.cli.cmd_invoke import invoke
312
+ module = importlib.import_module(module_path)
313
+ # Optional command imports can fail before an ImportError is raised when an installed
314
+ # optional SDK exposes an incompatible API. Keep the top-level CLI usable and make the
315
+ # unavailable command report the original reason instead of masking it as a CLI crash.
316
+ except (ImportError, AttributeError) as exc:
317
+ _warn_unavailable_optional_command(cmd_names, module_path, exc)
318
+ for cmd_name in cmd_names:
319
+ _add_command_once(cli, _unavailable_command_stub(cmd_name, module_path, exc))
320
+ return
321
+ for cmd_name in cmd_names:
322
+ _add_command_once(cli, getattr(module, cmd_name))
387
323
 
388
- _add_command_once(cli, invoke)
389
- except ImportError:
390
- pass
391
324
 
392
- try:
393
- from ksadk.cli.cmd_dashboard import dashboard
325
+ def _register_commands():
326
+ from ksadk.cli.cmd_create import create
327
+ from ksadk.cli.cmd_deploy import deploy
328
+ from ksadk.cli.cmd_run import run
329
+ from ksadk.cli.cmd_web import web
394
330
 
395
- _add_command_once(cli, dashboard)
396
- except ImportError:
397
- pass
331
+ # 注册现有命令
332
+ _add_command_once(cli, run)
333
+ _add_command_once(cli, deploy)
334
+ _add_command_once(cli, web)
398
335
 
399
- try:
400
- from ksadk.cli.cmd_destroy import delete, destroy
336
+ # init 作为主命令 (PRD 规范)
337
+ _add_command_once(cli, create, name="init")
401
338
 
402
- _add_command_once(cli, delete)
403
- _add_command_once(cli, destroy)
404
- except ImportError:
405
- pass
339
+ # 注册可选命令组;加载失败时显式降级(不静默吞,见 _register_optional_command)。
340
+ _register_optional_command(cli, "ksadk.cli.cmd_a2a", "a2a")
341
+ _register_optional_command(cli, "ksadk.cli.cmd_files", "files")
342
+ _register_optional_command(cli, "ksadk.cli.cmd_config", "config")
343
+ _register_optional_command(cli, "ksadk.cli.cmd_model", "model")
344
+ _register_optional_command(cli, "ksadk.cli.cmd_build", "build")
345
+ _register_optional_command(cli, "ksadk.cli.cmd_studio", "studio")
346
+ _register_optional_command(cli, "ksadk.cli.cmd_eval", "eval")
347
+ _register_optional_command(cli, "ksadk.cli.cmd_launch", "launch")
348
+ _register_optional_command(cli, "ksadk.cli.cmd_agent", "agent")
349
+ _register_optional_command(cli, "ksadk.cli.cmd_status", "status")
350
+ _register_optional_command(cli, "ksadk.cli.cmd_invoke", "invoke")
351
+ _register_optional_command(cli, "ksadk.cli.cmd_dashboard", "dashboard")
352
+ _register_optional_command(cli, "ksadk.cli.cmd_replay", "replay")
353
+ _register_optional_command(cli, "ksadk.cli.cmd_destroy", "delete", "destroy")
406
354
 
407
355
  # MCP 命令组
408
- try:
409
- from ksadk.cli.cmd_mcp import mcp
410
-
411
- _add_command_once(cli, mcp)
412
- except ImportError:
413
- pass
356
+ _register_optional_command(cli, "ksadk.cli.cmd_mcp", "mcp")
414
357
 
415
358
  # Completion 命令组
416
- try:
417
- from ksadk.cli.cmd_completion import completion
418
-
419
- _add_command_once(cli, completion)
420
- except ImportError:
421
- pass
359
+ _register_optional_command(cli, "ksadk.cli.cmd_completion", "completion")
422
360
 
423
361
  # Version 命令组
424
- try:
425
- from ksadk.cli.cmd_version import version
426
-
427
- _add_command_once(cli, version)
428
- except ImportError:
429
- pass
362
+ _register_optional_command(cli, "ksadk.cli.cmd_version", "version")
430
363
 
431
364
  # OpenClaw 命令组
432
- try:
433
- from ksadk.cli.cmd_openclaw import openclaw
434
-
435
- _add_command_once(cli, openclaw)
436
- except ImportError:
437
- pass
365
+ _register_optional_command(cli, "ksadk.cli.cmd_openclaw", "openclaw")
438
366
 
439
367
  # Hermes 命令组
440
- try:
441
- from ksadk.cli.cmd_hermes import hermes
368
+ _register_optional_command(cli, "ksadk.cli.cmd_hermes", "hermes")
442
369
 
443
- _add_command_once(cli, hermes)
444
- except ImportError:
445
- pass
446
370
 
447
371
  def main():
448
372
  # 全局加载 .env 文件
@@ -473,24 +397,25 @@ def main():
473
397
  if not loaded:
474
398
  # 回退到系统默认编码 (Windows 上通常是 GBK/cp936)
475
399
  import locale
400
+
476
401
  fallback_encoding = locale.getpreferredencoding(False)
477
402
  try:
478
403
  load_dotenv(dotenv_path, override=False, encoding=fallback_encoding)
479
404
  click.echo(
480
405
  click.style(
481
406
  f"⚠️ 警告: .env 文件使用 {fallback_encoding} 编码,建议转换为 UTF-8\n",
482
- fg="yellow"
407
+ fg="yellow",
483
408
  ),
484
- err=True
409
+ err=True,
485
410
  )
486
411
  except UnicodeDecodeError:
487
412
  click.echo(
488
413
  click.style(
489
414
  f"❌ 错误: .env 文件编码无法识别,请确保使用 UTF-8 编码保存\n"
490
415
  f" 文件路径: {dotenv_path}\n",
491
- fg="red"
416
+ fg="red",
492
417
  ),
493
- err=True
418
+ err=True,
494
419
  )
495
420
  except ImportError:
496
421
  pass
@@ -498,6 +423,7 @@ def main():
498
423
  # 全局配置回退: .env 未设置的变量从 ~/.agentengine/settings.json 补充
499
424
  try:
500
425
  from ksadk.configs.global_config import get_env_from_global_config
426
+
501
427
  global_env = get_env_from_global_config()
502
428
  injected_keys = []
503
429
  for key, value in global_env.items():