@agentunion/kite 1.3.2 → 1.5.0

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 (293) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/cli.js +119 -4
  3. package/core/dependency_checker.py +250 -0
  4. package/core/env_checker.py +490 -0
  5. package/dependencies_lock.json +128 -0
  6. package/extensions/agents/assistant/entry.py +111 -1
  7. package/extensions/agents/assistant/server.py +279 -215
  8. package/extensions/channels/acp_channel/entry.py +111 -1
  9. package/extensions/channels/acp_channel/module.md +23 -22
  10. package/extensions/channels/acp_channel/server.py +279 -215
  11. package/extensions/event_hub_bench/entry.py +107 -1
  12. package/extensions/services/backup/entry.py +306 -21
  13. package/extensions/services/backup/module.md +24 -22
  14. package/extensions/services/evol/auth_manager.py +443 -0
  15. package/extensions/services/evol/config.yaml +149 -0
  16. package/extensions/services/evol/config_loader.py +117 -0
  17. package/extensions/services/evol/entry.py +406 -0
  18. package/extensions/services/evol/evol_api.py +173 -0
  19. package/extensions/services/evol/evol_config.json5 +29 -0
  20. package/extensions/services/evol/migrate_tokens.py +122 -0
  21. package/extensions/services/evol/module.md +32 -0
  22. package/extensions/services/evol/pairing.py +250 -0
  23. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  24. package/extensions/services/evol/relay.py +682 -0
  25. package/extensions/services/evol/relay_config.json5 +67 -0
  26. package/extensions/services/evol/routes/__init__.py +1 -0
  27. package/extensions/services/evol/routes/routes_management_ws.py +127 -0
  28. package/extensions/services/evol/routes/routes_rpc.py +89 -0
  29. package/extensions/services/evol/routes/routes_test.py +61 -0
  30. package/extensions/services/evol/server.py +875 -0
  31. package/extensions/services/evol/static/css/style.css +1200 -0
  32. package/extensions/services/evol/static/index.html +781 -0
  33. package/extensions/services/evol/static/index_evol.html +14 -0
  34. package/extensions/services/evol/static/js/app.js +6304 -0
  35. package/extensions/services/evol/static/js/auth.js +326 -0
  36. package/extensions/services/evol/static/js/dialog.js +285 -0
  37. package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
  38. package/extensions/services/evol/static/js/evol-app.js +1949 -0
  39. package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
  40. package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
  41. package/extensions/services/evol/static/js/kernel-client.js +396 -0
  42. package/extensions/services/evol/static/js/main.js +141 -0
  43. package/extensions/services/evol/static/js/registry-tests.js +585 -0
  44. package/extensions/services/evol/static/js/stats.js +217 -0
  45. package/extensions/services/evol/static/js/token-manager.js +175 -0
  46. package/extensions/services/evol/static/pairing.html +248 -0
  47. package/extensions/services/evol/static/test_registry.html +262 -0
  48. package/extensions/services/evol/static/test_relay.html +462 -0
  49. package/extensions/services/evol/stats_manager.py +240 -0
  50. package/extensions/services/model_service/entry.py +167 -19
  51. package/extensions/services/model_service/module.md +21 -22
  52. package/extensions/services/proxy/.claude/settings.local.json +13 -0
  53. package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
  54. package/extensions/services/proxy/_fix_prints.py +133 -0
  55. package/extensions/services/proxy/_fix_prints2.py +87 -0
  56. package/extensions/services/proxy/agentcp/LICENCE +178 -0
  57. package/extensions/services/proxy/agentcp/README copy.md +85 -0
  58. package/extensions/services/proxy/agentcp/README.md +260 -0
  59. package/extensions/services/proxy/agentcp/__init__.py +16 -0
  60. package/extensions/services/proxy/agentcp/agent.py +4 -0
  61. package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
  62. package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
  63. package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
  64. package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
  65. package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
  66. package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
  67. package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
  68. package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
  69. package/extensions/services/proxy/agentcp/base/client.py +112 -0
  70. package/extensions/services/proxy/agentcp/base/env.py +34 -0
  71. package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
  72. package/extensions/services/proxy/agentcp/base/log.py +98 -0
  73. package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
  74. package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
  75. package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
  76. package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
  77. package/extensions/services/proxy/agentcp/context/context.py +73 -0
  78. package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
  79. package/extensions/services/proxy/agentcp/create_profile.py +125 -0
  80. package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
  81. package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
  82. package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
  83. package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
  84. package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
  85. package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
  86. package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
  87. package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
  88. package/extensions/services/proxy/agentcp/hcp.py +299 -0
  89. package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
  90. package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
  91. package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
  92. package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
  93. package/extensions/services/proxy/agentcp/llm_server.py +172 -0
  94. package/extensions/services/proxy/agentcp/mermaid.py +210 -0
  95. package/extensions/services/proxy/agentcp/message.py +149 -0
  96. package/extensions/services/proxy/agentcp/metrics.py +256 -0
  97. package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
  98. package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
  99. package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
  100. package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
  101. package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
  102. package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
  103. package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
  104. package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
  105. package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
  106. package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
  107. package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
  108. package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
  109. package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
  110. package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
  111. package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
  112. package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
  113. package/extensions/services/proxy/agentcp/requirements.txt +7 -0
  114. package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
  115. package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
  116. package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
  117. package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
  118. package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
  119. package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
  120. package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
  121. package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
  122. package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
  123. package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
  124. package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
  125. package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
  126. package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
  127. package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
  128. package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
  129. package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
  130. package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
  131. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
  132. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
  133. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
  134. package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
  135. package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
  136. package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
  137. package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
  138. package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
  139. package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
  140. package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
  141. package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
  142. package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
  143. package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
  144. package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
  145. package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
  146. package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
  147. package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
  148. package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
  149. package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
  150. package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
  151. package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
  152. package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
  153. package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
  154. package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
  155. package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
  156. package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
  157. package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
  158. package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
  159. package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
  160. package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
  161. package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
  162. package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
  163. package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
  164. package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
  165. package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
  166. package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
  167. package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
  168. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
  169. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
  170. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
  171. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
  172. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
  173. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
  174. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
  175. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
  176. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
  177. package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
  178. package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
  179. package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
  180. package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
  181. package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
  182. package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
  183. package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
  184. package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
  185. package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
  186. package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
  187. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
  188. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
  189. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
  190. package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
  191. package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
  192. package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
  193. package/extensions/services/proxy/agentcp/workflow.py +203 -0
  194. package/extensions/services/proxy/console_auth.py +109 -0
  195. package/extensions/services/proxy/evol/__init__.py +1 -0
  196. package/extensions/services/proxy/evol/config.py +37 -0
  197. package/extensions/services/proxy/evol/http/__init__.py +1 -0
  198. package/extensions/services/proxy/evol/http/async_http.py +551 -0
  199. package/extensions/services/proxy/evol/log.py +28 -0
  200. package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
  201. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
  202. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
  203. package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
  204. package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
  205. package/extensions/services/proxy/evol/server/__init__.py +1 -0
  206. package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
  207. package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
  208. package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
  209. package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
  210. package/extensions/services/proxy/evol/version.py +24 -0
  211. package/extensions/services/proxy/logs/websocket.log +260 -0
  212. package/extensions/services/proxy/main.py +240 -0
  213. package/extensions/services/proxy/requirements.txt +13 -0
  214. package/extensions/services/proxy/server.py +271 -0
  215. package/extensions/services/watchdog/entry.py +215 -26
  216. package/extensions/services/watchdog/module.md +1 -0
  217. package/extensions/services/watchdog/monitor.py +178 -38
  218. package/extensions/services/web/WEBSOCKET_STATUS.md +143 -0
  219. package/extensions/services/web/config_example.py +35 -0
  220. package/extensions/services/web/config_loader.py +110 -0
  221. package/extensions/services/web/entry.py +114 -26
  222. package/extensions/services/web/module.md +35 -24
  223. package/extensions/services/web/pairing.py +250 -0
  224. package/extensions/services/web/pairing_codes.jsonl +16 -0
  225. package/extensions/services/web/relay.py +643 -0
  226. package/extensions/services/web/relay_config.json5 +67 -0
  227. package/extensions/services/web/routes/routes_management_ws.py +127 -0
  228. package/extensions/services/web/routes/routes_rpc.py +89 -0
  229. package/extensions/services/web/routes/routes_test.py +61 -0
  230. package/extensions/services/web/routes/schemas.py +0 -22
  231. package/extensions/services/web/server.py +434 -99
  232. package/extensions/services/web/static/css/style.css +67 -28
  233. package/extensions/services/web/static/index.html +234 -44
  234. package/extensions/services/web/static/js/app.js +1335 -48
  235. package/extensions/services/web/static/js/kernel-client-example.js +161 -0
  236. package/extensions/services/web/static/js/kernel-client.js +383 -0
  237. package/extensions/services/web/static/js/registry-tests.js +558 -0
  238. package/extensions/services/web/static/js/token-manager.js +175 -0
  239. package/extensions/services/web/static/pairing.html +248 -0
  240. package/extensions/services/web/static/test_registry.html +262 -0
  241. package/extensions/services/web/web_config.json5 +29 -0
  242. package/kernel/entry.py +120 -32
  243. package/kernel/event_hub.py +141 -16
  244. package/kernel/module.md +60 -33
  245. package/kernel/registry_store.py +45 -36
  246. package/kernel/rpc_router.py +152 -59
  247. package/kernel/server.py +322 -26
  248. package/kite_cli/__init__.py +3 -0
  249. package/kite_cli/__main__.py +5 -0
  250. package/kite_cli/commands/__init__.py +1 -0
  251. package/kite_cli/commands/clean.py +101 -0
  252. package/kite_cli/commands/deps_install.py +67 -0
  253. package/kite_cli/commands/doctor.py +35 -0
  254. package/kite_cli/commands/env_check.py +45 -0
  255. package/kite_cli/commands/history.py +111 -0
  256. package/kite_cli/commands/info.py +96 -0
  257. package/kite_cli/commands/install.py +313 -0
  258. package/kite_cli/commands/list.py +143 -0
  259. package/kite_cli/commands/log.py +81 -0
  260. package/kite_cli/commands/prepare.py +49 -0
  261. package/kite_cli/commands/rollback.py +88 -0
  262. package/kite_cli/commands/search.py +73 -0
  263. package/kite_cli/commands/uninstall.py +85 -0
  264. package/kite_cli/commands/update.py +118 -0
  265. package/kite_cli/commands/venv_setup.py +56 -0
  266. package/kite_cli/core/__init__.py +1 -0
  267. package/kite_cli/core/checker.py +142 -0
  268. package/kite_cli/core/dependency.py +229 -0
  269. package/kite_cli/core/downloader.py +209 -0
  270. package/kite_cli/core/install_info.py +40 -0
  271. package/kite_cli/core/tool_installer.py +397 -0
  272. package/kite_cli/core/validator.py +78 -0
  273. package/kite_cli/main.py +317 -0
  274. package/kite_cli/utils/__init__.py +1 -0
  275. package/kite_cli/utils/i18n.py +252 -0
  276. package/kite_cli/utils/interactive.py +63 -0
  277. package/kite_cli/utils/operation_log.py +77 -0
  278. package/kite_cli/utils/paths.py +34 -0
  279. package/kite_cli/utils/version.py +308 -0
  280. package/launcher/entry.py +1124 -178
  281. package/launcher/logging_setup.py +104 -0
  282. package/launcher/module.md +46 -37
  283. package/launcher/module_scanner.py +11 -1
  284. package/main.py +4 -1
  285. package/package.json +9 -1
  286. package/python_version.json +4 -0
  287. package/requirements.txt +38 -0
  288. package/scripts/env-manager.js +328 -0
  289. package/scripts/plan_manager.py +315 -0
  290. package/scripts/python-env.js +79 -0
  291. package/scripts/scan_dependencies.py +461 -0
  292. package/scripts/setup-python-env.js +191 -0
  293. package/extensions/services/web/routes/routes_modules.py +0 -249
@@ -0,0 +1,143 @@
1
+ """list 命令实现 - 列出启动器能找到的所有模块"""
2
+ import os
3
+ import sys
4
+ from pathlib import Path
5
+ from kite_cli.utils.i18n import t
6
+
7
+
8
+ def run_list(args):
9
+ """执行列表命令 - 使用启动器的模块扫描器"""
10
+ verbose = args.verbose
11
+
12
+ # 确保环境变量设置
13
+ if "KITE_PROJECT" not in os.environ:
14
+ # 尝试从当前目录推断
15
+ cwd = Path.cwd()
16
+ if (cwd / "launcher").exists() and (cwd / "kernel").exists():
17
+ os.environ["KITE_PROJECT"] = str(cwd)
18
+ else:
19
+ print("[Error] 错误: 未找到 KITE_PROJECT 环境变量")
20
+ print("[Info] 请在 Kite 项目目录下运行此命令")
21
+ return 1
22
+
23
+ # 导入启动器的模块扫描器
24
+ project_root = Path(os.environ["KITE_PROJECT"])
25
+ launcher_path = project_root / "launcher"
26
+
27
+ if not launcher_path.exists():
28
+ print(f"[Error] 错误: 未找到 launcher 目录: {launcher_path}")
29
+ return 1
30
+
31
+ # 添加到 sys.path
32
+ if str(launcher_path.parent) not in sys.path:
33
+ sys.path.insert(0, str(launcher_path.parent))
34
+
35
+ try:
36
+ from launcher.module_scanner import ModuleScanner
37
+ except ImportError as e:
38
+ print(f"[Error] 错误: 无法导入 ModuleScanner: {e}")
39
+ return 1
40
+
41
+ # 读取 discovery 配置(如果存在)
42
+ discovery = {}
43
+ discovery_file = launcher_path / "discovery.yaml"
44
+ if discovery_file.exists():
45
+ try:
46
+ import yaml
47
+ with open(discovery_file, "r", encoding="utf-8") as f:
48
+ discovery = yaml.safe_load(f) or {}
49
+ except Exception as e:
50
+ print(f"[Warning] 警告: 无法读取 discovery.yaml: {e}")
51
+
52
+ # 扫描模块
53
+ scanner = ModuleScanner(discovery=discovery, launcher_dir=str(launcher_path))
54
+ modules = scanner.scan()
55
+
56
+ # 手动添加 kernel 模块(ModuleScanner 不扫描 kernel 目录本身)
57
+ kernel_dir_path = project_root / "kernel"
58
+ kernel_module_md = kernel_dir_path / "module.md"
59
+ if kernel_module_md.exists():
60
+ try:
61
+ kernel_info = scanner._try_load(str(kernel_dir_path))
62
+ if kernel_info and kernel_info.name not in modules:
63
+ modules[kernel_info.name] = kernel_info
64
+ except Exception as e:
65
+ print(f"[Warning] 警告: 无法加载 kernel 模块: {e}")
66
+
67
+ if not modules:
68
+ print(t('no_modules'))
69
+ return 0
70
+
71
+ # 分类模块
72
+ kernel_modules = []
73
+ builtin_modules = []
74
+ external_modules = []
75
+
76
+ extensions_dir = project_root / "extensions"
77
+ kernel_dir = project_root / "kernel"
78
+
79
+ for name, info in modules.items():
80
+ module_path = Path(info.module_dir)
81
+
82
+ # 判断模块类型
83
+ # 1. kernel 目录下的模块 = 内核模块
84
+ if module_path.parent == kernel_dir or name == "kernel":
85
+ kernel_modules.append((name, info))
86
+ # 2. extensions 目录下的模块 = 内置模块
87
+ elif module_path.is_relative_to(extensions_dir):
88
+ builtin_modules.append((name, info))
89
+ # 3. 其他位置的模块 = 外置模块
90
+ else:
91
+ external_modules.append((name, info))
92
+
93
+ # 显示结果
94
+ print(t('installed_modules') + "\n")
95
+
96
+ if kernel_modules:
97
+ print(f"【{t('category_kernel')}】")
98
+ for name, info in sorted(kernel_modules, key=lambda x: x[0]):
99
+ _print_module(name, info, verbose)
100
+ print()
101
+
102
+ if builtin_modules:
103
+ print(f"【{t('category_builtin')}】")
104
+ for name, info in sorted(builtin_modules, key=lambda x: x[0]):
105
+ _print_module(name, info, verbose)
106
+ print()
107
+
108
+ if external_modules:
109
+ print(f"【{t('category_external')}】")
110
+ for name, info in sorted(external_modules, key=lambda x: x[0]):
111
+ _print_module(name, info, verbose)
112
+ print()
113
+
114
+ total = len(modules)
115
+ print(t('total_modules', count=total))
116
+ print(t('stats_breakdown', kernel=len(kernel_modules), builtin=len(builtin_modules), external=len(external_modules)))
117
+
118
+ return 0
119
+
120
+
121
+ def _print_module(name, info, verbose):
122
+ """打印单个模块信息"""
123
+ display_name = info.display_name or name
124
+ version = info.version or "unknown"
125
+ state_icon = "✓" if info.state == "enabled" else "○"
126
+
127
+ if verbose:
128
+ print(f" {state_icon} {display_name} (v{version})")
129
+ print(f" 名称: {name}")
130
+ print(f" 类型: {info.type}")
131
+ print(f" 状态: {info.state}")
132
+ print(f" 运行时: {info.runtime}")
133
+ print(f" 入口: {info.entry}")
134
+ print(f" 路径: {info.module_dir}")
135
+ if info.depends_on:
136
+ print(f" 依赖: {', '.join(info.depends_on)}")
137
+ print()
138
+ else:
139
+ # 类型标签国际化
140
+ type_key = f"type_{info.type}"
141
+ type_label = t(type_key) if type_key in ['type_kernel', 'type_infrastructure', 'type_channel', 'type_agent', 'type_service', 'type_tool'] else info.type
142
+ type_badge = f"[{type_label}]"
143
+ print(f" {state_icon} {display_name} (v{version}) {type_badge}")
@@ -0,0 +1,81 @@
1
+ """log 命令实现 - 查看操作日志"""
2
+ from datetime import datetime
3
+ from kite_cli.utils.operation_log import read_operations, get_log_file
4
+ from kite_cli.utils.i18n import t
5
+
6
+
7
+ def run_log(args):
8
+ """执行日志查看命令"""
9
+ limit = args.limit if hasattr(args, 'limit') else 20
10
+ show_path = args.path if hasattr(args, 'path') else False
11
+
12
+ if show_path:
13
+ # 显示日志文件路径
14
+ log_file = get_log_file()
15
+ print(f"[Info] 日志文件路径: {log_file}")
16
+ return 0
17
+
18
+ # 读取操作日志
19
+ operations = read_operations(limit=limit)
20
+
21
+ if not operations:
22
+ print("[Info] 暂无操作记录")
23
+ return 0
24
+
25
+ print(f"[Log] 最近 {len(operations)} 条操作记录:\n")
26
+
27
+ for op in operations:
28
+ timestamp = op.get("timestamp", "unknown")
29
+ operation = op.get("operation", "unknown")
30
+ success = op.get("success", True)
31
+ details = op.get("details", {})
32
+ error = op.get("error")
33
+
34
+ # 格式化时间戳
35
+ try:
36
+ dt = datetime.fromisoformat(timestamp.replace('Z', '+00:00'))
37
+ time_str = dt.strftime("%Y-%m-%d %H:%M:%S")
38
+ except Exception:
39
+ time_str = timestamp
40
+
41
+ # 状态标记
42
+ status = "[Done]" if success else "[Error]"
43
+
44
+ # 操作类型
45
+ if operation == "install":
46
+ module = details.get("module", "unknown")
47
+ version = details.get("version", "")
48
+ location = details.get("location", "")
49
+ print(f"{time_str} {status} install {module} v{version} -> {location}")
50
+ if error:
51
+ print(f" 错误: {error}")
52
+
53
+ elif operation == "uninstall":
54
+ module = details.get("module", "unknown")
55
+ locations = details.get("locations", [])
56
+ if locations:
57
+ loc_str = ", ".join([l["location"] for l in locations])
58
+ print(f"{time_str} {status} uninstall {module} from {loc_str}")
59
+ else:
60
+ print(f"{time_str} {status} uninstall {module}")
61
+ if error:
62
+ print(f" 错误: {error}")
63
+
64
+ elif operation == "update":
65
+ module = details.get("module", "unknown")
66
+ print(f"{time_str} {status} update {module}")
67
+ if error:
68
+ print(f" 错误: {error}")
69
+
70
+ elif operation == "clean":
71
+ cleaned = details.get("cleaned", [])
72
+ print(f"{time_str} {status} clean ({len(cleaned)} items)")
73
+
74
+ else:
75
+ print(f"{time_str} {status} {operation}")
76
+ if error:
77
+ print(f" 错误: {error}")
78
+
79
+ print()
80
+
81
+ return 0
@@ -0,0 +1,49 @@
1
+ """
2
+ kite prepare 命令
3
+
4
+ 打包前的准备工作:
5
+ 1. 扫描所有模块的依赖
6
+ 2. 生成 dependencies_lock.json
7
+ 3. 更新 python_version.json
8
+ """
9
+
10
+ import sys
11
+ from pathlib import Path
12
+
13
+
14
+ def run_prepare(args):
15
+ """执行打包准备"""
16
+ # 导入扫描脚本
17
+ project_root = Path(__file__).parent.parent.parent
18
+
19
+ # 添加到 sys.path
20
+ sys.path.insert(0, str(project_root))
21
+
22
+ # 导入并执行扫描
23
+ from scripts.scan_dependencies import main as scan_main
24
+
25
+ print("=" * 60)
26
+ print(" Kite 打包准备")
27
+ print("=" * 60)
28
+ print()
29
+
30
+ try:
31
+ scan_main()
32
+ print()
33
+ print("✓ 打包准备完成")
34
+ print()
35
+ print("生成的文件:")
36
+ print(f" - {project_root / 'dependencies_lock.json'}")
37
+ print(f" - {project_root / 'python_version.json'}")
38
+ print()
39
+ print("下一步:")
40
+ print(" 1. 检查生成的文件")
41
+ print(" 2. 提交到 git: git add dependencies_lock.json python_version.json")
42
+ print(" 3. 发布: npm publish")
43
+ return 0
44
+
45
+ except Exception as e:
46
+ print(f"\n✗ 打包准备失败: {e}")
47
+ import traceback
48
+ traceback.print_exc()
49
+ return 1
@@ -0,0 +1,88 @@
1
+ """rollback 命令实现 - 回滚最后一次操作"""
2
+ import shutil
3
+ from pathlib import Path
4
+ from kite_cli.utils.operation_log import get_last_operation, log_operation
5
+ from kite_cli.utils.interactive import confirm_action
6
+ from kite_cli.utils.paths import get_install_path
7
+ from kite_cli.utils.i18n import t
8
+
9
+
10
+ def run_rollback(args):
11
+ """执行回滚命令"""
12
+ skip_confirm = args.yes if hasattr(args, 'yes') else False
13
+
14
+ # 获取最后一次成功的操作
15
+ last_op = get_last_operation()
16
+
17
+ if not last_op:
18
+ print("[Error] 没有可回滚的操作")
19
+ return 1
20
+
21
+ if not last_op.get("success"):
22
+ print("[Error] 最后一次操作失败,无法回滚")
23
+ return 1
24
+
25
+ operation = last_op.get("operation")
26
+ details = last_op.get("details", {})
27
+
28
+ if operation == "install":
29
+ return rollback_install(details, skip_confirm)
30
+ elif operation == "uninstall":
31
+ print("[Error] 卸载操作无法自动回滚")
32
+ print("[Info] 请手动重新安装模块")
33
+ return 1
34
+ elif operation == "update":
35
+ print("[Error] 更新操作无法自动回滚")
36
+ print("[Info] 请手动安装旧版本")
37
+ return 1
38
+ else:
39
+ print(f"[Error] 不支持回滚操作类型: {operation}")
40
+ return 1
41
+
42
+
43
+ def rollback_install(details: dict, skip_confirm: bool) -> int:
44
+ """回滚安装操作"""
45
+ module = details.get("module", "unknown")
46
+ location = details.get("location", "")
47
+ path = details.get("path", "")
48
+
49
+ if not path:
50
+ print("[Error] 无法确定模块路径")
51
+ return 1
52
+
53
+ module_path = Path(path)
54
+
55
+ if not module_path.exists():
56
+ print(f"[Warning] 模块已不存在: {module_path}")
57
+ return 0
58
+
59
+ # 确认回滚
60
+ if not skip_confirm:
61
+ if not confirm_action(f"确认回滚安装 {module} (删除 {location})?"):
62
+ print("[Cancelled] 已取消")
63
+ return 1
64
+
65
+ # 删除模块
66
+ try:
67
+ shutil.rmtree(module_path)
68
+ print(f"[Done] 已回滚安装: {module} from {location}")
69
+
70
+ # 记录回滚操作
71
+ log_operation("rollback", {
72
+ "original_operation": "install",
73
+ "module": module,
74
+ "location": location,
75
+ "path": str(module_path)
76
+ }, success=True)
77
+
78
+ return 0
79
+
80
+ except Exception as e:
81
+ print(f"[Error] 回滚失败: {e}")
82
+
83
+ log_operation("rollback", {
84
+ "original_operation": "install",
85
+ "module": module
86
+ }, success=False, error=str(e))
87
+
88
+ return 1
@@ -0,0 +1,73 @@
1
+ """search 命令实现"""
2
+ from kite_cli.core.checker import PlatformChecker
3
+ from kite_cli.utils.i18n import t
4
+
5
+
6
+ def run_search(args):
7
+ """执行搜索命令"""
8
+ keyword = args.keyword
9
+ from_platform = args.from_platform
10
+
11
+ print(t('searching_for', keyword=keyword) + "\n")
12
+
13
+ if from_platform:
14
+ # 指定平台搜索
15
+ results = search_single_platform(keyword, from_platform)
16
+ else:
17
+ # 搜索所有平台
18
+ results = PlatformChecker.check_all(keyword)
19
+
20
+ # 显示结果
21
+ found_count = 0
22
+
23
+ # PyPI
24
+ if results.get("pypi"):
25
+ found_count += 1
26
+ pypi = results["pypi"]
27
+ print(f"【{t('search_pypi')}】")
28
+ print(f" • {pypi['name']}")
29
+ print(f" {t('search_latest_version')}: {pypi['latest']}")
30
+ if len(pypi['versions']) > 1:
31
+ print(f" {t('search_available_versions')}: {', '.join(pypi['versions'][:5])}")
32
+ print()
33
+
34
+ # npm
35
+ if results.get("npm"):
36
+ found_count += 1
37
+ npm = results["npm"]
38
+ print(f"【{t('search_npm')}】")
39
+ print(f" • {npm['name']}")
40
+ print(f" {t('search_version')}: {npm['latest']}")
41
+ print()
42
+
43
+ # Git
44
+ if results.get("git"):
45
+ found_count += len(results["git"])
46
+ print(f"【{t('search_git')}】")
47
+ for repo in results["git"]:
48
+ print(f" • {repo['full_name']}")
49
+ if repo.get("description"):
50
+ print(f" {repo['description']}")
51
+ print(f" {repo['url']}")
52
+ print()
53
+
54
+ if found_count == 0:
55
+ print(t('no_results'))
56
+ return 1
57
+ else:
58
+ print(t('found_results', count=found_count))
59
+ return 0
60
+
61
+
62
+ def search_single_platform(keyword: str, platform: str):
63
+ """搜索单个平台"""
64
+ results = {"pypi": None, "npm": None, "git": None}
65
+
66
+ if platform == "pypi":
67
+ results["pypi"] = PlatformChecker.check_pypi(keyword)
68
+ elif platform == "npm":
69
+ results["npm"] = PlatformChecker.check_npm(keyword)
70
+ elif platform == "git":
71
+ results["git"] = PlatformChecker.check_git(keyword)
72
+
73
+ return results
@@ -0,0 +1,85 @@
1
+ """uninstall 命令实现"""
2
+ import shutil
3
+ from pathlib import Path
4
+ from kite_cli.utils.paths import get_install_path
5
+ from kite_cli.utils.interactive import confirm_action
6
+ from kite_cli.utils.i18n import t
7
+ from kite_cli.utils.operation_log import log_operation
8
+
9
+
10
+ def run_uninstall(args):
11
+ """执行卸载命令"""
12
+ module_name = args.name
13
+ location = args.location
14
+ uninstall_all = args.all
15
+ skip_confirm = args.yes
16
+
17
+ print(t('uninstalling', name=module_name))
18
+
19
+ # 查找模块
20
+ if uninstall_all:
21
+ # 卸载所有位置
22
+ locations = ["dev", "local", "global"]
23
+ elif location:
24
+ # 指定位置
25
+ locations = [location]
26
+ else:
27
+ # 自动查找
28
+ locations = find_module_locations(module_name)
29
+ if not locations:
30
+ print(t('module_not_found', name=module_name))
31
+ return 1
32
+
33
+ # 确认卸载
34
+ if not skip_confirm:
35
+ location_names = ", ".join(locations)
36
+ if not confirm_action(f"{t('uninstalling', name=module_name)} ({location_names})?"):
37
+ print(t('update_cancelled'))
38
+ return 1
39
+
40
+ # 执行卸载
41
+ success_count = 0
42
+ uninstalled_paths = []
43
+ for loc in locations:
44
+ module_path = get_install_path(loc, module_name)
45
+ if module_path.exists():
46
+ try:
47
+ shutil.rmtree(module_path)
48
+ print(t('uninstalled', location=loc, path=module_path))
49
+ success_count += 1
50
+ uninstalled_paths.append({"location": loc, "path": str(module_path)})
51
+ except Exception as e:
52
+ print(f"[Error] {t('update_failed', error=str(e))} ({loc})")
53
+ else:
54
+ print(f"[Warning] {t('module_not_found', name='')} ({loc}): {module_path}")
55
+
56
+ if success_count > 0:
57
+ # 记录操作日志
58
+ log_operation("uninstall", {
59
+ "module": module_name,
60
+ "locations": uninstalled_paths
61
+ }, success=True)
62
+
63
+ print(t('uninstall_complete', count=success_count))
64
+ print(t('restart_hint'))
65
+ return 0
66
+ else:
67
+ log_operation("uninstall", {
68
+ "module": module_name
69
+ }, success=False, error="No modules found")
70
+
71
+ print(t('uninstall_none'))
72
+ return 1
73
+
74
+
75
+ def find_module_locations(module_name: str):
76
+ """查找模块在哪些位置存在"""
77
+ locations = []
78
+ for loc in ["dev", "local", "global"]:
79
+ try:
80
+ module_path = get_install_path(loc, module_name)
81
+ if module_path.exists():
82
+ locations.append(loc)
83
+ except Exception:
84
+ pass
85
+ return locations
@@ -0,0 +1,118 @@
1
+ """update 命令实现"""
2
+ import sys
3
+ import subprocess
4
+ from pathlib import Path
5
+ from kite_cli.utils.paths import get_install_path
6
+ from kite_cli.core.install_info import read_install_info
7
+ from kite_cli.utils.interactive import confirm_action
8
+ from kite_cli.utils.i18n import t
9
+
10
+
11
+ def run_update(args):
12
+ """执行更新命令"""
13
+ module_name = args.name if hasattr(args, 'name') else None
14
+ location = args.location if hasattr(args, 'location') else None
15
+ to_version = args.to_version if hasattr(args, 'to_version') else None
16
+ update_all = args.all if hasattr(args, 'all') else False
17
+ skip_confirm = args.yes if hasattr(args, 'yes') else False
18
+
19
+ if update_all:
20
+ print(t('update_not_implemented'))
21
+ return 1
22
+
23
+ if not module_name:
24
+ print(t('update_specify_name'))
25
+ return 1
26
+
27
+ # 显示更新信息
28
+ if to_version:
29
+ print(t('updating_module', name=f"{module_name} → {to_version}"))
30
+ else:
31
+ print(t('updating_module', name=module_name))
32
+
33
+ # 查找模块
34
+ if location:
35
+ locations = [location]
36
+ else:
37
+ locations = find_module_locations(module_name)
38
+ if not locations:
39
+ print(t('update_not_found', name=module_name))
40
+ return 1
41
+
42
+ # 只更新第一个找到的位置
43
+ loc = locations[0]
44
+ module_path = get_install_path(loc, module_name)
45
+
46
+ # 读取安装信息
47
+ install_info = read_install_info(module_path)
48
+ if not install_info:
49
+ print(t('update_no_install_info'))
50
+ print(t('update_manual_reinstall', name=module_name, location=loc))
51
+ return 1
52
+
53
+ source = install_info.get("source", {})
54
+ source_type = source.get("type")
55
+
56
+ if not source_type:
57
+ print(t('update_incomplete_info'))
58
+ return 1
59
+
60
+ # 构建安装命令
61
+ if source_type == "pypi":
62
+ source_arg = source.get("package", module_name)
63
+ # 如果指定了版本,添加版本号
64
+ if to_version:
65
+ source_arg = f"{source_arg}@{to_version}"
66
+ from_arg = "-f pypi"
67
+ elif source_type == "npm":
68
+ source_arg = source.get("package", module_name)
69
+ # 如果指定了版本,添加版本号
70
+ if to_version:
71
+ source_arg = f"{source_arg}@{to_version}"
72
+ from_arg = "-f npm"
73
+ elif source_type == "git":
74
+ source_arg = source.get("url", "")
75
+ from_arg = "-f git"
76
+ # Git 源不支持版本号
77
+ if to_version:
78
+ print("[Warning] Git 源不支持 --to 参数,将更新到最新提交")
79
+ elif source_type == "local":
80
+ print(t('update_local_no_auto'))
81
+ return 1
82
+ else:
83
+ print(t('update_unknown_source', type=source_type))
84
+ return 1
85
+
86
+ if not skip_confirm:
87
+ confirm_msg = t('update_confirm', name=module_name, source=source_type)
88
+ if to_version:
89
+ confirm_msg = f"确认更新 {module_name} 到版本 {to_version}?"
90
+ if not confirm_action(confirm_msg):
91
+ print(t('update_cancelled'))
92
+ return 1
93
+
94
+ # 调用 install 命令
95
+ print(t('reinstalling', name=module_name))
96
+ try:
97
+ cmd = [
98
+ sys.executable, "-m", "kite_cli", "install",
99
+ source_arg, "-l", loc, from_arg, "-y"
100
+ ]
101
+ result = subprocess.run(cmd, capture_output=False, text=True)
102
+ return result.returncode
103
+ except Exception as e:
104
+ print(t('update_failed', error=str(e)))
105
+ return 1
106
+
107
+
108
+ def find_module_locations(module_name: str):
109
+ """查找模块在哪些位置存在"""
110
+ locations = []
111
+ for loc in ["dev", "local", "global"]:
112
+ try:
113
+ module_path = get_install_path(loc, module_name)
114
+ if module_path.exists():
115
+ locations.append(loc)
116
+ except Exception:
117
+ pass
118
+ return locations
@@ -0,0 +1,56 @@
1
+ """
2
+ kite venv-setup 命令
3
+
4
+ 只负责创建虚拟环境
5
+ """
6
+
7
+ import sys
8
+ from pathlib import Path
9
+
10
+
11
+ def run_venv_setup(args):
12
+ """创建虚拟环境"""
13
+ project_root = Path(__file__).parent.parent.parent
14
+ sys.path.insert(0, str(project_root))
15
+
16
+ from core.env_checker import (
17
+ get_venv_path,
18
+ check_venv_exists,
19
+ create_venv,
20
+ check_python_version
21
+ )
22
+
23
+ print("=" * 60)
24
+ print(" Kite 虚拟环境准备")
25
+ print("=" * 60)
26
+ print()
27
+
28
+ try:
29
+ # 1. 检查 Python 版本
30
+ py_ok, py_version, required_version = check_python_version()
31
+ if not py_ok:
32
+ print(f"✗ Python 版本不匹配: {py_version}(需要 {required_version})")
33
+ return 1
34
+
35
+ print(f"✓ Python 版本: {py_version}")
36
+
37
+ # 2. 检查虚拟环境
38
+ venv_ok, venv_msg = check_venv_exists()
39
+ if venv_ok:
40
+ print(f"✓ 虚拟环境已存在: {get_venv_path()}")
41
+ return 0
42
+
43
+ # 3. 创建虚拟环境
44
+ print(f"正在创建虚拟环境...")
45
+ if not create_venv():
46
+ print("✗ 虚拟环境创建失败")
47
+ return 1
48
+
49
+ print(f"✓ 虚拟环境创建成功: {get_venv_path()}")
50
+ return 0
51
+
52
+ except Exception as e:
53
+ print(f"\n✗ 虚拟环境准备失败: {e}")
54
+ import traceback
55
+ traceback.print_exc()
56
+ return 1
@@ -0,0 +1 @@
1
+ """核心功能模块"""