agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_build.py CHANGED
@@ -1,23 +1,29 @@
1
1
  """
2
2
  agentengine build - 构建 Agent 应用
3
3
 
4
- 支持两种模式:
4
+ 支持三种模式:
5
+ - managed: 仅打包系统无关 runtime manifest
5
6
  - code: 打包 zip + 依赖 → 上传 KS3 (默认)
6
7
  - container: 构建 Docker 镜像
7
8
  """
8
9
 
9
10
  import asyncio
10
- import click
11
11
  import time
12
12
  from datetime import datetime
13
13
  from pathlib import Path
14
- from ksadk.cli.error_utils import abort_with_cli_error, is_debug_mode_enabled, remote_error, validation_error
15
- from ksadk.cli.workflow_common import print_workflow_header, render_workflow_result
14
+
15
+ import click
16
+ import yaml
17
+
18
+ from ksadk.cli.error_utils import (
19
+ abort_with_cli_error,
20
+ is_debug_mode_enabled,
21
+ remote_error,
22
+ validation_error,
23
+ )
16
24
  from ksadk.cli.ui import (
17
25
  capture_standard_output,
18
26
  is_json_output,
19
- output_option as cli_output_option,
20
- print_error,
21
27
  print_info,
22
28
  print_kv,
23
29
  print_next_steps,
@@ -25,6 +31,10 @@ from ksadk.cli.ui import (
25
31
  print_success,
26
32
  print_warn,
27
33
  )
34
+ from ksadk.cli.ui import (
35
+ output_option as cli_output_option,
36
+ )
37
+ from ksadk.cli.workflow_common import print_workflow_header, render_workflow_result
28
38
 
29
39
 
30
40
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@@ -32,16 +42,32 @@ from ksadk.cli.ui import (
32
42
  @click.option(
33
43
  "--mode",
34
44
  "-m",
35
- type=click.Choice(["container", "code"]),
36
- default="code",
37
- help="构建模式: code (默认, zip+KS3) 或 container (Docker)",
45
+ type=click.Choice(["auto", "managed", "container", "code"]),
46
+ default="auto",
47
+ help="构建模式: auto (按配置推断)、managed、code 或 container",
38
48
  )
39
49
  @click.option("--tag", "-t", help="镜像标签 (container 模式)")
40
50
  @click.option("--registry", help="镜像仓库地址 (container 模式)")
41
- @click.option("--push", is_flag=True, help="构建后推送 (镜像到仓库 / zip到KS3)")
42
- @click.option("--no-cache", is_flag=True, help="强制重新构建,不使用缓存 (code: 忽略已有 zip;container: docker --no-cache)")
43
- @click.option("--repackage", is_flag=True, help="Code 模式复用依赖缓存,但强制重新打包当前代码/runtime")
44
- @click.option("--region", "-r", default="cn-beijing-6", envvar="KSYUN_REGION", help="KS3 区域 (code 模式)")
51
+ @click.option(
52
+ "--push",
53
+ is_flag=True,
54
+ help="构建后推送(仅 Container 镜像或 Code zip;ManagedRuntime 不支持)",
55
+ )
56
+ @click.option(
57
+ "--no-cache",
58
+ is_flag=True,
59
+ help="强制重新构建,不使用缓存 (code: 忽略已有 zip;container: docker --no-cache)",
60
+ )
61
+ @click.option(
62
+ "--repackage", is_flag=True, help="Code 模式复用依赖缓存,但强制重新打包当前代码/runtime"
63
+ )
64
+ @click.option(
65
+ "--region",
66
+ "-r",
67
+ default="cn-beijing-6",
68
+ envvar="KSYUN_REGION",
69
+ help="Code 的 KS3 区域,或 ManagedRuntime catalog 查询区域",
70
+ )
45
71
  @click.option("--ks3-bucket", help="KS3 bucket 名称 (code 模式, 默认: agentengine-{region})")
46
72
  @cli_output_option()
47
73
  def build(
@@ -63,7 +89,9 @@ def build(
63
89
 
64
90
  \b
65
91
  模式:
66
- code: 打包 zip + 依赖,上传 KS3 (默认)
92
+ auto: 按 artifact_type 推断 (默认)
93
+ managed: 只打包 ManagedRuntime manifest
94
+ code: 打包 zip + 依赖,上传 KS3
67
95
  container: 构建 Docker 镜像
68
96
 
69
97
  \b
@@ -77,22 +105,29 @@ def build(
77
105
  """
78
106
  _ = output_mode
79
107
  agent_path = Path(agent_dir).resolve()
108
+ effective_mode = _resolve_build_mode(agent_path, mode)
80
109
  try:
81
110
  with capture_standard_output():
82
111
  print_workflow_header(
83
112
  title="Agent 构建",
84
- subtitle=f"mode: {mode}",
113
+ subtitle=f"mode: {effective_mode}",
85
114
  project_dir=agent_path,
86
115
  target="build",
87
- region=region if mode == "code" else None,
116
+ region=region if effective_mode in {"code", "managed"} else None,
88
117
  mode_label="构建模式",
89
- mode_value=mode,
118
+ mode_value=effective_mode,
90
119
  )
91
120
 
92
- if mode == "container":
121
+ if effective_mode == "container":
93
122
  result = _build_container(agent_path, tag, registry, push, no_cache)
123
+ elif effective_mode == "managed":
124
+ result = asyncio.run(
125
+ _build_managed_runtime(agent_path, push, region, ks3_bucket)
126
+ )
94
127
  else:
95
- result = asyncio.run(_build_code(agent_path, push, region, ks3_bucket, no_cache, repackage))
128
+ result = asyncio.run(
129
+ _build_code(agent_path, push, region, ks3_bucket, no_cache, repackage)
130
+ )
96
131
  except Exception as e:
97
132
  if is_debug_mode_enabled():
98
133
  raise
@@ -103,6 +138,91 @@ def build(
103
138
  render_workflow_result(action="build", result=result)
104
139
 
105
140
 
141
+ def _load_build_config(agent_path: Path) -> dict:
142
+ config_path = agent_path / "agentengine.yaml"
143
+ if not config_path.exists():
144
+ config_path = agent_path / "ksadk.yaml"
145
+ if not config_path.exists():
146
+ return {}
147
+ with config_path.open(encoding="utf-8-sig") as stream:
148
+ loaded = yaml.safe_load(stream)
149
+ return loaded if isinstance(loaded, dict) else {}
150
+
151
+
152
+ def _resolve_build_mode(agent_path: Path, requested_mode: str) -> str:
153
+ normalized = str(requested_mode or "auto").strip().lower()
154
+ if normalized != "auto":
155
+ return normalized
156
+ config = _load_build_config(agent_path)
157
+ artifact_type = str(config.get("artifact_type") or "").strip().lower()
158
+ return "managed" if artifact_type == "managedruntime" else "code"
159
+
160
+
161
+ async def _build_managed_runtime(
162
+ agent_path: Path,
163
+ push: bool,
164
+ region: str,
165
+ ks3_bucket: str | None = None,
166
+ ):
167
+ """Build a local, system-independent runtime manifest for review/audit.
168
+
169
+ ManagedRuntime deployment is an inline server contract. Its optional local
170
+ zip is deliberately never published to KS3; the server receives the
171
+ normalized manifest and resolves the managed image itself.
172
+ """
173
+ import json
174
+ from dataclasses import asdict
175
+
176
+ from ksadk.builders import ManagedRuntimeBuilder
177
+ from ksadk.managed_runtime import resolve_managed_runtime
178
+
179
+ if push or ks3_bucket:
180
+ raise validation_error(
181
+ "ManagedRuntime 不使用 KS3;请移除 --push 和 --ks3-bucket。"
182
+ "构建出的本地 zip 仅用于审计,直接执行 `ksadk deploy .` 即可部署。"
183
+ )
184
+
185
+ config = _load_build_config(agent_path)
186
+ resolved = await resolve_managed_runtime(config, region=region)
187
+ builder = ManagedRuntimeBuilder(agent_path, runtime_version=resolved.version)
188
+ result = builder.build()
189
+ if not result.success or result.artifact_path is None:
190
+ raise validation_error(result.error_message or "ManagedRuntime manifest 构建失败")
191
+
192
+ metadata_file = agent_path / ".agentengine" / "build-metadata.json"
193
+ metadata_file.parent.mkdir(parents=True, exist_ok=True)
194
+ data = asdict(result)
195
+ metadata_file.write_text(
196
+ json.dumps(
197
+ data,
198
+ ensure_ascii=False,
199
+ indent=2,
200
+ default=lambda value: str(value) if isinstance(value, Path) else value,
201
+ ),
202
+ encoding="utf-8",
203
+ )
204
+
205
+ _print_summary("ManagedRuntime", result, show_next_step=True)
206
+ return {
207
+ "framework": str(result.metadata.get("framework") or "codex"),
208
+ "artifact_type": "managedruntime",
209
+ "artifact_source": "built",
210
+ "artifact_reused": False,
211
+ "artifact_built": True,
212
+ "artifact_reference": str(result.artifact_path),
213
+ "artifact_path": str(result.artifact_path),
214
+ "artifact_size_mb": float(result.artifact_size_mb),
215
+ "ks3_path": "",
216
+ "ks3_public_url": "",
217
+ "ks3_internal_url": "",
218
+ "runtime_name": resolved.name,
219
+ "runtime_version": resolved.version,
220
+ "runtime_version_source": resolved.source,
221
+ "manifest_sha256": str(result.metadata.get("manifest_sha256") or ""),
222
+ "push": False,
223
+ }
224
+
225
+
106
226
  def _build_container(agent_path: Path, tag: str, registry: str, push: bool, no_cache: bool):
107
227
  """Container 模式构建"""
108
228
  from ksadk.builders import ContainerBuilder
@@ -126,7 +246,10 @@ def _build_container(agent_path: Path, tag: str, registry: str, push: bool, no_c
126
246
  )
127
247
 
128
248
  print_next_steps(
129
- [f"agentengine deploy --target serverless --image {result.metadata['image']} --artifact-type Container"]
249
+ [
250
+ "agentengine deploy --target serverless "
251
+ f"--image {result.metadata['image']} --artifact-type Container"
252
+ ]
130
253
  )
131
254
 
132
255
  # 摘要
@@ -147,14 +270,16 @@ async def _build_code(
147
270
  agent_path: Path,
148
271
  push: bool,
149
272
  region: str,
150
- ks3_bucket: str = None,
273
+ ks3_bucket: str | None = None,
151
274
  no_cache: bool = False,
152
275
  repackage: bool = False,
153
276
  ):
154
277
  """Code 模式构建"""
155
278
  from ksadk.builders import CodeBuilder, KS3Uploader
156
279
 
157
- builder = CodeBuilder(project_dir=agent_path, config={"no_cache": no_cache, "repackage": repackage})
280
+ builder = CodeBuilder(
281
+ project_dir=agent_path, config={"no_cache": no_cache, "repackage": repackage}
282
+ )
158
283
  result = builder.build()
159
284
 
160
285
  if not result.success:
@@ -167,17 +292,19 @@ async def _build_code(
167
292
  ks3_internal_url = None
168
293
 
169
294
  if push:
295
+ if result.artifact_path is None:
296
+ raise validation_error("构建成功但未生成代码包路径")
170
297
  print_rule("上传到 KS3")
171
298
  upload_started_at = time.monotonic()
172
-
299
+
173
300
  # 预发特殊逻辑: region 为 pre-online 时,资源上传到 cn-beijing-6
174
301
  upload_region = "cn-beijing-6" if region == "pre-online" else region
175
-
302
+
176
303
  if region == "pre-online":
177
304
  print_warn("预发环境: 资源将上传到 cn-beijing-6 region")
178
-
305
+
179
306
  uploader = KS3Uploader(region=upload_region, bucket=ks3_bucket)
180
-
307
+
181
308
  # 使用时间戳确保每次上传的代码包路径唯一,支持真正的版本回滚
182
309
  timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
183
310
  object_key = f"agents/{agent_name}/code_{timestamp}.zip"
@@ -189,7 +316,7 @@ async def _build_code(
189
316
  # 更新 metadata 以便持久化
190
317
  result.metadata["ks3_path"] = ks3_path
191
318
  result.metadata["pushed"] = True
192
-
319
+
193
320
  ks3_public_url = uploader.get_public_url_by_key(object_key)
194
321
  ks3_internal_url = uploader.get_internal_url_by_key(object_key)
195
322
  print_kv("公网地址", ks3_public_url or "-")
@@ -206,7 +333,7 @@ async def _build_code(
206
333
  try:
207
334
  import json
208
335
  from dataclasses import asdict
209
-
336
+
210
337
  # 自定义序列化: 处理 Path 对象
211
338
  def default_serializer(obj):
212
339
  if isinstance(obj, Path):
@@ -228,7 +355,9 @@ async def _build_code(
228
355
  return {
229
356
  "framework": result.metadata.get("framework", "unknown"),
230
357
  "artifact_type": "code",
231
- "artifact_source": "built_and_uploaded" if push and result.metadata.get("ks3_path") else "built",
358
+ "artifact_source": (
359
+ "built_and_uploaded" if push and result.metadata.get("ks3_path") else "built"
360
+ ),
232
361
  "artifact_reused": bool(result.metadata.get("reused", False)),
233
362
  "artifact_built": True,
234
363
  "artifact_reference": str(result.metadata.get("ks3_path") or result.artifact_path or ""),
@@ -7,8 +7,10 @@ agentengine completion - Shell 自动补全安装
7
7
  import os
8
8
  import re
9
9
  import sys
10
- import click
11
10
  from pathlib import Path
11
+
12
+ import click
13
+
12
14
  from ksadk.cli.error_utils import ensure_json_output_supported, print_exception
13
15
  from ksadk.cli.resource_common import CONTEXT_SETTINGS
14
16
  from ksadk.cli.ui import (
@@ -63,7 +65,12 @@ def _resolve_bash_rc_file(home: Path) -> Path:
63
65
 
64
66
 
65
67
  def _has_zsh_compinit(rc_content: str) -> bool:
66
- return re.search(r"(?m)^\s*(?:autoload\s+-Uz\s+compinit(?:\s*&&\s*compinit)?|compinit)\s*$", rc_content) is not None
68
+ return (
69
+ re.search(
70
+ r"(?m)^\s*(?:autoload\s+-Uz\s+compinit(?:\s*&&\s*compinit)?|compinit)\s*$", rc_content
71
+ )
72
+ is not None
73
+ )
67
74
 
68
75
 
69
76
  def _rewrite_zsh_rc(rc_content: str, completion_file: Path, init_line: str) -> tuple[str, bool]:
@@ -72,7 +79,9 @@ def _rewrite_zsh_rc(rc_content: str, completion_file: Path, init_line: str) -> t
72
79
 
73
80
  # 清理旧的 AgentEngine 自动补全配置,避免重复 source / eval。
74
81
  updated = re.sub(
75
- r'(?ms)^\s*if command -v agentengine >/dev/null 2>&1; then\s*\n\s*eval "\$\(_AGENTENGINE_COMPLETE=zsh_source agentengine\)"\s*\n\s*fi\s*\n?',
82
+ r"(?ms)^\s*if command -v agentengine >/dev/null 2>&1; then\s*\n"
83
+ r'\s*eval "\$\(_AGENTENGINE_COMPLETE=zsh_source agentengine\)"\s*\n'
84
+ r"\s*fi\s*\n?",
76
85
  "",
77
86
  rc_content,
78
87
  )
@@ -87,7 +96,7 @@ def _rewrite_zsh_rc(rc_content: str, completion_file: Path, init_line: str) -> t
87
96
  updated,
88
97
  )
89
98
  updated = re.sub(
90
- r'(?m)^\s*# AgentEngine CLI 自动补全\s*$\n?',
99
+ r"(?m)^\s*# AgentEngine CLI 自动补全\s*$\n?",
91
100
  "",
92
101
  updated,
93
102
  )
@@ -116,9 +125,9 @@ def _rewrite_bash_rc(rc_content: str, completion_file: Path) -> str:
116
125
  rc_content,
117
126
  )
118
127
  updated = re.sub(
119
- r'(?m)^\s*if command -v agentengine >/dev/null 2>&1; then\s*$\n?'
128
+ r"(?m)^\s*if command -v agentengine >/dev/null 2>&1; then\s*$\n?"
120
129
  r'^\s*eval "\$\(_AGENTENGINE_COMPLETE=bash_source agentengine\)"\s*$\n?'
121
- r'^\s*fi\s*$\n?',
130
+ r"^\s*fi\s*$\n?",
122
131
  "",
123
132
  updated,
124
133
  )
@@ -128,7 +137,7 @@ def _rewrite_bash_rc(rc_content: str, completion_file: Path) -> str:
128
137
  updated,
129
138
  )
130
139
  updated = re.sub(
131
- r'(?m)^\s*# AgentEngine CLI 自动补全\s*$\n?',
140
+ r"(?m)^\s*# AgentEngine CLI 自动补全\s*$\n?",
132
141
  "",
133
142
  updated,
134
143
  )
@@ -140,7 +149,7 @@ def _rewrite_bash_rc(rc_content: str, completion_file: Path) -> str:
140
149
  @completion.command("bash", context_settings=CONTEXT_SETTINGS)
141
150
  def completion_bash():
142
151
  """输出 Bash 补全脚本"""
143
- script = '''
152
+ script = """
144
153
  _agentengine_completion() {
145
154
  local IFS=$'\\n'
146
155
  local line
@@ -165,14 +174,14 @@ _agentengine_completion() {
165
174
  }
166
175
 
167
176
  complete -o default -F _agentengine_completion agentengine
168
- '''
177
+ """
169
178
  click.echo(script.strip())
170
179
 
171
180
 
172
181
  @completion.command("zsh", context_settings=CONTEXT_SETTINGS)
173
182
  def completion_zsh():
174
183
  """输出 Zsh 补全脚本"""
175
- script = '''
184
+ script = """
176
185
  #compdef agentengine
177
186
 
178
187
  _agentengine() {
@@ -201,18 +210,22 @@ _agentengine() {
201
210
  }
202
211
 
203
212
  compdef _agentengine agentengine
204
- '''
213
+ """
205
214
  click.echo(script.strip())
206
215
 
207
216
 
208
217
  @completion.command("install", context_settings=CONTEXT_SETTINGS)
209
- @click.option("--shell", type=click.Choice(["bash", "zsh", "auto"]), default="auto",
210
- help="指定 Shell 类型")
218
+ @click.option(
219
+ "--shell", type=click.Choice(["bash", "zsh", "auto"]), default="auto", help="指定 Shell 类型"
220
+ )
211
221
  def completion_install(shell: str):
212
222
  """自动安装补全脚本到 Shell 配置文件"""
213
223
  ensure_json_output_supported(
214
224
  "agentengine completion install",
215
- suggestion="请直接使用 `agentengine completion bash` 或 `agentengine completion zsh` 获取脚本内容。",
225
+ suggestion=(
226
+ "请直接使用 `agentengine completion bash` 或 `agentengine completion zsh` "
227
+ "获取脚本内容。"
228
+ ),
216
229
  )
217
230
  print_title("安装自动补全")
218
231
 
@@ -224,59 +237,57 @@ def completion_install(shell: str):
224
237
  print_info("请使用 --shell=bash 或 --shell=zsh 指定")
225
238
  return
226
239
  shell = resolved_shell
227
-
240
+
228
241
  home = Path.home()
229
-
242
+
230
243
  if shell == "zsh":
231
244
  rc_file = home / ".zshrc"
232
245
  completion_file = home / ".agentengine-complete.zsh"
233
- completion_cmd = '_AGENTENGINE_COMPLETE=zsh_source agentengine'
246
+ completion_cmd = "_AGENTENGINE_COMPLETE=zsh_source agentengine"
234
247
  init_line = "autoload -Uz compinit && compinit"
235
248
  else: # bash
236
249
  rc_file = _resolve_bash_rc_file(home)
237
250
  completion_file = home / ".agentengine-complete.bash"
238
- completion_cmd = '_AGENTENGINE_COMPLETE=bash_source agentengine'
251
+ completion_cmd = "_AGENTENGINE_COMPLETE=bash_source agentengine"
239
252
  init_line = None
240
-
253
+
241
254
  print_kv("目标 Shell", shell, value_style="#58a6ff")
242
- print_kv("配置文件", rc_file, value_style="#58a6ff")
255
+ print_kv("配置文件", str(rc_file), value_style="#58a6ff")
243
256
  print_info("正在安装补全脚本...")
244
-
257
+
245
258
  # 生成补全脚本
246
259
  try:
247
260
  import subprocess
261
+
248
262
  env = os.environ.copy()
249
263
  env["_AGENTENGINE_COMPLETE"] = f"{shell}_source"
250
-
264
+
251
265
  result = subprocess.run(
252
- [sys.executable, "-m", "ksadk.cli"],
253
- env=env,
254
- capture_output=True,
255
- text=True
266
+ [sys.executable, "-m", "ksadk.cli"], env=env, capture_output=True, text=True
256
267
  )
257
-
268
+
258
269
  completion_script = result.stdout
259
-
270
+
260
271
  if not completion_script.strip():
261
272
  print_error("生成补全脚本失败")
262
273
  print_info("请尝试手动安装:")
263
274
  print_info(f"{completion_cmd} > {completion_file}")
264
- print_info(f'echo \'source "{completion_file}"\' >> {rc_file}')
275
+ print_info(f"echo 'source \"{completion_file}\"' >> {rc_file}")
265
276
  return
266
-
277
+
267
278
  # 写入补全脚本文件
268
279
  with open(completion_file, "w") as f:
269
280
  f.write(completion_script)
270
-
281
+
271
282
  print_success(f"补全脚本已保存到: {completion_file}")
272
-
283
+
273
284
  except Exception as e:
274
285
  print_exception("生成补全脚本失败", e)
275
286
  print_info("请尝试手动安装:")
276
287
  print_info(f"{completion_cmd} > {completion_file}")
277
- print_info(f'echo \'source "{completion_file}"\' >> {rc_file}')
288
+ print_info(f"echo 'source \"{completion_file}\"' >> {rc_file}")
278
289
  return
279
-
290
+
280
291
  # 检查并更新 rc 文件
281
292
  rc_content = ""
282
293
  if rc_file.exists():
@@ -284,6 +295,7 @@ def completion_install(shell: str):
284
295
  rc_content = f.read()
285
296
 
286
297
  if shell == "zsh":
298
+ assert init_line is not None
287
299
  updated_rc, added_compinit = _rewrite_zsh_rc(rc_content, completion_file, init_line)
288
300
  if added_compinit:
289
301
  print_success("已添加 compinit 初始化")
@@ -297,7 +309,7 @@ def completion_install(shell: str):
297
309
  f.write(updated_rc)
298
310
  else:
299
311
  print_info("补全配置已存在,跳过")
300
-
312
+
301
313
  print_success("安装完成")
302
314
  print_info("请运行以下命令使其生效:")
303
315
  print_kv("命令", f"source {rc_file}", value_style="#58a6ff")