agentengine-sdk-python 0.8.4__py3-none-any.whl → 0.8.5__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 (673) hide show
  1. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/METADATA +6 -3
  2. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/RECORD +591 -365
  3. ksadk/_build_provenance.json +1 -1
  4. ksadk/_process.py +83 -0
  5. ksadk/_str_enum.py +17 -0
  6. ksadk/a2ui/core.py +3 -3
  7. ksadk/api/client.py +6 -0
  8. ksadk/builders/code_builder.py +38 -12
  9. ksadk/builders/framework_requirements.py +20 -2
  10. ksadk/cli/__init__.py +36 -0
  11. ksadk/cli/cmd_config.py +4 -4
  12. ksadk/cli/cmd_create.py +12 -12
  13. ksadk/cli/cmd_hermes.py +24 -2
  14. ksadk/cli/cmd_invoke.py +28 -5
  15. ksadk/cli/cmd_openclaw.py +26 -1
  16. ksadk/cli/cmd_plugin.py +70 -12
  17. ksadk/cli/cmd_studio.py +64 -16
  18. ksadk/cli/openclaw_env.py +1 -1
  19. ksadk/cli/resource_common.py +26 -0
  20. ksadk/codex/client.py +3 -2
  21. ksadk/configs/__init__.py +1 -1
  22. ksadk/configs/env_registry.py +125 -31
  23. ksadk/configs/env_registry_studio.py +86 -0
  24. ksadk/configs/global_config.py +1 -1
  25. ksadk/configs/settings.py +3 -3
  26. ksadk/connector/__init__.py +17 -0
  27. ksadk/connector/channel.py +477 -0
  28. ksadk/context_engine/capabilities.py +52 -4
  29. ksadk/conversations/attachment_storage.py +10 -3
  30. ksadk/conversations/attachments.py +16 -5
  31. ksadk/conversations/message_projection.py +23 -32
  32. ksadk/conversations/normalize.py +28 -10
  33. ksadk/conversations/runtime_baseline.py +37 -0
  34. ksadk/conversations/runtime_invocation.py +17 -4
  35. ksadk/conversations/runtime_observability.py +39 -10
  36. ksadk/conversations/runtime_payloads.py +8 -0
  37. ksadk/conversations/runtime_persistence.py +105 -9
  38. ksadk/conversations/runtime_preparation.py +13 -7
  39. ksadk/conversations/runtime_stream_events.py +29 -35
  40. ksadk/conversations/runtime_streaming.py +8 -0
  41. ksadk/events/adapters/_codex_items.py +16 -8
  42. ksadk/events/adapters/_langgraph_support.py +34 -0
  43. ksadk/events/session_event.py +2 -2
  44. ksadk/harness/__init__.py +14 -0
  45. ksadk/harness/app.py +11 -0
  46. ksadk/harness/artifact_store.py +213 -0
  47. ksadk/harness/capabilities.py +115 -0
  48. ksadk/harness/capability_runtime.py +237 -0
  49. ksadk/harness/closure_contract.py +92 -0
  50. ksadk/harness/compaction_record.py +122 -0
  51. ksadk/harness/compiler.py +284 -0
  52. ksadk/harness/conformance/__init__.py +33 -0
  53. ksadk/harness/conformance/contract.py +506 -0
  54. ksadk/harness/conformance/fixtures.py +102 -0
  55. ksadk/harness/context_engine.py +403 -0
  56. ksadk/harness/context_maintenance.py +259 -0
  57. ksadk/harness/context_manifest.py +188 -0
  58. ksadk/harness/context_tuning.py +168 -0
  59. ksadk/harness/draft_runtime.py +322 -0
  60. ksadk/harness/engine/__init__.py +40 -0
  61. ksadk/harness/engine/base.py +122 -0
  62. ksadk/harness/engine/budgets.py +108 -0
  63. ksadk/harness/engine/capability_declarations.py +59 -0
  64. ksadk/harness/engine/completion_guard.py +42 -0
  65. ksadk/harness/engine/context_pipeline.py +579 -0
  66. ksadk/harness/engine/graph_builder.py +859 -0
  67. ksadk/harness/engine/langgraph.py +931 -0
  68. ksadk/harness/engine/mcp_disclosure.py +750 -0
  69. ksadk/harness/engine/policy_runtime.py +70 -0
  70. ksadk/harness/engine/postgres_checkpointer.py +63 -0
  71. ksadk/harness/engine/run_control_bridge.py +80 -0
  72. ksadk/harness/engine/run_types.py +88 -0
  73. ksadk/harness/engine/skill_disclosure.py +189 -0
  74. ksadk/harness/engine/spans.py +41 -0
  75. ksadk/harness/engine/subagents.py +343 -0
  76. ksadk/harness/engine/thread_ids.py +112 -0
  77. ksadk/harness/engine/tool_dispatch.py +144 -0
  78. ksadk/harness/event_tree.py +212 -0
  79. ksadk/harness/events.py +461 -0
  80. ksadk/harness/execution_policy.py +94 -0
  81. ksadk/harness/insights.py +210 -0
  82. ksadk/harness/lifecycle.py +578 -0
  83. ksadk/harness/lifecycle_conformance.py +233 -0
  84. ksadk/harness/lifecycle_local_plane.py +104 -0
  85. ksadk/harness/loop/__init__.py +44 -0
  86. ksadk/harness/loop/reason.py +454 -0
  87. ksadk/harness/loop/tools.py +762 -0
  88. ksadk/harness/managed_runtime.py +884 -0
  89. ksadk/harness/mcp_matrix.py +474 -0
  90. ksadk/harness/mcp_runtime.py +471 -0
  91. ksadk/harness/memory_consolidation.py +157 -0
  92. ksadk/harness/memory_loop.py +156 -0
  93. ksadk/harness/memory_runtime.py +541 -0
  94. ksadk/harness/metrics.py +90 -0
  95. ksadk/harness/model_capability.py +253 -0
  96. ksadk/harness/model_provider.py +220 -0
  97. ksadk/harness/observability/__init__.py +29 -0
  98. ksadk/harness/observability/inspection.py +528 -0
  99. ksadk/harness/observability/metrics.py +167 -0
  100. ksadk/harness/observability/otel_exporter.py +218 -0
  101. ksadk/harness/prompt_cache.py +70 -0
  102. ksadk/harness/public_activity.py +154 -0
  103. ksadk/harness/readiness.py +249 -0
  104. ksadk/harness/reasoner.py +466 -13
  105. ksadk/harness/release_readiness.py +140 -0
  106. ksadk/harness/resource_ref.py +69 -0
  107. ksadk/harness/run_control.py +668 -0
  108. ksadk/harness/runtime.py +146 -111
  109. ksadk/harness/runtime_capabilities.py +158 -0
  110. ksadk/harness/runtime_server.py +514 -0
  111. ksadk/harness/sandbox_adapters.py +739 -0
  112. ksadk/harness/sandbox_backend.py +530 -0
  113. ksadk/harness/sandbox_conformance.py +288 -0
  114. ksadk/harness/sandbox_lease.py +77 -0
  115. ksadk/harness/sandbox_lease_conformance.py +259 -0
  116. ksadk/harness/sandbox_matrix.py +170 -0
  117. ksadk/harness/sandbox_reconciliation.py +140 -0
  118. ksadk/harness/sandbox_recovery.py +586 -0
  119. ksadk/harness/sandbox_recovery_conformance.py +246 -0
  120. ksadk/harness/session_store.py +243 -0
  121. ksadk/harness/skill_composition.py +212 -0
  122. ksadk/harness/skill_feedback.py +123 -0
  123. ksadk/harness/skill_matrix.py +233 -0
  124. ksadk/harness/skill_runtime.py +259 -0
  125. ksadk/harness/spec.py +332 -0
  126. ksadk/harness/state.py +153 -0
  127. ksadk/harness/strategies.py +149 -0
  128. ksadk/harness/subagent.py +253 -0
  129. ksadk/harness/tool_policy.py +131 -0
  130. ksadk/harness/tool_receipts.py +96 -0
  131. ksadk/harness/tool_reliability.py +81 -0
  132. ksadk/harness/user_errors.py +69 -0
  133. ksadk/harness/working_context.py +81 -0
  134. ksadk/harness/working_context_patch.py +99 -0
  135. ksadk/identity/resolver.py +18 -0
  136. ksadk/interaction/__init__.py +1 -1
  137. ksadk/interaction/ledger.py +1 -1
  138. ksadk/interaction/provider.py +1 -1
  139. ksadk/interaction/providers/__init__.py +3 -1
  140. ksadk/interaction/providers/adk.py +1 -1
  141. ksadk/interaction/providers/codex.py +1 -1
  142. ksadk/interaction/providers/harness.py +50 -0
  143. ksadk/interaction/providers/langgraph.py +1 -1
  144. ksadk/kernel/__init__.py +10 -0
  145. ksadk/kernel/approval_presentation.py +91 -0
  146. ksadk/kernel/authorization.py +1 -1
  147. ksadk/kernel/bootstrap.py +86 -102
  148. ksadk/kernel/contract_fingerprints.py +1 -1
  149. ksadk/kernel/contracts.py +5 -0
  150. ksadk/kernel/control.py +32 -1
  151. ksadk/kernel/execution_grants.py +221 -0
  152. ksadk/kernel/execution_grants_memory.py +133 -0
  153. ksadk/kernel/execution_grants_postgres.py +217 -0
  154. ksadk/kernel/execution_grants_sqlite.py +209 -0
  155. ksadk/kernel/ingress.py +27 -27
  156. ksadk/kernel/mapping.py +1 -1
  157. ksadk/kernel/memory_store.py +24 -11
  158. ksadk/kernel/postgres_store.py +63 -33
  159. ksadk/kernel/recovery.py +78 -14
  160. ksadk/kernel/sql/001_agent_kernel.sql +23 -0
  161. ksadk/kernel/sqlite_store.py +304 -25
  162. ksadk/kernel/state.py +2 -3
  163. ksadk/kernel/store.py +69 -2
  164. ksadk/kernel/worker.py +79 -41
  165. ksadk/kernel/worker_history.py +72 -0
  166. ksadk/kernel/worker_identity.py +47 -0
  167. ksadk/memory/coordinator.py +22 -6
  168. ksadk/memory/extraction.py +40 -1
  169. ksadk/memory/models.py +77 -1
  170. ksadk/memory/provider_resolver.py +5 -0
  171. ksadk/memory/providers/local_postgres.py +200 -0
  172. ksadk/memory/providers/local_sqlite.py +42 -3
  173. ksadk/memory/retrieval.py +189 -0
  174. ksadk/memory/store_adapter.py +150 -0
  175. ksadk/model_policy.py +2 -2
  176. ksadk/model_proxy/detect.py +254 -0
  177. ksadk/model_proxy/server.py +4 -2
  178. ksadk/model_proxy/transform.py +40 -2
  179. ksadk/plugins/__init__.py +1 -1
  180. ksadk/plugins/bridges/dsh.py +11 -0
  181. ksadk/plugins/builtins.py +40 -2
  182. ksadk/plugins/companion_artifacts.py +83 -0
  183. ksadk/plugins/companions.py +368 -0
  184. ksadk/plugins/contracts.py +1 -1
  185. ksadk/plugins/dsh_channels.py +156 -0
  186. ksadk/plugins/dsh_home.py +140 -0
  187. ksadk/plugins/dsh_teams.py +105 -0
  188. ksadk/plugins/dsh_toolchain.py +101 -19
  189. ksadk/plugins/execution_host.py +99 -0
  190. ksadk/plugins/providers/bundles/dsh-channels-client/client.js +19 -0
  191. ksadk/plugins/providers/bundles/dsh-channels-client/cordis.patch.yml +3 -0
  192. ksadk/plugins/providers/bundles/dsh-channels-client/index.mjs +7 -0
  193. ksadk/plugins/providers/bundles/dsh-channels-client/package.json +12 -0
  194. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +1 -1
  195. ksadk/plugins/providers/bundles/dsh-memory/package.json +1 -1
  196. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +1 -1
  197. ksadk/plugins/providers/bundles/dsh-teams-client/client.js +29 -0
  198. ksadk/plugins/providers/bundles/dsh-teams-client/cordis.patch.yml +3 -0
  199. ksadk/plugins/providers/bundles/dsh-teams-client/index.mjs +11 -0
  200. ksadk/plugins/providers/bundles/dsh-teams-client/package.json +35 -0
  201. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/cordis.patch.yml +3 -0
  202. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/index.mjs +13 -0
  203. ksadk/plugins/providers/bundles/dsh-teams-leader-policy/package.json +27 -0
  204. ksadk/plugins/providers/bundles/dsh-teams-profile/cordis.patch.yml +3 -0
  205. ksadk/plugins/providers/bundles/dsh-teams-profile/index.mjs +12 -0
  206. ksadk/plugins/providers/bundles/dsh-teams-profile/package.json +26 -0
  207. ksadk/plugins/providers/bundles/dsh-teams-router/cordis.patch.yml +3 -0
  208. ksadk/plugins/providers/bundles/dsh-teams-router/index.mjs +16 -0
  209. ksadk/plugins/providers/bundles/dsh-teams-router/package.json +27 -0
  210. ksadk/plugins/providers/bundles/dsh-teams-tasks/cordis.patch.yml +3 -0
  211. ksadk/plugins/providers/bundles/dsh-teams-tasks/index.mjs +16 -0
  212. ksadk/plugins/providers/bundles/dsh-teams-tasks/package.json +27 -0
  213. ksadk/plugins/providers/bundles/dsh-teams-tools/cordis.patch.yml +3 -0
  214. ksadk/plugins/providers/bundles/dsh-teams-tools/index.mjs +25 -0
  215. ksadk/plugins/providers/bundles/dsh-teams-tools/package.json +29 -0
  216. ksadk/plugins/providers/bundles/dsh-teams-tools/tools.json +235 -0
  217. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +1 -1
  218. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +51 -1
  219. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +2 -2
  220. ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/client.mjs +133 -0
  221. ksadk/plugins/providers/bundles/ksadk-dsh-companion-host/index.mjs +14 -0
  222. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +27 -4
  223. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +9 -5
  224. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +1 -1
  225. ksadk/plugins/providers/codex.py +10 -2
  226. ksadk/plugins/providers/dsh_capabilities.py +61 -0
  227. ksadk/plugins/providers/harness.py +181 -33
  228. ksadk/plugins/providers/harness_delegation.py +593 -0
  229. ksadk/plugins/providers/harness_managed.py +456 -0
  230. ksadk/plugins/providers/harness_tools.py +326 -0
  231. ksadk/plugins/providers/shipped_dsh.py +4 -1
  232. ksadk/plugins/subagent_providers/codex.py +28 -6
  233. ksadk/plugins/teams/__init__.py +5 -0
  234. ksadk/plugins/teams/api.py +405 -0
  235. ksadk/plugins/teams/application.py +680 -0
  236. ksadk/plugins/teams/artifacts.py +60 -0
  237. ksadk/plugins/teams/context.py +96 -0
  238. ksadk/plugins/teams/contracts.py +136 -0
  239. ksadk/plugins/teams/domain.py +1427 -0
  240. ksadk/plugins/teams/domain_values.py +24 -0
  241. ksadk/plugins/teams/errors.py +13 -0
  242. ksadk/plugins/teams/migration.py +311 -0
  243. ksadk/plugins/teams/migration_cli.py +322 -0
  244. ksadk/plugins/teams/postgres_store.py +138 -0
  245. ksadk/plugins/teams/runtime.py +777 -0
  246. ksadk/plugins/teams/source_projection.py +84 -0
  247. ksadk/plugins/teams/store.py +311 -0
  248. ksadk/plugins/teams/task_decisions.py +423 -0
  249. ksadk/plugins/teams/transport.py +91 -0
  250. ksadk/plugins/teams/workspaces.py +255 -0
  251. ksadk/runners/_langgraph_runner_streams.py +121 -45
  252. ksadk/runners/_langgraph_state_reader.py +106 -0
  253. ksadk/runners/_session_identity.py +285 -0
  254. ksadk/runners/adk_runner.py +25 -60
  255. ksadk/runners/langgraph_runner.py +128 -111
  256. ksadk/runners/patch_langchain.py +47 -0
  257. ksadk/runners/usage_accumulator.py +11 -3
  258. ksadk/runtime/_runner_adapter/stream_mapping.py +52 -2
  259. ksadk/runtime/conversation_execution.py +25 -1
  260. ksadk/runtime/executor.py +9 -1
  261. ksadk/runtime/factory.py +36 -1
  262. ksadk/runtime/preprocessing.py +11 -3
  263. ksadk/runtime/runner_adapter.py +38 -9
  264. ksadk/runtime/skill_eval_result.py +36 -0
  265. ksadk/runtime/timing.py +46 -0
  266. ksadk/runtime/usage.py +49 -18
  267. ksadk/runtime_context.py +103 -1
  268. ksadk/sandbox/backends/e2b.py +245 -23
  269. ksadk/sandbox/backends/local_process.py +63 -39
  270. ksadk/sandbox/base.py +62 -1
  271. ksadk/sandbox/diagnostics.py +82 -0
  272. ksadk/sandbox/local_controls.py +746 -0
  273. ksadk/sandbox/local_launcher.py +90 -0
  274. ksadk/scheduler/dispatcher.py +1 -1
  275. ksadk/server/invocation_identity.py +118 -0
  276. ksadk/server/routes/common.py +32 -3
  277. ksadk/server/routes/control.py +64 -9
  278. ksadk/server/routes/dependencies.py +2 -1
  279. ksadk/server/routes/kernel_ingress.py +9 -1
  280. ksadk/server/routes/misc.py +233 -25
  281. ksadk/server/routes/models.py +3 -3
  282. ksadk/server/routes/openai_compat.py +76 -13
  283. ksadk/server/routes/run.py +106 -35
  284. ksadk/server/routes/sessions.py +244 -68
  285. ksadk/server/routes/workspace.py +130 -21
  286. ksadk/server/static/assets/{ArtifactsPanel-CGbWlMNh.js → ArtifactsPanel-C1YoaKhx.js} +1 -1
  287. ksadk/server/static/assets/{CodeBlock-b4C7upmO.js → CodeBlock-DHuAWfr5.js} +10 -7
  288. ksadk/server/static/assets/MathMessageMarkdown-cvdrBwYr.js +8 -0
  289. ksadk/server/static/assets/{MermaidBlock-BEBN4Ksz.js → MermaidBlock-DeBkbJvI.js} +9 -9
  290. ksadk/server/static/assets/{NativeTerminalPanel-zvL-WpAn.js → NativeTerminalPanel-oJj44_sV.js} +1 -1
  291. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-BYafW7Za.js → abnfDiagram-VCTEODGH-Dhfv25o2.js} +1 -1
  292. ksadk/server/static/assets/{arc-bTohInsS.js → arc-C35w-pn1.js} +1 -1
  293. ksadk/server/static/assets/architecture-7GRP2DOG-BCsa26zi.js +1 -0
  294. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-Ch5Lbzsi.js → architectureDiagram-5GKGNRK7-FoMY_u6D.js} +1 -1
  295. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-kqF4MDOG.js → blockDiagram-NRAW4CY4-zD4Rt7oE.js} +1 -1
  296. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-8uSRIODv.js → c4Diagram-UCG6FXSJ-BCtGGkhN.js} +1 -1
  297. ksadk/server/static/assets/channel-_KDifNys.js +1 -0
  298. ksadk/server/static/assets/chunk-2Q5K7J3B-HdVkJ9F0.js +1 -0
  299. ksadk/server/static/assets/{chunk-5VM5RSS4-DkhehZDr.js → chunk-5VM5RSS4-C2Ms13_k.js} +1 -1
  300. ksadk/server/static/assets/{chunk-F27PBJKO-BdXhtPe9.js → chunk-F27PBJKO-BoTj-qgx.js} +1 -1
  301. ksadk/server/static/assets/{chunk-G27WJ6UU-DPTpvpwi.js → chunk-G27WJ6UU-DOMyyjHH.js} +1 -1
  302. ksadk/server/static/assets/{chunk-JWPE2WC7-Pqoh38el.js → chunk-JWPE2WC7-DbJJqDli.js} +1 -1
  303. ksadk/server/static/assets/{chunk-LCL6LL3I-DeU00qC-.js → chunk-LCL6LL3I-CLuRCt_W.js} +1 -1
  304. ksadk/server/static/assets/{chunk-POPQ4Y6H-CzxScFkr.js → chunk-POPQ4Y6H-D0Dz847e.js} +1 -1
  305. ksadk/server/static/assets/{chunk-RHFEMEQ7-DpqMx-ux.js → chunk-RHFEMEQ7-BWSRzEcd.js} +1 -1
  306. ksadk/server/static/assets/{chunk-SVP7TREG-C6t0SypQ.js → chunk-SVP7TREG-CPoHqkCY.js} +1 -1
  307. ksadk/server/static/assets/{chunk-XXDRQBXY-DVaeafZk.js → chunk-XXDRQBXY-Bx1jS-X-.js} +1 -1
  308. ksadk/server/static/assets/classDiagram-DTDB5LWJ-BVCW3ZqZ.js +1 -0
  309. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-BVCW3ZqZ.js +1 -0
  310. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-Bf9D3tzJ.js → cose-bilkent-JH36ORCC-LzyWm4m0.js} +1 -1
  311. ksadk/server/static/assets/cynefin-OW5HDTMX-CNXjFctL.js +1 -0
  312. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-B9cY3iTz.js → cynefinDiagram-5FMLGOSQ-BlW_bHED.js} +1 -1
  313. ksadk/server/static/assets/{dagre-3AP2YEHR-CSwlx3CB.js → dagre-3AP2YEHR-Bu_S86_i.js} +1 -1
  314. ksadk/server/static/assets/{dagre-UBpgon5q.js → dagre-B7nCawed.js} +1 -1
  315. ksadk/server/static/assets/{diagram-S7CK7UJ4-C9akhN9a.js → diagram-S7CK7UJ4-W_Zow2Km.js} +1 -1
  316. ksadk/server/static/assets/{diagram-UQ7AKVKN-CgedhTPI.js → diagram-UQ7AKVKN-CLIKAHON.js} +1 -1
  317. ksadk/server/static/assets/{diagram-VSXAHHWV-Cjucz5BY.js → diagram-VSXAHHWV-Dv6_QAlN.js} +1 -1
  318. ksadk/server/static/assets/{diagram-VX7I27RA-Dd4Vleyn.js → diagram-VX7I27RA-BWAWRDtZ.js} +1 -1
  319. ksadk/server/static/assets/{diagram-Z3DM3KII-CZ2jGtYW.js → diagram-Z3DM3KII-XA_rWMss.js} +1 -1
  320. ksadk/server/static/assets/dist-0X_j2Rcc.js +1 -0
  321. ksadk/server/static/assets/{dist-DiixqL0J.js → dist-1nXCdsej.js} +1 -1
  322. ksadk/server/static/assets/{dist-BIr4DSRq.js → dist-2vL2sAdF.js} +1 -1
  323. ksadk/server/static/assets/{dist-D_ctSS2i.js → dist-B3bA05-e.js} +1 -1
  324. ksadk/server/static/assets/{dist-ClYUxfeK.js → dist-BLpRy_Yx.js} +1 -1
  325. ksadk/server/static/assets/{dist-QfkEHOlb.js → dist-BO_UwatH.js} +1 -1
  326. ksadk/server/static/assets/{dist-B3FR1SKK.js → dist-BdNFAney.js} +1 -1
  327. ksadk/server/static/assets/{dist-BnaTiyzN.js → dist-C0J5_3qM.js} +1 -1
  328. ksadk/server/static/assets/{dist-Bj730Ib4.js → dist-CGt_UGeO.js} +1 -1
  329. ksadk/server/static/assets/{dist-CFzsn6BG.js → dist-CIRMvUM4.js} +1 -1
  330. ksadk/server/static/assets/{dist-BgV_owcB.js → dist-CIpWk_5f.js} +1 -1
  331. ksadk/server/static/assets/{dist-C5_ZAZsG.js → dist-CPyieXEf.js} +1 -1
  332. ksadk/server/static/assets/{dist-btbmmX5O.js → dist-D-92S-Fd.js} +1 -1
  333. ksadk/server/static/assets/{dist-fBO2v5Kt.js → dist-DNKuMzWc.js} +1 -1
  334. ksadk/server/static/assets/{dist-ufY3F5p6.js → dist-DWfdmz9s.js} +2 -2
  335. ksadk/server/static/assets/{dist-DVCOWtha.js → dist-DppE_r-D.js} +1 -1
  336. ksadk/server/static/assets/{dist-C1NMAY5a.js → dist-DyG6Ya-z.js} +1 -1
  337. ksadk/server/static/assets/{dist-CB9iJrvg.js → dist-M-SrdhhZ.js} +1 -1
  338. ksadk/server/static/assets/{dist-DvFK7p5S.js → dist-mqD5TZup.js} +1 -1
  339. ksadk/server/static/assets/{dist-Cf125P_m.js → dist-n3n6t_FO.js} +1 -1
  340. ksadk/server/static/assets/{dist-DFD6Qa6T.js → dist-qe8xjesy.js} +1 -1
  341. ksadk/server/static/assets/{dist-DoVSwoDb.js → dist-t6MzE0jU.js} +1 -1
  342. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Ci8NqqZu.js → ebnfDiagram-PWID7BFC-BfCzF1Xi.js} +1 -1
  343. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CCIOhLZG.js → erDiagram-SSCWMZ5O-Dpz9_0zn.js} +1 -1
  344. ksadk/server/static/assets/eventmodeling-NTZA5JFV-B5-8RH9c.js +1 -0
  345. ksadk/server/static/assets/flowDiagram-A5DVABFB-BppFxEKw.js +1 -0
  346. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js → ganttDiagram-EL5Y4UJY-DDaG1f4_.js} +1 -1
  347. ksadk/server/static/assets/gitGraph-4MIJSDKK-B-AhYj4C.js +1 -0
  348. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js → gitGraphDiagram-WWUBYQGX-DcxzRwYC.js} +1 -1
  349. ksadk/server/static/assets/index-BMd2mucF.css +2 -0
  350. ksadk/server/static/assets/index-D5qyyhTH.js +244 -0
  351. ksadk/server/static/assets/info-A6RAGUB7-0uiKrC35.js +1 -0
  352. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CO0rRTRA.js → infoDiagram-RXCK75RN-CYMdn6lQ.js} +1 -1
  353. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CHiaedSS.js → ishikawaDiagram-5VMMS53U-CLHFAD6c.js} +1 -1
  354. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-CHcCIB09.js → journeyDiagram-EYS64GPL-BHSKQGAl.js} +1 -1
  355. ksadk/server/static/assets/{kanban-definition-3QL26DDD-CJ_ebBZf.js → kanban-definition-3QL26DDD-D5W3tjTT.js} +1 -1
  356. ksadk/server/static/assets/{katex-B4weu383.js → katex-mtjOi4KM.js} +1 -1
  357. ksadk/server/static/assets/{linear-V-MgYHW1.js → linear-BETqsxE_.js} +1 -1
  358. ksadk/server/static/assets/{mermaid-parser.core-CBijEX_c.js → mermaid-parser.core-DPWrvs90.js} +2 -2
  359. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-Bc-pQvpp.js → mindmap-definition-FBJOCRG2-CJG2mfBP.js} +1 -1
  360. ksadk/server/static/assets/packet-AYTQ26CC-BVTmZ_cw.js +1 -0
  361. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-D7genGLl.js → pegDiagram-XKGWAZYB-GjAPNaqn.js} +1 -1
  362. ksadk/server/static/assets/pie-WAS4IAKB-DyfxBU7V.js +1 -0
  363. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-Bxj32zwD.js → pieDiagram-E7YTZNPT-ToIewrqr.js} +1 -1
  364. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BURv2mGh.js → quadrantDiagram-AXDQQJYC-4d78KiEY.js} +1 -1
  365. ksadk/server/static/assets/radar-RG4KPBEZ-FFontjL2.js +1 -0
  366. ksadk/server/static/assets/railroad-74A4TZTK-D0Uidzen.js +1 -0
  367. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BOo_9T2h.js +1 -0
  368. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-D6-BjW7Z.js +1 -0
  369. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CXx__yMm.js +1 -0
  370. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-CCsh3avW.js → railroadDiagram-O6MQD6OU-DKzx4xfv.js} +1 -1
  371. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-_FRRBKEd.js → requirementDiagram-EFPCY7ZU-CJYljxQS.js} +1 -1
  372. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-C-gr2o9M.js → sankeyDiagram-P5KCCOFB-DLU2fV1w.js} +1 -1
  373. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-D97NmfKg.js → sequenceDiagram-WJ2MYXX4-CVqysrA9.js} +1 -1
  374. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DjrPC5FX.js → sizeCapture-X5ZJPWSS-BUxfmTHc.js} +1 -1
  375. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DzMNg1hh.js → stateDiagram-HBIQ2CUA-CNFgYI9E.js} +1 -1
  376. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BXAFScz8.js +1 -0
  377. ksadk/server/static/assets/{swimlanes-XN3QIQJK-Cssf_CsU.js → swimlanes-XN3QIQJK-B6qCMe8N.js} +1 -1
  378. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uIQ2lJKH.js +8 -0
  379. ksadk/server/static/assets/{timeline-definition-24CTP7MA-BWTHzyS1.js → timeline-definition-24CTP7MA-CMD3x_U_.js} +1 -1
  380. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5GgucZ.js +1 -0
  381. ksadk/server/static/assets/treemap-WGGIJYW6-Bq1u1SpG.js +1 -0
  382. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-BSKgJsmR.js → vennDiagram-4TSXK5OY-BqtUqvXM.js} +1 -1
  383. ksadk/server/static/assets/wardley-WFR3VGLG-QAt06uEz.js +1 -0
  384. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-eflHNoaZ.js → wardleyDiagram-VM6X3IG4-B5KfDjI-.js} +1 -1
  385. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-eYqrQ-v4.js → xychartDiagram-S5SC5T6Z-BaUlSZrn.js} +1 -1
  386. ksadk/server/static/index.html +2 -2
  387. ksadk/server/terminal_sessions.py +34 -2
  388. ksadk/sessions/invocation_identity.py +235 -0
  389. ksadk/skills/__init__.py +26 -0
  390. ksadk/skills/events.py +464 -0
  391. ksadk/skills/manifest_cache.py +263 -0
  392. ksadk/skills/mcp_server/__init__.py +0 -0
  393. ksadk/skills/mcp_server/_registry.py +33 -0
  394. ksadk/skills/mcp_server/_routing.py +26 -0
  395. ksadk/skills/mcp_server/_workspace_files.py +160 -0
  396. ksadk/skills/mcp_server/register.py +415 -0
  397. ksadk/skills/mcp_server/server.py +218 -0
  398. ksadk/skills/models.py +11 -0
  399. ksadk/skills/observability.py +132 -0
  400. ksadk/skills/package_store.py +75 -2
  401. ksadk/skills/runtime/agent.py +38 -5
  402. ksadk/skills/runtime/artifacts.py +87 -0
  403. ksadk/skills/runtime/backends/e2b.py +393 -52
  404. ksadk/skills/runtime/backends/local.py +621 -119
  405. ksadk/skills/runtime/base.py +78 -7
  406. ksadk/skills/runtime/executor.py +266 -1
  407. ksadk/skills/runtime/loader.py +108 -3
  408. ksadk/skills/runtime/request.py +18 -0
  409. ksadk/skills/tool_defs.py +108 -3
  410. ksadk/studio/api.py +592 -57
  411. ksadk/studio/api_contracts.py +8 -2
  412. ksadk/studio/api_plugin_routes.py +39 -12
  413. ksadk/studio/api_resource_connections.py +79 -41
  414. ksadk/studio/authoring.py +12 -6
  415. ksadk/studio/authoring_coordinator.py +4 -2
  416. ksadk/studio/builder.py +12 -0
  417. ksadk/studio/capabilities.py +23 -6
  418. ksadk/studio/channel_connections.py +333 -0
  419. ksadk/studio/cloud.py +30 -10
  420. ksadk/studio/cloud_shared_web.py +75 -2
  421. ksadk/studio/codex_agent_service.py +2 -2
  422. ksadk/studio/codex_builder.py +1 -1
  423. ksadk/studio/codex_run.py +6 -1
  424. ksadk/studio/compiler.py +10 -0
  425. ksadk/studio/configuration.py +182 -0
  426. ksadk/studio/contracts.py +33 -5
  427. ksadk/studio/dsh_application.py +135 -25
  428. ksadk/studio/dsh_capability_service.py +287 -20
  429. ksadk/studio/dsh_lifecycle.py +58 -0
  430. ksadk/studio/dsh_provider_registration.py +55 -16
  431. ksadk/studio/entry.py +53 -0
  432. ksadk/studio/event_store.py +36 -5
  433. ksadk/studio/execution_host.py +525 -0
  434. ksadk/studio/framework_run.py +32 -10
  435. ksadk/studio/hosted_kernel.py +1 -1
  436. ksadk/studio/kernel_registry.py +418 -0
  437. ksadk/studio/kernel_sqlite_migration.py +181 -0
  438. ksadk/studio/model_client.py +1178 -64
  439. ksadk/studio/model_profile_service.py +26 -11
  440. ksadk/studio/native_documents.py +172 -0
  441. ksadk/studio/plugin_composition.py +13 -2
  442. ksadk/studio/plugin_kernel_adapter.py +15 -0
  443. ksadk/studio/plugin_lifecycle.py +80 -0
  444. ksadk/studio/plugin_runtime.py +230 -17
  445. ksadk/studio/provider_recovery.py +59 -0
  446. ksadk/studio/recovery_page.py +70 -0
  447. ksadk/studio/resource_authority.py +59 -32
  448. ksadk/studio/resource_catalog.py +6 -0
  449. ksadk/studio/run_activity.py +895 -0
  450. ksadk/studio/run_documents.py +127 -0
  451. ksadk/studio/run_service.py +329 -33
  452. ksadk/studio/runtime_catalog.py +53 -10
  453. ksadk/studio/runtime_source.py +1 -1
  454. ksadk/studio/scheduler_runtime.py +32 -289
  455. ksadk/studio/service.py +398 -103
  456. ksadk/studio/shared_web.py +149 -36
  457. ksadk/studio/static/assets/ChannelsPage-D_PGmKVq.js +8 -0
  458. ksadk/studio/static/assets/CodeBlock-DMIf4h33-UIqo-BPW.js +44 -0
  459. ksadk/studio/static/assets/ExecutionTree-v3HexvPo-Bk8wzGSy.js +1 -0
  460. ksadk/studio/static/assets/MathMessageMarkdown-BesSeCYl-OhNwH4K9.js +8 -0
  461. ksadk/studio/static/assets/MermaidBlock-H_0qzQDf-BdXtxug_.js +11 -0
  462. ksadk/studio/static/assets/MessageMarkdown-CwMTvgFj-g0I-I4dD.js +59 -0
  463. ksadk/studio/static/assets/PrismRenderer-5pK6tUdb.js +3 -0
  464. ksadk/studio/static/assets/TeamsPage-DqX4HWKQ.js +3 -0
  465. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-Bnb1O3tA.js +1 -0
  466. ksadk/studio/static/assets/architecture-7GRP2DOG-BMOPAkUC.js +1 -0
  467. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-5Zn1gqJv.js +36 -0
  468. ksadk/studio/static/assets/{blockDiagram-I7D4REHJ-CFmPl1de.js → blockDiagram-I7D4REHJ-CLB4L11u.js} +6 -6
  469. ksadk/studio/static/assets/{c4Diagram-7LVT6UL2-BRrGu8qt.js → c4Diagram-7LVT6UL2-BOma_Z_F.js} +7 -7
  470. ksadk/studio/static/assets/channel-r8itPEik.js +1 -0
  471. ksadk/studio/static/assets/chunk-2E4U76K2-BFf_huql.js +2 -0
  472. ksadk/studio/static/assets/chunk-2ZTRR5NV-C2qZJila.js +2 -0
  473. ksadk/studio/static/assets/chunk-3Z5EZCMW-DMniOlPd.js +1 -0
  474. ksadk/studio/static/assets/{chunk-4HAMMTFA-D220vUtq.js → chunk-4HAMMTFA-DVtDP4rm.js} +7 -7
  475. ksadk/studio/static/assets/chunk-5V3GS4D5-i-ZDOEnP.js +1 -0
  476. ksadk/studio/static/assets/chunk-6AZGARVD-BB6FqMl-.js +1 -0
  477. ksadk/studio/static/assets/chunk-6EIED4P4-DdUJkP0f.js +1 -0
  478. ksadk/studio/static/assets/chunk-6K3QC6MW-CqVsVn-y.js +1 -0
  479. ksadk/studio/static/assets/chunk-6TQVIW2G-DKlLbNIP.js +1 -0
  480. ksadk/studio/static/assets/chunk-747NJXEK-BFkZPlab.js +2 -0
  481. ksadk/studio/static/assets/chunk-75Z2AOVW-BZNhM4vB.js +2 -0
  482. ksadk/studio/static/assets/chunk-CLGD4ZFX-D-GTtyKs.js +1 -0
  483. ksadk/studio/static/assets/{chunk-DU6HZSFF-C4DtVpCu.js → chunk-DU6HZSFF-CpEZCUgg.js} +1 -1
  484. ksadk/studio/static/assets/chunk-F27PBJKO-D7pvKf0C.js +1 -0
  485. ksadk/studio/static/assets/{chunk-GMAD6QVW-DiQA-u2N.js → chunk-GMAD6QVW-DE_8H717.js} +6 -6
  486. ksadk/studio/static/assets/chunk-GVQU2GXP-BfEB0lNv.js +1 -0
  487. ksadk/studio/static/assets/chunk-I5DQTOEV-Hm2LfiYI.js +1 -0
  488. ksadk/studio/static/assets/chunk-ICYGCRZG-749o-pGJ.js +1 -0
  489. ksadk/studio/static/assets/chunk-IH6LHLGP-CC6I9F3i.js +1 -0
  490. ksadk/studio/static/assets/{chunk-IMKFNOWR-BSlbjT_b.js → chunk-IMKFNOWR-D38axYOR.js} +5 -5
  491. ksadk/studio/static/assets/chunk-KI3K4JFJ-Rma-0k_M.js +1 -0
  492. ksadk/studio/static/assets/chunk-L3NEJ4N5-Dq5xn7aL.js +1 -0
  493. ksadk/studio/static/assets/chunk-LNGE3PJU-DWpGwHrW.js +34 -0
  494. ksadk/studio/static/assets/{chunk-OSK3NFVY-M2m6G3j4.js → chunk-OSK3NFVY-DiCQjx9b.js} +5 -5
  495. ksadk/studio/static/assets/chunk-OUJLGHUK-D0j2JRSg.js +2 -0
  496. ksadk/studio/static/assets/{chunk-P2QGCYS3-DezaQxiK.js → chunk-P2QGCYS3-VdhKmfYq.js} +1 -1
  497. ksadk/studio/static/assets/chunk-POPQ4Y6H-C1_rzO5M.js +1 -0
  498. ksadk/studio/static/assets/chunk-PWAF6VOD-B45HvflI.js +1 -0
  499. ksadk/studio/static/assets/{chunk-SHT3W25Y-DAyIVp5H.js → chunk-SHT3W25Y-DsCFnRVE.js} +9 -9
  500. ksadk/studio/static/assets/{chunk-SVP7TREG-DulomOrS.js → chunk-SVP7TREG-DljApgRX.js} +1 -1
  501. ksadk/studio/static/assets/{chunk-TICWLB2K-bHJYoflj.js → chunk-TICWLB2K-DWqRtyqa.js} +6 -6
  502. ksadk/studio/static/assets/chunk-TLUHSLCS-DUeGgnD5.js +2 -0
  503. ksadk/studio/static/assets/chunk-UY3FDG6J-CnmaAkG5.js +1 -0
  504. ksadk/studio/static/assets/chunk-XHIXRSVI-BFQ6B8BE.js +1 -0
  505. ksadk/studio/static/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  506. ksadk/studio/static/assets/classDiagram-ZZMXUADV-DjeMNJmu.js +1 -0
  507. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-DjeMNJmu.js +1 -0
  508. ksadk/studio/static/assets/clsx-DB0hHKMi.js +1 -0
  509. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-om8AY0Mc.js +1 -0
  510. ksadk/studio/static/assets/createLucideIcon-DR0LGTP5.js +1 -0
  511. ksadk/studio/static/assets/cynefin-OW5HDTMX-7tP7QfM3.js +1 -0
  512. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-6BrmK52S.js +62 -0
  513. ksadk/studio/static/assets/dagre-GXQ25YYZ-buZBRlwz.js +4 -0
  514. ksadk/studio/static/assets/{diagram-S7CK7UJ4-0BZ98mya.js → diagram-S7CK7UJ4-C6aH78c4.js} +3 -3
  515. ksadk/studio/static/assets/diagram-UQ7AKVKN-DY_tQ6C_.js +41 -0
  516. ksadk/studio/static/assets/diagram-VSXAHHWV-DX9p5cQT.js +3 -0
  517. ksadk/studio/static/assets/diagram-VX7I27RA-DB2WSH8X.js +24 -0
  518. ksadk/studio/static/assets/diagram-Z3DM3KII-Ce1BJwHE.js +24 -0
  519. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-Daukxwqf.js +1 -0
  520. ksadk/studio/static/assets/{erDiagram-RLTQ6QDP-DLGry2Ap.js → erDiagram-RLTQ6QDP-CGthTMmJ.js} +6 -6
  521. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-BR2FzK4R.js +1 -0
  522. ksadk/studio/static/assets/flowDiagram-HODETNUW-CZ1tEenp.js +1 -0
  523. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BfoAZW9X.js +292 -0
  524. ksadk/studio/static/assets/gitGraph-4MIJSDKK-DYlXv_yJ.js +1 -0
  525. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-S985OIJF.js +106 -0
  526. ksadk/studio/static/assets/iconfont-4HN3C9Pg.woff2 +0 -0
  527. ksadk/studio/static/assets/index-CfEnms6Y.css +2 -0
  528. ksadk/studio/static/assets/index-Dp61rOWZ.js +0 -0
  529. ksadk/studio/static/assets/index.dom-BQenBtFm.js +1 -0
  530. ksadk/studio/static/assets/info-A6RAGUB7-BlU-8_xu.js +1 -0
  531. ksadk/studio/static/assets/infoDiagram-27XIBGKW-CO3W8tFn.js +2 -0
  532. ksadk/studio/static/assets/{ishikawaDiagram-5VMMS53U-CljI2wyf.js → ishikawaDiagram-5VMMS53U-BUGEl8cO.js} +2 -2
  533. ksadk/studio/static/assets/{journeyDiagram-3NMN7TZE-D50Fo2sL.js → journeyDiagram-3NMN7TZE-Ch2ZYxvr.js} +6 -6
  534. ksadk/studio/static/assets/{kanban-definition-UXKFOSKX-DimfOTam.js → kanban-definition-UXKFOSKX-Da-Fp4vC.js} +3 -3
  535. ksadk/studio/static/assets/kingsoft-cloud-BOcLiQ3e.ico +0 -0
  536. ksadk/studio/static/assets/{line-CX5BOOUP.js → line-BDaeq300.js} +1 -1
  537. ksadk/studio/static/assets/linear-DmucvK78.js +1 -0
  538. ksadk/studio/static/assets/mermaid-parser.core-Cj5mYdBi.js +4 -0
  539. ksadk/studio/static/assets/{mindmap-definition-YA3MSWOX-Bizzqy5R.js → mindmap-definition-YA3MSWOX-CvlsVQ38.js} +1 -1
  540. ksadk/studio/static/assets/packet-AYTQ26CC-BSJEH9Lb.js +1 -0
  541. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-BuHuNgT5.js +1 -0
  542. ksadk/studio/static/assets/pie-WAS4IAKB-qxv01Y8W.js +1 -0
  543. ksadk/studio/static/assets/{pieDiagram-E7YTZNPT-B9mrFSDF.js → pieDiagram-E7YTZNPT-DlrWiSOv.js} +1 -1
  544. ksadk/studio/static/assets/preload-helper-CO68xz6u.js +1 -0
  545. ksadk/studio/static/assets/presentation-yYw7xK60-BmcZriri.js +1 -0
  546. ksadk/studio/static/assets/{quadrantDiagram-AXDQQJYC-NzUfCbMR.js → quadrantDiagram-AXDQQJYC-BA3hpUZM.js} +6 -6
  547. ksadk/studio/static/assets/radar-RG4KPBEZ-B6h6pWOs.js +1 -0
  548. ksadk/studio/static/assets/railroad-74A4TZTK-CGtTWdGc.js +1 -0
  549. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-Cq7y22IA.js +1 -0
  550. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-V0aQVv9m.js +1 -0
  551. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-BQiIsX_p.js +1 -0
  552. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-BxpAazym.js +1 -0
  553. ksadk/studio/static/assets/{requirementDiagram-BXWQKSXE-BF3d103U.js → requirementDiagram-BXWQKSXE-E-Ge0FcV.js} +1 -1
  554. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-CA6YKhQ3.js +40 -0
  555. ksadk/studio/static/assets/{sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js → sequenceDiagram-WJ2MYXX4-CcElXGg4.js} +9 -9
  556. ksadk/studio/static/assets/src-B6xuSHsQ.js +1 -0
  557. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DdXZOFqY.js +1 -0
  558. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-CJbOM-QK.js +1 -0
  559. ksadk/studio/static/assets/swimlanes-42K2YHIH-NtgEEHLY.js +1 -0
  560. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-D-AVlW8B.js +8 -0
  561. ksadk/studio/static/assets/{timeline-definition-24CTP7MA-DxmSSjRB.js → timeline-definition-24CTP7MA-CIuYhNy3.js} +7 -7
  562. ksadk/studio/static/assets/treeView-Q6P3EWNA-BTTYcvrF.js +1 -0
  563. ksadk/studio/static/assets/treemap-WGGIJYW6-Cg7tyfH8.js +1 -0
  564. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-7HbApbrv.js +34 -0
  565. ksadk/studio/static/assets/wardley-WFR3VGLG-C6N1rULY.js +1 -0
  566. ksadk/studio/static/assets/{wardleyDiagram-VM6X3IG4-Ba1AOWoe.js → wardleyDiagram-VM6X3IG4-CMJiaedy.js} +1 -1
  567. ksadk/studio/static/assets/{xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js → xychartDiagram-S5SC5T6Z-BdgtMvW2.js} +6 -6
  568. ksadk/studio/static/index.html +8 -2
  569. ksadk/studio/teams_catalog.py +133 -0
  570. ksadk/studio/teams_installation.py +214 -0
  571. ksadk/studio/teams_node.py +545 -0
  572. ksadk/studio/teams_node_runner.py +69 -0
  573. ksadk/studio/teams_remote.py +274 -0
  574. ksadk/studio/templates.py +40 -19
  575. ksadk/studio/validator.py +13 -0
  576. ksadk/studio/workspace.py +19 -4
  577. ksadk/studio/workspace_plugins.py +136 -0
  578. ksadk/studio/workspace_registry.py +286 -0
  579. ksadk/toolsets/__init__.py +11 -0
  580. ksadk/toolsets/skills.py +446 -378
  581. ksadk/toolsets/workspace.py +3 -3
  582. ksadk/toolsets/workspace_identity.py +15 -0
  583. ksadk/version.py +1 -1
  584. ksadk_runtime_common/memory_backend/providers/lancedb.py +56 -2
  585. ksadk_runtime_common/schemas/memory_backend_manifest.schema.json +148 -148
  586. ksadk_runtime_common/workspace_files/router.py +26 -13
  587. ksadk/server/static/assets/MathMessageMarkdown-DbdW5A4_.js +0 -8
  588. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +0 -1
  589. ksadk/server/static/assets/channel-CF5Up3hQ.js +0 -1
  590. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +0 -1
  591. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +0 -1
  592. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +0 -1
  593. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +0 -1
  594. ksadk/server/static/assets/dist-B2_CVgKv.js +0 -1
  595. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +0 -1
  596. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +0 -1
  597. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +0 -1
  598. ksadk/server/static/assets/index-DcTML1Up.css +0 -2
  599. ksadk/server/static/assets/index-Dh2XHqPK.js +0 -244
  600. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +0 -1
  601. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +0 -1
  602. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +0 -1
  603. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +0 -1
  604. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +0 -1
  605. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +0 -1
  606. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +0 -1
  607. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +0 -1
  608. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +0 -1
  609. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +0 -8
  610. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +0 -1
  611. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +0 -1
  612. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +0 -1
  613. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +0 -41
  614. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +0 -8
  615. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +0 -44
  616. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +0 -3
  617. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +0 -1
  618. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +0 -1
  619. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +0 -36
  620. ksadk/studio/static/assets/channel-BqO-gtEw.js +0 -1
  621. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +0 -2
  622. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +0 -1
  623. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +0 -1
  624. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +0 -1
  625. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +0 -1
  626. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +0 -1
  627. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +0 -1
  628. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +0 -1
  629. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +0 -1
  630. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +0 -1
  631. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +0 -1
  632. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +0 -62
  633. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +0 -4
  634. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +0 -41
  635. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +0 -3
  636. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +0 -24
  637. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +0 -24
  638. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +0 -1
  639. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +0 -1
  640. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +0 -1
  641. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +0 -292
  642. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +0 -1
  643. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +0 -106
  644. ksadk/studio/static/assets/index-CeHL9ARV.css +0 -2
  645. ksadk/studio/static/assets/index-D9QEcVpL.js +0 -320
  646. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +0 -1
  647. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +0 -2
  648. ksadk/studio/static/assets/linear-BCxN9JLv.js +0 -1
  649. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +0 -7
  650. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +0 -1
  651. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +0 -1
  652. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +0 -1
  653. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +0 -1
  654. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +0 -1
  655. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +0 -1
  656. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +0 -1
  657. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +0 -1
  658. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +0 -1
  659. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +0 -40
  660. ksadk/studio/static/assets/src-SFn9St9H.js +0 -1
  661. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +0 -1
  662. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +0 -1
  663. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +0 -1
  664. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +0 -8
  665. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +0 -1
  666. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +0 -1
  667. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +0 -34
  668. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +0 -1
  669. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/WHEEL +0 -0
  670. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/entry_points.txt +0 -0
  671. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/licenses/LICENSE +0 -0
  672. {agentengine_sdk_python-0.8.4.dist-info → agentengine_sdk_python-0.8.5.dist-info}/top_level.txt +0 -0
  673. /ksadk/studio/static/assets/{MathMessageMarkdown-CBcDrAw--BEOyPC3w.css → MathMessageMarkdown-BesSeCYl-BEOyPC3w.css} +0 -0
ksadk/toolsets/skills.py CHANGED
@@ -1,378 +1,446 @@
1
- from __future__ import annotations
2
-
3
- import os
4
- import tempfile
5
- from pathlib import Path
6
- from typing import Any
7
-
8
- from ksadk.skills.loader import load_local_skill
9
- from ksadk.skills.package_store import PackageStore, SkillPackageError
10
- from ksadk.skills.runtime import loader as runtime_loader
11
- from ksadk.skills.runtime.base import SkillRuntimeError
12
- from ksadk.skills.runtime.factory import create_skill_runtime_backend
13
- from ksadk.skills.runtime.registry import match_skill_refs, select_public_skill_refs
14
- from ksadk.skills.service_client import SkillServiceClient
15
- from ksadk.skills.service_env import (
16
- public_skill_space_ids,
17
- resolve_skill_service_url,
18
- user_skill_space_ids,
19
- )
20
- from ksadk.skills.tool_defs import (
21
- _skill_manifest_item,
22
- load_remote_skill_manifests,
23
- resolve_skill_space_ids,
24
- )
25
- from ksadk.skills.tool_defs import (
26
- build_execute_skills_tool as build_runtime_execute_skills_tool,
27
- )
28
- from ksadk.tools.gateway import ToolPolicy, default_tool_gateway
29
- from ksadk.toolsets._langchain import as_tool
30
-
31
- _SKILL_TOOL_POLICIES = {
32
- "list_skill_spaces": ToolPolicy(risk_level="low"),
33
- "list_skills": ToolPolicy(risk_level="low"),
34
- "search_skills": ToolPolicy(risk_level="low"),
35
- "load_skill": ToolPolicy(risk_level="low", side_effects=("skill_cache_write",)),
36
- "execute_skills": ToolPolicy(risk_level="high", side_effects=("isolated_runtime_execution",)),
37
- }
38
-
39
-
40
- def _gateway():
41
- return default_tool_gateway(_SKILL_TOOL_POLICIES)
42
-
43
-
44
- def _dict_result(value: Any, *, tool_name: str) -> dict[str, Any]:
45
- if not isinstance(value, dict):
46
- raise TypeError(f"{tool_name} returned {type(value).__name__}, expected dict")
47
- return dict(value)
48
-
49
-
50
- def list_skill_spaces() -> dict[str, Any]:
51
- """List visible Skill Spaces with id/name/description, so the model can pick one by intent.
52
-
53
- 多 space 场景下,先调用本工具了解可选 space,再按用户意图用
54
- ``search_skills(query, space_id=...)`` 或 ``load_skill(name, space_id=...)`` 定向查找。
55
- """
56
-
57
- configured = resolve_skill_space_ids()
58
- try:
59
- client = _skill_service_client()
60
- payload = client.list_skill_spaces()
61
- spaces = _parse_skill_spaces(payload)
62
- configured_set = set(configured)
63
- for space in spaces:
64
- space["configured"] = space["space_id"] in configured_set
65
- if not spaces:
66
- # 服务不支持 ListSkillSpaces 时,退化为返回已配置的 space id。
67
- spaces = [
68
- {"space_id": sid, "space_name": "", "description": "", "configured": True}
69
- for sid in configured
70
- ]
71
- return {
72
- "ok": True,
73
- "configured_space_ids": configured,
74
- "spaces": spaces,
75
- "usage": (
76
- "根据用户意图从这些 space 中选一个 space_id,再用 "
77
- "search_skills(query, space_id=...) 在该 space 内搜索,或用 "
78
- "load_skill(skill_name, space_id=...) 精确加载该 space 下的 skill。"
79
- ),
80
- }
81
- except Exception as exc:
82
- return {
83
- "ok": False,
84
- "error_type": type(exc).__name__,
85
- "error_message": str(exc),
86
- "configured_space_ids": configured,
87
- "spaces": [
88
- {"space_id": sid, "space_name": "", "description": "", "configured": True}
89
- for sid in configured
90
- ],
91
- }
92
-
93
-
94
- def _parse_skill_spaces(payload: dict[str, Any]) -> list[dict[str, Any]]:
95
- data = payload.get("Data") or payload.get("data") or {}
96
- raw = (
97
- data.get("SkillSpaces")
98
- or data.get("skill_spaces")
99
- or data.get("Spaces")
100
- or data.get("spaces")
101
- or data.get("Items")
102
- or data.get("items")
103
- or []
104
- )
105
- spaces: list[dict[str, Any]] = []
106
- for item in raw:
107
- if not isinstance(item, dict):
108
- continue
109
- spaces.append(
110
- {
111
- "space_id": str(
112
- item.get("SkillSpaceId")
113
- or item.get("skill_space_id")
114
- or item.get("SpaceId")
115
- or item.get("space_id")
116
- or ""
117
- ),
118
- "space_name": str(
119
- item.get("SkillSpaceName")
120
- or item.get("skill_space_name")
121
- or item.get("SpaceName")
122
- or item.get("space_name")
123
- or ""
124
- ),
125
- "description": str(item.get("Description") or item.get("description") or ""),
126
- }
127
- )
128
- return spaces
129
-
130
-
131
- def list_skills(space_id: str | None = None) -> dict[str, Any]:
132
- """List skills discoverable from configured Skill Spaces, optionally limited to one space.
133
-
134
- ``space_id`` 指定时只列该 space(user space id 或 ``"public"``);缺省列出全部已配置 space。
135
- """
136
-
137
- space_ids = [space_id] if space_id else resolve_skill_space_ids()
138
- try:
139
- if space_id:
140
- client = _skill_service_client()
141
- manifests = [
142
- _skill_manifest_item(skill, space_id=sid)
143
- for sid, skill in _iter_remote_skills(client, space_id=space_id)
144
- if skill.name
145
- ]
146
- else:
147
- manifests = load_remote_skill_manifests(space_ids)
148
- return {
149
- "ok": True,
150
- "skills": manifests,
151
- "skill_space_ids": space_ids,
152
- "space_id": space_id,
153
- }
154
- except Exception as exc:
155
- return {
156
- "ok": False,
157
- "error_type": type(exc).__name__,
158
- "error_message": str(exc),
159
- "skill_space_ids": space_ids,
160
- "space_id": space_id,
161
- }
162
-
163
-
164
- def load_skill(skill_name: str, space_id: str | None = None) -> dict[str, Any]:
165
- """Download and load a skill's SKILL.md instructions from configured Skill Spaces.
166
-
167
- ``space_id`` 指定时只在该 space 内按名匹配,用于多 space 下精确定位、避免同名冲突;
168
- 缺省按配置顺序(user space 优先于 public)取第一个匹配。
169
- """
170
-
171
- target = str(skill_name or "").strip().lower()
172
- if not target:
173
- return {"ok": False, "error_message": "skill_name is required"}
174
- try:
175
- client = _skill_service_client()
176
- available: list[str] = []
177
- for sid, skill in _iter_remote_skills(client, space_id=space_id):
178
- if not skill.name:
179
- continue
180
- available.append(skill.name)
181
- if skill.name.strip().lower() != target:
182
- continue
183
- package = _get_or_download_package(client, skill)
184
- local_skill = load_local_skill(package.root_dir)
185
- return {
186
- "ok": True,
187
- "execution_context": "outer_agent",
188
- "name": local_skill.name,
189
- "description": local_skill.description,
190
- "space_id": sid,
191
- "skill_id": skill.skill_id,
192
- "version_id": skill.version_id,
193
- "version": skill.version,
194
- "cache_hit": bool(getattr(package, "cache_hit", False)),
195
- "root_dir": str(local_skill.root_dir),
196
- "has_scripts_dir": (local_skill.root_dir / "scripts").is_dir(),
197
- "script_files": _script_files(local_skill.root_dir),
198
- "instructions": local_skill.body,
199
- "usage": (
200
- "Read these instructions and complete the user's task in the outer "
201
- "agent unless the skill explicitly requires isolated execution."
202
- ),
203
- }
204
- return {
205
- "ok": False,
206
- "error_message": f"Skill not found: {skill_name}",
207
- "space_id": space_id,
208
- "available_skills": available,
209
- }
210
- except Exception as exc:
211
- return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
212
-
213
-
214
- def search_skills(query: str, max_results: int = 10, space_id: str | None = None) -> dict[str, Any]:
215
- """Search skills by name, aliases, tags, description, and examples.
216
-
217
- ``space_id`` 指定时只在该 space 内搜索;缺省聚合全部已配置 space。结果带 ``space_id``,
218
- 便于后续 ``load_skill(name, space_id=...)`` 精确定位。
219
- """
220
-
221
- query_text = str(query or "").strip()
222
- if not query_text:
223
- return {"ok": False, "error_message": "query is required"}
224
- try:
225
- client = _skill_service_client()
226
- pairs = list(_iter_remote_skills(client, space_id=space_id))
227
- # 建立 skill 标识 -> space_id 映射,给结果回填来源 space(cache_key 与 match 去重一致)。
228
- space_of: dict[str, str] = {}
229
- for sid, skill in pairs:
230
- space_of.setdefault(skill.cache_key or skill.skill_id or skill.name, sid)
231
- refs = [skill for _, skill in pairs]
232
- matches = match_skill_refs(refs, query_text, limit=max_results)
233
- results = []
234
- for match in matches:
235
- item = match.to_dict()
236
- item["space_id"] = space_of.get(
237
- match.skill.cache_key or match.skill.skill_id or match.skill.name, ""
238
- )
239
- results.append(item)
240
- return {
241
- "ok": True,
242
- "query": query,
243
- "space_id": space_id,
244
- "results": results,
245
- }
246
- except Exception as exc:
247
- return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
248
-
249
-
250
- def execute_skills(
251
- workflow_prompt: str,
252
- skill_names: list[str] | str | None = None,
253
- approval: dict[str, Any] | None = None,
254
- ) -> dict[str, Any]:
255
- """Execute a workflow through the configured Skill Runtime."""
256
-
257
- return _dict_result(
258
- _gateway().invoke(
259
- "execute_skills",
260
- _execute_skills_impl,
261
- workflow_prompt,
262
- skill_names,
263
- approval=approval,
264
- ),
265
- tool_name="execute_skills",
266
- )
267
-
268
-
269
- def _execute_skills_impl(
270
- workflow_prompt: str, skill_names: list[str] | str | None = None
271
- ) -> dict[str, Any]:
272
- try:
273
- backend = create_skill_runtime_backend()
274
- raw_tool = build_runtime_execute_skills_tool(backend=backend)
275
- result = raw_tool(workflow_prompt, skill_names)
276
- if not isinstance(result, dict):
277
- return {
278
- "ok": False,
279
- "error_type": "invalid_skill_runtime_result",
280
- "error_message": (f"skill runtime returned {type(result).__name__}, expected dict"),
281
- }
282
- result.setdefault("execution_context", f"skill-runtime/{_skill_execution_backend()}")
283
- return dict(result)
284
- except SkillRuntimeError as exc:
285
- return {
286
- "ok": False,
287
- "error_type": "skill_runtime_disabled",
288
- "error_message": str(exc),
289
- "hint": (
290
- "Configure KSADK_SKILL_RUNTIME_BACKEND=local_process/e2b or "
291
- "KSADK_SANDBOX_TEMPLATE_ID for isolated Skill workflow execution."
292
- ),
293
- }
294
- except Exception as exc:
295
- return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
296
-
297
-
298
- def get_skill_tools() -> list:
299
- return [
300
- as_tool(list_skills),
301
- as_tool(list_skill_spaces),
302
- as_tool(search_skills),
303
- as_tool(load_skill),
304
- as_tool(execute_skills),
305
- ]
306
-
307
-
308
- def _skill_execution_backend() -> str:
309
- explicit = os.environ.get("KSADK_SKILL_RUNTIME_BACKEND", "").strip().lower()
310
- if explicit:
311
- return explicit
312
- if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get(
313
- "KSADK_SKILL_RUNTIME_TEMPLATE_ID"
314
- ):
315
- return "e2b"
316
- return "disabled"
317
-
318
-
319
- def _skill_service_client() -> SkillServiceClient:
320
- service_url = resolve_skill_service_url(require_spaces=True)
321
- if not service_url:
322
- raise ValueError("Skill Service URL is not configured")
323
- return SkillServiceClient(
324
- base_url=service_url,
325
- token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
326
- timeout=float(os.environ.get("KSADK_SKILL_MANIFEST_TIMEOUT", "10")),
327
- )
328
-
329
-
330
- def _iter_space_skills(client: SkillServiceClient, space_id: str):
331
- """遍历单个 space 的 active skill;space_id="public" 走 premade 列表。"""
332
-
333
- if space_id == "public":
334
- listing = client.list_available_premade_skills()
335
- for skill in select_public_skill_refs(listing.active_skills()):
336
- yield listing.space_id or "public", skill
337
- else:
338
- listing = client.list_skills_by_space_id(space_id)
339
- for skill in listing.active_skills():
340
- yield space_id, skill
341
-
342
-
343
- def _iter_remote_skills(client: SkillServiceClient, space_id: str | None = None):
344
- """遍历配置的 space;space_id 指定时只遍历该 space(user 或 "public")。"""
345
-
346
- if space_id:
347
- yield from _iter_space_skills(client, space_id)
348
- return
349
- for user_space_id in user_skill_space_ids():
350
- yield from _iter_space_skills(client, user_space_id)
351
- if public_skill_space_ids():
352
- yield from _iter_space_skills(client, "public")
353
-
354
-
355
- def _get_or_download_package(client: SkillServiceClient, skill):
356
- cache_dir = Path(
357
- os.environ.get("KSADK_SKILL_CACHE_DIR") or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
358
- )
359
- store = PackageStore(cache_dir=cache_dir)
360
- package = store.get_cached(skill)
361
- if package is not None:
362
- return package
363
- archive = client.download_skill_archive(skill)
364
- try:
365
- return store.store_archive(skill, archive)
366
- except SkillPackageError:
367
- if not runtime_loader._allow_hash_mismatch():
368
- raise
369
- return runtime_loader._store_unverified_archive(store, skill, archive)
370
-
371
-
372
- def _script_files(root_dir: Path) -> list[str]:
373
- scripts_dir = root_dir / "scripts"
374
- if not scripts_dir.is_dir():
375
- return []
376
- return [
377
- str(path.relative_to(root_dir)) for path in sorted(scripts_dir.rglob("*")) if path.is_file()
378
- ][:20]
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import os
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ from ksadk.skills.runtime.base import SkillRuntimeError, normalize_skill_names
9
+ from ksadk.skills.runtime.factory import create_skill_runtime_backend
10
+ from ksadk.skills.runtime.registry import match_skill_refs, select_public_skill_refs
11
+ from ksadk.skills.service_client import SkillServiceClient
12
+ from ksadk.skills.service_env import (
13
+ public_skill_space_ids,
14
+ resolve_skill_service_url,
15
+ user_skill_space_ids,
16
+ )
17
+ from ksadk.skills.tool_defs import (
18
+ _skill_manifest_item,
19
+ load_remote_skill_manifests,
20
+ resolve_skill_space_ids,
21
+ )
22
+ from ksadk.skills.tool_defs import (
23
+ build_execute_skills_tool as build_runtime_execute_skills_tool,
24
+ )
25
+ from ksadk.skills.loader import load_local_skill
26
+ from ksadk.skills.package_store import PackageStore, SkillPackageError
27
+ from ksadk.skills.runtime import loader as runtime_loader
28
+ from ksadk.tools.gateway import ToolPolicy, default_tool_gateway
29
+ import tempfile
30
+ from ksadk.toolsets._langchain import as_tool
31
+
32
+ _log = logging.getLogger("ksadk.skills.execute_skills")
33
+
34
+ _SKILL_TOOL_POLICIES = {
35
+ "list_skill_spaces": ToolPolicy(risk_level="low"),
36
+ "list_skills": ToolPolicy(risk_level="low"),
37
+ "search_skills": ToolPolicy(risk_level="low"),
38
+ "load_skill": ToolPolicy(risk_level="low"),
39
+ "execute_skills": ToolPolicy(risk_level="high", side_effects=("isolated_runtime_execution",)),
40
+ }
41
+
42
+
43
+ def _gateway():
44
+ return default_tool_gateway(_SKILL_TOOL_POLICIES)
45
+
46
+
47
+ def _dict_result(value: Any, *, tool_name: str) -> dict[str, Any]:
48
+ if not isinstance(value, dict):
49
+ raise TypeError(f"{tool_name} returned {type(value).__name__}, expected dict")
50
+ return dict(value)
51
+
52
+
53
+ def list_skill_spaces() -> dict[str, Any]:
54
+ """List visible Skill Spaces with id/name/description, so the model can pick one by intent.
55
+
56
+ 多 space 场景下,先调用本工具了解可选 space,再按用户意图用
57
+ ``list_skills(query, space_id=...)`` 定向查找,或 ``execute_skills`` 执行.
58
+ """
59
+
60
+ configured = resolve_skill_space_ids()
61
+ try:
62
+ client = _skill_service_client()
63
+ payload = client.list_skill_spaces()
64
+ spaces = _parse_skill_spaces(payload)
65
+ configured_set = set(configured)
66
+ for space in spaces:
67
+ space["configured"] = space["space_id"] in configured_set
68
+ if not spaces:
69
+ # 服务不支持 ListSkillSpaces 时,退化为返回已配置的 space id。
70
+ spaces = [
71
+ {"space_id": sid, "space_name": "", "description": "", "configured": True}
72
+ for sid in configured
73
+ ]
74
+ return {
75
+ "ok": True,
76
+ "configured_space_ids": configured,
77
+ "spaces": spaces,
78
+ "usage": (
79
+ "根据用户意图从这些 space 中选一个 space_id,再用 "
80
+ "search_skills(query, space_id=...) 在该 space 内搜索,或用 "
81
+ "load_skill(skill_name, space_id=...) 精确加载该 space 下的 skill。"
82
+ ),
83
+ }
84
+ except Exception as exc:
85
+ return {
86
+ "ok": False,
87
+ "error_type": type(exc).__name__,
88
+ "error_message": str(exc),
89
+ "configured_space_ids": configured,
90
+ "spaces": [
91
+ {"space_id": sid, "space_name": "", "description": "", "configured": True}
92
+ for sid in configured
93
+ ],
94
+ }
95
+
96
+
97
+ def _parse_skill_spaces(payload: dict[str, Any]) -> list[dict[str, Any]]:
98
+ data = payload.get("Data") or payload.get("data") or {}
99
+ raw = (
100
+ data.get("SkillSpaces")
101
+ or data.get("skill_spaces")
102
+ or data.get("Spaces")
103
+ or data.get("spaces")
104
+ or data.get("Items")
105
+ or data.get("items")
106
+ or []
107
+ )
108
+ spaces: list[dict[str, Any]] = []
109
+ for item in raw:
110
+ if not isinstance(item, dict):
111
+ continue
112
+ spaces.append(
113
+ {
114
+ "space_id": str(
115
+ item.get("SkillSpaceId")
116
+ or item.get("skill_space_id")
117
+ or item.get("SpaceId")
118
+ or item.get("space_id")
119
+ or ""
120
+ ),
121
+ "space_name": str(
122
+ item.get("SkillSpaceName")
123
+ or item.get("skill_space_name")
124
+ or item.get("SpaceName")
125
+ or item.get("space_name")
126
+ or ""
127
+ ),
128
+ "description": str(item.get("Description") or item.get("description") or ""),
129
+ }
130
+ )
131
+ return spaces
132
+
133
+
134
+ def list_skills(space_id: str | None = None) -> dict[str, Any]:
135
+ """List skills discoverable from configured Skill Spaces, optionally limited to one space.
136
+
137
+ ``space_id`` 指定时只列该 space(user space id 或 ``"public"``);缺省列出全部已配置 space。
138
+ """
139
+
140
+ space_ids = [space_id] if space_id else resolve_skill_space_ids()
141
+ try:
142
+ if space_id:
143
+ client = _skill_service_client()
144
+ manifests = [
145
+ _skill_manifest_item(skill, space_id=sid)
146
+ for sid, skill in _iter_remote_skills(client, space_id=space_id)
147
+ if skill.name
148
+ ]
149
+ else:
150
+ manifests = load_remote_skill_manifests(space_ids)
151
+ return {
152
+ "ok": True,
153
+ "skills": manifests,
154
+ "skill_space_ids": space_ids,
155
+ "space_id": space_id,
156
+ }
157
+ except Exception as exc:
158
+ return {
159
+ "ok": False,
160
+ "error_type": type(exc).__name__,
161
+ "error_message": str(exc),
162
+ "skill_space_ids": space_ids,
163
+ "space_id": space_id,
164
+ }
165
+
166
+
167
+ def load_skill(skill_name: str, space_id: str | None = None) -> dict[str, Any]:
168
+ """Download and load a skill\'s SKILL.md instructions from configured Skill Spaces.
169
+
170
+ ``space_id`` 指定时只在该 space 内按名匹配,用于多 space 下精确定位、避免同名冲突;
171
+ 缺省按配置顺序(user space 优先于 public)取第一个匹配。
172
+ """
173
+
174
+ target = str(skill_name or "").strip().lower()
175
+ if not target:
176
+ return {"ok": False, "error_message": "skill_name is required"}
177
+ try:
178
+ client = _skill_service_client()
179
+ available: list[str] = []
180
+ for sid, skill in _iter_remote_skills(client, space_id=space_id):
181
+ if not skill.name:
182
+ continue
183
+ available.append(skill.name)
184
+ if skill.name.strip().lower() != target:
185
+ continue
186
+ package = _get_or_download_package(client, skill)
187
+ local_skill = load_local_skill(package.root_dir)
188
+ return {
189
+ "ok": True,
190
+ "execution_context": "outer_agent",
191
+ "name": local_skill.name,
192
+ "description": local_skill.description,
193
+ "space_id": sid,
194
+ "skill_id": skill.skill_id,
195
+ "version_id": skill.version_id,
196
+ "version": skill.version,
197
+ "cache_hit": bool(getattr(package, "cache_hit", False)),
198
+ "root_dir": str(local_skill.root_dir),
199
+ "has_scripts_dir": (local_skill.root_dir / "scripts").is_dir(),
200
+ "script_files": _script_files(local_skill.root_dir),
201
+ "instructions": local_skill.body,
202
+ "usage": (
203
+ "Read these instructions and complete the user\'s task in the outer "
204
+ "agent unless the skill explicitly requires isolated execution."
205
+ ),
206
+ }
207
+ return {
208
+ "ok": False,
209
+ "error_message": f"Skill not found: {skill_name}",
210
+ "space_id": space_id,
211
+ "available_skills": available,
212
+ }
213
+ except Exception as exc:
214
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
215
+
216
+
217
+ def preview_skill(skill_name: str, space_id: str | None = None) -> dict[str, Any]:
218
+ """Return manifest-level info for a skill without downloading the package.
219
+
220
+ Lightweight preview that does not download or unpack the skill package.
221
+ Use ``load_skill`` for the full SKILL.md instructions and scripts directory.
222
+ """
223
+
224
+ target = str(skill_name or "").strip().lower()
225
+ if not target:
226
+ return {"ok": False, "error_message": "skill_name is required"}
227
+ try:
228
+ client = _skill_service_client()
229
+ available: list[str] = []
230
+ for sid, skill in _iter_remote_skills(client, space_id=space_id):
231
+ if not skill.name:
232
+ continue
233
+ available.append(skill.name)
234
+ if skill.name.strip().lower() != target:
235
+ continue
236
+ return {
237
+ "ok": True,
238
+ "execution_context": "manifest_preview",
239
+ "name": skill.name,
240
+ "description": skill.description,
241
+ "space_id": sid,
242
+ "skill_id": skill.skill_id,
243
+ "version_id": skill.version_id,
244
+ "version": skill.version,
245
+ "cache_hit": False,
246
+ "has_scripts_dir": False,
247
+ "script_files": [],
248
+ "instructions": skill.description or "",
249
+ "usage": (
250
+ "Manifest-level preview. To execute, call execute_skills "
251
+ "with the workflow_prompt and skill_names. For full SKILL.md "
252
+ "instructions, use load_skill instead."
253
+ ),
254
+ }
255
+ return {
256
+ "ok": False,
257
+ "error_message": f"Skill not found: {skill_name}",
258
+ "space_id": space_id,
259
+ "available_skills": available,
260
+ }
261
+ except Exception as exc:
262
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
263
+
264
+
265
+ def _get_or_download_package(client: SkillServiceClient, skill):
266
+ cache_dir = Path(
267
+ os.environ.get("KSADK_SKILL_CACHE_DIR") or Path(tempfile.gettempdir()) / "ksadk-skill-cache"
268
+ )
269
+ store = PackageStore(cache_dir=cache_dir)
270
+ package = store.get_cached(skill)
271
+ if package is not None:
272
+ return package
273
+ archive = client.download_skill_archive(skill)
274
+ try:
275
+ return store.store_archive(skill, archive)
276
+ except SkillPackageError:
277
+ if not runtime_loader._allow_hash_mismatch():
278
+ raise
279
+ return runtime_loader._store_unverified_archive(store, skill, archive)
280
+
281
+
282
+ def _script_files(root_dir: Path) -> list[str]:
283
+ scripts_dir = root_dir / "scripts"
284
+ if not scripts_dir.is_dir():
285
+ return []
286
+ return [
287
+ str(path.relative_to(root_dir)) for path in sorted(scripts_dir.rglob("*")) if path.is_file()
288
+ ][:20]
289
+
290
+
291
+ def search_skills(query: str, max_results: int = 10, space_id: str | None = None) -> dict[str, Any]:
292
+ """Search skills by name, aliases, tags, description, and examples.
293
+
294
+ ``space_id`` 指定时只在该 space 内搜索;缺省聚合全部已配置 space。结果带 ``space_id``,
295
+ 便于后续 ``execute_skills(skill_names=[name])`` 精确执行.
296
+ """
297
+
298
+ query_text = str(query or "").strip()
299
+ if not query_text:
300
+ return {"ok": False, "error_message": "query is required"}
301
+ try:
302
+ client = _skill_service_client()
303
+ pairs = list(_iter_remote_skills(client, space_id=space_id))
304
+ # 建立 skill 标识 -> space_id 映射,给结果回填来源 space(cache_key 与 match 去重一致)。
305
+ space_of: dict[str, str] = {}
306
+ for sid, skill in pairs:
307
+ space_of.setdefault(skill.cache_key or skill.skill_id or skill.name, sid)
308
+ refs = [skill for _, skill in pairs]
309
+ matches = match_skill_refs(refs, query_text, limit=max_results)
310
+ results = []
311
+ for match in matches:
312
+ item = match.to_dict()
313
+ item["space_id"] = space_of.get(
314
+ match.skill.cache_key or match.skill.skill_id or match.skill.name, ""
315
+ )
316
+ results.append(item)
317
+ return {
318
+ "ok": True,
319
+ "query": query,
320
+ "space_id": space_id,
321
+ "results": results,
322
+ }
323
+ except Exception as exc:
324
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
325
+
326
+
327
+ def execute_skills(
328
+ workflow_prompt: str,
329
+ skill_names: list[str] | str | None = None,
330
+ approval: dict[str, Any] | None = None,
331
+ ) -> dict[str, Any]:
332
+ """Execute a workflow through the configured Skill Runtime."""
333
+
334
+ return _dict_result(
335
+ _gateway().invoke(
336
+ "execute_skills",
337
+ _execute_skills_impl,
338
+ workflow_prompt,
339
+ skill_names,
340
+ approval=approval,
341
+ ),
342
+ tool_name="execute_skills",
343
+ )
344
+
345
+
346
+ def _execute_skills_impl(
347
+ workflow_prompt: str, skill_names: list[str] | str | None = None
348
+ ) -> dict[str, Any]:
349
+ normalized_names = normalize_skill_names(skill_names) if skill_names else []
350
+ _log.info(
351
+ "execute_skills invoked: skill_names=%s workflow_prompt_len=%d",
352
+ normalized_names,
353
+ len(workflow_prompt),
354
+ )
355
+ try:
356
+ backend = create_skill_runtime_backend()
357
+ raw_tool = build_runtime_execute_skills_tool(backend=backend)
358
+ result = raw_tool(workflow_prompt, skill_names)
359
+ if not isinstance(result, dict):
360
+ _log.warning("execute_skills: invalid result type %s", type(result).__name__)
361
+ return {
362
+ "ok": False,
363
+ "error_type": "invalid_skill_runtime_result",
364
+ "error_message": (f"skill runtime returned {type(result).__name__}, expected dict"),
365
+ }
366
+ result.setdefault("execution_context", f"skill-runtime/{_skill_execution_backend()}")
367
+ _log.info(
368
+ "execute_skills completed: exit_code=%s duration_ms=%s workflow_status=%s executed_skill=%s",
369
+ result.get("exit_code"),
370
+ result.get("duration_ms"),
371
+ result.get("workflow_status", ""),
372
+ result.get("executed_skill", ""),
373
+ )
374
+ return dict(result)
375
+ except SkillRuntimeError as exc:
376
+ _log.error("execute_skills: SkillRuntimeError: %s", exc)
377
+ return {
378
+ "ok": False,
379
+ "error_type": "skill_runtime_disabled",
380
+ "error_message": str(exc),
381
+ "hint": (
382
+ "Configure KSADK_SKILL_RUNTIME_BACKEND=local_process/e2b or "
383
+ "KSADK_SANDBOX_TEMPLATE_ID for isolated Skill workflow execution."
384
+ ),
385
+ }
386
+ except Exception as exc:
387
+ _log.error("execute_skills: %s: %s", type(exc).__name__, exc)
388
+ return {"ok": False, "error_type": type(exc).__name__, "error_message": str(exc)}
389
+
390
+
391
+ def get_skill_tools() -> list:
392
+ return [
393
+ as_tool(list_skills),
394
+ as_tool(list_skill_spaces),
395
+ as_tool(search_skills),
396
+ as_tool(load_skill),
397
+ as_tool(preview_skill),
398
+ as_tool(execute_skills),
399
+ ]
400
+
401
+
402
+ def _skill_execution_backend() -> str:
403
+ explicit = os.environ.get("KSADK_SKILL_RUNTIME_BACKEND", "").strip().lower()
404
+ if explicit:
405
+ return explicit
406
+ if os.environ.get("KSADK_SANDBOX_TEMPLATE_ID") or os.environ.get(
407
+ "KSADK_SKILL_RUNTIME_TEMPLATE_ID"
408
+ ):
409
+ return "e2b"
410
+ return "disabled"
411
+
412
+
413
+ def _skill_service_client() -> SkillServiceClient:
414
+ service_url = resolve_skill_service_url(require_spaces=True)
415
+ if not service_url:
416
+ raise ValueError("Skill Service URL is not configured")
417
+ return SkillServiceClient(
418
+ base_url=service_url,
419
+ token=os.environ.get("KSADK_SKILL_SERVICE_TOKEN", ""),
420
+ timeout=float(os.environ.get("KSADK_SKILL_MANIFEST_TIMEOUT", "10")),
421
+ )
422
+
423
+
424
+ def _iter_space_skills(client: SkillServiceClient, space_id: str):
425
+ """遍历单个 space 的 active skill;space_id="public" 走 premade 列表。"""
426
+
427
+ if space_id == "public":
428
+ listing = client.list_available_premade_skills()
429
+ for skill in select_public_skill_refs(listing.active_skills()):
430
+ yield listing.space_id or "public", skill
431
+ else:
432
+ listing = client.list_skills_by_space_id(space_id)
433
+ for skill in listing.active_skills():
434
+ yield space_id, skill
435
+
436
+
437
+ def _iter_remote_skills(client: SkillServiceClient, space_id: str | None = None):
438
+ """遍历配置的 space;space_id 指定时只遍历该 space(user 或 "public")。"""
439
+
440
+ if space_id:
441
+ yield from _iter_space_skills(client, space_id)
442
+ return
443
+ for user_space_id in user_skill_space_ids():
444
+ yield from _iter_space_skills(client, user_space_id)
445
+ if public_skill_space_ids():
446
+ yield from _iter_space_skills(client, "public")