agentengine-sdk-python 0.6.4__py3-none-any.whl → 0.7.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 (486) hide show
  1. agentengine_sdk_python-0.7.0.dist-info/METADATA +181 -0
  2. agentengine_sdk_python-0.7.0.dist-info/RECORD +482 -0
  3. {agentengine_sdk_python-0.6.4.dist-info → agentengine_sdk_python-0.7.0.dist-info}/WHEEL +1 -1
  4. agentengine_sdk_python-0.7.0.dist-info/entry_points.txt +3 -0
  5. agentengine_sdk_python-0.7.0.dist-info/licenses/LICENSE +175 -0
  6. agentengine_sdk_python-0.7.0.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 +2246 -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 +2304 -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 +1263 -0
  46. ksadk/cli/cmd_invoke.py +1503 -0
  47. ksadk/cli/cmd_launch.py +564 -0
  48. ksadk/cli/cmd_mcp.py +1179 -0
  49. ksadk/cli/cmd_model.py +302 -0
  50. ksadk/cli/cmd_openclaw.py +3922 -0
  51. ksadk/cli/cmd_run.py +239 -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 +412 -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 +343 -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/message_projection.py +269 -0
  83. ksadk/conversations/model_context.py +370 -0
  84. ksadk/conversations/model_options.py +136 -0
  85. ksadk/conversations/normalize.py +446 -0
  86. ksadk/conversations/reasoning_markup.py +91 -0
  87. ksadk/conversations/run_kinds.py +61 -0
  88. ksadk/conversations/run_status.py +53 -0
  89. ksadk/conversations/runtime.py +5276 -0
  90. ksadk/conversations/semantic_summary.py +359 -0
  91. ksadk/conversations/session_title.py +254 -0
  92. ksadk/deployment/__init__.py +83 -0
  93. ksadk/deployment/agent_access.py +226 -0
  94. ksadk/deployment/base.py +229 -0
  95. ksadk/deployment/manager.py +332 -0
  96. ksadk/deployment/providers/__init__.py +10 -0
  97. ksadk/deployment/providers/serverless.py +1115 -0
  98. ksadk/deployment/registry.py +120 -0
  99. ksadk/deployment/state.py +78 -0
  100. ksadk/deployment/ui_config.py +21 -0
  101. ksadk/detection/__init__.py +7 -0
  102. ksadk/detection/detector.py +431 -0
  103. ksadk/detection/mcp_detector.py +250 -0
  104. ksadk/hermes_terminal.py +467 -0
  105. ksadk/identity/__init__.py +17 -0
  106. ksadk/identity/resolver.py +385 -0
  107. ksadk/knowledge_base/__init__.py +62 -0
  108. ksadk/knowledge_base/adk_tool.py +47 -0
  109. ksadk/knowledge_base/client.py +297 -0
  110. ksadk/knowledge_base/langchain_tool.py +55 -0
  111. ksadk/knowledge_base/service.py +66 -0
  112. ksadk/knowledge_base/tool.py +50 -0
  113. ksadk/markdown.py +169 -0
  114. ksadk/mcp_runtime/__init__.py +231 -0
  115. ksadk/memory/__init__.py +57 -0
  116. ksadk/memory/adk/__init__.py +51 -0
  117. ksadk/memory/adk/backends/__init__.py +5 -0
  118. ksadk/memory/adk/backends/base_ltm_backend.py +52 -0
  119. ksadk/memory/adk/backends/http_ltm_backend.py +183 -0
  120. ksadk/memory/adk/backends/inmemory_ltm_backend.py +96 -0
  121. ksadk/memory/adk/backends/sdk_ltm_backend.py +456 -0
  122. ksadk/memory/adk/long_term_memory.py +273 -0
  123. ksadk/memory/adk/resilient_session_service.py +268 -0
  124. ksadk/memory/adk/short_term_memory.py +304 -0
  125. ksadk/memory/adk_tool.py +31 -0
  126. ksadk/memory/backends/__init__.py +6 -0
  127. ksadk/memory/backends/base.py +103 -0
  128. ksadk/memory/backends/memory.py +112 -0
  129. ksadk/memory/backends/redis.py +146 -0
  130. ksadk/memory/langchain_tool.py +39 -0
  131. ksadk/memory/ltm_backend_factory.py +24 -0
  132. ksadk/memory/manager.py +215 -0
  133. ksadk/memory/service.py +172 -0
  134. ksadk/memory/tool.py +96 -0
  135. ksadk/model_policy.py +223 -0
  136. ksadk/openclaw_gateway.py +378 -0
  137. ksadk/runners/__init__.py +8 -0
  138. ksadk/runners/adk_runner.py +1994 -0
  139. ksadk/runners/base_runner.py +305 -0
  140. ksadk/runners/deepagents_runner.py +13 -0
  141. ksadk/runners/factory.py +73 -0
  142. ksadk/runners/langchain_runner.py +751 -0
  143. ksadk/runners/langgraph_runner.py +985 -0
  144. ksadk/runners/patch_langchain.py +187 -0
  145. ksadk/runners/remote_runner.py +792 -0
  146. ksadk/runners/usage_accumulator.py +38 -0
  147. ksadk/runners/utils/__init__.py +19 -0
  148. ksadk/runners/utils/langfuse.py +230 -0
  149. ksadk/runners/utils/loader.py +62 -0
  150. ksadk/runtime_context.py +166 -0
  151. ksadk/runtime_state.py +25 -0
  152. ksadk/sandbox/__init__.py +28 -0
  153. ksadk/sandbox/backends/__init__.py +9 -0
  154. ksadk/sandbox/backends/e2b.py +154 -0
  155. ksadk/sandbox/backends/local_process.py +131 -0
  156. ksadk/sandbox/base.py +101 -0
  157. ksadk/sandbox/factory.py +53 -0
  158. ksadk/sandbox/registry.py +187 -0
  159. ksadk/server/__init__.py +7 -0
  160. ksadk/server/api_models.py +73 -0
  161. ksadk/server/app.py +3931 -0
  162. ksadk/server/static/assets/ArtifactsPanel-D-SSn2ee.js +1 -0
  163. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +9 -0
  164. ksadk/server/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  165. ksadk/server/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  166. ksadk/server/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  167. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  168. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  169. ksadk/server/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  170. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  171. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  172. ksadk/server/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  173. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  174. ksadk/server/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  175. ksadk/server/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  176. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  177. ksadk/server/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  178. ksadk/server/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  179. ksadk/server/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  180. ksadk/server/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  181. ksadk/server/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  182. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  183. ksadk/server/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  184. ksadk/server/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  185. ksadk/server/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  186. ksadk/server/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  187. ksadk/server/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  188. ksadk/server/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  189. ksadk/server/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  190. ksadk/server/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  191. ksadk/server/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  192. ksadk/server/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  193. ksadk/server/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  194. ksadk/server/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  195. ksadk/server/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  196. ksadk/server/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  197. ksadk/server/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  198. ksadk/server/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  199. ksadk/server/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  200. ksadk/server/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  201. ksadk/server/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  202. ksadk/server/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  203. ksadk/server/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  204. ksadk/server/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  205. ksadk/server/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  206. ksadk/server/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  207. ksadk/server/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  208. ksadk/server/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  209. ksadk/server/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  210. ksadk/server/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  211. ksadk/server/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  212. ksadk/server/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  213. ksadk/server/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  214. ksadk/server/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  215. ksadk/server/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  216. ksadk/server/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  217. ksadk/server/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  218. ksadk/server/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  219. ksadk/server/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  220. ksadk/server/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  221. ksadk/server/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  222. ksadk/server/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +8 -0
  224. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +1 -0
  225. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +303 -0
  226. ksadk/server/static/assets/NativeTerminalPanel-CHOd7Rch.css +1 -0
  227. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +1 -0
  228. ksadk/server/static/assets/addon-fit-DthTIhi3.js +1 -0
  229. ksadk/server/static/assets/apl-CnwPGSsG.js +1 -0
  230. ksadk/server/static/assets/arc-BA13sHc9.js +1 -0
  231. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +1 -0
  232. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-DzJzgVoL.js +36 -0
  233. ksadk/server/static/assets/asciiarmor-qTkVPQu6.js +1 -0
  234. ksadk/server/static/assets/asn1-Dr8qZg38.js +1 -0
  235. ksadk/server/static/assets/asterisk-Bja0s6e1.js +1 -0
  236. ksadk/server/static/assets/blockDiagram-GPEHLZMM-UTdVcZhn.js +132 -0
  237. ksadk/server/static/assets/brainfuck-D5EjA2JK.js +1 -0
  238. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dix0GD4m.js +10 -0
  239. ksadk/server/static/assets/channel-CTuydARX.js +1 -0
  240. ksadk/server/static/assets/chunk-2J33WTMH-C2JxuZ42.js +1 -0
  241. ksadk/server/static/assets/chunk-4BX2VUAB-Be57QPgD.js +1 -0
  242. ksadk/server/static/assets/chunk-55IACEB6-WjSuy4nv.js +1 -0
  243. ksadk/server/static/assets/chunk-727SXJPM-BOovP-b5.js +206 -0
  244. ksadk/server/static/assets/chunk-AQP2D5EJ-DOmZNmWj.js +231 -0
  245. ksadk/server/static/assets/chunk-FMBD7UC4-DzwlodkU.js +15 -0
  246. ksadk/server/static/assets/chunk-ND2GUHAM-DMqAikEU.js +1 -0
  247. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +1 -0
  248. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +1 -0
  249. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +1 -0
  250. ksadk/server/static/assets/clike-DHH8Ad3s.js +1 -0
  251. ksadk/server/static/assets/clojure-BflJGmDX.js +1 -0
  252. ksadk/server/static/assets/cmake-CyVbuzPu.js +1 -0
  253. ksadk/server/static/assets/cobol-B_OZ4V-R.js +1 -0
  254. ksadk/server/static/assets/coffeescript-B2pKbFk8.js +1 -0
  255. ksadk/server/static/assets/commonlisp-CcllspGY.js +1 -0
  256. ksadk/server/static/assets/cose-bilkent-S5V4N54A-Zhy2GBnP.js +1 -0
  257. ksadk/server/static/assets/crystal-M5-qzICs.js +1 -0
  258. ksadk/server/static/assets/css-CYpP4FRV.js +1 -0
  259. ksadk/server/static/assets/cypher-p9eYesGn.js +1 -0
  260. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +321 -0
  261. ksadk/server/static/assets/d-BhMjBjQP.js +1 -0
  262. ksadk/server/static/assets/dagre-BM42HDAG-CbKrtIUz.js +4 -0
  263. ksadk/server/static/assets/dagre-Bx709z4p.js +1 -0
  264. ksadk/server/static/assets/defaultLocale-C8Fc0cco.js +1 -0
  265. ksadk/server/static/assets/diagram-2AECGRRQ-BRApgQRK.js +43 -0
  266. ksadk/server/static/assets/diagram-5GNKFQAL-D0xbnDiK.js +10 -0
  267. ksadk/server/static/assets/diagram-KO2AKTUF-CVugVI9L.js +3 -0
  268. ksadk/server/static/assets/diagram-LMA3HP47-DozUGgee.js +24 -0
  269. ksadk/server/static/assets/diagram-OG6HWLK6-ZOYsKlru.js +24 -0
  270. ksadk/server/static/assets/diff-ChtP43wD.js +1 -0
  271. ksadk/server/static/assets/dist-2hInLS_J.js +9 -0
  272. ksadk/server/static/assets/dist-8EEyGgDx.js +1 -0
  273. ksadk/server/static/assets/dist-8_SfK1IP.js +1 -0
  274. ksadk/server/static/assets/dist-B0NP_Z0z.js +23 -0
  275. ksadk/server/static/assets/dist-BIJVDMuB.js +1 -0
  276. ksadk/server/static/assets/dist-BmlMPsCc.js +2 -0
  277. ksadk/server/static/assets/dist-BrCcQ47T.js +1 -0
  278. ksadk/server/static/assets/dist-BssVmjIo.js +6 -0
  279. ksadk/server/static/assets/dist-C3HIIaN5.js +1 -0
  280. ksadk/server/static/assets/dist-CPBtqRTW.js +1 -0
  281. ksadk/server/static/assets/dist-CkEKJFtk.js +1 -0
  282. ksadk/server/static/assets/dist-D-JMdWPQ.js +1 -0
  283. ksadk/server/static/assets/dist-D-xOD048.js +1 -0
  284. ksadk/server/static/assets/dist-D57wnGWd.js +1 -0
  285. ksadk/server/static/assets/dist-DL_NKc_z.js +1 -0
  286. ksadk/server/static/assets/dist-DMezvBGJ.js +1 -0
  287. ksadk/server/static/assets/dist-DmFaq_Iy.js +1 -0
  288. ksadk/server/static/assets/dist-Dp0k7bWI.js +1 -0
  289. ksadk/server/static/assets/dist-DpKtt4Bo.js +1 -0
  290. ksadk/server/static/assets/dist-DyOkZmze.js +11 -0
  291. ksadk/server/static/assets/dist-DyWsb78Q.js +1 -0
  292. ksadk/server/static/assets/dist-gX6GOLKq.js +1 -0
  293. ksadk/server/static/assets/dockerfile-BLkNEvjs.js +1 -0
  294. ksadk/server/static/assets/dtd-DTF72YNO.js +1 -0
  295. ksadk/server/static/assets/dylan-C6jEEEk-.js +1 -0
  296. ksadk/server/static/assets/ebnf-D4c0_ac3.js +1 -0
  297. ksadk/server/static/assets/ecl-BSZaIHnp.js +1 -0
  298. ksadk/server/static/assets/eiffel-BEjRio4Q.js +1 -0
  299. ksadk/server/static/assets/elm-Cshzl8qu.js +1 -0
  300. ksadk/server/static/assets/erDiagram-TEJ5UH35-Bk-9bgE5.js +85 -0
  301. ksadk/server/static/assets/erlang-DaB2Rkuy.js +1 -0
  302. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +1 -0
  303. ksadk/server/static/assets/factor-D7LVTn2l.js +1 -0
  304. ksadk/server/static/assets/fcl-ClOhbFR7.js +1 -0
  305. ksadk/server/static/assets/flowDiagram-I6XJVG4X-Dn9kZVuZ.js +162 -0
  306. ksadk/server/static/assets/forth-Cezjo90N.js +1 -0
  307. ksadk/server/static/assets/fortran-Bt6PBEDR.js +1 -0
  308. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-BGxXlJqm.js +292 -0
  309. ksadk/server/static/assets/gas-BHEdbvp9.js +1 -0
  310. ksadk/server/static/assets/gherkin-oBAE_ms0.js +1 -0
  311. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +1 -0
  312. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-C7Q0X-wi.js +106 -0
  313. ksadk/server/static/assets/graphlib-B8gBHxth.js +1 -0
  314. ksadk/server/static/assets/groovy-BC3IOsC8.js +1 -0
  315. ksadk/server/static/assets/haskell-BRsoo5mP.js +1 -0
  316. ksadk/server/static/assets/haxe-DIz0ZZqd.js +1 -0
  317. ksadk/server/static/assets/http-CLVgA2GD.js +1 -0
  318. ksadk/server/static/assets/idl-BUZw3wgd.js +1 -0
  319. ksadk/server/static/assets/index-C00Lwg3L.js +165 -0
  320. ksadk/server/static/assets/index-DAURbCsP.css +1 -0
  321. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +1 -0
  322. ksadk/server/static/assets/infoDiagram-5YYISTIA-BO_CSqq5.js +2 -0
  323. ksadk/server/static/assets/init-D6jRqBbL.js +1 -0
  324. ksadk/server/static/assets/ishikawaDiagram-YF4QCWOH-eYLPLd46.js +70 -0
  325. ksadk/server/static/assets/javascript-9Tg8ixDm.js +1 -0
  326. ksadk/server/static/assets/journeyDiagram-JHISSGLW-De9geSb0.js +139 -0
  327. ksadk/server/static/assets/julia-CQfgDRfP.js +1 -0
  328. ksadk/server/static/assets/kanban-definition-UN3LZRKU-Cs80kQto.js +89 -0
  329. ksadk/server/static/assets/katex-DSrCFD8n.js +265 -0
  330. ksadk/server/static/assets/linear-CN9sbKTF.js +1 -0
  331. ksadk/server/static/assets/livescript-BXxG0Yva.js +1 -0
  332. ksadk/server/static/assets/lua-CiA1ziua.js +1 -0
  333. ksadk/server/static/assets/mathematica-u8YMmbU0.js +1 -0
  334. ksadk/server/static/assets/mbox-BEMVcqjs.js +1 -0
  335. ksadk/server/static/assets/mermaid-parser.core-DlgSBU8l.js +161 -0
  336. ksadk/server/static/assets/mindmap-definition-RKZ34NQL-9afz7Oug.js +96 -0
  337. ksadk/server/static/assets/mirc-C9zpzAZU.js +1 -0
  338. ksadk/server/static/assets/mllike-B45xgp2S.js +1 -0
  339. ksadk/server/static/assets/modelica-CqHI_q-D.js +1 -0
  340. ksadk/server/static/assets/mscgen-qgSLujhx.js +1 -0
  341. ksadk/server/static/assets/mumps-CW_TBmxz.js +1 -0
  342. ksadk/server/static/assets/nginx-BMaDbqW3.js +1 -0
  343. ksadk/server/static/assets/nsis-AQ_alPln.js +1 -0
  344. ksadk/server/static/assets/ntriples-d28e9m0E.js +1 -0
  345. ksadk/server/static/assets/octave-D2Q8cUp1.js +1 -0
  346. ksadk/server/static/assets/ordinal-hYBb2elL.js +1 -0
  347. ksadk/server/static/assets/oz-BwTct_5T.js +1 -0
  348. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +1 -0
  349. ksadk/server/static/assets/pascal-Dp_KdFgX.js +1 -0
  350. ksadk/server/static/assets/perl-CdEHsPfU.js +1 -0
  351. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +1 -0
  352. ksadk/server/static/assets/pieDiagram-4H26LBE5-DPv_VstN.js +30 -0
  353. ksadk/server/static/assets/pig-AF4Hwhju.js +1 -0
  354. ksadk/server/static/assets/powershell-CzG71I4L.js +1 -0
  355. ksadk/server/static/assets/properties-C357ku5U.js +1 -0
  356. ksadk/server/static/assets/protobuf-D1ij_kNL.js +1 -0
  357. ksadk/server/static/assets/pug-Bugr-47h.js +1 -0
  358. ksadk/server/static/assets/puppet-B4hC2X4m.js +1 -0
  359. ksadk/server/static/assets/python-BqYw9LYJ.js +1 -0
  360. ksadk/server/static/assets/q-B9NhS7L_.js +1 -0
  361. ksadk/server/static/assets/quadrantDiagram-W4KKPZXB-o77wZ1XK.js +7 -0
  362. ksadk/server/static/assets/r-DADKenSm.js +1 -0
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +1 -0
  364. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-BYVw81VC.js +84 -0
  365. ksadk/server/static/assets/rpm-gpDK5sbt.js +1 -0
  366. ksadk/server/static/assets/ruby-DsYpTuWg.js +1 -0
  367. ksadk/server/static/assets/sankeyDiagram-5OEKKPKP-B7nZFMKT.js +40 -0
  368. ksadk/server/static/assets/sas-C2OyD2Y6.js +1 -0
  369. ksadk/server/static/assets/scheme-CyDdOh7e.js +1 -0
  370. ksadk/server/static/assets/sequenceDiagram-3UESZ5HK-BGRRrFw5.js +162 -0
  371. ksadk/server/static/assets/shell-Du5Qg9im.js +1 -0
  372. ksadk/server/static/assets/sieve-BAxa3IjF.js +1 -0
  373. ksadk/server/static/assets/simple-mode-DRpGK0lJ.js +1 -0
  374. ksadk/server/static/assets/smalltalk-BLp5-jwC.js +1 -0
  375. ksadk/server/static/assets/solr-BBopId9w.js +1 -0
  376. ksadk/server/static/assets/sparql-Dz-mlCAC.js +1 -0
  377. ksadk/server/static/assets/spreadsheet-CTIncYxj.js +1 -0
  378. ksadk/server/static/assets/sql-DcCJ9jop.js +1 -0
  379. ksadk/server/static/assets/stateDiagram-AJRCARHV-BUfHCoPs.js +1 -0
  380. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +1 -0
  381. ksadk/server/static/assets/stex-sDrdk2BW.js +1 -0
  382. ksadk/server/static/assets/stylus-DLLZ8dgm.js +1 -0
  383. ksadk/server/static/assets/swift-DKB6_1j6.js +1 -0
  384. ksadk/server/static/assets/tcl-BGfruO1u.js +1 -0
  385. ksadk/server/static/assets/textile-DWBqthVk.js +1 -0
  386. ksadk/server/static/assets/tiddlywiki-VlUiK86J.js +1 -0
  387. ksadk/server/static/assets/tiki-CxVlf5KZ.js +1 -0
  388. ksadk/server/static/assets/timeline-definition-PNZ67QCA-FbCTGrf9.js +120 -0
  389. ksadk/server/static/assets/toml-LvoKBwCs.js +1 -0
  390. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +1 -0
  391. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +1 -0
  392. ksadk/server/static/assets/troff-C2dAgh7P.js +1 -0
  393. ksadk/server/static/assets/ttcn-BePYh-hG.js +1 -0
  394. ksadk/server/static/assets/ttcn-cfg-CY0aot7Q.js +1 -0
  395. ksadk/server/static/assets/turtle-BDLWE2cD.js +1 -0
  396. ksadk/server/static/assets/vb-BthdM_4N.js +1 -0
  397. ksadk/server/static/assets/vbscript-D9f6rSsU.js +1 -0
  398. ksadk/server/static/assets/velocity-CqftRsjg.js +1 -0
  399. ksadk/server/static/assets/vennDiagram-CIIHVFJN-DWgwtPsJ.js +34 -0
  400. ksadk/server/static/assets/verilog-D-x6ne0Z.js +1 -0
  401. ksadk/server/static/assets/vhdl-CMrOq2q1.js +1 -0
  402. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +1 -0
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-2x8G-tTM.js +78 -0
  404. ksadk/server/static/assets/webidl-D5jiJvOU.js +1 -0
  405. ksadk/server/static/assets/xquery-fj_R-kMw.js +1 -0
  406. ksadk/server/static/assets/xterm-DooSxjI5.js +36 -0
  407. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-Drma3AYl.js +7 -0
  408. ksadk/server/static/assets/yacas-CXXgtw0p.js +1 -0
  409. ksadk/server/static/assets/z80-CL1naaMV.js +1 -0
  410. ksadk/server/static/favicon.svg +1 -0
  411. ksadk/server/static/icons.svg +24 -0
  412. ksadk/server/static/index.html +14 -0
  413. ksadk/server/terminal_sessions.py +551 -0
  414. ksadk/sessions/__init__.py +279 -0
  415. ksadk/sessions/base.py +354 -0
  416. ksadk/sessions/continuity.py +337 -0
  417. ksadk/sessions/errors.py +7 -0
  418. ksadk/sessions/in_memory.py +273 -0
  419. ksadk/sessions/local_service.py +949 -0
  420. ksadk/sessions/postgres_service.py +901 -0
  421. ksadk/sessions/resilience.py +52 -0
  422. ksadk/sessions/resilient.py +360 -0
  423. ksadk/sessions/sqlite_service.py +13 -0
  424. ksadk/skills/__init__.py +9 -0
  425. ksadk/skills/loader.py +46 -0
  426. ksadk/skills/models.py +120 -0
  427. ksadk/skills/package_store.py +104 -0
  428. ksadk/skills/runtime/__init__.py +17 -0
  429. ksadk/skills/runtime/agent.py +183 -0
  430. ksadk/skills/runtime/artifacts.py +39 -0
  431. ksadk/skills/runtime/backends/__init__.py +1 -0
  432. ksadk/skills/runtime/backends/disabled.py +8 -0
  433. ksadk/skills/runtime/backends/e2b.py +168 -0
  434. ksadk/skills/runtime/backends/local.py +95 -0
  435. ksadk/skills/runtime/base.py +103 -0
  436. ksadk/skills/runtime/executor.py +219 -0
  437. ksadk/skills/runtime/factory.py +37 -0
  438. ksadk/skills/runtime/loader.py +131 -0
  439. ksadk/skills/runtime/registry.py +150 -0
  440. ksadk/skills/runtime/request.py +67 -0
  441. ksadk/skills/service_client.py +239 -0
  442. ksadk/skills/service_env.py +58 -0
  443. ksadk/skills/tool_defs.py +221 -0
  444. ksadk/terminal_client.py +69 -0
  445. ksadk/terminal_exec_policy.py +229 -0
  446. ksadk/tools/__init__.py +17 -0
  447. ksadk/tools/gateway.py +230 -0
  448. ksadk/tools/result_budget.py +154 -0
  449. ksadk/toolsets/__init__.py +854 -0
  450. ksadk/toolsets/_langchain.py +11 -0
  451. ksadk/toolsets/platform.py +93 -0
  452. ksadk/toolsets/sandbox.py +310 -0
  453. ksadk/toolsets/skills.py +217 -0
  454. ksadk/toolsets/web.py +266 -0
  455. ksadk/toolsets/workspace.py +917 -0
  456. ksadk/toolsets/workspace_state.py +44 -0
  457. ksadk/tracing/__init__.py +37 -0
  458. ksadk/tracing/exporters/__init__.py +1 -0
  459. ksadk/tracing/exporters/inmemory_exporter.py +116 -0
  460. ksadk/tracing/exporters/langfuse_exporter.py +445 -0
  461. ksadk/tracing/setup.py +892 -0
  462. ksadk/tracing/span_utils.py +114 -0
  463. ksadk/tui/__init__.py +27 -0
  464. ksadk/tui/loop.py +1877 -0
  465. ksadk/tui/stream_render.py +68 -0
  466. ksadk/ui_config.py +168 -0
  467. ksadk/version.py +4 -0
  468. ksadk_runtime_common/__init__.py +20 -0
  469. ksadk_runtime_common/memory_backend/__init__.py +29 -0
  470. ksadk_runtime_common/memory_backend/manifest.py +79 -0
  471. ksadk_runtime_common/memory_backend/providers/__init__.py +6 -0
  472. ksadk_runtime_common/memory_backend/providers/lancedb.py +151 -0
  473. ksadk_runtime_common/memory_backend/providers/mem0.py +74 -0
  474. ksadk_runtime_common/memory_backend/registry.py +56 -0
  475. ksadk_runtime_common/memory_backend/render.py +71 -0
  476. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -0
  477. ksadk_runtime_common/workspace_files/__init__.py +29 -0
  478. ksadk_runtime_common/workspace_files/bootstrap.py +56 -0
  479. ksadk_runtime_common/workspace_files/constants.py +9 -0
  480. ksadk_runtime_common/workspace_files/path_utils.py +71 -0
  481. ksadk_runtime_common/workspace_files/preview.py +96 -0
  482. ksadk_runtime_common/workspace_files/router.py +254 -0
  483. agentengine_sdk_python/__init__.py +0 -3
  484. agentengine_sdk_python-0.6.4.dist-info/METADATA +0 -48
  485. agentengine_sdk_python-0.6.4.dist-info/RECORD +0 -5
  486. agentengine_sdk_python-0.6.4.dist-info/top_level.txt +0 -1
@@ -0,0 +1,68 @@
1
+ """TUI 流式渲染共享纯函数。
2
+
3
+ 从 RemoteRunner.stream 的归一化 chunk 提取 delta/usage/终止信号,格式化 usage 文本。
4
+ 被 loop.py(交互 TUI)和 cmd_invoke._invoke_once(-m 单次)共用,保证两路径渲染口径一致。
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import re
9
+ from typing import Any, Optional
10
+
11
+
12
+ def clean_response(text: str) -> str:
13
+ """清理 LLM 响应中的内部调试伪影。
14
+
15
+ 只删内部调试残留(Tool Result 标记、python repr 片段、tool_call_id),
16
+ 不动正常的 XML/HTML 标签(用户可能需要 <tag> 输出)。
17
+ """
18
+ text = re.sub(r"\[Tool Result:.*?\]", "", text, flags=re.DOTALL)
19
+ text = re.sub(r"<think>.*?</think>", "", text, flags=re.DOTALL)
20
+ text = re.sub(r"name='[^']*'\s*tool_call_id='[^']*'", "", text)
21
+ return text.strip()
22
+
23
+
24
+ def extract_stream_delta(chunk: dict) -> tuple[str, dict | None, bool]:
25
+ """从 RemoteRunner.stream 的 chunk 提取 (delta 文本, usage, 是否终止信号)。
26
+
27
+ - text/thinking 等普通 chunk:取 delta,非终止。
28
+ - final(chat 路径结束,output=完整文本)/ responses_output(responses 路径
29
+ response.completed,output=list):只取 usage,不把 output 当 delta——
30
+ 否则末尾会把完整文本或 list 再 append 一遍(重复/乱码)。
31
+ """
32
+ chunk_type = str(chunk.get("type") or "text")
33
+ if chunk_type in {"final", "responses_output"}:
34
+ usage = chunk.get("usage")
35
+ usage = dict(usage) if isinstance(usage, dict) else None
36
+ # terminal chunk 可能带 metadata.last_usage(上下文用量),合并进 usage
37
+ # 让 TUI 能显示 context 占比,不丢这条 metadata。
38
+ metadata = chunk.get("metadata")
39
+ if isinstance(metadata, dict) and isinstance(metadata.get("last_usage"), dict):
40
+ if usage is None:
41
+ usage = {}
42
+ usage.setdefault("last_usage", dict(metadata["last_usage"]))
43
+ return "", (usage or None), True
44
+ delta = chunk.get("delta") or ""
45
+ if not isinstance(delta, str):
46
+ delta = str(delta or "")
47
+ return delta, None, False
48
+
49
+
50
+ def format_usage(usage: Optional[dict[str, Any]]) -> str:
51
+ """把 usage dict 格式成紧凑文本:↑输入 ↓输出 ⌀总计。
52
+
53
+ 兼容 input_tokens/output_tokens(chat 路径)与 prompt_tokens/completion_tokens
54
+ (responses 路径)两种字段名。
55
+ """
56
+ if not isinstance(usage, dict) or not usage:
57
+ return ""
58
+ inp = usage.get("input_tokens") or usage.get("prompt_tokens")
59
+ out = usage.get("output_tokens") or usage.get("completion_tokens")
60
+ total = usage.get("total_tokens")
61
+ parts = []
62
+ if inp:
63
+ parts.append(f"↑{inp}")
64
+ if out:
65
+ parts.append(f"↓{out}")
66
+ if total:
67
+ parts.append(f"⌀{total}")
68
+ return " ".join(parts)
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.7.0"
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"]
@@ -0,0 +1,151 @@
1
+ """LanceDB memory backend provider."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from ksadk_runtime_common.memory_backend.manifest import MemoryBackendManifest
8
+ from ksadk_runtime_common.memory_backend.registry import RenderResult
9
+
10
+
11
+ class LanceDBProvider:
12
+ """Provider for the in-process LanceDB OpenClaw memory plugin."""
13
+
14
+ def render(self, manifest: MemoryBackendManifest) -> RenderResult:
15
+ """Render LanceDB plugin config for OpenClaw.
16
+
17
+ Maps the platform manifest config fields onto the memory-lancedb
18
+ plugin schema. This must stay in sync with the inline renderer in
19
+ ``deploy/openclaw/bootstrap.sh`` so both code paths produce the same
20
+ plugin entry.
21
+ """
22
+ entry: dict[str, Any] = {"enabled": True}
23
+ config = self._render_plugin_config(manifest.config or {})
24
+ if config:
25
+ entry["config"] = config
26
+
27
+ return RenderResult(
28
+ backend_type="lancedb",
29
+ config_patch={
30
+ "plugins": {
31
+ "slots": {
32
+ "memory": "memory-lancedb",
33
+ },
34
+ "entries": {
35
+ "memory-lancedb": entry,
36
+ },
37
+ },
38
+ },
39
+ plugin_ids=["memory-lancedb"],
40
+ disabled_plugin_ids=["openclaw-mem0"],
41
+ )
42
+
43
+ @staticmethod
44
+ def _first(config: dict[str, Any], *keys: str) -> Any:
45
+ for key in keys:
46
+ value = config.get(key)
47
+ if isinstance(value, str):
48
+ value = value.strip()
49
+ if value:
50
+ return value
51
+ elif value is not None:
52
+ return value
53
+ return None
54
+
55
+ @classmethod
56
+ def _render_plugin_config(cls, config: dict[str, Any]) -> dict[str, Any]:
57
+ if not config:
58
+ return {}
59
+
60
+ output: dict[str, Any] = {}
61
+
62
+ embedding: dict[str, Any] = {}
63
+ for target_key, *source_keys in (
64
+ ("provider", "provider", "embedding_provider"),
65
+ ("model", "model", "embedding_model"),
66
+ ("apiKey", "apiKey", "api_key", "embedding_api_key"),
67
+ ("baseUrl", "baseUrl", "base_url", "embedding_base_url"),
68
+ ):
69
+ value = cls._first(config, *source_keys)
70
+ if value is not None:
71
+ embedding[target_key] = value
72
+ dimensions = cls._first(
73
+ config, "dimensions", "embedding_dimensions"
74
+ )
75
+ if isinstance(dimensions, int) or (
76
+ isinstance(dimensions, str) and dimensions.strip().isdigit()
77
+ ):
78
+ embedding["dimensions"] = int(dimensions)
79
+ if embedding:
80
+ output["embedding"] = embedding
81
+
82
+ db_path = cls._first(
83
+ config, "dbPath", "db_path", "data_path",
84
+ "database_uri", "databaseUri", "database_url",
85
+ )
86
+ if db_path is not None:
87
+ output["dbPath"] = db_path
88
+
89
+ for target_key, *source_keys in (
90
+ ("autoCapture", "autoCapture", "auto_capture"),
91
+ ("autoRecall", "autoRecall", "auto_recall"),
92
+ ):
93
+ value = cls._first(config, *source_keys)
94
+ if isinstance(value, bool):
95
+ output[target_key] = value
96
+ elif isinstance(value, str):
97
+ normalized = value.strip().lower()
98
+ if normalized in {"1", "true", "yes", "on"}:
99
+ output[target_key] = True
100
+ elif normalized in {"0", "false", "no", "off"}:
101
+ output[target_key] = False
102
+
103
+ for target_key, *source_keys in (
104
+ ("captureMaxChars", "captureMaxChars", "capture_max_chars"),
105
+ ("recallMaxChars", "recallMaxChars", "recall_max_chars"),
106
+ ):
107
+ value = cls._first(config, *source_keys)
108
+ if isinstance(value, int) and not isinstance(value, bool):
109
+ output[target_key] = value
110
+ elif isinstance(value, str) and value.strip().lstrip("-").isdigit():
111
+ output[target_key] = int(value)
112
+
113
+ custom_triggers = config.get("customTriggers", config.get("custom_triggers"))
114
+ if isinstance(custom_triggers, list):
115
+ output["customTriggers"] = custom_triggers
116
+
117
+ for target_key, *source_keys in (
118
+ ("dreaming", "dreaming"),
119
+ ("storageOptions", "storageOptions", "storage_options"),
120
+ ):
121
+ value = cls._first(config, *source_keys)
122
+ if isinstance(value, dict):
123
+ output[target_key] = value
124
+
125
+ storage_options = output.get("storageOptions")
126
+ if not isinstance(storage_options, dict):
127
+ storage_options = {}
128
+ for target_key, *source_keys in (
129
+ ("endpoint", "storage_endpoint", "storageEndpoint"),
130
+ ("region", "storage_region", "storageRegion"),
131
+ ("bucket", "storage_bucket", "storageBucket"),
132
+ ("prefix", "storage_prefix", "storagePrefix"),
133
+ ("accessKeyId", "storage_access_key_id", "storageAccessKeyId"),
134
+ ("secretAccessKey", "storage_secret_access_key", "storageSecretAccessKey"),
135
+ ):
136
+ value = cls._first(config, *source_keys)
137
+ if value is not None:
138
+ storage_options[target_key] = value
139
+ allow_http = cls._first(config, "storage_allow_http", "storageAllowHttp")
140
+ if isinstance(allow_http, bool):
141
+ storage_options["allowHttp"] = "true" if allow_http else "false"
142
+ elif isinstance(allow_http, str):
143
+ normalized = allow_http.strip().lower()
144
+ if normalized in {"1", "true", "yes", "on"}:
145
+ storage_options["allowHttp"] = "true"
146
+ elif normalized in {"0", "false", "no", "off"}:
147
+ storage_options["allowHttp"] = "false"
148
+ if storage_options:
149
+ output["storageOptions"] = storage_options
150
+
151
+ return output
@@ -0,0 +1,74 @@
1
+ """Mem0 memory backend provider."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ from typing import Any
7
+
8
+ from ksadk_runtime_common.memory_backend.manifest import MemoryBackendManifest
9
+ from ksadk_runtime_common.memory_backend.registry import RenderResult
10
+
11
+
12
+ def _resolve_env_name(secrets_env: dict[str, str], key: str, default: str) -> str:
13
+ """Resolve an env var name from secrets_env, falling back to a default."""
14
+ return str(secrets_env.get(key) or default).strip() or default
15
+
16
+
17
+ def _require_env(name: str) -> None:
18
+ """Require a non-empty environment variable in the current process."""
19
+ if not str(os.getenv(name) or "").strip():
20
+ raise ValueError(f"mem0 backend requires environment variable '{name}'")
21
+
22
+
23
+ def _require_env_value(name: str) -> str:
24
+ """Return a required env var value after validating it is non-empty."""
25
+ _require_env(name)
26
+ return str(os.getenv(name) or "").strip()
27
+
28
+
29
+ class Mem0Provider:
30
+ """Provider for the mem0 memory backend."""
31
+
32
+ def render(self, manifest: MemoryBackendManifest) -> RenderResult:
33
+ """Render mem0 config for OpenClaw."""
34
+ config = manifest.config
35
+ secrets_env = manifest.secrets_env
36
+
37
+ mem0_instance_id = config.get("mem0_instance_id")
38
+ if not mem0_instance_id:
39
+ raise ValueError("mem0 backend requires 'mem0_instance_id' in config")
40
+
41
+ api_key_env = _resolve_env_name(secrets_env, "api_key", "MEM0_API_KEY")
42
+ user_id_env = _resolve_env_name(secrets_env, "user_id", "MEM0_USER_ID")
43
+ base_url_env = _resolve_env_name(secrets_env, "base_url", "MEM0_BASE_URL")
44
+
45
+ required_env = [api_key_env, user_id_env, base_url_env]
46
+ api_key = _require_env_value(api_key_env)
47
+ user_id = _require_env_value(user_id_env)
48
+ base_url = _require_env_value(base_url_env)
49
+
50
+ config_patch: dict[str, Any] = {
51
+ "plugins": {
52
+ "slots": {
53
+ "memory": "openclaw-mem0",
54
+ },
55
+ "entries": {
56
+ "openclaw-mem0": {
57
+ "enabled": True,
58
+ "config": {
59
+ "mode": "platform",
60
+ "apiKey": api_key,
61
+ "baseUrl": base_url,
62
+ "userId": user_id,
63
+ },
64
+ },
65
+ },
66
+ },
67
+ }
68
+
69
+ return RenderResult(
70
+ backend_type="mem0",
71
+ config_patch=config_patch,
72
+ required_env=required_env,
73
+ plugin_ids=["openclaw-mem0"],
74
+ )
@@ -0,0 +1,56 @@
1
+ """Memory backend provider registry."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Protocol
6
+
7
+ from pydantic import BaseModel, Field
8
+
9
+ from ksadk_runtime_common.memory_backend.manifest import MemoryBackendManifest
10
+
11
+
12
+ class RenderResult(BaseModel):
13
+ """Result from rendering a memory backend config."""
14
+
15
+ backend_type: str
16
+ config_patch: dict[str, Any] = Field(default_factory=dict)
17
+ required_env: list[str] = Field(default_factory=list)
18
+ plugin_ids: list[str] = Field(default_factory=list)
19
+ disabled_plugin_ids: list[str] = Field(default_factory=list)
20
+ clear_plugin_slots: list[str] = Field(default_factory=list)
21
+
22
+
23
+ class ProviderProtocol(Protocol):
24
+ """Protocol for memory backend providers."""
25
+
26
+ def render(self, manifest: MemoryBackendManifest) -> RenderResult: ...
27
+
28
+
29
+ _PROVIDERS: dict[str, ProviderProtocol] = {}
30
+
31
+
32
+ def register_provider(backend_type: str, provider: ProviderProtocol) -> None:
33
+ """Register a memory backend provider."""
34
+ _PROVIDERS[backend_type] = provider
35
+
36
+
37
+ def get_provider(backend_type: str) -> ProviderProtocol | None:
38
+ """Get a registered provider by backend type."""
39
+ return _PROVIDERS.get(backend_type)
40
+
41
+
42
+ def list_providers() -> list[str]:
43
+ """List registered backend type identifiers."""
44
+ return list(_PROVIDERS.keys())
45
+
46
+
47
+ def _register_builtin_providers() -> None:
48
+ """Register providers shipped in this repo copy."""
49
+ from ksadk_runtime_common.memory_backend.providers.mem0 import Mem0Provider
50
+ from ksadk_runtime_common.memory_backend.providers.lancedb import LanceDBProvider
51
+
52
+ register_provider("mem0", Mem0Provider())
53
+ register_provider("lancedb", LanceDBProvider())
54
+
55
+
56
+ _register_builtin_providers()