agentengine-sdk-python 0.6.2__py3-none-any.whl → 0.6.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. agentengine_sdk_python-0.6.9.dist-info/METADATA +179 -0
  2. agentengine_sdk_python-0.6.9.dist-info/RECORD +487 -0
  3. {agentengine_sdk_python-0.6.2.dist-info → agentengine_sdk_python-0.6.9.dist-info}/WHEEL +1 -1
  4. agentengine_sdk_python-0.6.9.dist-info/entry_points.txt +3 -0
  5. agentengine_sdk_python-0.6.9.dist-info/licenses/LICENSE +175 -0
  6. agentengine_sdk_python-0.6.9.dist-info/top_level.txt +2 -0
  7. ksadk/__init__.py +13 -0
  8. ksadk/__main__.py +4 -0
  9. ksadk/a2a/__init__.py +15 -0
  10. ksadk/a2a/card_builder.py +64 -0
  11. ksadk/a2a/client.py +309 -0
  12. ksadk/a2a/executor.py +201 -0
  13. ksadk/a2a/server.py +79 -0
  14. ksadk/agents/__init__.py +20 -0
  15. ksadk/agents/base.py +370 -0
  16. ksadk/agents/context.py +38 -0
  17. ksadk/agents/event.py +35 -0
  18. ksadk/agents/loop_agent.py +71 -0
  19. ksadk/agents/parallel_agent.py +109 -0
  20. ksadk/agents/runner_adapter.py +24 -0
  21. ksadk/agents/sequential_agent.py +34 -0
  22. ksadk/api/__init__.py +3 -0
  23. ksadk/api/client.py +2227 -0
  24. ksadk/builders/__init__.py +20 -0
  25. ksadk/builders/base.py +66 -0
  26. ksadk/builders/code_builder.py +1990 -0
  27. ksadk/builders/container_builder.py +786 -0
  28. ksadk/builders/framework_requirements.py +59 -0
  29. ksadk/builders/ks3_uploader.py +389 -0
  30. ksadk/builders/mcp_builder.py +476 -0
  31. ksadk/builders/requirements_utils.py +75 -0
  32. ksadk/cli/__init__.py +531 -0
  33. ksadk/cli/__main__.py +4 -0
  34. ksadk/cli/agent_ref.py +204 -0
  35. ksadk/cli/cmd_a2a.py +167 -0
  36. ksadk/cli/cmd_agent.py +201 -0
  37. ksadk/cli/cmd_build.py +270 -0
  38. ksadk/cli/cmd_completion.py +304 -0
  39. ksadk/cli/cmd_config.py +758 -0
  40. ksadk/cli/cmd_create.py +2277 -0
  41. ksadk/cli/cmd_dashboard.py +900 -0
  42. ksadk/cli/cmd_deploy.py +704 -0
  43. ksadk/cli/cmd_destroy.py +345 -0
  44. ksadk/cli/cmd_files.py +1227 -0
  45. ksadk/cli/cmd_hermes.py +1259 -0
  46. ksadk/cli/cmd_invoke.py +1336 -0
  47. ksadk/cli/cmd_launch.py +564 -0
  48. ksadk/cli/cmd_mcp.py +1174 -0
  49. ksadk/cli/cmd_model.py +302 -0
  50. ksadk/cli/cmd_openclaw.py +3918 -0
  51. ksadk/cli/cmd_run.py +232 -0
  52. ksadk/cli/cmd_status.py +588 -0
  53. ksadk/cli/cmd_version.py +522 -0
  54. ksadk/cli/cmd_web.py +288 -0
  55. ksadk/cli/deploy_utils.py +87 -0
  56. ksadk/cli/dry_run.py +214 -0
  57. ksadk/cli/env_options.py +82 -0
  58. ksadk/cli/error_utils.py +525 -0
  59. ksadk/cli/global_options.py +31 -0
  60. ksadk/cli/local_runtime.py +97 -0
  61. ksadk/cli/model_catalog.py +136 -0
  62. ksadk/cli/network_options.py +410 -0
  63. ksadk/cli/resource_common.py +621 -0
  64. ksadk/cli/storage.py +84 -0
  65. ksadk/cli/ui.py +431 -0
  66. ksadk/cli/workflow_common.py +552 -0
  67. ksadk/common/__init__.py +14 -0
  68. ksadk/common/aicp_env.py +128 -0
  69. ksadk/common/auth.py +190 -0
  70. ksadk/common/constants.py +84 -0
  71. ksadk/common/llm_utils.py +61 -0
  72. ksadk/configs/__init__.py +61 -0
  73. ksadk/configs/env_registry.py +342 -0
  74. ksadk/configs/global_config.py +200 -0
  75. ksadk/configs/settings.py +706 -0
  76. ksadk/conversations/__init__.py +95 -0
  77. ksadk/conversations/attachment_storage.py +379 -0
  78. ksadk/conversations/attachments.py +774 -0
  79. ksadk/conversations/compaction_pipeline.py +387 -0
  80. ksadk/conversations/compaction_prompt.py +128 -0
  81. ksadk/conversations/context.py +303 -0
  82. ksadk/conversations/model_context.py +360 -0
  83. ksadk/conversations/model_options.py +136 -0
  84. ksadk/conversations/normalize.py +446 -0
  85. ksadk/conversations/reasoning_markup.py +91 -0
  86. ksadk/conversations/run_kinds.py +61 -0
  87. ksadk/conversations/run_status.py +53 -0
  88. ksadk/conversations/runtime.py +5208 -0
  89. ksadk/conversations/semantic_summary.py +359 -0
  90. ksadk/conversations/session_title.py +254 -0
  91. ksadk/deployment/__init__.py +83 -0
  92. ksadk/deployment/agent_access.py +226 -0
  93. ksadk/deployment/base.py +229 -0
  94. ksadk/deployment/manager.py +332 -0
  95. ksadk/deployment/providers/__init__.py +10 -0
  96. ksadk/deployment/providers/serverless.py +1105 -0
  97. ksadk/deployment/registry.py +120 -0
  98. ksadk/deployment/state.py +78 -0
  99. ksadk/deployment/ui_config.py +21 -0
  100. ksadk/detection/__init__.py +7 -0
  101. ksadk/detection/detector.py +431 -0
  102. ksadk/detection/mcp_detector.py +250 -0
  103. ksadk/hermes_terminal.py +467 -0
  104. ksadk/identity/__init__.py +17 -0
  105. ksadk/identity/resolver.py +385 -0
  106. ksadk/knowledge_base/__init__.py +62 -0
  107. ksadk/knowledge_base/adk_tool.py +47 -0
  108. ksadk/knowledge_base/client.py +297 -0
  109. ksadk/knowledge_base/langchain_tool.py +55 -0
  110. ksadk/knowledge_base/service.py +66 -0
  111. ksadk/knowledge_base/tool.py +50 -0
  112. ksadk/markdown.py +169 -0
  113. ksadk/mcp_runtime/__init__.py +231 -0
  114. ksadk/memory/__init__.py +57 -0
  115. ksadk/memory/adk/__init__.py +51 -0
  116. ksadk/memory/adk/backends/__init__.py +5 -0
  117. ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
  118. ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
  119. ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
  120. ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
  121. ksadk/memory/adk/long_term_memory.py +273 -0
  122. ksadk/memory/adk/short_term_memory.py +289 -0
  123. ksadk/memory/adk_tool.py +31 -0
  124. ksadk/memory/backends/__init__.py +6 -0
  125. ksadk/memory/backends/base.py +103 -0
  126. ksadk/memory/backends/memory.py +112 -0
  127. ksadk/memory/backends/redis.py +146 -0
  128. ksadk/memory/langchain_tool.py +39 -0
  129. ksadk/memory/ltm_backend_factory.py +24 -0
  130. ksadk/memory/manager.py +215 -0
  131. ksadk/memory/service.py +172 -0
  132. ksadk/memory/tool.py +96 -0
  133. ksadk/model_policy.py +223 -0
  134. ksadk/openclaw_gateway.py +378 -0
  135. ksadk/runners/__init__.py +8 -0
  136. ksadk/runners/adk_runner.py +1135 -0
  137. ksadk/runners/base_runner.py +305 -0
  138. ksadk/runners/deepagents_runner.py +13 -0
  139. ksadk/runners/factory.py +73 -0
  140. ksadk/runners/langchain_runner.py +539 -0
  141. ksadk/runners/langgraph_runner.py +852 -0
  142. ksadk/runners/patch_langchain.py +187 -0
  143. ksadk/runners/remote_runner.py +667 -0
  144. ksadk/runners/usage_accumulator.py +38 -0
  145. ksadk/runners/utils/__init__.py +19 -0
  146. ksadk/runners/utils/langfuse.py +230 -0
  147. ksadk/runners/utils/loader.py +62 -0
  148. ksadk/runtime_context.py +166 -0
  149. ksadk/runtime_state.py +25 -0
  150. ksadk/sandbox/__init__.py +28 -0
  151. ksadk/sandbox/backends/__init__.py +9 -0
  152. ksadk/sandbox/backends/e2b.py +154 -0
  153. ksadk/sandbox/backends/local_process.py +131 -0
  154. ksadk/sandbox/base.py +101 -0
  155. ksadk/sandbox/factory.py +53 -0
  156. ksadk/sandbox/registry.py +187 -0
  157. ksadk/server/__init__.py +7 -0
  158. ksadk/server/api_models.py +73 -0
  159. ksadk/server/app.py +3789 -0
  160. ksadk/server/static/assets/ArtifactsPanel-C0meuOdi.js +1 -0
  161. ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +9 -0
  162. ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  163. ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  164. ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  165. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  166. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  167. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  168. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  169. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  170. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  171. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  172. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  173. ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  174. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  175. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  176. ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  177. ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  178. ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  179. ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  180. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  181. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  182. ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  183. ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  184. ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  185. ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  186. ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  187. ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  188. ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  189. ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  190. ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  191. ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  192. ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  193. ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  194. ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  195. ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  196. ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  197. ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  198. ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  199. ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  200. ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  201. ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  202. ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  203. ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  204. ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  205. ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  206. ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  207. ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  208. ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  209. ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  210. ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  211. ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  212. ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  213. ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  214. ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  215. ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  216. ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  217. ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  218. ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  219. ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  220. ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  221. ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +8 -0
  222. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
  223. ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +303 -0
  224. ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +1 -0
  226. ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
  227. ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
  228. ksadk/server/static/assets/arc-bj2rZnP5.js +1 -0
  229. ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +1 -0
  230. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-2u1ltDIj.js +36 -0
  231. ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
  232. ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
  233. ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
  234. ksadk/server/static/assets/blockDiagram-GPEHLZMM-D6fvdK20.js +132 -0
  235. ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
  236. ksadk/server/static/assets/c4Diagram-AAUBKEIU-BK82L5n5.js +10 -0
  237. ksadk/server/static/assets/channel-BSSOwFIb.js +1 -0
  238. ksadk/server/static/assets/chunk-2J33WTMH-DLVdkeyQ.js +1 -0
  239. ksadk/server/static/assets/chunk-4BX2VUAB-BbwsYcbW.js +1 -0
  240. ksadk/server/static/assets/chunk-55IACEB6-DOairxzw.js +1 -0
  241. ksadk/server/static/assets/chunk-727SXJPM-hCO487gs.js +206 -0
  242. ksadk/server/static/assets/chunk-AQP2D5EJ-XU8vDOuG.js +231 -0
  243. ksadk/server/static/assets/chunk-FMBD7UC4-PrapyfMu.js +15 -0
  244. ksadk/server/static/assets/chunk-ND2GUHAM-CboKhTZ3.js +1 -0
  245. ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +1 -0
  246. ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +1 -0
  247. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +1 -0
  248. ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
  249. ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
  250. ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
  251. ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
  252. ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
  253. ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
  254. ksadk/server/static/assets/cose-bilkent-S5V4N54A-_N8bJ-EU.js +1 -0
  255. ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
  256. ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
  257. ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
  258. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
  259. ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
  260. ksadk/server/static/assets/dagre-BM42HDAG-FoDlo5J2.js +4 -0
  261. ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
  262. ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
  263. ksadk/server/static/assets/diagram-2AECGRRQ-BBp6ebBw.js +43 -0
  264. ksadk/server/static/assets/diagram-5GNKFQAL-CqOvG1PR.js +10 -0
  265. ksadk/server/static/assets/diagram-KO2AKTUF-O9T3t6ba.js +3 -0
  266. ksadk/server/static/assets/diagram-LMA3HP47-CGG8ekBO.js +24 -0
  267. ksadk/server/static/assets/diagram-OG6HWLK6-4BmH1EEg.js +24 -0
  268. ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
  269. ksadk/server/static/assets/dist-6kSZvCZh.js +1 -0
  270. ksadk/server/static/assets/dist-B67uF2uK.js +1 -0
  271. ksadk/server/static/assets/dist-BMKM66B4.js +1 -0
  272. ksadk/server/static/assets/dist-BVzcWa6D.js +1 -0
  273. ksadk/server/static/assets/dist-Bk1l05Ni.js +1 -0
  274. ksadk/server/static/assets/dist-BkJjNih3.js +1 -0
  275. ksadk/server/static/assets/dist-BmuTWcm7.js +9 -0
  276. ksadk/server/static/assets/dist-C2DKRFVK.js +1 -0
  277. ksadk/server/static/assets/dist-CWiTDN_V.js +6 -0
  278. ksadk/server/static/assets/dist-CZ6C3x8B.js +23 -0
  279. ksadk/server/static/assets/dist-CiZHB6ZW.js +1 -0
  280. ksadk/server/static/assets/dist-Cp1_jKwf.js +1 -0
  281. ksadk/server/static/assets/dist-Cwhk4lwI.js +2 -0
  282. ksadk/server/static/assets/dist-D5JGcxBx.js +11 -0
  283. ksadk/server/static/assets/dist-D99wf6_X.js +1 -0
  284. ksadk/server/static/assets/dist-DCpZrjaK.js +1 -0
  285. ksadk/server/static/assets/dist-DI-oVAXw.js +1 -0
  286. ksadk/server/static/assets/dist-DLMjL01k.js +1 -0
  287. ksadk/server/static/assets/dist-DLeM1OCK.js +1 -0
  288. ksadk/server/static/assets/dist-DM0rEQPk.js +1 -0
  289. ksadk/server/static/assets/dist-DbaH3p5h.js +1 -0
  290. ksadk/server/static/assets/dist-S4klkK5W.js +1 -0
  291. ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
  292. ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
  293. ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
  294. ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
  295. ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
  296. ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
  297. ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
  298. ksadk/server/static/assets/erDiagram-TEJ5UH35-oJhaci7S.js +85 -0
  299. ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
  300. ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +1 -0
  301. ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
  302. ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
  303. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DtTmUan-.js +162 -0
  304. ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
  305. ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
  306. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BSsb_eij.js +292 -0
  307. ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
  308. ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
  309. ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +1 -0
  310. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-BR5s6Pws.js +106 -0
  311. ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
  312. ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
  313. ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
  314. ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
  315. ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
  316. ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
  317. ksadk/server/static/assets/index-BH7-pC0B.js +165 -0
  318. ksadk/server/static/assets/index-DAURbCsP.css +1 -0
  319. ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +1 -0
  320. ksadk/server/static/assets/infoDiagram-5YYISTIA-DYPc5cvh.js +2 -0
  321. ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
  322. ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-MoBdALDg.js +70 -0
  323. ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
  324. ksadk/server/static/assets/journeyDiagram-JHISSGLW-DgLiQT8l.js +139 -0
  325. ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
  326. ksadk/server/static/assets/kanban-definition-UN3LZRKU-CsFx112F.js +89 -0
  327. ksadk/server/static/assets/katex-DRsiwpM2.js +265 -0
  328. ksadk/server/static/assets/linear-TNRQ5Orv.js +1 -0
  329. ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
  330. ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
  331. ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
  332. ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
  333. ksadk/server/static/assets/mermaid-parser.core-D2eMVOgo.js +161 -0
  334. ksadk/server/static/assets/mindmap-definition-RKZ34NQL-BtByYFhL.js +96 -0
  335. ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
  336. ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
  337. ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
  338. ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
  339. ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
  340. ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
  341. ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
  342. ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
  343. ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
  344. ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
  345. ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
  346. ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +1 -0
  347. ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
  348. ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
  349. ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +1 -0
  350. ksadk/server/static/assets/pieDiagram-4H26LBE5-DPnuCB8c.js +30 -0
  351. ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
  352. ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
  353. ksadk/server/static/assets/properties-C357ku5U.js +1 -0
  354. ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
  355. ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
  356. ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
  357. ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
  358. ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
  359. ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-miFpCPv4.js +7 -0
  360. ksadk/server/static/assets/r-DADKenSm.js +1 -0
  361. ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +1 -0
  362. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-mjB_yYkW.js +84 -0
  363. ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
  364. ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
  365. ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-D7hSlZZZ.js +40 -0
  366. ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
  367. ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
  368. ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-D9Cx6hC3.js +162 -0
  369. ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
  370. ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
  371. ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
  372. ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
  373. ksadk/server/static/assets/solr-BBopId9w.js +1 -0
  374. ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
  375. ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
  376. ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
  377. ksadk/server/static/assets/stateDiagram-AJRCARHV-D_zrg47o.js +1 -0
  378. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +1 -0
  379. ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
  380. ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
  381. ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
  382. ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
  383. ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
  384. ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
  385. ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
  386. ksadk/server/static/assets/timeline-definition-PNZ67QCA-CwSec0Wa.js +120 -0
  387. ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
  388. ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +1 -0
  389. ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +1 -0
  390. ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
  391. ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
  392. ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
  393. ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
  394. ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
  395. ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
  396. ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
  397. ksadk/server/static/assets/vennDiagram-CIIHVFJN-agCVobiF.js +34 -0
  398. ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
  399. ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
  400. ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +1 -0
  401. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-TmrlhWNt.js +78 -0
  402. ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
  403. ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
  404. ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
  405. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-DV71V-ah.js +7 -0
  406. ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
  407. ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
  408. ksadk/server/static/favicon.svg +1 -0
  409. ksadk/server/static/icons.svg +24 -0
  410. ksadk/server/static/index.html +14 -0
  411. ksadk/server/terminal_sessions.py +551 -0
  412. ksadk/sessions/__init__.py +283 -0
  413. ksadk/sessions/base.py +354 -0
  414. ksadk/sessions/continuity.py +313 -0
  415. ksadk/sessions/errors.py +7 -0
  416. ksadk/sessions/in_memory.py +273 -0
  417. ksadk/sessions/local_service.py +949 -0
  418. ksadk/sessions/postgres_service.py +838 -0
  419. ksadk/sessions/sqlite_service.py +13 -0
  420. ksadk/skills/__init__.py +9 -0
  421. ksadk/skills/loader.py +46 -0
  422. ksadk/skills/models.py +120 -0
  423. ksadk/skills/package_store.py +104 -0
  424. ksadk/skills/runtime/__init__.py +17 -0
  425. ksadk/skills/runtime/agent.py +183 -0
  426. ksadk/skills/runtime/artifacts.py +39 -0
  427. ksadk/skills/runtime/backends/__init__.py +1 -0
  428. ksadk/skills/runtime/backends/disabled.py +8 -0
  429. ksadk/skills/runtime/backends/e2b.py +168 -0
  430. ksadk/skills/runtime/backends/local.py +95 -0
  431. ksadk/skills/runtime/base.py +103 -0
  432. ksadk/skills/runtime/executor.py +219 -0
  433. ksadk/skills/runtime/factory.py +37 -0
  434. ksadk/skills/runtime/loader.py +131 -0
  435. ksadk/skills/runtime/registry.py +150 -0
  436. ksadk/skills/runtime/request.py +67 -0
  437. ksadk/skills/service_client.py +239 -0
  438. ksadk/skills/service_env.py +58 -0
  439. ksadk/skills/tool_defs.py +221 -0
  440. ksadk/terminal_client.py +69 -0
  441. ksadk/terminal_exec_policy.py +229 -0
  442. ksadk/tools/__init__.py +17 -0
  443. ksadk/tools/gateway.py +230 -0
  444. ksadk/tools/result_budget.py +154 -0
  445. ksadk/toolsets/__init__.py +852 -0
  446. ksadk/toolsets/_langchain.py +11 -0
  447. ksadk/toolsets/platform.py +93 -0
  448. ksadk/toolsets/sandbox.py +310 -0
  449. ksadk/toolsets/skills.py +217 -0
  450. ksadk/toolsets/web.py +266 -0
  451. ksadk/toolsets/workspace.py +878 -0
  452. ksadk/toolsets/workspace_state.py +44 -0
  453. ksadk/tracing/__init__.py +37 -0
  454. ksadk/tracing/exporters/__init__.py +1 -0
  455. ksadk/tracing/exporters/inmemory_exporter.py +116 -0
  456. ksadk/tracing/exporters/langfuse_exporter.py +445 -0
  457. ksadk/tracing/setup.py +829 -0
  458. ksadk/tracing/span_utils.py +114 -0
  459. ksadk/tui/__init__.py +12 -0
  460. ksadk/tui/app.py +400 -0
  461. ksadk/tui/clipboard.py +100 -0
  462. ksadk/tui/widgets/__init__.py +22 -0
  463. ksadk/tui/widgets/assistant.py +89 -0
  464. ksadk/tui/widgets/base.py +54 -0
  465. ksadk/tui/widgets/chat_input.py +246 -0
  466. ksadk/tui/widgets/history.py +156 -0
  467. ksadk/tui/widgets/system.py +87 -0
  468. ksadk/tui/widgets/thinking.py +110 -0
  469. ksadk/tui/widgets/tool_call.py +161 -0
  470. ksadk/tui/widgets/user.py +37 -0
  471. ksadk/ui_config.py +168 -0
  472. ksadk/version.py +4 -0
  473. ksadk_runtime_common/__init__.py +20 -0
  474. ksadk_runtime_common/memory_backend/__init__.py +29 -0
  475. ksadk_runtime_common/memory_backend/manifest.py +79 -0
  476. ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
  477. ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
  478. ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
  479. ksadk_runtime_common/memory_backend/registry.py +56 -0
  480. ksadk_runtime_common/memory_backend/render.py +71 -0
  481. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
  482. ksadk_runtime_common/workspace_files/__init__.py +29 -0
  483. ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
  484. ksadk_runtime_common/workspace_files/constants.py +9 -0
  485. ksadk_runtime_common/workspace_files/path_utils.py +71 -0
  486. ksadk_runtime_common/workspace_files/preview.py +96 -0
  487. ksadk_runtime_common/workspace_files/router.py +254 -0
  488. agentengine_sdk_python-0.6.2.dist-info/METADATA +0 -46
  489. agentengine_sdk_python-0.6.2.dist-info/RECORD +0 -4
  490. agentengine_sdk_python-0.6.2.dist-info/top_level.txt +0 -1
@@ -0,0 +1,110 @@
1
+ """
2
+ ThinkingMessage - 思考过程组件
3
+
4
+ 带 spinner 动画的思考过程展示
5
+ """
6
+
7
+ from textual.widgets import Static
8
+ from textual.reactive import reactive
9
+ from textual.timer import Timer
10
+ from typing import ClassVar, Any
11
+ from time import time
12
+
13
+ from .base import MessageWidget
14
+
15
+
16
+ class ThinkingMessage(MessageWidget):
17
+ """思考过程组件
18
+
19
+ 显示 AI 思考过程,支持:
20
+ - spinner 动画
21
+ - 实时计时
22
+ - 流式内容追加
23
+ - 可折叠
24
+ """
25
+
26
+ DEFAULT_CSS = """
27
+ ThinkingMessage {
28
+ height: auto;
29
+ padding: 0 1;
30
+ margin: 0 0 1 0;
31
+ border-left: wide #7777aa;
32
+ color: #ffffff;
33
+ background: $surface;
34
+ }
35
+
36
+ ThinkingMessage .thinking-header {
37
+ color: #cccccc;
38
+ width: 100%;
39
+ }
40
+
41
+ ThinkingMessage .thinking-content {
42
+ color: #ffffff;
43
+ margin-left: 2;
44
+ width: 100%;
45
+ }
46
+
47
+ /* 确保所有子组件都有正确的颜色 */
48
+ ThinkingMessage * {
49
+ color: #ffffff;
50
+ }
51
+ """
52
+
53
+ # Spinner 动画帧
54
+ _SPINNER_FRAMES: ClassVar[tuple[str, ...]] = ("⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏")
55
+
56
+ is_active: reactive[bool] = reactive(True)
57
+
58
+ def __init__(self, content: str = "", **kwargs: Any) -> None:
59
+ super().__init__(content=content, **kwargs)
60
+ self._thinking_content = content
61
+ self._spinner_position = 0
62
+ self._start_time: float = time()
63
+ self._animation_timer: Timer | None = None
64
+ self._header_widget: Static | None = None
65
+ self._content_widget: Static | None = None
66
+
67
+ def compose(self):
68
+ """构建思考消息布局"""
69
+ self._header_widget = Static("🧠 Thinking...", classes="thinking-header")
70
+ yield self._header_widget
71
+
72
+ self._content_widget = Static(self._thinking_content, classes="thinking-content")
73
+ yield self._content_widget
74
+
75
+ def on_mount(self) -> None:
76
+ """启动动画"""
77
+ if self.is_active:
78
+ self._animation_timer = self.set_interval(0.1, self._update_animation)
79
+
80
+ def _update_animation(self) -> None:
81
+ """更新 spinner 动画"""
82
+ if not self.is_active or self._header_widget is None:
83
+ return
84
+
85
+ frame = self._SPINNER_FRAMES[self._spinner_position]
86
+ self._spinner_position = (self._spinner_position + 1) % len(self._SPINNER_FRAMES)
87
+
88
+ elapsed = int(time() - self._start_time)
89
+ self._header_widget.update(f"[bold #ffffff]{frame}[/] [italic #dddddd]Thinking... ({elapsed}s)[/]")
90
+
91
+ async def append_content(self, delta: str) -> None:
92
+ """追加思考内容"""
93
+ self._thinking_content += delta
94
+ if self._content_widget:
95
+ self._content_widget.update(self._thinking_content)
96
+
97
+ def stop(self) -> None:
98
+ """停止思考动画"""
99
+ self.is_active = False
100
+ if self._animation_timer:
101
+ self._animation_timer.stop()
102
+ self._animation_timer = None
103
+
104
+ if self._header_widget:
105
+ elapsed = int(time() - self._start_time)
106
+ self._header_widget.update(f"[bold #ffffff]💭[/] [italic #aaaaaa]Thought for {elapsed}s[/]")
107
+
108
+ @property
109
+ def thinking_content(self) -> str:
110
+ return self._thinking_content
@@ -0,0 +1,161 @@
1
+ """
2
+ ToolCallMessage - 工具调用消息组件
3
+
4
+ 显示 Tool Call 状态和参数。
5
+ """
6
+
7
+ from textual.widgets import Static
8
+ from textual.reactive import reactive
9
+ from textual.containers import Vertical
10
+ from typing import Any, Dict, Optional
11
+ import json
12
+
13
+ from .base import MessageWidget
14
+
15
+
16
+ class ToolStatus:
17
+ """Tool Call 状态"""
18
+ PENDING = "pending"
19
+ RUNNING = "running"
20
+ SUCCESS = "success"
21
+ ERROR = "error"
22
+ REJECTED = "rejected"
23
+
24
+
25
+ class ToolCallMessage(MessageWidget):
26
+ """工具调用消息组件
27
+
28
+ 用于显示 Tool Call 的状态和参数:
29
+ - pending: 等待执行(黄色)
30
+ - running: 执行中(蓝色动画)
31
+ - success: 成功(绿色)
32
+ - error: 失败(红色)
33
+ - rejected: 被拒绝(灰色)
34
+ """
35
+
36
+ DEFAULT_CSS = """
37
+ ToolCallMessage {
38
+ width: 100%;
39
+ padding: 1;
40
+ margin: 0 0 1 0;
41
+ border: round $secondary;
42
+ background: $surface;
43
+ color: #ffffff;
44
+ }
45
+
46
+ ToolCallMessage.pending {
47
+ border: round $warning;
48
+ }
49
+
50
+ ToolCallMessage.running {
51
+ border: round $primary;
52
+ }
53
+
54
+ ToolCallMessage.success {
55
+ border: round $success;
56
+ }
57
+
58
+ ToolCallMessage.error {
59
+ border: round $error;
60
+ }
61
+
62
+ ToolCallMessage.rejected {
63
+ border: round $surface-darken-2;
64
+ opacity: 0.7;
65
+ }
66
+
67
+ ToolCallMessage .tool-header {
68
+ text-style: bold;
69
+ color: #ffffff;
70
+ }
71
+
72
+ ToolCallMessage .tool-args {
73
+ color: #aaaaaa;
74
+ margin-left: 2;
75
+ }
76
+
77
+ ToolCallMessage .tool-output {
78
+ margin-top: 1;
79
+ padding: 1;
80
+ background: $surface-darken-1;
81
+ color: #ffffff;
82
+ }
83
+ """
84
+
85
+ status: reactive[str] = reactive(ToolStatus.PENDING)
86
+ output: reactive[str] = reactive("")
87
+
88
+ def __init__(
89
+ self,
90
+ tool_name: str,
91
+ args: Dict[str, Any],
92
+ tool_id: Optional[str] = None,
93
+ **kwargs
94
+ ) -> None:
95
+ super().__init__(**kwargs)
96
+ self._tool_name = tool_name
97
+ self._args = args
98
+ self._tool_id = tool_id
99
+ self.add_class("pending")
100
+
101
+ def compose(self):
102
+ """构建组件"""
103
+ status_icon = self._get_status_icon()
104
+ yield Static(
105
+ f"{status_icon} {self._tool_name}",
106
+ classes="tool-header"
107
+ )
108
+
109
+ # 显示参数(截断过长的值)
110
+ args_display = self._format_args(self._args)
111
+ yield Static(args_display, classes="tool-args")
112
+
113
+ # 输出区域
114
+ if self.output:
115
+ yield Static(self.output, classes="tool-output")
116
+
117
+ def _get_status_icon(self) -> str:
118
+ """获取状态图标"""
119
+ icons = {
120
+ ToolStatus.PENDING: "⏳",
121
+ ToolStatus.RUNNING: "🔄",
122
+ ToolStatus.SUCCESS: "✅",
123
+ ToolStatus.ERROR: "❌",
124
+ ToolStatus.REJECTED: "🚫",
125
+ }
126
+ return icons.get(self.status, "⏳")
127
+
128
+ def _format_args(self, args: Dict[str, Any], max_len: int = 100) -> str:
129
+ """格式化参数显示"""
130
+ try:
131
+ args_str = json.dumps(args, ensure_ascii=False, indent=2)
132
+ if len(args_str) > max_len:
133
+ args_str = args_str[:max_len] + "..."
134
+ return args_str
135
+ except Exception:
136
+ return str(args)[:max_len]
137
+
138
+ def _update_status(self, new_status: str) -> None:
139
+ """更新状态"""
140
+ self.remove_class(self.status)
141
+ self.status = new_status
142
+ self.add_class(new_status)
143
+ self.refresh()
144
+
145
+ def set_running(self) -> None:
146
+ """设置为运行中"""
147
+ self._update_status(ToolStatus.RUNNING)
148
+
149
+ def set_success(self, output: str = "") -> None:
150
+ """设置为成功"""
151
+ self.output = output
152
+ self._update_status(ToolStatus.SUCCESS)
153
+
154
+ def set_error(self, error: str = "") -> None:
155
+ """设置为失败"""
156
+ self.output = f"Error: {error}"
157
+ self._update_status(ToolStatus.ERROR)
158
+
159
+ def set_rejected(self) -> None:
160
+ """设置为被拒绝"""
161
+ self._update_status(ToolStatus.REJECTED)
@@ -0,0 +1,37 @@
1
+ """
2
+ UserMessage - 用户消息组件
3
+ """
4
+
5
+ from textual.widgets import Static
6
+ from rich.text import Text
7
+ from typing import Any
8
+
9
+ from .base import MessageWidget
10
+
11
+
12
+ class UserMessage(MessageWidget):
13
+ """用户消息组件
14
+
15
+ 显示用户输入,左边框绿色
16
+ """
17
+
18
+ DEFAULT_CSS = """
19
+ UserMessage {
20
+ height: auto;
21
+ padding: 0 1;
22
+ margin: 1 0 0 0;
23
+ background: transparent;
24
+ border-left: wide #10b981;
25
+ }
26
+ """
27
+
28
+ def __init__(self, content: str, **kwargs: Any) -> None:
29
+ super().__init__(content=content, **kwargs)
30
+ self._content = content
31
+
32
+ def compose(self):
33
+ """构建用户消息布局"""
34
+ text = Text()
35
+ text.append("> ", style="bold #10b981")
36
+ text.append(self._content, style="#ffffff")
37
+ yield Static(text)
ksadk/ui_config.py ADDED
@@ -0,0 +1,168 @@
1
+ """UI configuration helpers shared by CLI, deployment, and runtime."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Any, Dict, Optional, Tuple
7
+ from urllib.parse import urlsplit
8
+
9
+
10
+ UI_PROFILE_AUTO = "auto"
11
+ UI_PROFILE_ADK = "adk"
12
+ UI_PROFILE_LANGCHAIN = "langchain"
13
+ UI_PROFILE_OPENCLAW = "openclaw"
14
+ UI_PROFILE_HERMES = "hermes"
15
+ UI_PROFILE_CUSTOM = "custom"
16
+
17
+ SUPPORTED_UI_PROFILES = (
18
+ UI_PROFILE_AUTO,
19
+ UI_PROFILE_ADK,
20
+ UI_PROFILE_LANGCHAIN,
21
+ UI_PROFILE_OPENCLAW,
22
+ UI_PROFILE_HERMES,
23
+ UI_PROFILE_CUSTOM,
24
+ )
25
+
26
+
27
+ _FRAMEWORK_TO_PROFILE = {
28
+ "adk": UI_PROFILE_ADK,
29
+ "langchain": UI_PROFILE_LANGCHAIN,
30
+ "langgraph": UI_PROFILE_LANGCHAIN,
31
+ "deepagents": UI_PROFILE_LANGCHAIN,
32
+ "openclaw": UI_PROFILE_OPENCLAW,
33
+ "hermes": UI_PROFILE_HERMES,
34
+ }
35
+
36
+ _DEFAULT_PATH_BY_PROFILE = {
37
+ UI_PROFILE_ADK: "/chat",
38
+ UI_PROFILE_LANGCHAIN: "/chat",
39
+ UI_PROFILE_OPENCLAW: "/chat",
40
+ UI_PROFILE_HERMES: "/chat",
41
+ UI_PROFILE_CUSTOM: "/",
42
+ }
43
+
44
+
45
+ @dataclass(frozen=True)
46
+ class UIConfig:
47
+ """Resolved UI configuration."""
48
+
49
+ profile: str
50
+ path: str
51
+ url: Optional[str] = None
52
+
53
+
54
+ def normalize_ui_profile(profile: Optional[str], *, default: str = UI_PROFILE_AUTO) -> str:
55
+ value = (profile or "").strip().lower()
56
+ if not value:
57
+ return default
58
+ if value not in SUPPORTED_UI_PROFILES:
59
+ raise ValueError(f"unsupported ui_profile: {profile}")
60
+ return value
61
+
62
+
63
+ def normalize_ui_path(path: Optional[str]) -> Optional[str]:
64
+ if path is None:
65
+ return None
66
+
67
+ value = path.strip()
68
+ if not value:
69
+ return None
70
+
71
+ if not value.startswith("/"):
72
+ value = "/" + value
73
+ return value
74
+
75
+
76
+ def normalize_ui_url(url: Optional[str]) -> Optional[str]:
77
+ if url is None:
78
+ return None
79
+ value = url.strip()
80
+ return value or None
81
+
82
+
83
+ def infer_ui_profile_from_framework(framework: Optional[str]) -> str:
84
+ key = (framework or "").strip().lower()
85
+ return _FRAMEWORK_TO_PROFILE.get(key, UI_PROFILE_ADK)
86
+
87
+
88
+ def default_ui_path(profile: str) -> str:
89
+ return _DEFAULT_PATH_BY_PROFILE.get(profile, "/")
90
+
91
+
92
+ def extract_ui_state(state: Optional[Dict[str, Any]]) -> Tuple[Optional[str], Optional[str], Optional[str]]:
93
+ if not isinstance(state, dict):
94
+ return None, None, None
95
+
96
+ nested = state.get("ui") if isinstance(state.get("ui"), dict) else {}
97
+
98
+ profile = state.get("ui_profile") or nested.get("profile")
99
+ path = state.get("ui_path") or nested.get("path")
100
+ url = state.get("ui_url") or nested.get("url")
101
+
102
+ return profile, path, url
103
+
104
+
105
+ def resolve_ui_config(
106
+ *,
107
+ framework: Optional[str],
108
+ state: Optional[Dict[str, Any]],
109
+ cli_profile: Optional[str],
110
+ cli_path: Optional[str],
111
+ cli_url: Optional[str],
112
+ ) -> UIConfig:
113
+ """Merge CLI + state + framework defaults into the final UI config.
114
+
115
+ Priority:
116
+ 1) CLI arguments
117
+ 2) .agentengine.state
118
+ 3) framework default
119
+ 4) global default
120
+ """
121
+
122
+ state_profile, state_path, state_url = extract_ui_state(state)
123
+
124
+ profile = normalize_ui_profile(cli_profile or state_profile or UI_PROFILE_AUTO)
125
+ if profile == UI_PROFILE_AUTO:
126
+ profile = infer_ui_profile_from_framework(framework)
127
+
128
+ path = normalize_ui_path(cli_path) if cli_path is not None else normalize_ui_path(state_path)
129
+ url = normalize_ui_url(cli_url) if cli_url is not None else normalize_ui_url(state_url)
130
+
131
+ if profile in {UI_PROFILE_ADK, UI_PROFILE_LANGCHAIN, UI_PROFILE_OPENCLAW, UI_PROFILE_HERMES}:
132
+ normalized_legacy_path = (path or "").rstrip("/") or "/"
133
+ legacy_paths = {"/langchain"}
134
+ if cli_path is None:
135
+ legacy_paths.add("/")
136
+ if normalized_legacy_path in legacy_paths:
137
+ path = "/chat"
138
+
139
+ if not path:
140
+ path = default_ui_path(profile)
141
+ if profile == UI_PROFILE_CUSTOM and path == "/chat":
142
+ path = "/"
143
+
144
+ return UIConfig(profile=profile, path=path, url=url)
145
+
146
+
147
+ def ui_config_to_state_fields(config: UIConfig) -> Dict[str, Any]:
148
+ return {
149
+ "ui_profile": config.profile,
150
+ "ui_path": config.path,
151
+ "ui_url": config.url,
152
+ }
153
+
154
+
155
+ def is_same_origin(url: str, endpoint: str) -> bool:
156
+ if not url or not endpoint:
157
+ return False
158
+
159
+ left = urlsplit(url)
160
+ right = urlsplit(endpoint)
161
+
162
+ if not left.scheme or not left.netloc or not right.scheme or not right.netloc:
163
+ return False
164
+
165
+ return (left.scheme.lower(), left.netloc.lower()) == (
166
+ right.scheme.lower(),
167
+ right.netloc.lower(),
168
+ )
ksadk/version.py ADDED
@@ -0,0 +1,4 @@
1
+ """KsADK 版本信息"""
2
+
3
+ VERSION = "0.6.9"
4
+ __version__ = VERSION
@@ -0,0 +1,20 @@
1
+ """Shared runtime components bundled inside ksadk-python."""
2
+
3
+ __version__ = "0.1.0"
4
+
5
+ from ksadk_runtime_common.workspace_files.bootstrap import (
6
+ build_workspace_files_bootstrap,
7
+ workspace_files_enabled,
8
+ workspace_files_max_upload_bytes,
9
+ workspace_files_root_label,
10
+ )
11
+ from ksadk_runtime_common.workspace_files.router import create_workspace_files_router
12
+
13
+ __all__ = [
14
+ "__version__",
15
+ "create_workspace_files_router",
16
+ "build_workspace_files_bootstrap",
17
+ "workspace_files_enabled",
18
+ "workspace_files_root_label",
19
+ "workspace_files_max_upload_bytes",
20
+ ]
@@ -0,0 +1,29 @@
1
+ """Memory backend manifest parsing and config rendering helpers."""
2
+
3
+ from ksadk_runtime_common.memory_backend.manifest import (
4
+ MemoryBackendManifest,
5
+ parse_manifest,
6
+ )
7
+ from ksadk_runtime_common.memory_backend.registry import (
8
+ RenderResult,
9
+ get_provider,
10
+ list_providers,
11
+ register_provider,
12
+ )
13
+ from ksadk_runtime_common.memory_backend.render import (
14
+ MANIFEST_ENV_VAR,
15
+ render_memory_backend_config,
16
+ render_to_json,
17
+ )
18
+
19
+ __all__ = [
20
+ "MemoryBackendManifest",
21
+ "parse_manifest",
22
+ "render_memory_backend_config",
23
+ "render_to_json",
24
+ "MANIFEST_ENV_VAR",
25
+ "RenderResult",
26
+ "register_provider",
27
+ "get_provider",
28
+ "list_providers",
29
+ ]
@@ -0,0 +1,79 @@
1
+ """Memory backend manifest model validated against the bundled JSON Schema."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from collections.abc import Mapping
7
+ from functools import lru_cache
8
+ from pathlib import Path
9
+ from typing import Any, Literal
10
+
11
+ from jsonschema import Draft202012Validator
12
+ from jsonschema import ValidationError as JsonSchemaValidationError
13
+ from pydantic import BaseModel, Field
14
+
15
+ _SCHEMA_PATH = Path(__file__).parent.parent / "schemas" / "memory_backend_manifest.schema.json"
16
+
17
+
18
+ class MemoryBackendManifest(BaseModel):
19
+ """Memory backend manifest for OpenClaw runtime."""
20
+
21
+ schema_version: Literal["v1"] = "v1"
22
+ backend_type: Literal["openclaw_default", "mem0", "lancedb"]
23
+ config: dict[str, Any] = Field(default_factory=dict)
24
+ secrets_env: dict[str, str] = Field(default_factory=dict)
25
+
26
+
27
+ @lru_cache(maxsize=1)
28
+ def _schema_validator() -> Draft202012Validator:
29
+ """Build and cache the canonical JSON Schema validator."""
30
+ schema = json.loads(_SCHEMA_PATH.read_text(encoding="utf-8"))
31
+ Draft202012Validator.check_schema(schema)
32
+ return Draft202012Validator(
33
+ schema,
34
+ format_checker=Draft202012Validator.FORMAT_CHECKER,
35
+ )
36
+
37
+
38
+ def _format_schema_error(error: JsonSchemaValidationError) -> str:
39
+ """Format schema validation errors with a stable dotted path."""
40
+ location = ".".join(str(part) for part in error.absolute_path) or "<root>"
41
+ return f"Invalid manifest at '{location}': {error.message}"
42
+
43
+
44
+ def _validate_against_schema(data: object) -> dict[str, Any]:
45
+ """Validate a raw manifest payload against the bundled JSON Schema."""
46
+ errors = sorted(
47
+ _schema_validator().iter_errors(data),
48
+ key=lambda error: error.json_path,
49
+ )
50
+ if errors:
51
+ first_error = errors[0]
52
+ raise ValueError(_format_schema_error(first_error)) from first_error
53
+ if not isinstance(data, Mapping):
54
+ raise ValueError("Invalid manifest at '<root>': manifest must be an object")
55
+ return dict(data)
56
+
57
+
58
+ def parse_manifest(
59
+ raw: MemoryBackendManifest | str | Mapping[str, Any] | None,
60
+ ) -> MemoryBackendManifest | None:
61
+ """Parse a memory backend manifest from model, JSON string, or mapping."""
62
+ if raw is None:
63
+ return None
64
+
65
+ if isinstance(raw, MemoryBackendManifest):
66
+ data: object = raw.model_dump(mode="python")
67
+ elif isinstance(raw, str):
68
+ raw = raw.strip()
69
+ if not raw:
70
+ return None
71
+ try:
72
+ data = json.loads(raw)
73
+ except json.JSONDecodeError as e:
74
+ raise ValueError(f"Invalid JSON: {e}") from e
75
+ else:
76
+ data = dict(raw)
77
+
78
+ validated = _validate_against_schema(data)
79
+ return MemoryBackendManifest.model_validate(validated)
@@ -0,0 +1,6 @@
1
+ """Memory backend providers package."""
2
+
3
+ from ksadk_runtime_common.memory_backend.providers.lancedb import LanceDBProvider
4
+ from ksadk_runtime_common.memory_backend.providers.mem0 import Mem0Provider
5
+
6
+ __all__ = ["LanceDBProvider", "Mem0Provider"]