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,103 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from dataclasses import dataclass, field
5
+ from pathlib import Path
6
+ from typing import Protocol, Sequence
7
+
8
+
9
+ class SkillRuntimeError(RuntimeError):
10
+ pass
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class SandboxInputFile:
15
+ source: Path
16
+ target_path: str
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class SkillRuntimeResult:
21
+ runtime_id: str = ""
22
+ exit_code: int | None = None
23
+ stdout: str = ""
24
+ stderr: str = ""
25
+ duration_ms: int = 0
26
+ timed_out: bool = False
27
+ error_type: str | None = None
28
+ error_message: str | None = None
29
+ output_files: list[str] = field(default_factory=list)
30
+
31
+ @property
32
+ def ok(self) -> bool:
33
+ return self.exit_code == 0 and not self.error_type and not self.timed_out
34
+
35
+ def to_dict(self) -> dict[str, object]:
36
+ return {
37
+ "runtime_id": self.runtime_id,
38
+ "exit_code": self.exit_code,
39
+ "stdout": self.stdout,
40
+ "stderr": self.stderr,
41
+ "duration_ms": self.duration_ms,
42
+ "timed_out": self.timed_out,
43
+ "error_type": self.error_type,
44
+ "error_message": self.error_message,
45
+ "output_files": list(self.output_files),
46
+ }
47
+
48
+
49
+ class SkillRuntimeBackend(Protocol):
50
+ def run_workflow(
51
+ self,
52
+ workflow_prompt: str,
53
+ *,
54
+ skill_space_ids: list[str],
55
+ session_id: str,
56
+ skill_names: list[str] | None = None,
57
+ env: dict[str, str] | None = None,
58
+ input_files: list[SandboxInputFile] | None = None,
59
+ timeout: int = 900,
60
+ ) -> SkillRuntimeResult:
61
+ ...
62
+
63
+
64
+ def parse_output_files(stdout: str) -> list[str]:
65
+ for line in stdout.splitlines():
66
+ if not line.startswith("workflow_result="):
67
+ continue
68
+ raw = line.split("=", 1)[1]
69
+ try:
70
+ payload = json.loads(raw)
71
+ except json.JSONDecodeError:
72
+ return []
73
+ output_files = payload.get("output_files") if isinstance(payload, dict) else None
74
+ if isinstance(output_files, list):
75
+ return [str(item) for item in output_files]
76
+ return []
77
+
78
+
79
+ def normalize_skill_names(skill_names: Sequence[str] | str | None) -> list[str]:
80
+ if skill_names is None:
81
+ return []
82
+
83
+ raw_values: list[str]
84
+ if isinstance(skill_names, str):
85
+ raw_values = [skill_names]
86
+ else:
87
+ raw_values = [str(item) for item in skill_names]
88
+
89
+ normalized: list[str] = []
90
+ seen: set[str] = set()
91
+ for raw in raw_values:
92
+ for part in raw.split(","):
93
+ name = part.strip()
94
+ key = name.lower()
95
+ if not name or key in seen:
96
+ continue
97
+ seen.add(key)
98
+ normalized.append(name)
99
+ return normalized
100
+
101
+
102
+ def format_skill_names_env(skill_names: Sequence[str] | str | None) -> str:
103
+ return ",".join(normalize_skill_names(skill_names))
@@ -0,0 +1,219 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import shutil
5
+ import subprocess
6
+ import tempfile
7
+ from dataclasses import dataclass, field
8
+ from pathlib import Path
9
+
10
+ from ksadk.skills.loader import LocalSkill
11
+ from ksadk.skills.runtime.artifacts import (
12
+ collect_output_dir_artifacts,
13
+ merge_artifacts,
14
+ parse_artifact_lines,
15
+ )
16
+ from ksadk.skills.runtime.base import normalize_skill_names
17
+
18
+
19
+ @dataclass
20
+ class WorkflowExecution:
21
+ status: str
22
+ executed_skill: str = ""
23
+ output_files: list[str] = field(default_factory=list)
24
+ commands: list[dict[str, object]] = field(default_factory=list)
25
+ selected_skills: list[str] = field(default_factory=list)
26
+ loaded_skills: list[str] = field(default_factory=list)
27
+ artifacts: list[str] = field(default_factory=list)
28
+ warnings: list[str] = field(default_factory=list)
29
+ error: str = ""
30
+
31
+
32
+ def execute_workflow(
33
+ prompt: str,
34
+ skills: list[LocalSkill],
35
+ *,
36
+ selected_skill_names: list[str] | None = None,
37
+ ) -> WorkflowExecution:
38
+ selected = normalize_skill_names(selected_skill_names)
39
+ loaded = [skill.name for skill in skills]
40
+ if not skills:
41
+ return WorkflowExecution(status="no_skills", selected_skills=selected, loaded_skills=loaded)
42
+
43
+ for skill in _candidate_skills(skills, selected):
44
+ if _can_run_web_artifacts_builder(skill, prompt):
45
+ result = _run_web_artifacts_builder(skill)
46
+ _attach_context(result, selected=selected, loaded=loaded)
47
+ return result
48
+
49
+ for skill in _candidate_skills(skills, selected):
50
+ if _can_run_generic_workflow(skill):
51
+ result = _run_generic_workflow(skill, prompt)
52
+ _attach_context(result, selected=selected, loaded=loaded)
53
+ return result
54
+
55
+ return WorkflowExecution(
56
+ status="skipped",
57
+ selected_skills=selected,
58
+ loaded_skills=loaded,
59
+ warnings=["No loaded skill exposes an executable workflow entrypoint."],
60
+ )
61
+
62
+
63
+ def _candidate_skills(skills: list[LocalSkill], selected: list[str]) -> list[LocalSkill]:
64
+ if not selected:
65
+ return skills
66
+ selected_keys = {name.lower() for name in selected}
67
+ return [skill for skill in skills if skill.name.lower() in selected_keys]
68
+
69
+
70
+ def _attach_context(result: WorkflowExecution, *, selected: list[str], loaded: list[str]) -> None:
71
+ result.selected_skills = selected
72
+ result.loaded_skills = loaded
73
+ if not result.artifacts:
74
+ result.artifacts = list(result.output_files)
75
+
76
+
77
+ def _can_run_web_artifacts_builder(skill: LocalSkill, prompt: str) -> bool:
78
+ if skill.name != "web-artifacts-builder":
79
+ return False
80
+ init_script = skill.root_dir / "scripts" / "init-artifact.sh"
81
+ bundle_script = skill.root_dir / "scripts" / "bundle-artifact.sh"
82
+ if not init_script.exists() or not bundle_script.exists():
83
+ return False
84
+ normalized = prompt.lower()
85
+ return any(marker in normalized for marker in ("web-artifacts-builder", "artifact", "bundle", "html", "react"))
86
+
87
+
88
+ def _can_run_generic_workflow(skill: LocalSkill) -> bool:
89
+ return (skill.root_dir / "scripts" / "run-workflow.sh").exists()
90
+
91
+
92
+ def _run_web_artifacts_builder(skill: LocalSkill) -> WorkflowExecution:
93
+ workdir = _skill_workdir()
94
+ project_name = _safe_project_name(os.environ.get("KSADK_SKILL_ARTIFACT_PROJECT") or "ksadk-artifact")
95
+ project_dir = workdir / project_name
96
+ workdir.mkdir(parents=True, exist_ok=True)
97
+ if project_dir.exists():
98
+ shutil.rmtree(project_dir)
99
+
100
+ timeout = _runtime_timeout()
101
+ commands: list[dict[str, object]] = []
102
+ init_result = _run_command(
103
+ ["bash", str(skill.root_dir / "scripts" / "init-artifact.sh"), project_name],
104
+ cwd=workdir,
105
+ timeout=timeout,
106
+ )
107
+ commands.append(init_result)
108
+ if init_result["exit_code"] != 0:
109
+ return WorkflowExecution(status="failed", executed_skill=skill.name, commands=commands)
110
+
111
+ bundle_result = _run_command(
112
+ ["bash", str(skill.root_dir / "scripts" / "bundle-artifact.sh")],
113
+ cwd=project_dir,
114
+ timeout=timeout,
115
+ )
116
+ commands.append(bundle_result)
117
+ output_files = [str(project_dir / "bundle.html")] if (project_dir / "bundle.html").exists() else []
118
+ status = "ok" if bundle_result["exit_code"] == 0 and output_files else "failed"
119
+ return WorkflowExecution(
120
+ status=status,
121
+ executed_skill=skill.name,
122
+ output_files=output_files,
123
+ artifacts=list(output_files),
124
+ commands=commands,
125
+ )
126
+
127
+
128
+ def _run_generic_workflow(skill: LocalSkill, prompt: str) -> WorkflowExecution:
129
+ workdir = _skill_workdir()
130
+ workdir.mkdir(parents=True, exist_ok=True)
131
+ output_dir = workdir / "artifacts"
132
+ timeout = _runtime_timeout()
133
+ command = _run_command(
134
+ ["bash", str(skill.root_dir / "scripts" / "run-workflow.sh")],
135
+ cwd=workdir,
136
+ timeout=timeout,
137
+ extra_env={
138
+ "KSADK_WORKFLOW_PROMPT": prompt,
139
+ "KSADK_SKILL_WORKDIR": str(workdir),
140
+ "KSADK_SKILL_OUTPUT_DIR": str(output_dir),
141
+ "KSADK_SKILL_ROOT_DIR": str(skill.root_dir),
142
+ },
143
+ )
144
+ artifacts = merge_artifacts(
145
+ parse_artifact_lines(str(command.get("stdout") or "")),
146
+ collect_output_dir_artifacts(output_dir),
147
+ )
148
+ status = "ok" if command["exit_code"] == 0 else "failed"
149
+ return WorkflowExecution(
150
+ status=status,
151
+ executed_skill=skill.name,
152
+ output_files=list(artifacts),
153
+ artifacts=list(artifacts),
154
+ commands=[command],
155
+ )
156
+
157
+
158
+ def _skill_workdir() -> Path:
159
+ return Path(
160
+ os.environ.get("KSADK_SKILL_WORKDIR")
161
+ or Path(tempfile.gettempdir()) / "ksadk-skill-workflow"
162
+ )
163
+
164
+
165
+ def _run_command(
166
+ args: list[str],
167
+ *,
168
+ cwd: Path,
169
+ timeout: int,
170
+ extra_env: dict[str, str] | None = None,
171
+ ) -> dict[str, object]:
172
+ env = os.environ.copy()
173
+ env.setdefault("CI", "1")
174
+ env.update(extra_env or {})
175
+ try:
176
+ completed = subprocess.run(
177
+ args,
178
+ cwd=str(cwd),
179
+ text=True,
180
+ capture_output=True,
181
+ timeout=timeout,
182
+ check=False,
183
+ env=env,
184
+ )
185
+ return {
186
+ "command": " ".join(args),
187
+ "cwd": str(cwd),
188
+ "exit_code": completed.returncode,
189
+ "stdout": _tail(completed.stdout),
190
+ "stderr": _tail(completed.stderr),
191
+ }
192
+ except subprocess.TimeoutExpired as exc:
193
+ return {
194
+ "command": " ".join(args),
195
+ "cwd": str(cwd),
196
+ "exit_code": None,
197
+ "timed_out": True,
198
+ "stdout": _tail(exc.stdout or ""),
199
+ "stderr": _tail(exc.stderr or ""),
200
+ }
201
+
202
+
203
+ def _runtime_timeout() -> int:
204
+ try:
205
+ return int(os.environ.get("KSADK_SKILL_RUNTIME_TIMEOUT", "900"))
206
+ except ValueError:
207
+ return 900
208
+
209
+
210
+ def _safe_project_name(raw: str) -> str:
211
+ sanitized = "".join(ch if ch.isalnum() or ch in {"-", "_"} else "-" for ch in raw).strip("-_")
212
+ return sanitized[:80] or "ksadk-artifact"
213
+
214
+
215
+ def _tail(value: str | bytes, limit: int = 4000) -> str:
216
+ text = value.decode("utf-8", errors="replace") if isinstance(value, bytes) else value
217
+ if len(text) <= limit:
218
+ return text
219
+ return text[-limit:]
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+
5
+ from ksadk.skills.runtime.base import SkillRuntimeBackend
6
+ from ksadk.skills.runtime.backends.disabled import DisabledSkillRuntimeBackend
7
+ from ksadk.skills.runtime.backends.e2b import E2BSkillRuntimeBackend
8
+ from ksadk.skills.runtime.backends.local import LocalProcessSkillRuntimeBackend
9
+
10
+
11
+ def _resolve_backend(backend: str | None = None) -> str:
12
+ if backend is not None:
13
+ return backend.strip().lower()
14
+
15
+ explicit = os.environ.get("KSADK_SKILL_RUNTIME_BACKEND")
16
+ if explicit is not None:
17
+ return explicit.strip().lower()
18
+
19
+ sandbox_backend = os.environ.get("KSADK_SANDBOX_BACKEND", "").strip().lower()
20
+ if sandbox_backend and sandbox_backend not in {"disabled", "none", "off"}:
21
+ return sandbox_backend
22
+
23
+ if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get("KSADK_SKILL_RUNTIME_TEMPLATE_ID"):
24
+ return "e2b"
25
+
26
+ return "disabled"
27
+
28
+
29
+ def create_skill_runtime_backend(backend: str | None = None) -> SkillRuntimeBackend:
30
+ resolved = _resolve_backend(backend)
31
+ if resolved in {"", "disabled", "none", "off"}:
32
+ return DisabledSkillRuntimeBackend()
33
+ if resolved == "local_process":
34
+ return LocalProcessSkillRuntimeBackend.from_env()
35
+ if resolved == "e2b":
36
+ return E2BSkillRuntimeBackend.from_env()
37
+ raise ValueError(f"Unsupported skill runtime backend: {resolved}")
@@ -0,0 +1,131 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import shutil
5
+ import tempfile
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+
9
+ import httpx
10
+
11
+ from ksadk.skills.loader import LocalSkill, load_local_skill
12
+ from ksadk.skills.models import SkillRef
13
+ from ksadk.skills.package_store import PackageStore, SkillPackageError
14
+ from ksadk.skills.runtime import registry
15
+ from ksadk.skills.service_client import SkillServiceClient
16
+ from ksadk.skills.service_env import resolve_skill_service_url
17
+
18
+
19
+ @dataclass
20
+ class SkillLoadResult:
21
+ skills: list[LocalSkill] = field(default_factory=list)
22
+ warnings: list[str] = field(default_factory=list)
23
+
24
+
25
+ def load_skills(
26
+ *,
27
+ prompt: str = "",
28
+ skill_names: list[str] | None = None,
29
+ service_transport: httpx.BaseTransport | None = None,
30
+ ) -> SkillLoadResult:
31
+ warnings: list[str] = []
32
+ skills: list[LocalSkill] = []
33
+ skills.extend(load_local_skills())
34
+
35
+ service_url = resolve_skill_service_url(require_spaces=True)
36
+ if not service_url:
37
+ return SkillLoadResult(skills=skills, warnings=warnings)
38
+
39
+ cache_dir = Path(
40
+ os.environ.get("KSADK_SKILL_CACHE_DIR")
41
+ or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
42
+ )
43
+ client = SkillServiceClient(
44
+ base_url=service_url,
45
+ token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
46
+ transport=service_transport,
47
+ )
48
+ store = PackageStore(cache_dir=cache_dir)
49
+ selected_refs: list[SkillRef] = []
50
+ seen_names: set[str] = {skill.name.lower() for skill in skills if skill.name}
51
+ for space_id in registry.user_skill_space_ids():
52
+ listing = client.list_skills_by_space_id(space_id)
53
+ selected_refs.extend(
54
+ registry.dedupe_skill_refs(
55
+ registry.select_remote_skill_refs(
56
+ listing.active_skills(),
57
+ prompt,
58
+ skill_names=skill_names,
59
+ ),
60
+ seen_names=seen_names,
61
+ )
62
+ )
63
+
64
+ if registry.public_skill_space_ids():
65
+ listing = client.list_available_premade_skills()
66
+ selected_refs.extend(
67
+ registry.dedupe_skill_refs(
68
+ registry.select_public_skill_refs(listing.active_skills()),
69
+ seen_names=seen_names,
70
+ )
71
+ )
72
+
73
+ for skill in selected_refs:
74
+ package = store.get_cached(skill)
75
+ if package is None:
76
+ archive = client.download_skill_archive(skill)
77
+ try:
78
+ package = store.store_archive(skill, archive)
79
+ except SkillPackageError as exc:
80
+ if not _allow_hash_mismatch():
81
+ raise
82
+ package = _store_unverified_archive(store, skill, archive)
83
+ warnings.append(str(exc))
84
+ skills.append(load_local_skill(package.root_dir))
85
+ return SkillLoadResult(skills=skills, warnings=warnings)
86
+
87
+
88
+ def load_local_skills() -> list[LocalSkill]:
89
+ skills_dir = os.environ.get("KSADK_LOCAL_SKILLS_DIR", "").strip()
90
+ if not skills_dir:
91
+ return []
92
+ root = Path(skills_dir)
93
+ if not root.exists():
94
+ return []
95
+ return [
96
+ load_local_skill(path)
97
+ for path in sorted(root.iterdir())
98
+ if path.is_dir() and (path / "SKILL.md").exists()
99
+ ]
100
+
101
+
102
+ def _allow_hash_mismatch() -> bool:
103
+ return os.environ.get("KSADK_SKILL_ALLOW_HASH_MISMATCH", "").strip().lower() in {
104
+ "1",
105
+ "true",
106
+ "yes",
107
+ "on",
108
+ }
109
+
110
+
111
+ def _store_unverified_archive(store: PackageStore, skill: SkillRef, archive: bytes):
112
+ skill_dir = store.cache_dir / f"unverified-{skill.cache_key or skill.name or 'skill'}"
113
+ if skill_dir.exists():
114
+ shutil.rmtree(skill_dir)
115
+ skill_dir.mkdir(parents=True, exist_ok=True)
116
+ archive_path = skill_dir / "archive.zip"
117
+ extract_dir = skill_dir / "extracted"
118
+ archive_path.write_bytes(archive)
119
+ extract_dir.mkdir(parents=True, exist_ok=True)
120
+ store._safe_extract(archive_path, extract_dir)
121
+ return type(
122
+ "UnverifiedSkillPackage",
123
+ (),
124
+ {
125
+ "ref": skill,
126
+ "archive_path": archive_path,
127
+ "extract_dir": extract_dir,
128
+ "root_dir": store._find_skill_root(extract_dir),
129
+ "cache_hit": False,
130
+ },
131
+ )()
@@ -0,0 +1,150 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import re
5
+
6
+ from ksadk.skills.models import SkillRef
7
+ from ksadk.skills.runtime.base import normalize_skill_names
8
+ from ksadk.skills.service_env import (
9
+ parse_skill_space_ids,
10
+ public_skill_space_ids as configured_public_skill_space_ids,
11
+ skill_space_ids as configured_skill_space_ids,
12
+ user_skill_space_ids as configured_user_skill_space_ids,
13
+ )
14
+
15
+
16
+ def skill_space_ids() -> list[str]:
17
+ return configured_skill_space_ids()
18
+
19
+
20
+ def user_skill_space_ids() -> list[str]:
21
+ return configured_user_skill_space_ids()
22
+
23
+
24
+ def public_skill_space_ids() -> list[str]:
25
+ return configured_public_skill_space_ids()
26
+
27
+
28
+ def parse_space_ids(*raw_values: str) -> list[str]:
29
+ return parse_skill_space_ids(*raw_values)
30
+
31
+
32
+ def dedupe_skill_refs(skill_refs: list[SkillRef], *, seen_names: set[str]) -> list[SkillRef]:
33
+ selected: list[SkillRef] = []
34
+ seen_keys: set[str] = set()
35
+ for skill in skill_refs:
36
+ name_key = skill.name.lower() if skill.name else ""
37
+ key = skill.cache_key or skill.skill_id or skill.name
38
+ if not name_key or name_key in seen_names or key in seen_keys:
39
+ continue
40
+ seen_names.add(name_key)
41
+ seen_keys.add(key)
42
+ selected.append(skill)
43
+ return selected
44
+
45
+
46
+ def select_public_skill_refs(skill_refs: list[SkillRef]) -> list[SkillRef]:
47
+ allowlist = {name.lower() for name in normalize_skill_names(os.environ.get("KSADK_PUBLIC_SKILL_ALLOWLIST", ""))}
48
+ if not allowlist:
49
+ return [skill for skill in skill_refs if skill.name]
50
+ return [
51
+ skill
52
+ for skill in skill_refs
53
+ if skill.name and skill.name.lower() in allowlist
54
+ ]
55
+
56
+
57
+ def select_remote_skill_refs(
58
+ skill_refs: list[SkillRef],
59
+ prompt: str,
60
+ *,
61
+ skill_names: list[str] | None = None,
62
+ ) -> list[SkillRef]:
63
+ if not prompt and not normalize_skill_names(skill_names):
64
+ return []
65
+ return [match.skill for match in match_skill_refs(skill_refs, prompt, skill_names=skill_names)]
66
+
67
+
68
+ class SkillMatch:
69
+ def __init__(self, skill: SkillRef, score: int, reason: str):
70
+ self.skill = skill
71
+ self.score = score
72
+ self.reason = reason
73
+
74
+ def to_dict(self) -> dict[str, object]:
75
+ return {
76
+ "name": self.skill.name,
77
+ "description": self.skill.description,
78
+ "version": self.skill.version,
79
+ "score": self.score,
80
+ "reason": self.reason,
81
+ "aliases": list(self.skill.aliases),
82
+ "tags": list(self.skill.tags),
83
+ }
84
+
85
+
86
+ def match_skill_refs(
87
+ skill_refs: list[SkillRef],
88
+ prompt: str,
89
+ *,
90
+ skill_names: list[str] | None = None,
91
+ limit: int | None = None,
92
+ ) -> list[SkillMatch]:
93
+ requested_names = {name.lower() for name in normalize_skill_names(skill_names)}
94
+ normalized_prompt = prompt.lower()
95
+ prompt_tokens = _tokens(normalized_prompt)
96
+ matches: list[SkillMatch] = []
97
+ seen: set[str] = set()
98
+ for skill in skill_refs:
99
+ if not skill.name:
100
+ continue
101
+ skill_name = skill.name.lower()
102
+ if requested_names:
103
+ if skill_name not in requested_names:
104
+ continue
105
+ score, reason = 100, "exact_name"
106
+ else:
107
+ score, reason = _metadata_score(skill, normalized_prompt, prompt_tokens)
108
+ if score <= 0:
109
+ continue
110
+ key = skill.cache_key or skill.skill_id or skill.name
111
+ if key in seen:
112
+ continue
113
+ seen.add(key)
114
+ matches.append(SkillMatch(skill=skill, score=score, reason=reason))
115
+ matches.sort(key=lambda item: (-item.score, item.skill.name.lower()))
116
+ if limit is not None:
117
+ return matches[: max(0, limit)]
118
+ return matches
119
+
120
+
121
+ def _metadata_score(skill: SkillRef, normalized_prompt: str, prompt_tokens: set[str]) -> tuple[int, str]:
122
+ if skill.name and skill.name.lower() in normalized_prompt:
123
+ return 90, "name"
124
+ for alias in skill.aliases:
125
+ if alias.lower() in normalized_prompt:
126
+ return 80, "alias"
127
+ for tag in skill.tags:
128
+ tag_key = tag.lower()
129
+ if tag_key and (tag_key in normalized_prompt or tag_key in prompt_tokens):
130
+ return 65, "tag"
131
+
132
+ text = " ".join(
133
+ [
134
+ skill.description or "",
135
+ " ".join(skill.examples),
136
+ ]
137
+ ).lower()
138
+ skill_tokens = _tokens(text)
139
+ overlap = prompt_tokens & skill_tokens
140
+ if overlap:
141
+ return min(55, 20 + len(overlap) * 10), "metadata"
142
+ return 0, ""
143
+
144
+
145
+ def _tokens(value: str) -> set[str]:
146
+ return {
147
+ token
148
+ for token in re.split(r"[^0-9a-zA-Z\u4e00-\u9fff]+", value.lower())
149
+ if len(token) >= 2
150
+ }