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