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,104 @@
1
+ from __future__ import annotations
2
+
3
+ import hashlib
4
+ import shutil
5
+ import zipfile
6
+ from dataclasses import dataclass
7
+ from pathlib import Path
8
+
9
+ from ksadk.skills.models import SkillRef
10
+
11
+
12
+ class SkillPackageError(RuntimeError):
13
+ pass
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class SkillPackage:
18
+ ref: SkillRef
19
+ archive_path: Path
20
+ extract_dir: Path
21
+ root_dir: Path
22
+ cache_hit: bool = False
23
+
24
+
25
+ class PackageStore:
26
+ def __init__(self, cache_dir: str | Path):
27
+ self.cache_dir = Path(cache_dir)
28
+ self.cache_dir.mkdir(parents=True, exist_ok=True)
29
+
30
+ def store_archive(self, ref: SkillRef, content: bytes) -> SkillPackage:
31
+ self._verify_hash(ref, content)
32
+ skill_dir = self._skill_dir(ref)
33
+ archive_path = skill_dir / "archive.zip"
34
+ extract_dir = skill_dir / "extracted"
35
+
36
+ if archive_path.exists() and extract_dir.exists():
37
+ cached = self.get_cached(ref)
38
+ if cached is not None:
39
+ return cached
40
+
41
+ if skill_dir.exists():
42
+ shutil.rmtree(skill_dir)
43
+ skill_dir.mkdir(parents=True, exist_ok=True)
44
+ archive_path.write_bytes(content)
45
+ extract_dir.mkdir(parents=True, exist_ok=True)
46
+ self._safe_extract(archive_path, extract_dir)
47
+
48
+ return SkillPackage(
49
+ ref=ref,
50
+ archive_path=archive_path,
51
+ extract_dir=extract_dir,
52
+ root_dir=self._find_skill_root(extract_dir),
53
+ cache_hit=False,
54
+ )
55
+
56
+ def get_cached(self, ref: SkillRef) -> SkillPackage | None:
57
+ skill_dir = self._skill_dir(ref)
58
+ archive_path = skill_dir / "archive.zip"
59
+ extract_dir = skill_dir / "extracted"
60
+ if not archive_path.exists() or not extract_dir.exists():
61
+ return None
62
+ content = archive_path.read_bytes()
63
+ try:
64
+ self._verify_hash(ref, content)
65
+ except SkillPackageError:
66
+ return None
67
+ return SkillPackage(
68
+ ref=ref,
69
+ archive_path=archive_path,
70
+ extract_dir=extract_dir,
71
+ root_dir=self._find_skill_root(extract_dir),
72
+ cache_hit=True,
73
+ )
74
+
75
+ def _skill_dir(self, ref: SkillRef) -> Path:
76
+ return self.cache_dir / (ref.cache_key or ref.name or "skill")
77
+
78
+ def _verify_hash(self, ref: SkillRef, content: bytes) -> None:
79
+ if not ref.content_hash:
80
+ return
81
+ if ref.content_hash.algorithm != "sha256":
82
+ raise SkillPackageError(f"Unsupported ContentHash algorithm: {ref.content_hash.algorithm}")
83
+ actual = hashlib.sha256(content).hexdigest()
84
+ if actual.lower() != ref.content_hash.value.lower():
85
+ raise SkillPackageError(
86
+ f"ContentHash mismatch for {ref.name}: expected {ref.content_hash.render()}, got sha256:{actual}"
87
+ )
88
+
89
+ def _safe_extract(self, archive_path: Path, extract_dir: Path) -> None:
90
+ base = extract_dir.resolve()
91
+ with zipfile.ZipFile(archive_path) as archive:
92
+ for member in archive.infolist():
93
+ target = (extract_dir / member.filename).resolve()
94
+ if not str(target).startswith(str(base) + "/") and target != base:
95
+ raise SkillPackageError(f"unsafe zip member: {member.filename}")
96
+ archive.extractall(extract_dir)
97
+
98
+ def _find_skill_root(self, extract_dir: Path) -> Path:
99
+ if (extract_dir / "SKILL.md").exists():
100
+ return extract_dir
101
+ candidates = sorted(path.parent for path in extract_dir.rglob("SKILL.md"))
102
+ if not candidates:
103
+ raise SkillPackageError(f"SKILL.md not found under {extract_dir}")
104
+ return candidates[0]
@@ -0,0 +1,17 @@
1
+ from ksadk.skills.runtime.base import (
2
+ SandboxInputFile,
3
+ SkillRuntimeBackend,
4
+ SkillRuntimeError,
5
+ SkillRuntimeResult,
6
+ )
7
+ from ksadk.skills.runtime.factory import create_skill_runtime_backend
8
+ from ksadk.skills.runtime.request import SkillWorkflowRequest
9
+
10
+ __all__ = [
11
+ "SandboxInputFile",
12
+ "SkillRuntimeBackend",
13
+ "SkillRuntimeError",
14
+ "SkillRuntimeResult",
15
+ "SkillWorkflowRequest",
16
+ "create_skill_runtime_backend",
17
+ ]
@@ -0,0 +1,183 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import subprocess
6
+ import sys
7
+ from dataclasses import asdict
8
+ from pathlib import Path
9
+
10
+ import httpx
11
+
12
+ from ksadk.skills.loader import LocalSkill
13
+ from ksadk.skills.models import SkillRef
14
+ from ksadk.skills.package_store import PackageStore
15
+ from ksadk.skills.runtime.base import normalize_skill_names
16
+ from ksadk.skills.runtime.executor import (
17
+ WorkflowExecution,
18
+ execute_workflow,
19
+ _can_run_web_artifacts_builder as _executor_can_run_web_artifacts_builder,
20
+ _run_command as _executor_run_command,
21
+ _run_web_artifacts_builder as _executor_run_web_artifacts_builder,
22
+ _runtime_timeout as _executor_runtime_timeout,
23
+ _safe_project_name as _executor_safe_project_name,
24
+ _tail as _executor_tail,
25
+ )
26
+ from ksadk.skills.runtime.request import (
27
+ SkillWorkflowRequest,
28
+ SkillWorkflowRequestError,
29
+ parse_workflow_request,
30
+ )
31
+ from ksadk.skills.runtime import loader as runtime_loader
32
+ from ksadk.skills.runtime import registry as runtime_registry
33
+
34
+
35
+ def _skill_space_ids() -> list[str]:
36
+ return runtime_registry.skill_space_ids()
37
+
38
+
39
+ def _user_skill_space_ids() -> list[str]:
40
+ return runtime_registry.user_skill_space_ids()
41
+
42
+
43
+ def _public_skill_space_ids() -> list[str]:
44
+ return runtime_registry.public_skill_space_ids()
45
+
46
+
47
+ def _parse_space_ids(*raw_values: str) -> list[str]:
48
+ return runtime_registry.parse_space_ids(*raw_values)
49
+
50
+
51
+ _SKILL_LOAD_WARNINGS: list[str] = []
52
+
53
+
54
+ def _load_skills(
55
+ *,
56
+ prompt: str = "",
57
+ skill_names: list[str] | None = None,
58
+ service_transport: httpx.BaseTransport | None = None,
59
+ ) -> list[LocalSkill]:
60
+ result = runtime_loader.load_skills(
61
+ prompt=prompt,
62
+ skill_names=skill_names,
63
+ service_transport=service_transport,
64
+ )
65
+ _SKILL_LOAD_WARNINGS.extend(result.warnings)
66
+ return result.skills
67
+
68
+
69
+ def _dedupe_skill_refs(skill_refs: list[SkillRef], *, seen_names: set[str]) -> list[SkillRef]:
70
+ return runtime_registry.dedupe_skill_refs(skill_refs, seen_names=seen_names)
71
+
72
+
73
+ def _select_public_skill_refs(skill_refs: list[SkillRef]) -> list[SkillRef]:
74
+ return runtime_registry.select_public_skill_refs(skill_refs)
75
+
76
+
77
+ def _allow_hash_mismatch() -> bool:
78
+ return runtime_loader._allow_hash_mismatch()
79
+
80
+
81
+ def _store_unverified_archive(store: PackageStore, skill: SkillRef, archive: bytes):
82
+ return runtime_loader._store_unverified_archive(store, skill, archive)
83
+
84
+
85
+ def _select_remote_skill_refs(
86
+ skill_refs: list[SkillRef],
87
+ prompt: str,
88
+ *,
89
+ skill_names: list[str] | None = None,
90
+ ) -> list[SkillRef]:
91
+ return runtime_registry.select_remote_skill_refs(skill_refs, prompt, skill_names=skill_names)
92
+
93
+
94
+ def _load_local_skills() -> list[LocalSkill]:
95
+ return runtime_loader.load_local_skills()
96
+
97
+
98
+ def run_agent(
99
+ argv: list[str] | None = None,
100
+ *,
101
+ service_transport: httpx.BaseTransport | None = None,
102
+ ) -> int:
103
+ _SKILL_LOAD_WARNINGS.clear()
104
+ args = list(argv if argv is not None else sys.argv[1:])
105
+ try:
106
+ request = _resolve_request(args)
107
+ except SkillWorkflowRequestError as exc:
108
+ execution = WorkflowExecution(status="failed", error=str(exc))
109
+ print("workflow=")
110
+ print(f"skill_spaces={','.join(_skill_space_ids())}")
111
+ print("loaded_skills=")
112
+ print(f"workflow_result={json.dumps(asdict(execution), ensure_ascii=False, sort_keys=True)}")
113
+ return 1
114
+
115
+ prompt = request.workflow_prompt
116
+ selected_skill_names = request.skill_names or _selected_skill_names()
117
+ loaded_skills = _load_skills(
118
+ prompt=prompt,
119
+ skill_names=selected_skill_names,
120
+ service_transport=service_transport,
121
+ )
122
+ execution = _execute_workflow(prompt, loaded_skills, selected_skill_names=selected_skill_names)
123
+ print(f"workflow={prompt}")
124
+ print(f"skill_spaces={','.join(_skill_space_ids())}")
125
+ print(f"loaded_skills={','.join(skill.name for skill in loaded_skills)}")
126
+ print(f"selected_skills={json.dumps(selected_skill_names, ensure_ascii=False, sort_keys=True)}")
127
+ if _SKILL_LOAD_WARNINGS:
128
+ print(f"skill_warnings={json.dumps(_SKILL_LOAD_WARNINGS, ensure_ascii=False, sort_keys=True)}")
129
+ print(f"workflow_result={json.dumps(asdict(execution), ensure_ascii=False, sort_keys=True)}")
130
+ return 0 if execution.status != "failed" else 1
131
+
132
+
133
+ def _resolve_request(args: list[str]) -> SkillWorkflowRequest:
134
+ return parse_workflow_request(args)
135
+
136
+
137
+ def _selected_skill_names() -> list[str]:
138
+ return normalize_skill_names(os.environ.get("KSADK_SELECTED_SKILL_NAMES", ""))
139
+
140
+
141
+ def _execute_workflow(
142
+ prompt: str,
143
+ skills: list[LocalSkill],
144
+ *,
145
+ selected_skill_names: list[str] | None = None,
146
+ ) -> WorkflowExecution:
147
+ return execute_workflow(prompt, skills, selected_skill_names=selected_skill_names)
148
+
149
+
150
+ def _can_run_web_artifacts_builder(skill: LocalSkill, prompt: str) -> bool:
151
+ return _executor_can_run_web_artifacts_builder(skill, prompt)
152
+
153
+
154
+ def _run_web_artifacts_builder(skill: LocalSkill) -> WorkflowExecution:
155
+ return _executor_run_web_artifacts_builder(skill)
156
+
157
+
158
+ def _run_command(args: list[str], *, cwd: Path, timeout: int) -> dict[str, object]:
159
+ return _executor_run_command(args, cwd=cwd, timeout=timeout)
160
+
161
+
162
+ def _runtime_timeout() -> int:
163
+ return _executor_runtime_timeout()
164
+
165
+
166
+ def _safe_project_name(raw: str) -> str:
167
+ return _executor_safe_project_name(raw)
168
+
169
+
170
+ def _tail(value: str | bytes, limit: int = 4000) -> str:
171
+ return _executor_tail(value, limit=limit)
172
+
173
+
174
+ def _resolve_prompt(args: list[str]) -> str:
175
+ return _resolve_request(args).workflow_prompt
176
+
177
+
178
+ def main(argv: list[str] | None = None) -> int:
179
+ return run_agent(argv)
180
+
181
+
182
+ if __name__ == "__main__":
183
+ raise SystemExit(main())
@@ -0,0 +1,39 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def parse_artifact_lines(stdout: str) -> list[str]:
7
+ artifacts: list[str] = []
8
+ seen: set[str] = set()
9
+ for line in stdout.splitlines():
10
+ if not line.startswith("artifact="):
11
+ continue
12
+ value = line.split("=", 1)[1].strip()
13
+ if not value or value in seen:
14
+ continue
15
+ seen.add(value)
16
+ artifacts.append(value)
17
+ return artifacts
18
+
19
+
20
+ def collect_output_dir_artifacts(output_dir: Path) -> list[str]:
21
+ if not output_dir.is_dir():
22
+ return []
23
+ return [
24
+ str(path)
25
+ for path in sorted(output_dir.rglob("*"))
26
+ if path.is_file()
27
+ ]
28
+
29
+
30
+ def merge_artifacts(*groups: list[str]) -> list[str]:
31
+ merged: list[str] = []
32
+ seen: set[str] = set()
33
+ for group in groups:
34
+ for item in group:
35
+ if item in seen:
36
+ continue
37
+ seen.add(item)
38
+ merged.append(item)
39
+ return merged
@@ -0,0 +1 @@
1
+ """Skill Runtime backend implementations."""
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from ksadk.skills.runtime.base import SkillRuntimeError, SkillRuntimeResult
4
+
5
+
6
+ class DisabledSkillRuntimeBackend:
7
+ def run_workflow(self, *args, **kwargs) -> SkillRuntimeResult:
8
+ raise SkillRuntimeError("Skill Runtime is disabled")
@@ -0,0 +1,168 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import time
6
+ from typing import Any
7
+
8
+ from ksadk.sandbox import (
9
+ E2BSandboxBackend,
10
+ SandboxInputFile as RuntimeSandboxInputFile,
11
+ SandboxSpec,
12
+ )
13
+ from ksadk.skills.runtime.base import (
14
+ SandboxInputFile,
15
+ SkillRuntimeError,
16
+ SkillRuntimeResult,
17
+ format_skill_names_env,
18
+ normalize_skill_names,
19
+ parse_output_files,
20
+ )
21
+
22
+
23
+ def _bool_env(name: str, default: bool = True) -> bool:
24
+ raw = os.environ.get(name)
25
+ if raw is None:
26
+ return default
27
+ return raw.strip().lower() in {"1", "true", "yes", "on"}
28
+
29
+
30
+ def _redact(value: str) -> str:
31
+ redacted = value
32
+ for key_name in (
33
+ "E2B_API_KEY",
34
+ "KSADK_SKILL_SERVICE_TOKEN",
35
+ "KSADK_SKILL_SERVICE_ACCESS_KEY",
36
+ "KSADK_SKILL_SERVICE_SECRET_KEY",
37
+ "KSYUN_ACCESS_KEY",
38
+ "KSYUN_SECRET_KEY",
39
+ "KS3_ACCESS_KEY",
40
+ "KS3_SECRET_KEY",
41
+ ):
42
+ secret = os.environ.get(key_name)
43
+ if secret:
44
+ redacted = redacted.replace(secret, "[REDACTED]")
45
+ return redacted
46
+
47
+
48
+ class E2BSkillRuntimeBackend:
49
+ def __init__(
50
+ self,
51
+ *,
52
+ sandbox_cls: Any | None = None,
53
+ template_id: str,
54
+ timeout: int = 900,
55
+ allow_internet_access: bool = True,
56
+ ):
57
+ if not template_id:
58
+ raise SkillRuntimeError(
59
+ "KSADK_SANDBOX_TEMPLATE_ID is required for E2B backend "
60
+ "(KSADK_SKILL_RUNTIME_TEMPLATE_ID is a compatibility alias)"
61
+ )
62
+ self.template_id = template_id
63
+ self.timeout = timeout
64
+ self.allow_internet_access = allow_internet_access
65
+ self.sandbox_backend = E2BSandboxBackend(
66
+ spec=SandboxSpec(
67
+ template_id=template_id,
68
+ timeout=timeout,
69
+ allow_internet_access=allow_internet_access,
70
+ metadata={"component": "skill-runtime"},
71
+ ),
72
+ sandbox_cls=sandbox_cls,
73
+ )
74
+
75
+ @classmethod
76
+ def from_env(cls) -> "E2BSkillRuntimeBackend":
77
+ try:
78
+ from e2b import Sandbox
79
+ except ImportError as exc:
80
+ raise SkillRuntimeError(
81
+ "e2b>=2.0.0 is required for KSADK_SKILL_RUNTIME_BACKEND=e2b"
82
+ ) from exc
83
+ return cls(
84
+ sandbox_cls=Sandbox,
85
+ template_id=(
86
+ os.environ.get("KSADK_SANDBOX_TEMPLATE_ID")
87
+ or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID")
88
+ or ""
89
+ ),
90
+ timeout=int(os.environ.get("KSADK_SANDBOX_TIMEOUT") or os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT") or "900"),
91
+ allow_internet_access=_bool_env(
92
+ "KSADK_SANDBOX_ALLOW_INTERNET_ACCESS",
93
+ _bool_env("KSADK_SKILL_RUNTIME_ALLOW_INTERNET_ACCESS", True),
94
+ ),
95
+ )
96
+
97
+ def run_workflow(
98
+ self,
99
+ workflow_prompt: str,
100
+ *,
101
+ skill_space_ids: list[str],
102
+ session_id: str,
103
+ skill_names: list[str] | None = None,
104
+ env: dict[str, str] | None = None,
105
+ input_files: list[SandboxInputFile] | None = None,
106
+ timeout: int = 900,
107
+ ) -> SkillRuntimeResult:
108
+ session = None
109
+ started = time.monotonic()
110
+ effective_timeout = timeout or self.timeout
111
+ try:
112
+ sandbox_env = {
113
+ "KSADK_SKILL_SPACE_IDS": ",".join(skill_space_ids),
114
+ "SKILL_SPACE_ID": skill_space_ids[0] if skill_space_ids else "",
115
+ }
116
+ if public_spaces := os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS"):
117
+ sandbox_env["KSADK_PUBLIC_SKILL_SPACE_IDS"] = public_spaces
118
+ selected_skill_names = format_skill_names_env(skill_names)
119
+ if selected_skill_names:
120
+ sandbox_env["KSADK_SELECTED_SKILL_NAMES"] = selected_skill_names
121
+ sandbox_env.update(env or {})
122
+ session = self.sandbox_backend.create_session(
123
+ session_id=session_id,
124
+ env=sandbox_env,
125
+ input_files=[
126
+ RuntimeSandboxInputFile(source=item.source, target_path=item.target_path)
127
+ for item in input_files or []
128
+ ],
129
+ )
130
+
131
+ request_path = "/tmp/ksadk-workflow-request.json"
132
+ session.write_file(
133
+ request_path,
134
+ json.dumps(
135
+ {
136
+ "workflow_prompt": workflow_prompt,
137
+ "skill_names": normalize_skill_names(skill_names),
138
+ },
139
+ ensure_ascii=False,
140
+ ).encode("utf-8"),
141
+ )
142
+ command = f"python -u /home/ksadk/agent.py --request-file {request_path}"
143
+ result = session.run_command(command, timeout=effective_timeout, env=sandbox_env)
144
+ stdout = result.stdout
145
+ return SkillRuntimeResult(
146
+ runtime_id=session.sandbox_id,
147
+ exit_code=result.exit_code,
148
+ stdout=stdout,
149
+ stderr=result.stderr,
150
+ duration_ms=int((time.monotonic() - started) * 1000),
151
+ output_files=parse_output_files(stdout),
152
+ )
153
+ except Exception as exc:
154
+ error_type = type(exc).__name__
155
+ return SkillRuntimeResult(
156
+ runtime_id=session.sandbox_id if session is not None else "",
157
+ exit_code=None,
158
+ duration_ms=int((time.monotonic() - started) * 1000),
159
+ timed_out="timeout" in error_type.lower(),
160
+ error_type=error_type,
161
+ error_message=_redact(str(exc)),
162
+ )
163
+ finally:
164
+ if session is not None:
165
+ try:
166
+ session.kill()
167
+ except Exception:
168
+ pass
@@ -0,0 +1,95 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import subprocess
6
+ import sys
7
+ import tempfile
8
+ import time
9
+ from pathlib import Path
10
+
11
+ from ksadk.skills.runtime.base import (
12
+ SandboxInputFile,
13
+ SkillRuntimeResult,
14
+ format_skill_names_env,
15
+ normalize_skill_names,
16
+ parse_output_files,
17
+ )
18
+
19
+
20
+ class LocalProcessSkillRuntimeBackend:
21
+ def __init__(self, agent_path: str | Path, timeout: int = 900):
22
+ self.agent_path = Path(agent_path)
23
+ self.timeout = timeout
24
+
25
+ @classmethod
26
+ def from_env(cls) -> "LocalProcessSkillRuntimeBackend":
27
+ agent_path = os.environ.get("KSADK_SKILL_RUNTIME_AGENT_PATH") or str(
28
+ Path(__file__).resolve().parents[1] / "agent.py"
29
+ )
30
+ timeout = int(os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT", "900"))
31
+ return cls(agent_path=agent_path, timeout=timeout)
32
+
33
+ def run_workflow(
34
+ self,
35
+ workflow_prompt: str,
36
+ *,
37
+ skill_space_ids: list[str],
38
+ session_id: str,
39
+ skill_names: list[str] | None = None,
40
+ env: dict[str, str] | None = None,
41
+ input_files: list[SandboxInputFile] | None = None,
42
+ timeout: int = 900,
43
+ ) -> SkillRuntimeResult:
44
+ started = time.monotonic()
45
+ runtime_env = os.environ.copy()
46
+ runtime_env.update(env or {})
47
+ runtime_env["KSADK_SKILL_SPACE_IDS"] = ",".join(skill_space_ids)
48
+ runtime_env["SKILL_SPACE_ID"] = skill_space_ids[0] if skill_space_ids else ""
49
+ if public_spaces := os.environ.get("KSADK_PUBLIC_SKILL_SPACE_IDS"):
50
+ runtime_env["KSADK_PUBLIC_SKILL_SPACE_IDS"] = public_spaces
51
+ selected_skill_names = format_skill_names_env(skill_names)
52
+ if selected_skill_names:
53
+ runtime_env["KSADK_SELECTED_SKILL_NAMES"] = selected_skill_names
54
+ else:
55
+ runtime_env.pop("KSADK_SELECTED_SKILL_NAMES", None)
56
+ try:
57
+ with tempfile.TemporaryDirectory(prefix="ksadk-skill-runtime-") as tmp_dir:
58
+ request_path = Path(tmp_dir) / "workflow-request.json"
59
+ request_path.write_text(
60
+ json.dumps(
61
+ {
62
+ "workflow_prompt": workflow_prompt,
63
+ "skill_names": normalize_skill_names(skill_names),
64
+ },
65
+ ensure_ascii=False,
66
+ ),
67
+ encoding="utf-8",
68
+ )
69
+ completed = subprocess.run(
70
+ [sys.executable, "-u", str(self.agent_path), "--request-file", str(request_path)],
71
+ text=True,
72
+ capture_output=True,
73
+ timeout=timeout or self.timeout,
74
+ env=runtime_env,
75
+ check=False,
76
+ )
77
+ return SkillRuntimeResult(
78
+ runtime_id=f"local:{session_id}",
79
+ exit_code=completed.returncode,
80
+ stdout=completed.stdout,
81
+ stderr=completed.stderr,
82
+ duration_ms=int((time.monotonic() - started) * 1000),
83
+ output_files=parse_output_files(completed.stdout),
84
+ )
85
+ except subprocess.TimeoutExpired as exc:
86
+ return SkillRuntimeResult(
87
+ runtime_id=f"local:{session_id}",
88
+ exit_code=None,
89
+ stdout=exc.stdout or "",
90
+ stderr=exc.stderr or "",
91
+ duration_ms=int((time.monotonic() - started) * 1000),
92
+ timed_out=True,
93
+ error_type="TimeoutExpired",
94
+ error_message=f"Skill workflow timed out after {timeout or self.timeout}s",
95
+ )