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,11 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Callable
4
+
5
+
6
+ def as_tool(func: Callable):
7
+ try:
8
+ from langchain_core.tools import tool
9
+ except Exception:
10
+ return func
11
+ return tool(func)
@@ -0,0 +1,93 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+
5
+ from ksadk.skills.service_env import public_skill_space_ids, skill_space_ids, user_skill_space_ids
6
+ from ksadk.toolsets._langchain import as_tool
7
+ from ksadk.toolsets.sandbox import sandbox_backend_name
8
+ from ksadk.toolsets.workspace import workspace_root
9
+
10
+
11
+ def _env(name: str, default: str = "") -> str:
12
+ return str(os.environ.get(name) or default).strip()
13
+
14
+
15
+ def _skill_execution_backend() -> str:
16
+ explicit = _env("KSADK_SKILL_RUNTIME_BACKEND").lower()
17
+ if explicit:
18
+ return explicit
19
+ if _env("KSADK_SANDBOX_TEMPLATE_ID") or _env("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
20
+ return "e2b"
21
+ return "disabled"
22
+
23
+
24
+ def component_status() -> dict:
25
+ """Report AgentEngine built-in toolset and runtime binding status."""
26
+
27
+ skill_runtime_backend = _skill_execution_backend()
28
+ sandbox_backend = sandbox_backend_name()
29
+ spaces = skill_space_ids()
30
+ return {
31
+ "ok": True,
32
+ "summary": {
33
+ "model": _env("OPENAI_MODEL_NAME") or _env("MODEL_NAME"),
34
+ "knowledge_base_bound": bool(_env("KSADK_KB_DATASET_ID")),
35
+ "long_term_memory_bound": bool(_env("KSADK_LTM_NAMESPACE")),
36
+ "skill_space_bound": bool(spaces),
37
+ "isolated_execution": "enabled" if skill_runtime_backend not in {"", "disabled", "none", "off"} else "not_enabled",
38
+ "sandbox_direct_tools": "enabled" if sandbox_backend not in {"", "disabled", "none", "off"} else "not_enabled",
39
+ },
40
+ "skill_space": {
41
+ "space_ids": spaces,
42
+ "user_space_ids": user_skill_space_ids(),
43
+ "public_space_ids": public_skill_space_ids(),
44
+ "service_url": _env("KSADK_SKILL_SERVICE_URL"),
45
+ "aicp_endpoint_mode": _env("KSADK_AICP_ENDPOINT_MODE", "auto"),
46
+ "tools": ["list_skills", "search_skills", "load_skill", "execute_skills"],
47
+ },
48
+ "skill_runtime": {
49
+ "backend": skill_runtime_backend,
50
+ "enabled": skill_runtime_backend not in {"", "disabled", "none", "off"},
51
+ "template_bound": bool(_env("KSADK_SANDBOX_TEMPLATE_ID") or _env("KSADK_SKILL_RUNTIME_TEMPLATE_ID")),
52
+ "request_protocol": "--request-file JSON envelope",
53
+ },
54
+ "sandbox": {
55
+ "backend": sandbox_backend,
56
+ "enabled": sandbox_backend not in {"", "disabled", "none", "off"},
57
+ "template_bound": bool(_env("KSADK_SANDBOX_TEMPLATE_ID") or _env("KSADK_SKILL_RUNTIME_TEMPLATE_ID")),
58
+ "tools": ["sandbox_status", "run_command", "run_code"],
59
+ },
60
+ "workspace": {
61
+ "root": str(workspace_root()),
62
+ "tools": [
63
+ "workspace_status",
64
+ "list_workspace_files",
65
+ "read_workspace_file",
66
+ "write_workspace_file",
67
+ "write_workspace_files",
68
+ "edit_workspace_file",
69
+ "lint_workspace_file",
70
+ "search_workspace_files",
71
+ "delete_workspace_file",
72
+ ],
73
+ "boundary": "Workspace tools are confined to the AgentEngine UI workspace directory.",
74
+ "editing_model": "write tools support whole-file writes; edit_workspace_file supports exact snippet replacement; lint_workspace_file provides lightweight built-in checks.",
75
+ },
76
+ }
77
+
78
+
79
+ def get_platform_tools() -> list:
80
+ tools = [as_tool(component_status)]
81
+ try:
82
+ from ksadk.knowledge_base.langchain_tool import search_knowledge_base
83
+
84
+ tools.append(search_knowledge_base)
85
+ except Exception:
86
+ pass
87
+ try:
88
+ from ksadk.memory.langchain_tool import load_memory, save_memory
89
+
90
+ tools.extend([load_memory, save_memory])
91
+ except Exception:
92
+ pass
93
+ return tools
@@ -0,0 +1,310 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import shlex
5
+ import time
6
+ import logging
7
+ from typing import Any
8
+ from uuid import uuid4
9
+
10
+ from ksadk.runtime_context import get_current_tool_execution_context_or_default
11
+ from ksadk.sandbox import SandboxError, SandboxInputFile, create_sandbox_backend
12
+ from ksadk.sandbox.registry import GLOBAL_SANDBOX_REGISTRY
13
+ from ksadk.tools.gateway import ToolPolicy, check_command_policy, default_tool_gateway
14
+ from ksadk.tools.result_budget import budget_text_fields
15
+ from ksadk.toolsets._langchain import as_tool
16
+ from ksadk.toolsets.workspace import workspace_root
17
+
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ _SANDBOX_TOOL_POLICIES = {
23
+ "sandbox_status": ToolPolicy(risk_level="low"),
24
+ "run_command": ToolPolicy(risk_level="high", side_effects=("sandbox_command_execution",)),
25
+ "run_code": ToolPolicy(risk_level="high", side_effects=("sandbox_code_execution",)),
26
+ }
27
+
28
+
29
+ def _gateway():
30
+ return default_tool_gateway(_SANDBOX_TOOL_POLICIES)
31
+
32
+
33
+ def sandbox_backend_name() -> str:
34
+ explicit = os.environ.get("KSADK_SANDBOX_BACKEND", "").strip().lower()
35
+ if explicit:
36
+ return explicit
37
+ if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
38
+ return "e2b"
39
+ return "none"
40
+
41
+
42
+ def _sandbox_execution_backend_name() -> str:
43
+ explicit = os.environ.get("KSADK_SANDBOX_BACKEND", "").strip().lower()
44
+ return explicit or "e2b"
45
+
46
+
47
+ def sandbox_status() -> dict:
48
+ """Report configured AgentEngine sandbox status and boundaries."""
49
+
50
+ return _gateway().invoke("sandbox_status", _sandbox_status_impl)
51
+
52
+
53
+ def _sandbox_status_impl() -> dict[str, Any]:
54
+ backend = sandbox_backend_name()
55
+ timeout = int(os.environ.get("KSADK_SANDBOX_TIMEOUT") or os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT") or "600")
56
+ idle_ttl = _int_env("KSADK_SANDBOX_IDLE_TTL_SECONDS", 300)
57
+ max_sessions = _int_env("KSADK_SANDBOX_MAX_SESSIONS", 0)
58
+ template_id = os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID") or ""
59
+ isolated = backend not in {"local", "local_process", "pod", "pod_process"}
60
+ latest = GLOBAL_SANDBOX_REGISTRY.latest()
61
+ now = time.time()
62
+ return {
63
+ "ok": True,
64
+ "backend": backend,
65
+ "enabled": backend not in {"", "disabled", "none", "off"},
66
+ "isolated": isolated,
67
+ "template_bound": bool(template_id),
68
+ "template_id": template_id,
69
+ "timeout_seconds": timeout,
70
+ "ttl_seconds": _sandbox_ttl_seconds(),
71
+ "idle_ttl_seconds": idle_ttl,
72
+ "max_sessions": max_sessions,
73
+ "sandbox_id": latest.sandbox_id if latest else "",
74
+ "created_at": latest.created_at if latest else None,
75
+ "last_used_at": latest.last_used_at if latest else None,
76
+ "expires_at": latest.expires_at if latest else None,
77
+ "idle_seconds": int(now - latest.last_used_at) if latest else None,
78
+ "boundary": _sandbox_boundary(backend),
79
+ }
80
+
81
+
82
+ def run_command(
83
+ command: str,
84
+ cwd: str | None = None,
85
+ timeout: int | None = None,
86
+ env: dict[str, str] | None = None,
87
+ background: bool = False,
88
+ approval: dict[str, Any] | None = None,
89
+ ) -> dict[str, Any]:
90
+ """Run a shell command inside the configured isolated sandbox."""
91
+
92
+ return _gateway().invoke("run_command", _run_command_impl, command, cwd, timeout, env, background, approval=approval)
93
+
94
+
95
+ def _run_command_impl(
96
+ command: str,
97
+ cwd: str | None = None,
98
+ timeout: int | None = None,
99
+ env: dict[str, str] | None = None,
100
+ background: bool = False,
101
+ ) -> dict[str, Any]:
102
+ command_text = str(command or "").strip()
103
+ if not command_text:
104
+ return {"ok": False, "error_message": "command is required"}
105
+ policy = check_command_policy(command_text)
106
+ if not policy.get("ok"):
107
+ return policy
108
+ if background:
109
+ return {"ok": False, "error_type": "background_not_supported", "error_message": "background commands are not supported in P0"}
110
+ try:
111
+ entry, _created = _sandbox_entry("ksadk-direct")
112
+ result = entry.session.run_command(command_text, timeout=timeout, env=env, cwd=cwd)
113
+ payload = {
114
+ "ok": True,
115
+ "backend": f"sandbox/{_sandbox_execution_backend_name()}",
116
+ "sandbox_id": entry.sandbox_id,
117
+ "command": command_text,
118
+ "stdout": result.stdout,
119
+ "stderr": result.stderr,
120
+ "exit_code": result.exit_code,
121
+ }
122
+ return budget_text_fields(payload, tool_name="run_command", fields=("stdout", "stderr"), metadata={"tool_use_id": entry.sandbox_id})
123
+ except SandboxError as exc:
124
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
125
+ except Exception as exc:
126
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
127
+
128
+
129
+ def run_code(
130
+ code: str,
131
+ language: str = "python",
132
+ timeout: int | None = None,
133
+ env: dict[str, str] | None = None,
134
+ approval: dict[str, Any] | None = None,
135
+ ) -> dict[str, Any]:
136
+ """Run a code snippet through the sandbox; this is not a shell replacement."""
137
+
138
+ return _gateway().invoke("run_code", _run_code_impl, code, language, timeout, env, approval=approval)
139
+
140
+
141
+ def _run_code_impl(
142
+ code: str,
143
+ language: str = "python",
144
+ timeout: int | None = None,
145
+ env: dict[str, str] | None = None,
146
+ ) -> dict[str, Any]:
147
+ source = str(code or "")
148
+ if not source:
149
+ return {"ok": False, "error_message": "code is required"}
150
+ backend_name = _sandbox_execution_backend_name()
151
+ if not _sandbox_backend_isolated(backend_name):
152
+ return {
153
+ "ok": False,
154
+ "error_type": "isolated_sandbox_required",
155
+ "error_message": "run_code requires an isolated sandbox backend; local_process and pod_process are not supported for snippet execution",
156
+ "backend": backend_name,
157
+ "boundary": _sandbox_boundary(backend_name),
158
+ }
159
+ language_name = _normalize_language(language)
160
+ try:
161
+ suffix, command_prefix = _language_command(language_name)
162
+ except ValueError as exc:
163
+ return {"ok": False, "error_message": str(exc)}
164
+
165
+ path = f"/tmp/ksadk-run-code-{uuid4().hex}{suffix}"
166
+ try:
167
+ entry, _created = _sandbox_entry("ksadk-code")
168
+ entry.session.write_file(path, source)
169
+ command = f"{command_prefix} {shlex.quote(path)}"
170
+ result = entry.session.run_command(command, timeout=timeout, env=env)
171
+ payload = {
172
+ "ok": True,
173
+ "backend": f"sandbox/{_sandbox_execution_backend_name()}",
174
+ "sandbox_id": entry.sandbox_id,
175
+ "execution_model": "snippet_runner",
176
+ "boundary": _sandbox_boundary(_sandbox_execution_backend_name()),
177
+ "language": language_name,
178
+ "path": path,
179
+ "command": command,
180
+ "stdout": result.stdout,
181
+ "stderr": result.stderr,
182
+ "exit_code": result.exit_code,
183
+ }
184
+ return budget_text_fields(payload, tool_name="run_code", fields=("stdout", "stderr"), metadata={"tool_use_id": entry.sandbox_id})
185
+ except SandboxError as exc:
186
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
187
+ except Exception as exc:
188
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
189
+
190
+
191
+ def _normalize_language(language: str) -> str:
192
+ value = str(language or "python").strip().lower()
193
+ aliases = {
194
+ "py": "python",
195
+ "python3": "python",
196
+ "js": "javascript",
197
+ "node": "javascript",
198
+ "nodejs": "javascript",
199
+ "sh": "bash",
200
+ "shell": "bash",
201
+ }
202
+ return aliases.get(value, value)
203
+
204
+
205
+ def _language_command(language: str) -> tuple[str, str]:
206
+ if language == "python":
207
+ return ".py", "python"
208
+ if language == "javascript":
209
+ return ".js", "node"
210
+ if language == "bash":
211
+ return ".sh", "bash"
212
+ raise ValueError(f"unsupported language: {language}")
213
+
214
+
215
+ def _sandbox_entry(prefix: str):
216
+ backend_name = _sandbox_execution_backend_name()
217
+ backend = create_sandbox_backend()
218
+ ttl = _sandbox_ttl_seconds()
219
+ idle_ttl = _int_env("KSADK_SANDBOX_IDLE_TTL_SECONDS", 300)
220
+ max_sessions = _int_env("KSADK_SANDBOX_MAX_SESSIONS", 0) or None
221
+ key = _sandbox_session_key(prefix)
222
+ isolated = _sandbox_backend_isolated(backend_name)
223
+ input_files = _workspace_input_files() if isolated else []
224
+ entry, created = GLOBAL_SANDBOX_REGISTRY.get_or_create(
225
+ key=key,
226
+ backend_name=backend_name,
227
+ backend=backend,
228
+ ttl_seconds=ttl,
229
+ idle_ttl_seconds=idle_ttl,
230
+ max_sessions=max_sessions,
231
+ input_files=input_files,
232
+ isolated=isolated,
233
+ )
234
+ logger.info(
235
+ "ksadk.sandbox.%s",
236
+ "create" if created else "reuse",
237
+ extra={
238
+ "sandbox_backend": backend_name,
239
+ "sandbox_id": entry.sandbox_id,
240
+ "isolated": isolated,
241
+ "workspace_input_files": len(input_files) if created else 0,
242
+ },
243
+ )
244
+ return entry, created
245
+
246
+
247
+ def _sandbox_session_key(prefix: str) -> str:
248
+ explicit = os.environ.get("KSADK_SANDBOX_SESSION_ID")
249
+ if explicit:
250
+ return explicit
251
+ context = get_current_tool_execution_context_or_default()
252
+ if context.session_id:
253
+ return f"ksadk-session:{context.session_id}"
254
+ return f"{prefix}-shared"
255
+
256
+
257
+ def _sandbox_backend_isolated(backend_name: str) -> bool:
258
+ return backend_name not in {"local", "local_process", "pod", "pod_process"}
259
+
260
+
261
+ def _workspace_input_files() -> list[SandboxInputFile]:
262
+ root = workspace_root()
263
+ if not root.exists():
264
+ return []
265
+ max_files = _int_env("KSADK_SANDBOX_SYNC_MAX_FILES", 2000)
266
+ max_file_bytes = _int_env("KSADK_SANDBOX_SYNC_MAX_FILE_BYTES", 2 * 1024 * 1024)
267
+ max_total_bytes = _int_env("KSADK_SANDBOX_SYNC_MAX_TOTAL_BYTES", 25 * 1024 * 1024)
268
+ skipped_dirs = {".git", "__pycache__", ".venv", "node_modules", ".pytest_cache"}
269
+ files: list[SandboxInputFile] = []
270
+ total_bytes = 0
271
+ for item in sorted(root.rglob("*")):
272
+ if len(files) >= max_files:
273
+ break
274
+ if any(part in skipped_dirs for part in item.relative_to(root).parts):
275
+ continue
276
+ if not item.is_file():
277
+ continue
278
+ size = item.stat().st_size
279
+ if size > max_file_bytes or total_bytes + size > max_total_bytes:
280
+ continue
281
+ relative = item.relative_to(root).as_posix()
282
+ files.append(SandboxInputFile(source=item, target_path=f"/workspace/{relative}"))
283
+ total_bytes += size
284
+ return files
285
+
286
+
287
+ def _sandbox_ttl_seconds() -> int:
288
+ return _int_env("KSADK_SANDBOX_TTL_SECONDS", _int_env("KSADK_SANDBOX_TIMEOUT", 600))
289
+
290
+
291
+ def _int_env(name: str, default: int) -> int:
292
+ raw = os.environ.get(name)
293
+ if raw is None:
294
+ return int(default)
295
+ try:
296
+ return max(0, int(raw))
297
+ except ValueError:
298
+ return int(default)
299
+
300
+
301
+ def _sandbox_boundary(backend: str) -> str:
302
+ if backend in {"local", "local_process"}:
303
+ return "executes as a local child process; shares local filesystem, env allowlist, and network"
304
+ if backend in {"pod", "pod_process"}:
305
+ return "executes inside the agent pod; shares pod filesystem, env allowlist, network, and service account"
306
+ return "Sandbox tools execute commands and code only through the configured isolated sandbox backend; they never expose the host shell."
307
+
308
+
309
+ def get_sandbox_tools() -> list:
310
+ return [as_tool(sandbox_status), as_tool(run_command), as_tool(run_code)]
@@ -0,0 +1,217 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import tempfile
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ from ksadk.skills.loader import load_local_skill
9
+ from ksadk.skills.package_store import PackageStore, SkillPackageError
10
+ from ksadk.skills.runtime import loader as runtime_loader
11
+ from ksadk.skills.runtime.base import SkillRuntimeError
12
+ from ksadk.skills.runtime.factory import create_skill_runtime_backend
13
+ from ksadk.skills.runtime.registry import match_skill_refs, select_public_skill_refs
14
+ from ksadk.skills.service_client import SkillServiceClient
15
+ from ksadk.skills.service_env import (
16
+ public_skill_space_ids,
17
+ resolve_skill_service_url,
18
+ user_skill_space_ids,
19
+ )
20
+ from ksadk.skills.tool_defs import (
21
+ build_execute_skills_tool as build_runtime_execute_skills_tool,
22
+ load_remote_skill_manifests,
23
+ resolve_skill_space_ids,
24
+ )
25
+ from ksadk.tools.gateway import ToolPolicy, default_tool_gateway
26
+ from ksadk.toolsets._langchain import as_tool
27
+
28
+
29
+ _SKILL_TOOL_POLICIES = {
30
+ "list_skills": ToolPolicy(risk_level="low"),
31
+ "search_skills": ToolPolicy(risk_level="low"),
32
+ "load_skill": ToolPolicy(risk_level="low", side_effects=("skill_cache_write",)),
33
+ "execute_skills": ToolPolicy(risk_level="high", side_effects=("isolated_runtime_execution",)),
34
+ }
35
+
36
+
37
+ def _gateway():
38
+ return default_tool_gateway(_SKILL_TOOL_POLICIES)
39
+
40
+
41
+ def list_skills() -> dict[str, Any]:
42
+ """List skills discoverable from configured Skill Spaces."""
43
+
44
+ try:
45
+ manifests = load_remote_skill_manifests(resolve_skill_space_ids())
46
+ return {
47
+ "ok": True,
48
+ "skills": manifests,
49
+ "skill_space_ids": resolve_skill_space_ids(),
50
+ }
51
+ except Exception as exc:
52
+ return {
53
+ "ok": False,
54
+ "error_type": type(exc).__name__,
55
+ "error_message": str(exc),
56
+ "skill_space_ids": resolve_skill_space_ids(),
57
+ }
58
+
59
+
60
+ def load_skill(skill_name: str) -> dict[str, Any]:
61
+ """Download and load a skill's SKILL.md instructions from configured Skill Spaces."""
62
+
63
+ target = str(skill_name or "").strip().lower()
64
+ if not target:
65
+ return {"ok": False, "error_message": "skill_name is required"}
66
+ try:
67
+ client = _skill_service_client()
68
+ available: list[str] = []
69
+ for space_id, skill in _iter_remote_skills(client):
70
+ if not skill.name:
71
+ continue
72
+ available.append(skill.name)
73
+ if skill.name.strip().lower() != target:
74
+ continue
75
+ package = _get_or_download_package(client, skill)
76
+ local_skill = load_local_skill(package.root_dir)
77
+ return {
78
+ "ok": True,
79
+ "execution_context": "outer_agent",
80
+ "name": local_skill.name,
81
+ "description": local_skill.description,
82
+ "space_id": space_id,
83
+ "skill_id": skill.skill_id,
84
+ "version_id": skill.version_id,
85
+ "version": skill.version,
86
+ "cache_hit": bool(getattr(package, "cache_hit", False)),
87
+ "root_dir": str(local_skill.root_dir),
88
+ "has_scripts_dir": (local_skill.root_dir / "scripts").is_dir(),
89
+ "script_files": _script_files(local_skill.root_dir),
90
+ "instructions": local_skill.body,
91
+ "usage": "Read these instructions and complete the user's task in the outer agent unless the skill explicitly requires isolated execution.",
92
+ }
93
+ return {
94
+ "ok": False,
95
+ "error_message": f"Skill not found: {skill_name}",
96
+ "available_skills": available,
97
+ }
98
+ except Exception as exc:
99
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
100
+
101
+
102
+ def search_skills(query: str, max_results: int = 10) -> dict[str, Any]:
103
+ """Search skills by name, aliases, tags, description, and examples."""
104
+
105
+ query_text = str(query or "").strip()
106
+ if not query_text:
107
+ return {"ok": False, "error_message": "query is required"}
108
+ try:
109
+ client = _skill_service_client()
110
+ refs = [skill for _, skill in _iter_remote_skills(client)]
111
+ matches = match_skill_refs(refs, query_text, limit=max_results)
112
+ return {
113
+ "ok": True,
114
+ "query": query,
115
+ "results": [match.to_dict() for match in matches],
116
+ }
117
+ except Exception as exc:
118
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
119
+
120
+
121
+ def execute_skills(
122
+ workflow_prompt: str,
123
+ skill_names: list[str] | str | None = None,
124
+ approval: dict[str, Any] | None = None,
125
+ ) -> dict[str, Any]:
126
+ """Execute a workflow through the configured Skill Runtime."""
127
+
128
+ return _gateway().invoke(
129
+ "execute_skills",
130
+ _execute_skills_impl,
131
+ workflow_prompt,
132
+ skill_names,
133
+ approval=approval,
134
+ )
135
+
136
+
137
+ def _execute_skills_impl(workflow_prompt: str, skill_names: list[str] | str | None = None) -> dict[str, Any]:
138
+ try:
139
+ backend = create_skill_runtime_backend()
140
+ raw_tool = build_runtime_execute_skills_tool(backend=backend)
141
+ result = raw_tool(workflow_prompt, skill_names)
142
+ if isinstance(result, dict):
143
+ result.setdefault("execution_context", f"skill-runtime/{_skill_execution_backend()}")
144
+ return result
145
+ except SkillRuntimeError as exc:
146
+ return {
147
+ "ok": False,
148
+ "error_type": "skill_runtime_disabled",
149
+ "error_message": str(exc),
150
+ "hint": "Configure KSADK_SKILL_RUNTIME_BACKEND=local_process/e2b or KSADK_SANDBOX_TEMPLATE_ID for isolated Skill workflow execution.",
151
+ }
152
+ except Exception as exc:
153
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
154
+
155
+
156
+ def get_skill_tools() -> list:
157
+ return [as_tool(list_skills), as_tool(search_skills), as_tool(load_skill), as_tool(execute_skills)]
158
+
159
+
160
+ def _skill_execution_backend() -> str:
161
+ explicit = os.environ.get("KSADK_SKILL_RUNTIME_BACKEND", "").strip().lower()
162
+ if explicit:
163
+ return explicit
164
+ if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
165
+ return "e2b"
166
+ return "disabled"
167
+
168
+
169
+ def _skill_service_client() -> SkillServiceClient:
170
+ service_url = resolve_skill_service_url(require_spaces=True)
171
+ if not service_url:
172
+ raise ValueError("Skill Service URL is not configured")
173
+ return SkillServiceClient(
174
+ base_url=service_url,
175
+ token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
176
+ timeout=float(os.environ.get("KSADK_SKILL_MANIFEST_TIMEOUT", "10")),
177
+ )
178
+
179
+
180
+ def _iter_remote_skills(client: SkillServiceClient):
181
+ for space_id in user_skill_space_ids():
182
+ listing = client.list_skills_by_space_id(space_id)
183
+ for skill in listing.active_skills():
184
+ yield space_id, skill
185
+ if public_skill_space_ids():
186
+ listing = client.list_available_premade_skills()
187
+ for skill in select_public_skill_refs(listing.active_skills()):
188
+ yield listing.space_id or "public", skill
189
+
190
+
191
+ def _get_or_download_package(client: SkillServiceClient, skill):
192
+ cache_dir = Path(
193
+ os.environ.get("KSADK_SKILL_CACHE_DIR")
194
+ or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
195
+ )
196
+ store = PackageStore(cache_dir=cache_dir)
197
+ package = store.get_cached(skill)
198
+ if package is not None:
199
+ return package
200
+ archive = client.download_skill_archive(skill)
201
+ try:
202
+ return store.store_archive(skill, archive)
203
+ except SkillPackageError:
204
+ if not runtime_loader._allow_hash_mismatch():
205
+ raise
206
+ return runtime_loader._store_unverified_archive(store, skill, archive)
207
+
208
+
209
+ def _script_files(root_dir: Path) -> list[str]:
210
+ scripts_dir = root_dir / "scripts"
211
+ if not scripts_dir.is_dir():
212
+ return []
213
+ return [
214
+ str(path.relative_to(root_dir))
215
+ for path in sorted(scripts_dir.rglob("*"))
216
+ if path.is_file()
217
+ ][:20]