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,852 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import re
6
+ from collections.abc import Iterable
7
+ from collections.abc import Mapping
8
+ from typing import Any
9
+
10
+ from ksadk.toolsets.platform import get_platform_tools
11
+ from ksadk.toolsets.platform import component_status
12
+ from ksadk.toolsets.sandbox import get_sandbox_tools
13
+ from ksadk.toolsets.sandbox import (
14
+ _SANDBOX_TOOL_POLICIES,
15
+ run_code,
16
+ run_command,
17
+ sandbox_backend_name,
18
+ sandbox_status,
19
+ )
20
+ from ksadk.toolsets.skills import get_skill_tools
21
+ from ksadk.toolsets.skills import (
22
+ _SKILL_TOOL_POLICIES,
23
+ _skill_execution_backend,
24
+ execute_skills,
25
+ list_skills,
26
+ load_skill,
27
+ search_skills,
28
+ )
29
+ from ksadk.toolsets.workspace import get_workspace_tools
30
+ from ksadk.toolsets.workspace import (
31
+ _WORKSPACE_TOOL_POLICIES,
32
+ delete_workspace_file,
33
+ edit_workspace_file,
34
+ lint_workspace_file,
35
+ list_workspace_files,
36
+ multi_edit_workspace_file,
37
+ read_workspace_file,
38
+ search_workspace_files,
39
+ workspace_status,
40
+ write_workspace_file,
41
+ write_workspace_files,
42
+ )
43
+ from ksadk.toolsets.web import get_web_tools
44
+ from ksadk.toolsets.web import web_fetch, web_search, _WEB_TOOL_POLICIES
45
+ from ksadk.tools.gateway import ToolPolicy, tool_policy_requires_approval
46
+ from ksadk.toolsets._langchain import as_tool
47
+
48
+ _DEFAULT_GROUPS = ("skill", "workspace", "platform", "sandbox", "web")
49
+ _DISPATCHER_TOOL_NAME = "tool_dispatcher"
50
+ _LEGACY_DISPATCHER_TOOL_NAME = "agentengine_tool_dispatcher"
51
+ _TOOL_SEARCH_NAME = "tool_search"
52
+ _FOCUSED_TOOL_NAMES = (
53
+ "workspace_status",
54
+ "list_workspace_files",
55
+ "read_workspace_file",
56
+ "search_workspace_files",
57
+ "edit_workspace_file",
58
+ "multi_edit_workspace_file",
59
+ "lint_workspace_file",
60
+ "component_status",
61
+ "sandbox_status",
62
+ "run_command",
63
+ "run_code",
64
+ "web_fetch",
65
+ "web_search",
66
+ _TOOL_SEARCH_NAME,
67
+ )
68
+ _DEFERRED_TOOL_NAMES = (_TOOL_SEARCH_NAME, _DISPATCHER_TOOL_NAME)
69
+ _EXTERNAL_TOOL_SPECS: dict[str, dict[str, Any]] = {}
70
+
71
+ _TOOLSET_FACTORIES = {
72
+ "skill": get_skill_tools,
73
+ "skills": get_skill_tools,
74
+ "workspace": get_workspace_tools,
75
+ "platform": get_platform_tools,
76
+ "sandbox": get_sandbox_tools,
77
+ "web": get_web_tools,
78
+ }
79
+
80
+ _TOOLSET_DESCRIPTORS = {
81
+ "skill": (
82
+ (list_skills, _SKILL_TOOL_POLICIES["list_skills"], {}),
83
+ (search_skills, _SKILL_TOOL_POLICIES["search_skills"], {}),
84
+ (load_skill, _SKILL_TOOL_POLICIES["load_skill"], {}),
85
+ (
86
+ execute_skills,
87
+ _SKILL_TOOL_POLICIES["execute_skills"],
88
+ {
89
+ "backend": lambda: _skill_execution_backend(),
90
+ "enabled": lambda: _enabled_backend(_skill_execution_backend()),
91
+ "boundary": "isolated_skill_runtime",
92
+ },
93
+ ),
94
+ ),
95
+ "workspace": (
96
+ (workspace_status, _WORKSPACE_TOOL_POLICIES["workspace_status"], {"boundary": "workspace_root"}),
97
+ (list_workspace_files, _WORKSPACE_TOOL_POLICIES["list_workspace_files"], {"boundary": "workspace_root"}),
98
+ (read_workspace_file, _WORKSPACE_TOOL_POLICIES["read_workspace_file"], {"boundary": "workspace_root"}),
99
+ (write_workspace_file, _WORKSPACE_TOOL_POLICIES["write_workspace_file"], {"boundary": "workspace_root"}),
100
+ (write_workspace_files, _WORKSPACE_TOOL_POLICIES["write_workspace_files"], {"boundary": "workspace_root"}),
101
+ (edit_workspace_file, _WORKSPACE_TOOL_POLICIES["edit_workspace_file"], {"boundary": "workspace_root"}),
102
+ (multi_edit_workspace_file, _WORKSPACE_TOOL_POLICIES["multi_edit_workspace_file"], {"boundary": "workspace_root"}),
103
+ (lint_workspace_file, _WORKSPACE_TOOL_POLICIES["lint_workspace_file"], {"boundary": "workspace_root"}),
104
+ (search_workspace_files, _WORKSPACE_TOOL_POLICIES["search_workspace_files"], {"boundary": "workspace_root"}),
105
+ (delete_workspace_file, _WORKSPACE_TOOL_POLICIES["delete_workspace_file"], {"boundary": "workspace_root"}),
106
+ ),
107
+ "platform": (
108
+ (component_status, ToolPolicy(risk_level="low"), {}),
109
+ ),
110
+ "sandbox": (
111
+ (
112
+ sandbox_status,
113
+ _SANDBOX_TOOL_POLICIES["sandbox_status"],
114
+ {
115
+ "backend": lambda: sandbox_backend_name(),
116
+ "enabled": lambda: _enabled_backend(sandbox_backend_name()),
117
+ "boundary": "isolated_sandbox",
118
+ },
119
+ ),
120
+ (
121
+ run_command,
122
+ _SANDBOX_TOOL_POLICIES["run_command"],
123
+ {
124
+ "backend": lambda: sandbox_backend_name(),
125
+ "enabled": lambda: _enabled_backend(sandbox_backend_name()),
126
+ "boundary": "isolated_sandbox",
127
+ },
128
+ ),
129
+ (
130
+ run_code,
131
+ _SANDBOX_TOOL_POLICIES["run_code"],
132
+ {
133
+ "backend": lambda: sandbox_backend_name(),
134
+ "enabled": lambda: _enabled_backend(sandbox_backend_name()),
135
+ "boundary": "isolated_sandbox",
136
+ },
137
+ ),
138
+ ),
139
+ "web": (
140
+ (web_fetch, _WEB_TOOL_POLICIES["web_fetch"], {"boundary": "public_http"}),
141
+ (web_search, _WEB_TOOL_POLICIES["web_search"], {"boundary": "search_provider"}),
142
+ ),
143
+ }
144
+
145
+
146
+ def get_agentengine_tools(
147
+ include: Iterable[str] | None = None,
148
+ *,
149
+ profile: str = "default",
150
+ mode: str = "direct",
151
+ ) -> list:
152
+ tools, _ = _select_agentengine_tools(include=include, profile=profile, mode=mode)
153
+ return tools
154
+
155
+
156
+ def get_ksadk_builtin_tools(profile: str = "coding") -> list:
157
+ return get_agentengine_tools(profile=profile, mode="direct")
158
+
159
+
160
+ def describe_agentengine_tools(
161
+ include: Iterable[str] | None = None,
162
+ *,
163
+ profile: str = "default",
164
+ mode: str = "direct",
165
+ ) -> list[dict[str, Any]]:
166
+ return _select_agentengine_tool_descriptors(include=include, profile=profile, mode=mode)
167
+
168
+
169
+ def register_external_tools(
170
+ tools: Iterable[Any],
171
+ *,
172
+ group: str = "external",
173
+ boundary: str = "framework_managed_external_tool",
174
+ risk_level: str = "medium",
175
+ enabled: bool = True,
176
+ ) -> list[str]:
177
+ """Register framework-managed tool descriptors for tool_search discovery.
178
+
179
+ The registered tools are descriptors only. Execution remains owned by the
180
+ framework or runtime that originally bound the external tool.
181
+ """
182
+
183
+ names: list[str] = []
184
+ for tool in tools or []:
185
+ spec = _external_tool_spec(
186
+ tool,
187
+ group=group,
188
+ boundary=boundary,
189
+ risk_level=risk_level,
190
+ enabled=enabled,
191
+ )
192
+ if not spec:
193
+ continue
194
+ name = spec["name"]
195
+ _EXTERNAL_TOOL_SPECS[name] = spec
196
+ names.append(name)
197
+ return names
198
+
199
+
200
+ def clear_external_tools(group: str | None = None) -> None:
201
+ """Clear registered external tool descriptors, primarily for tests."""
202
+
203
+ if group is None:
204
+ _EXTERNAL_TOOL_SPECS.clear()
205
+ return
206
+ normalized_group = str(group or "").strip()
207
+ for name, spec in list(_EXTERNAL_TOOL_SPECS.items()):
208
+ if str(spec.get("group") or "") == normalized_group:
209
+ _EXTERNAL_TOOL_SPECS.pop(name, None)
210
+
211
+
212
+ def tool_dispatcher(
213
+ action: str,
214
+ tool_name: str | None = None,
215
+ arguments: dict[str, Any] | str | None = None,
216
+ include: str | Iterable[str] | None = None,
217
+ profile: str = "default",
218
+ ) -> dict[str, Any]:
219
+ """List, describe, or call ksadk built-in tools through one governed entrypoint."""
220
+
221
+ normalized_action = str(action or "").strip().lower()
222
+ requested_include = _normalize_include(include)
223
+
224
+ if normalized_action == "list":
225
+ try:
226
+ _, specs = _select_agentengine_tools(
227
+ include=requested_include or _profile_default_include(profile),
228
+ profile=profile,
229
+ include_dispatcher=False,
230
+ )
231
+ except ValueError:
232
+ return _unknown_tool_error(", ".join(requested_include) if requested_include else str(include or ""))
233
+ return {"ok": True, "tools": specs, "tool_count": len(specs)}
234
+
235
+ if normalized_action == "describe":
236
+ target_name = _normalize_tool_name(tool_name)
237
+ if not target_name:
238
+ return {"ok": False, "error_type": "missing_tool_name", "error_message": "tool_name is required"}
239
+ if target_name in {_DISPATCHER_TOOL_NAME, _LEGACY_DISPATCHER_TOOL_NAME}:
240
+ return _dispatcher_self_call_error()
241
+ try:
242
+ _, specs = _select_agentengine_tools(include=[target_name], profile=profile, include_dispatcher=False)
243
+ except ValueError:
244
+ return _unknown_tool_error(target_name)
245
+ return {"ok": True, "tool": specs[0]}
246
+
247
+ if normalized_action == "call":
248
+ target_name = _normalize_tool_name(tool_name)
249
+ if not target_name:
250
+ return {"ok": False, "error_type": "missing_tool_name", "error_message": "tool_name is required"}
251
+ if target_name in {_DISPATCHER_TOOL_NAME, _LEGACY_DISPATCHER_TOOL_NAME}:
252
+ return _dispatcher_self_call_error()
253
+ try:
254
+ tools, specs = _select_agentengine_tools(include=[target_name], profile=profile, include_dispatcher=False)
255
+ except ValueError:
256
+ return _unknown_tool_error(target_name)
257
+ if specs and specs[0].get("enabled") is False:
258
+ return {"ok": False, "error_type": "tool_disabled", "error_message": f"Tool is disabled: {target_name}", "tool_name": target_name}
259
+ tool_arguments, arguments_error = _normalize_tool_arguments(arguments)
260
+ if arguments_error:
261
+ return arguments_error
262
+ tool_arguments = _normalize_dispatched_tool_arguments(target_name, tool_arguments)
263
+ result = _invoke_tool(tools[0], tool_arguments)
264
+ if isinstance(result, dict) and result.get("type") == "approval_required":
265
+ return {**result, "dispatched_tool_name": target_name}
266
+ if isinstance(result, dict) and result.get("ok") is False:
267
+ return {"ok": False, "tool_name": target_name, "result": result}
268
+ return {"ok": True, "tool_name": target_name, "result": result}
269
+
270
+ return {
271
+ "ok": False,
272
+ "error_type": "unknown_action",
273
+ "error_message": "action must be one of: list, describe, call",
274
+ "action": action,
275
+ }
276
+
277
+
278
+ def agentengine_tool_dispatcher(
279
+ action: str,
280
+ tool_name: str | None = None,
281
+ arguments: dict[str, Any] | str | None = None,
282
+ include: str | Iterable[str] | None = None,
283
+ profile: str = "default",
284
+ ) -> dict[str, Any]:
285
+ """Compatibility alias for tool_dispatcher."""
286
+
287
+ return tool_dispatcher(
288
+ action=action,
289
+ tool_name=tool_name,
290
+ arguments=arguments,
291
+ include=include,
292
+ profile=profile,
293
+ )
294
+
295
+
296
+ def tool_search(
297
+ query: str,
298
+ profile: str = "coding",
299
+ max_results: int = 8,
300
+ include_disabled: bool = False,
301
+ ) -> dict[str, Any]:
302
+ """Search ksadk built-in tool descriptions without executing them."""
303
+
304
+ text = str(query or "").strip()
305
+ if not text:
306
+ return {"ok": False, "error_type": "query_required", "error_message": "query is required"}
307
+ specs = [
308
+ *describe_agentengine_tools(include=_profile_default_include(profile), profile=profile),
309
+ *_external_tool_specs(),
310
+ ]
311
+ terms = _search_terms(text)
312
+ scored: list[dict[str, Any]] = []
313
+ for spec in specs:
314
+ if spec["name"] in {_DISPATCHER_TOOL_NAME, _LEGACY_DISPATCHER_TOOL_NAME}:
315
+ continue
316
+ if not include_disabled and spec.get("enabled") is False:
317
+ continue
318
+ haystack = _tool_search_text(spec)
319
+ score = _tool_search_score(terms, haystack, spec)
320
+ if score <= 0:
321
+ continue
322
+ scored.append(
323
+ {
324
+ "name": spec["name"],
325
+ "description": spec.get("description", ""),
326
+ "group": spec.get("group", ""),
327
+ "args": dict(spec.get("args") or {}),
328
+ "risk_level": spec.get("risk_level", "low"),
329
+ "enabled": spec.get("enabled", True),
330
+ "boundary": spec.get("boundary", ""),
331
+ "execution": spec.get("execution", "builtin"),
332
+ "score": score,
333
+ "reason": _tool_search_reason(terms, haystack),
334
+ }
335
+ )
336
+ scored.sort(key=lambda item: (-float(item["score"]), str(item["name"])))
337
+ limit = max(1, min(int(max_results or 8), 50))
338
+ results = scored[:limit]
339
+ return {
340
+ "ok": True,
341
+ "query": text,
342
+ "profile": profile,
343
+ "results": results,
344
+ "deferred_tool_names": [item["name"] for item in results],
345
+ }
346
+
347
+
348
+ def _select_agentengine_tools(
349
+ *,
350
+ include: Iterable[str] | None = None,
351
+ profile: str = "default",
352
+ mode: str = "direct",
353
+ include_dispatcher: bool = True,
354
+ ) -> tuple[list, list[dict[str, Any]]]:
355
+ normalized_mode = _normalize_mode(mode)
356
+ requested = _normalize_include(include) or _profile_default_include(profile)
357
+ if normalized_mode == "deferred" and include is None:
358
+ requested = list(_DEFERRED_TOOL_NAMES)
359
+ if normalized_mode == "dispatcher" and include is None:
360
+ requested = [_DISPATCHER_TOOL_NAME]
361
+ if normalized_mode == "off":
362
+ requested = []
363
+ tool_registry = _build_tool_registry(include_dispatcher=include_dispatcher)
364
+ descriptor_registry = _build_descriptor_registry(include_dispatcher=include_dispatcher)
365
+ selected_names = _expand_requested_names(requested, tool_registry)
366
+ tools = []
367
+ specs: list[dict[str, Any]] = []
368
+ seen_names: set[str] = set()
369
+ for tool_name in selected_names:
370
+ if tool_name in seen_names:
371
+ continue
372
+ tool = tool_registry.get(tool_name)
373
+ spec = descriptor_registry.get(tool_name)
374
+ if tool is None or spec is None:
375
+ raise ValueError(f"Unknown AgentEngine toolset or tool: {tool_name}")
376
+ seen_names.add(tool_name)
377
+ tools.append(tool)
378
+ specs.append(spec)
379
+ return tools, specs
380
+
381
+
382
+ def _select_agentengine_tool_descriptors(
383
+ *,
384
+ include: Iterable[str] | None = None,
385
+ profile: str = "default",
386
+ mode: str = "direct",
387
+ include_dispatcher: bool = True,
388
+ ) -> list[dict[str, Any]]:
389
+ normalized_mode = _normalize_mode(mode)
390
+ requested = _normalize_include(include) or _profile_default_include(profile)
391
+ if normalized_mode == "deferred" and include is None:
392
+ requested = list(_DEFERRED_TOOL_NAMES)
393
+ if normalized_mode == "dispatcher" and include is None:
394
+ requested = [_DISPATCHER_TOOL_NAME]
395
+ if normalized_mode == "off":
396
+ requested = []
397
+ descriptor_registry = _build_descriptor_registry(include_dispatcher=include_dispatcher)
398
+ selected_names = _expand_requested_descriptor_names(requested, descriptor_registry)
399
+ specs: list[dict[str, Any]] = []
400
+ seen_names: set[str] = set()
401
+ for tool_name in selected_names:
402
+ if tool_name in seen_names:
403
+ continue
404
+ spec = descriptor_registry.get(tool_name)
405
+ if spec is None:
406
+ raise ValueError(f"Unknown AgentEngine toolset or tool: {tool_name}")
407
+ seen_names.add(tool_name)
408
+ specs.append(dict(spec))
409
+ return specs
410
+
411
+
412
+ def _expand_requested_names(requested: list[str], tool_registry: Mapping[str, Any]) -> list[str]:
413
+ names: list[str] = []
414
+ for name in requested:
415
+ canonical_name = _canonical_toolset_group(name)
416
+ if canonical_name in {"focused", "core"}:
417
+ names.extend(_FOCUSED_TOOL_NAMES)
418
+ continue
419
+ if canonical_name in _TOOLSET_FACTORIES:
420
+ for tool in _TOOLSET_FACTORIES[canonical_name]():
421
+ names.append(_tool_name(tool))
422
+ continue
423
+ if canonical_name in tool_registry:
424
+ names.append(canonical_name)
425
+ continue
426
+ raise ValueError(f"Unknown AgentEngine toolset or tool: {name}")
427
+ return names
428
+
429
+
430
+ def _expand_requested_descriptor_names(requested: list[str], descriptor_registry: Mapping[str, Any]) -> list[str]:
431
+ names: list[str] = []
432
+ for name in requested:
433
+ canonical_name = _canonical_toolset_group(name)
434
+ if canonical_name in {"focused", "core"}:
435
+ names.extend(_FOCUSED_TOOL_NAMES)
436
+ continue
437
+ if canonical_name in _TOOLSET_FACTORIES:
438
+ for tool in _TOOLSET_FACTORIES[canonical_name]():
439
+ names.append(_tool_name(tool))
440
+ continue
441
+ if canonical_name == "mcp":
442
+ names.extend(
443
+ spec["name"]
444
+ for spec in _external_tool_specs()
445
+ if str(spec.get("group") or "").startswith("mcp:")
446
+ )
447
+ continue
448
+ external_group_names = [
449
+ spec["name"]
450
+ for spec in _external_tool_specs()
451
+ if str(spec.get("group") or "") == canonical_name
452
+ ]
453
+ if external_group_names:
454
+ names.extend(external_group_names)
455
+ continue
456
+ if canonical_name in descriptor_registry:
457
+ names.append(canonical_name)
458
+ continue
459
+ raise ValueError(f"Unknown AgentEngine toolset or tool: {name}")
460
+ return names
461
+
462
+
463
+ def _build_tool_registry(*, include_dispatcher: bool) -> dict[str, Any]:
464
+ registry: dict[str, Any] = {}
465
+ for group_name in _DEFAULT_GROUPS:
466
+ for tool in _TOOLSET_FACTORIES[group_name]():
467
+ name = _tool_name(tool)
468
+ if name and name not in registry:
469
+ registry[name] = tool
470
+ if include_dispatcher:
471
+ registry[_DISPATCHER_TOOL_NAME] = as_tool(tool_dispatcher)
472
+ registry[_TOOL_SEARCH_NAME] = as_tool(tool_search)
473
+ registry[_LEGACY_DISPATCHER_TOOL_NAME] = as_tool(agentengine_tool_dispatcher)
474
+ return registry
475
+
476
+
477
+ def _build_descriptor_registry(*, include_dispatcher: bool) -> dict[str, dict[str, Any]]:
478
+ registry: dict[str, dict[str, Any]] = {}
479
+ for group_name in _DEFAULT_GROUPS:
480
+ for func, policy, extras in _TOOLSET_DESCRIPTORS[group_name]:
481
+ name = getattr(func, "__name__", "")
482
+ if name and name not in registry:
483
+ registry[name] = _tool_spec(
484
+ group=group_name,
485
+ name=name,
486
+ description=(getattr(func, "__doc__", "") or "").strip(),
487
+ policy=policy,
488
+ extras=extras,
489
+ )
490
+ for platform_tool in get_platform_tools():
491
+ name = _tool_name(platform_tool)
492
+ if name and name not in registry:
493
+ spec = {
494
+ "name": name,
495
+ "group": "platform",
496
+ "description": str(getattr(platform_tool, "description", "") or ""),
497
+ "risk_level": "low",
498
+ "requires_approval": False,
499
+ "side_effects": [],
500
+ "enabled": True,
501
+ }
502
+ args = _tool_args(platform_tool)
503
+ if args:
504
+ spec["args"] = args
505
+ registry[name] = spec
506
+ if include_dispatcher:
507
+ registry[_DISPATCHER_TOOL_NAME] = _tool_spec(
508
+ group="dispatcher",
509
+ name=_DISPATCHER_TOOL_NAME,
510
+ description=(tool_dispatcher.__doc__ or "").strip(),
511
+ policy=ToolPolicy(risk_level="low"),
512
+ extras={
513
+ "boundary": "local_ksadk_builtin_tools",
514
+ "actions": ["list", "describe", "call"],
515
+ },
516
+ )
517
+ registry[_TOOL_SEARCH_NAME] = _tool_spec(
518
+ group="tools",
519
+ name=_TOOL_SEARCH_NAME,
520
+ description=(tool_search.__doc__ or "").strip(),
521
+ policy=ToolPolicy(risk_level="low"),
522
+ extras={
523
+ "boundary": "local_ksadk_builtin_tool_registry",
524
+ "actions": ["search"],
525
+ },
526
+ )
527
+ registry[_LEGACY_DISPATCHER_TOOL_NAME] = _tool_spec(
528
+ group="dispatcher",
529
+ name=_LEGACY_DISPATCHER_TOOL_NAME,
530
+ description=(agentengine_tool_dispatcher.__doc__ or "").strip(),
531
+ policy=ToolPolicy(risk_level="low"),
532
+ extras={
533
+ "boundary": "local_ksadk_builtin_tools",
534
+ "compat_alias_for": _DISPATCHER_TOOL_NAME,
535
+ "actions": ["list", "describe", "call"],
536
+ },
537
+ )
538
+ registry.update(_external_tool_specs_by_name())
539
+ return registry
540
+
541
+
542
+ def _canonical_toolset_group(name: object) -> str:
543
+ value = str(name).strip().lower()
544
+ if value == "skills":
545
+ return "skill"
546
+ return value
547
+
548
+
549
+ def _normalize_include(include: Iterable[str] | str | None) -> list[str]:
550
+ if include is None:
551
+ return []
552
+ if isinstance(include, str):
553
+ return [include]
554
+ return [str(item) for item in include]
555
+
556
+
557
+ def _normalize_tool_name(tool_name: str | None) -> str:
558
+ return str(tool_name or "").strip()
559
+
560
+
561
+ def _normalize_tool_arguments(arguments: dict[str, Any] | str | None) -> tuple[dict[str, Any], dict[str, Any] | None]:
562
+ if arguments is None:
563
+ return {}, None
564
+ if isinstance(arguments, dict):
565
+ return dict(arguments), None
566
+ if isinstance(arguments, str):
567
+ text = arguments.strip()
568
+ if not text:
569
+ return {}, None
570
+ try:
571
+ parsed = json.loads(text)
572
+ except json.JSONDecodeError as exc:
573
+ return {}, {
574
+ "ok": False,
575
+ "error_type": "invalid_arguments_json",
576
+ "error_message": f"arguments must be a JSON object string: {exc.msg}",
577
+ "arguments": arguments,
578
+ }
579
+ if isinstance(parsed, dict):
580
+ return parsed, None
581
+ return {}, {
582
+ "ok": False,
583
+ "error_type": "invalid_arguments_type",
584
+ "error_message": "arguments JSON string must decode to an object",
585
+ "arguments_type": type(parsed).__name__,
586
+ }
587
+ return {}, {
588
+ "ok": False,
589
+ "error_type": "invalid_arguments_type",
590
+ "error_message": "arguments must be a dictionary or JSON object string",
591
+ "arguments_type": type(arguments).__name__,
592
+ }
593
+
594
+
595
+ def _normalize_dispatched_tool_arguments(tool_name: str, arguments: dict[str, Any]) -> dict[str, Any]:
596
+ if tool_name == "save_memory" and "content" not in arguments:
597
+ if "key" in arguments and "value" in arguments:
598
+ return {"content": f"{arguments['key']}: {_stringify_memory_value(arguments['value'])}"}
599
+ return arguments
600
+
601
+
602
+ def _stringify_memory_value(value: Any) -> str:
603
+ if isinstance(value, str):
604
+ return value
605
+ return json.dumps(value, ensure_ascii=False)
606
+
607
+
608
+ def _tool_args(tool: Any) -> dict[str, Any]:
609
+ args = getattr(tool, "args", None)
610
+ if isinstance(args, dict):
611
+ return dict(args)
612
+ return {}
613
+
614
+
615
+ def _external_tool_specs() -> list[dict[str, Any]]:
616
+ return [dict(spec) for spec in _EXTERNAL_TOOL_SPECS.values()]
617
+
618
+
619
+ def _external_tool_specs_by_name() -> dict[str, dict[str, Any]]:
620
+ return {name: dict(spec) for name, spec in _EXTERNAL_TOOL_SPECS.items()}
621
+
622
+
623
+ def _external_tool_spec(
624
+ tool: Any,
625
+ *,
626
+ group: str,
627
+ boundary: str,
628
+ risk_level: str,
629
+ enabled: bool,
630
+ ) -> dict[str, Any] | None:
631
+ if isinstance(tool, Mapping):
632
+ name = str(tool.get("name") or "").strip()
633
+ description = str(tool.get("description") or "").strip()
634
+ args = _external_tool_args(tool)
635
+ spec = dict(tool)
636
+ else:
637
+ name = _tool_name(tool)
638
+ description = str(getattr(tool, "description", "") or "").strip()
639
+ args = _external_tool_args(tool)
640
+ spec = {}
641
+ if not name:
642
+ return None
643
+ return {
644
+ **spec,
645
+ "name": name,
646
+ "group": str(group or "external"),
647
+ "description": description,
648
+ "args": args,
649
+ "risk_level": str(spec.get("risk_level") or risk_level or "medium"),
650
+ "requires_approval": bool(spec.get("requires_approval", False)),
651
+ "side_effects": list(spec.get("side_effects") or []),
652
+ "enabled": bool(spec.get("enabled", enabled)),
653
+ "boundary": str(spec.get("boundary") or boundary),
654
+ "execution": "external",
655
+ }
656
+
657
+
658
+ def _external_tool_args(tool: Any) -> dict[str, Any]:
659
+ if isinstance(tool, Mapping):
660
+ args = tool.get("args") or tool.get("parameters") or tool.get("input_schema")
661
+ else:
662
+ args = (
663
+ getattr(tool, "args", None)
664
+ or getattr(tool, "parameters", None)
665
+ or getattr(tool, "input_schema", None)
666
+ )
667
+ if not isinstance(args, Mapping):
668
+ return {}
669
+ if args.get("type") == "object" and isinstance(args.get("properties"), Mapping):
670
+ return dict(args["properties"])
671
+ return dict(args)
672
+
673
+
674
+ def _tool_name(tool: Any) -> str:
675
+ return str(getattr(tool, "name", None) or getattr(tool, "__name__", "") or "")
676
+
677
+
678
+ def _invoke_tool(tool: Any, arguments: dict[str, Any]) -> Any:
679
+ if hasattr(tool, "invoke"):
680
+ return tool.invoke(arguments)
681
+ return tool(**arguments)
682
+
683
+
684
+ def _dispatcher_self_call_error() -> dict[str, Any]:
685
+ return {
686
+ "ok": False,
687
+ "error_type": "dispatcher_self_call",
688
+ "error_message": "tool_dispatcher cannot call itself",
689
+ "tool_name": _DISPATCHER_TOOL_NAME,
690
+ }
691
+
692
+
693
+ def _unknown_tool_error(tool_name: str) -> dict[str, Any]:
694
+ return {
695
+ "ok": False,
696
+ "error_type": "unknown_tool",
697
+ "error_message": f"Unknown AgentEngine tool: {tool_name}",
698
+ "tool_name": tool_name,
699
+ }
700
+
701
+
702
+ def _enabled_backend(backend: str) -> bool:
703
+ return backend not in {"", "disabled", "none", "off"}
704
+
705
+
706
+ def _profile_default_include(profile: str) -> list[str]:
707
+ normalized = str(profile or "default").strip().lower()
708
+ if normalized == "coding":
709
+ return list(_FOCUSED_TOOL_NAMES)
710
+ return list(_DEFAULT_GROUPS)
711
+
712
+
713
+ def _normalize_mode(mode: str) -> str:
714
+ normalized = str(mode or "direct").strip().lower()
715
+ if normalized in {"off", "none", "disabled"}:
716
+ return "off"
717
+ if normalized in {"dispatcher", "dispatch"}:
718
+ return "dispatcher"
719
+ if normalized in {"deferred", "search"}:
720
+ return "deferred"
721
+ return "direct"
722
+
723
+
724
+ def builtin_tools_mode(default: str = "off") -> str:
725
+ return _normalize_mode(os.environ.get("KSADK_BUILTIN_TOOLS_MODE", default))
726
+
727
+
728
+ def builtin_tools_profile(default: str = "default") -> str:
729
+ return str(os.environ.get("KSADK_BUILTIN_TOOLS_PROFILE") or default).strip() or default
730
+
731
+
732
+ def builtin_tool_descriptors_for_runtime(
733
+ *,
734
+ profile: str | None = None,
735
+ mode: str | None = None,
736
+ ) -> list[dict[str, Any]]:
737
+ resolved_mode = builtin_tools_mode() if mode is None else _normalize_mode(mode)
738
+ resolved_profile = profile or builtin_tools_profile("default")
739
+ if resolved_mode == "off":
740
+ return []
741
+ return describe_agentengine_tools(profile=resolved_profile, mode=resolved_mode)
742
+
743
+
744
+ def builtin_tools_for_runtime(
745
+ *,
746
+ profile: str | None = None,
747
+ mode: str | None = None,
748
+ ) -> list:
749
+ resolved_mode = builtin_tools_mode() if mode is None else _normalize_mode(mode)
750
+ resolved_profile = profile or builtin_tools_profile("default")
751
+ if resolved_mode == "off":
752
+ return []
753
+ return get_agentengine_tools(profile=resolved_profile, mode=resolved_mode)
754
+
755
+
756
+ def _search_terms(text: str) -> list[str]:
757
+ terms = re.findall(r"[a-zA-Z0-9_]+|[\u4e00-\u9fff]+", text.lower())
758
+ synonyms = {
759
+ "edit": ["edit", "replace", "modify", "patch", "write", "file"],
760
+ "file": ["file", "workspace", "read", "list", "search", "edit"],
761
+ "grep": ["grep", "search", "rg", "find"],
762
+ "run": ["run", "command", "shell", "code", "execute"],
763
+ "web": ["web", "fetch", "search", "url", "http"],
764
+ "读": ["read", "file", "workspace"],
765
+ "改": ["edit", "replace", "file"],
766
+ "搜": ["search", "grep", "find"],
767
+ }
768
+ expanded: list[str] = []
769
+ for term in terms:
770
+ expanded.append(term)
771
+ expanded.extend(synonyms.get(term, []))
772
+ return expanded
773
+
774
+
775
+ def _tool_search_text(spec: Mapping[str, Any]) -> str:
776
+ values = [
777
+ str(spec.get("name") or ""),
778
+ str(spec.get("group") or ""),
779
+ str(spec.get("description") or ""),
780
+ " ".join((spec.get("args") or {}).keys()) if isinstance(spec.get("args"), Mapping) else "",
781
+ ]
782
+ return " ".join(values).lower()
783
+
784
+
785
+ def _tool_search_score(terms: list[str], haystack: str, spec: Mapping[str, Any]) -> float:
786
+ score = 0.0
787
+ name = str(spec.get("name") or "").lower()
788
+ for term in terms:
789
+ if not term:
790
+ continue
791
+ if term in name:
792
+ score += 4.0
793
+ elif term in haystack:
794
+ score += 1.0
795
+ if str(spec.get("group") or "") == "workspace":
796
+ score += 0.5
797
+ return score
798
+
799
+
800
+ def _tool_search_reason(terms: list[str], haystack: str) -> str:
801
+ matched = [term for term in terms if term and term in haystack]
802
+ return f"matched: {', '.join(matched[:4])}" if matched else "matched registry metadata"
803
+
804
+
805
+ def _tool_spec(
806
+ *,
807
+ group: str,
808
+ name: str,
809
+ description: str,
810
+ policy: ToolPolicy,
811
+ extras: Mapping[str, Any] | None = None,
812
+ ) -> dict[str, Any]:
813
+ spec = {
814
+ "name": name,
815
+ "group": group,
816
+ "description": description,
817
+ "risk_level": policy.risk_level,
818
+ "requires_approval": tool_policy_requires_approval(policy),
819
+ "side_effects": list(policy.side_effects),
820
+ "enabled": True,
821
+ }
822
+ for key, value in dict(extras or {}).items():
823
+ spec[key] = value() if callable(value) else value
824
+ enabled = bool(spec.get("enabled", True))
825
+ if name == "web_search":
826
+ enabled = bool(os.environ.get("KSADK_WEB_SEARCH_PROVIDER") or os.environ.get("OPENCLAW_WEB_SEARCH_PROVIDER"))
827
+ if name in {"run_command", "run_code", "sandbox_status"}:
828
+ enabled = enabled and _enabled_backend(sandbox_backend_name())
829
+ spec["enabled"] = enabled
830
+ return spec
831
+
832
+
833
+ __all__ = [
834
+ "agentengine_tool_dispatcher",
835
+ "tool_dispatcher",
836
+ "tool_search",
837
+ "describe_agentengine_tools",
838
+ "clear_external_tools",
839
+ "builtin_tool_descriptors_for_runtime",
840
+ "builtin_tools_for_runtime",
841
+ "get_ksadk_builtin_tools",
842
+ "get_agentengine_tools",
843
+ "get_platform_tools",
844
+ "get_sandbox_tools",
845
+ "get_skill_tools",
846
+ "get_workspace_tools",
847
+ "get_web_tools",
848
+ "multi_edit_workspace_file",
849
+ "register_external_tools",
850
+ "web_fetch",
851
+ "web_search",
852
+ ]