agentengine-sdk-python 0.8.3__py3-none-any.whl → 0.8.4__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 (509) hide show
  1. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +9 -8
  2. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/RECORD +482 -245
  3. ksadk/_build_provenance.json +1 -1
  4. ksadk/api/client.py +105 -91
  5. ksadk/builders/code_builder.py +36 -9
  6. ksadk/builders/framework_requirements.py +2 -1
  7. ksadk/builders/ks3_uploader.py +36 -7
  8. ksadk/builders/managed_runtime_builder.py +1 -0
  9. ksadk/cli/__init__.py +32 -3
  10. ksadk/cli/cmd_managed_runtime.py +13 -1
  11. ksadk/cli/cmd_plugin.py +6 -1
  12. ksadk/cli/cmd_web.py +2 -5
  13. ksadk/cli/runtime_bootstrap.py +23 -1
  14. ksadk/codex/client.py +424 -96
  15. ksadk/codex/projection.py +24 -0
  16. ksadk/codex/runtime.py +56 -298
  17. ksadk/common/auth.py +16 -10
  18. ksadk/configs/env_registry.py +29 -1
  19. ksadk/conversations/message_projection.py +135 -14
  20. ksadk/conversations/projector.py +4 -6
  21. ksadk/conversations/runtime_invocation.py +5 -0
  22. ksadk/conversations/runtime_payloads.py +1 -0
  23. ksadk/conversations/runtime_preparation.py +30 -27
  24. ksadk/conversations/runtime_resume.py +50 -2
  25. ksadk/conversations/runtime_stream_events.py +5 -0
  26. ksadk/conversations/runtime_streaming.py +25 -7
  27. ksadk/deployment/env_forward.py +2 -2
  28. ksadk/deployment/providers/serverless.py +1 -1
  29. ksadk/events/adapters/_codex_validators.py +18 -7
  30. ksadk/events/adapters/langgraph.py +15 -1
  31. ksadk/events/canonical_store.py +3 -1
  32. ksadk/events/projections.py +1 -1
  33. ksadk/harness/config.py +2 -2
  34. ksadk/harness/runtime.py +27 -27
  35. ksadk/harness/tools.py +38 -13
  36. ksadk/interaction/provider.py +1 -0
  37. ksadk/interaction/providers/langgraph.py +1 -0
  38. ksadk/kernel/bootstrap.py +28 -4
  39. ksadk/kernel/ingress.py +15 -2
  40. ksadk/kernel/sqlite_store.py +27 -0
  41. ksadk/kernel/store.py +3 -0
  42. ksadk/kernel/worker.py +65 -10
  43. ksadk/knowledge_base/client.py +57 -27
  44. ksadk/mcp_runtime/__init__.py +12 -4
  45. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  46. ksadk/memory/adk/resilient_session_service.py +25 -17
  47. ksadk/memory/adk/short_term_memory.py +26 -9
  48. ksadk/memory/models.py +7 -4
  49. ksadk/memory/provider_resolver.py +3 -0
  50. ksadk/model_proxy/server.py +10 -5
  51. ksadk/plugins/__init__.py +4 -0
  52. ksadk/plugins/artifacts.py +275 -0
  53. ksadk/plugins/bridges/__init__.py +4 -2
  54. ksadk/plugins/bridges/codex.py +120 -13
  55. ksadk/plugins/bridges/dsh.py +340 -156
  56. ksadk/plugins/builtins.py +35 -36
  57. ksadk/plugins/bundle_security.py +28 -4
  58. ksadk/plugins/codex_manifest.py +983 -0
  59. ksadk/plugins/composition.py +8 -0
  60. ksadk/plugins/contracts.py +118 -0
  61. ksadk/plugins/delivery.py +153 -0
  62. ksadk/plugins/dsh_installation_digest.py +71 -0
  63. ksadk/plugins/dsh_toolchain.py +110 -21
  64. ksadk/plugins/ecosystem_probe.py +6 -6
  65. ksadk/plugins/host.py +102 -39
  66. ksadk/plugins/kernel_adapter.py +205 -0
  67. ksadk/plugins/providers/__init__.py +23 -0
  68. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  69. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  70. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  71. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  72. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  73. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  74. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  75. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  76. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  77. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  78. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  79. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  80. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  81. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  82. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  83. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  84. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  85. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  86. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  87. ksadk/plugins/providers/codex.py +335 -69
  88. ksadk/plugins/providers/codex_native.py +368 -0
  89. ksadk/plugins/providers/codex_turn.py +301 -0
  90. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  91. ksadk/plugins/providers/dsh_mcp.py +467 -0
  92. ksadk/plugins/providers/harness.py +118 -113
  93. ksadk/plugins/providers/mcp_projection.py +150 -0
  94. ksadk/plugins/providers/platform_resources.py +657 -0
  95. ksadk/plugins/resolver.py +8 -1
  96. ksadk/resource_runtime/__init__.py +4 -0
  97. ksadk/resource_runtime/broker.py +616 -0
  98. ksadk/resource_runtime/build_artifacts.py +165 -0
  99. ksadk/resource_runtime/contracts.py +138 -0
  100. ksadk/resource_runtime/discovery_receipts.py +100 -0
  101. ksadk/resource_runtime/discovery_skills.py +172 -0
  102. ksadk/resource_runtime/errors.py +6 -0
  103. ksadk/resource_runtime/ipc.py +142 -0
  104. ksadk/resource_runtime/kernel_approval.py +165 -0
  105. ksadk/resource_runtime/knowledge.py +114 -0
  106. ksadk/resource_runtime/langgraph.py +94 -0
  107. ksadk/resource_runtime/leases.py +191 -0
  108. ksadk/resource_runtime/managed_projection.py +186 -0
  109. ksadk/resource_runtime/mcp_server.py +138 -0
  110. ksadk/resource_runtime/memory_provider.py +318 -0
  111. ksadk/resource_runtime/memory_receipts.py +34 -0
  112. ksadk/resource_runtime/operation_ledger.py +211 -0
  113. ksadk/resource_runtime/plugin_config.py +48 -0
  114. ksadk/resource_runtime/policy_authorization.py +54 -0
  115. ksadk/resource_runtime/process.py +110 -0
  116. ksadk/resource_runtime/skill_artifacts.py +153 -0
  117. ksadk/resource_runtime/skill_runtime.py +42 -0
  118. ksadk/resource_runtime/skill_workspace.py +118 -0
  119. ksadk/resource_runtime/skills.py +215 -0
  120. ksadk/resource_runtime/snapshots.py +180 -0
  121. ksadk/resource_runtime/socket_server.py +103 -0
  122. ksadk/resource_runtime/supervisor.py +380 -0
  123. ksadk/resource_runtime/worker.py +504 -0
  124. ksadk/runners/_langgraph_runner_streams.py +74 -6
  125. ksadk/runners/adk_runner.py +149 -11
  126. ksadk/runners/base_runner.py +29 -1
  127. ksadk/runners/langgraph_runner.py +475 -145
  128. ksadk/runtime/_runner_adapter/stream_mapping.py +142 -18
  129. ksadk/runtime/adapter.py +2 -0
  130. ksadk/runtime/conversation_execution.py +92 -16
  131. ksadk/runtime/executor.py +78 -2
  132. ksadk/runtime/factory.py +29 -273
  133. ksadk/runtime/framework_adapters.py +23 -0
  134. ksadk/runtime/preprocessing.py +10 -2
  135. ksadk/runtime/runner_adapter.py +73 -14
  136. ksadk/runtime_context.py +40 -2
  137. ksadk/sandbox/backends/e2b.py +52 -11
  138. ksadk/sandbox/backends/local_process.py +9 -0
  139. ksadk/sandbox/base.py +2 -0
  140. ksadk/sandbox/e2b_connection.py +66 -0
  141. ksadk/scheduler/sqlite_store.py +18 -0
  142. ksadk/server/composition.py +2 -0
  143. ksadk/server/factory.py +5 -0
  144. ksadk/server/persistence_capability.py +516 -0
  145. ksadk/server/routes/control.py +210 -46
  146. ksadk/server/routes/dependencies.py +15 -0
  147. ksadk/server/routes/models.py +47 -4
  148. ksadk/server/routes/projection.py +252 -12
  149. ksadk/server/routes/sessions.py +284 -107
  150. ksadk/server/routes/streaming.py +43 -9
  151. ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  152. ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-b4C7upmO.js} +3 -3
  153. ksadk/server/static/assets/{MathMessageMarkdown-D9uB55Oh.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  154. ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  155. ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  156. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  157. ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-bTohInsS.js} +1 -1
  158. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  159. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  160. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  161. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  162. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  163. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  164. ksadk/server/static/assets/{chunk-5VM5RSS4-bZ7ws-8m.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  165. ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  166. ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  167. ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  168. ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  169. ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  170. ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  171. ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  172. ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  173. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  174. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  175. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-CkonRdAS.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  176. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  177. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  178. ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  179. ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-UBpgon5q.js} +1 -1
  180. ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  181. ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  182. ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  183. ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  184. ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  185. ksadk/server/static/assets/{dist-DdRBIceA.js → dist-B2_CVgKv.js} +1 -1
  186. ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-B3FR1SKK.js} +1 -1
  187. ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-BIr4DSRq.js} +1 -1
  188. ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-BgV_owcB.js} +1 -1
  189. ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-Bj730Ib4.js} +1 -1
  190. ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-BnaTiyzN.js} +1 -1
  191. ksadk/server/static/assets/{dist-C71CsujO.js → dist-C1NMAY5a.js} +1 -1
  192. ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-C5_ZAZsG.js} +1 -1
  193. ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-CB9iJrvg.js} +1 -1
  194. ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CFzsn6BG.js} +1 -1
  195. ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-Cf125P_m.js} +1 -1
  196. ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-ClYUxfeK.js} +1 -1
  197. ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-DFD6Qa6T.js} +1 -1
  198. ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DVCOWtha.js} +1 -1
  199. ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-D_ctSS2i.js} +1 -1
  200. ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-DiixqL0J.js} +1 -1
  201. ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-DoVSwoDb.js} +1 -1
  202. ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-DvFK7p5S.js} +1 -1
  203. ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-QfkEHOlb.js} +1 -1
  204. ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-btbmmX5O.js} +1 -1
  205. ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-fBO2v5Kt.js} +1 -1
  206. ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-ufY3F5p6.js} +1 -1
  207. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  208. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  209. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  210. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  211. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  212. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  213. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  214. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  215. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  216. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  217. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CgoyWiDR.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  218. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  219. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  220. ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  221. ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-B4weu383.js} +1 -1
  222. ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-V-MgYHW1.js} +1 -1
  223. ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  224. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  225. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  226. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-BQVc9ia_.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  227. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  228. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  229. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  230. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  231. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  232. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  233. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  234. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  235. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  236. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  237. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  238. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  239. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  240. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  241. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  242. ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  243. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  244. ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  245. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  246. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  247. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-EnNl0DE7.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  248. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  249. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  250. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  251. ksadk/server/static/index.html +2 -2
  252. ksadk/session_context.py +66 -0
  253. ksadk/sessions/__init__.py +11 -21
  254. ksadk/sessions/_local_service_sync.py +263 -1
  255. ksadk/sessions/base.py +176 -0
  256. ksadk/sessions/errors.py +4 -0
  257. ksadk/sessions/in_memory.py +309 -19
  258. ksadk/sessions/local_service.py +83 -1
  259. ksadk/sessions/persistence.py +275 -0
  260. ksadk/sessions/postgres_service.py +358 -0
  261. ksadk/sessions/resilience.py +8 -0
  262. ksadk/sessions/resilient.py +362 -4
  263. ksadk/sessions/topology.py +135 -0
  264. ksadk/skills/models.py +26 -4
  265. ksadk/skills/package_store.py +186 -38
  266. ksadk/skills/runtime/agent.py +31 -6
  267. ksadk/skills/runtime/artifact_delivery.py +139 -0
  268. ksadk/skills/runtime/backends/e2b.py +98 -6
  269. ksadk/skills/runtime/backends/local.py +73 -8
  270. ksadk/skills/runtime/base.py +3 -0
  271. ksadk/skills/runtime/executor.py +2 -0
  272. ksadk/skills/runtime/loader.py +10 -2
  273. ksadk/skills/runtime/pinned.py +114 -0
  274. ksadk/skills/runtime/request.py +31 -0
  275. ksadk/skills/service_client.py +167 -28
  276. ksadk/studio/api.py +224 -42
  277. ksadk/studio/api_catalog_routes.py +18 -0
  278. ksadk/studio/api_plugin_routes.py +526 -95
  279. ksadk/studio/api_resource_connections.py +183 -0
  280. ksadk/studio/authoring_coordinator.py +19 -14
  281. ksadk/studio/builder.py +76 -0
  282. ksadk/studio/cloud.py +342 -104
  283. ksadk/studio/cloud_shared_web.py +565 -0
  284. ksadk/studio/codex_agent_service.py +128 -26
  285. ksadk/studio/codex_builder.py +241 -2
  286. ksadk/studio/codex_credentials.py +90 -0
  287. ksadk/studio/codex_manifest.py +31 -4
  288. ksadk/studio/codex_plugin_store.py +746 -0
  289. ksadk/studio/codex_provider_build.py +231 -0
  290. ksadk/studio/codex_run.py +184 -25
  291. ksadk/studio/compatibility_report.py +12 -1
  292. ksadk/studio/compiler.py +78 -14
  293. ksadk/studio/contracts.py +132 -6
  294. ksadk/studio/dsh_application.py +137 -0
  295. ksadk/studio/dsh_capability_service.py +1107 -0
  296. ksadk/studio/dsh_models.py +59 -0
  297. ksadk/studio/dsh_provider_registration.py +320 -13
  298. ksadk/studio/hosted_kernel.py +88 -13
  299. ksadk/studio/mcp_runtime.py +11 -3
  300. ksadk/studio/model_client.py +2 -2
  301. ksadk/studio/plugin_composition.py +190 -23
  302. ksadk/studio/plugin_kernel_adapter.py +12 -112
  303. ksadk/studio/plugin_runtime.py +224 -45
  304. ksadk/studio/resource_authority.py +637 -0
  305. ksadk/studio/resource_binding_validation.py +77 -0
  306. ksadk/studio/resource_build_admission.py +196 -0
  307. ksadk/studio/resource_build_materializer.py +149 -0
  308. ksadk/studio/resource_catalog.py +143 -2
  309. ksadk/studio/resource_connections.py +220 -0
  310. ksadk/studio/run_service.py +462 -52
  311. ksadk/studio/runtime_source.py +15 -7
  312. ksadk/studio/scheduler_assistant.py +317 -0
  313. ksadk/studio/scheduler_runtime.py +9 -0
  314. ksadk/studio/scheduler_service.py +3 -0
  315. ksadk/studio/service.py +490 -44
  316. ksadk/studio/shared_web.py +446 -62
  317. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  318. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  319. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  320. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  321. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  322. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  323. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  324. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  325. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  326. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  327. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  328. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  329. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  330. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  331. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  332. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  333. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  334. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  335. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  336. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  337. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  338. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  339. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  340. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  341. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  342. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  343. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  344. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  345. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  346. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  347. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  348. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  349. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  350. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  351. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  352. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  353. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  354. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  355. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  356. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  357. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  358. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  359. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  360. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  361. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  362. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  363. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  364. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  365. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  366. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  367. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  368. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  369. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  372. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  373. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  377. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  378. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  379. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  380. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  381. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  382. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  383. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  384. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  385. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  386. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  387. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  388. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  389. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  390. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  391. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  392. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  393. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  394. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  395. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  396. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  397. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  398. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  399. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  400. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  401. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  402. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  403. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  404. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  405. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  406. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  407. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  408. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  409. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  410. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  411. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  412. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  413. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  414. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  415. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  416. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  417. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  418. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  419. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  420. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  421. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  422. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  423. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  424. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  425. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  426. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  427. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  428. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  429. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  430. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  431. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  432. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  433. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  434. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  435. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  436. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  437. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  438. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  439. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  440. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  441. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  442. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  443. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  444. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  445. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  446. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  447. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  448. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  449. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  450. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  451. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  452. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  453. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  454. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  455. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  456. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  457. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  458. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  459. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  460. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  461. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  462. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  463. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  464. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  465. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  466. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  467. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  468. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  469. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  470. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  471. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  472. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  473. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  474. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  475. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  476. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  477. ksadk/studio/static/index.html +2 -2
  478. ksadk/version.py +1 -1
  479. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +0 -1
  480. ksadk/server/static/assets/channel-s354Yo6o.js +0 -1
  481. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +0 -1
  482. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +0 -1
  483. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +0 -1
  484. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +0 -1
  485. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +0 -1
  486. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +0 -1
  487. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +0 -1
  488. ksadk/server/static/assets/index-B2k_urY8.js +0 -241
  489. ksadk/server/static/assets/index-ILPt6IWF.css +0 -2
  490. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +0 -1
  491. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +0 -1
  492. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +0 -1
  493. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +0 -1
  494. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +0 -1
  495. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +0 -1
  496. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +0 -1
  497. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +0 -1
  498. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +0 -1
  499. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +0 -8
  500. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +0 -1
  501. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +0 -1
  502. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +0 -1
  503. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  504. ksadk/studio/static/assets/index-DXs1Eq4M.css +0 -1
  505. ksadk/studio/static/assets/index-DeDqwTsD.js +0 -283
  506. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  507. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  508. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  509. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
ksadk/studio/service.py CHANGED
@@ -8,10 +8,11 @@ import json
8
8
  import logging
9
9
  import os
10
10
  import zipfile
11
- from collections.abc import Mapping, Sequence
11
+ from collections.abc import AsyncIterator, Awaitable, Mapping, Sequence
12
+ from contextlib import asynccontextmanager
12
13
  from dataclasses import dataclass
13
14
  from pathlib import Path
14
- from typing import Any, Callable, Literal, cast
15
+ from typing import Any, Callable, Literal, TypeVar, cast
15
16
  from urllib.parse import urlparse
16
17
  from uuid import uuid4
17
18
 
@@ -43,6 +44,7 @@ from ksadk.evaluation.studio_build_adapter import (
43
44
  from ksadk.events.store import RuntimeEventStore
44
45
  from ksadk.observability.session_log import SessionLogError, export_session_log
45
46
  from ksadk.observability.trajectory import encode_sse, project_trajectory_event
47
+ from ksadk.plugins.bundle_security import BundleSecurityError
46
48
  from ksadk.plugins.contracts import PluginManifest
47
49
  from ksadk.plugins.providers.legacy import LegacyHarnessSource
48
50
  from ksadk.plugins.providers.legacy_catalog import (
@@ -82,6 +84,8 @@ from ksadk.studio.codex_manifest import (
82
84
  CodexAgentManifest,
83
85
  CodexManifestRepository,
84
86
  )
87
+ from ksadk.studio.codex_plugin_store import CodexPluginSnapshotStore
88
+ from ksadk.studio.codex_provider_build import CodexProviderBuildManager
85
89
  from ksadk.studio.codex_run import CodexRunSpecResolver
86
90
  from ksadk.studio.compiler import AgentCompiler
87
91
  from ksadk.studio.contracts import (
@@ -92,7 +96,10 @@ from ksadk.studio.contracts import (
92
96
  AgentTemplateComposeRequest,
93
97
  AgentTemplateComposition,
94
98
  BuildStatus,
99
+ BundleManifest,
95
100
  DeploymentRequest,
101
+ Diagnostic,
102
+ DiagnosticSeverity,
96
103
  Operation,
97
104
  OperationKind,
98
105
  RunEvent,
@@ -100,6 +107,9 @@ from ksadk.studio.contracts import (
100
107
  RuntimeRef,
101
108
  ToolContract,
102
109
  )
110
+ from ksadk.studio.dsh_capability_service import (
111
+ StudioDshCapabilityService,
112
+ )
103
113
  from ksadk.studio.dsh_provider_registration import (
104
114
  StudioDshProviderRegistrationError,
105
115
  StudioDshProviderRegistrationManager,
@@ -114,7 +124,17 @@ from ksadk.studio.operations import OperationManager
114
124
  from ksadk.studio.plugin_composition import StudioPluginCompositionCompiler
115
125
  from ksadk.studio.plugin_runtime import StudioPluginRuntime
116
126
  from ksadk.studio.repository import AgentDraftRepository, BuildRepository, load_yaml_file
127
+ from ksadk.studio.resource_authority import (
128
+ ResourceAuthorityPolicy,
129
+ SignedKnowledgeResourceAuthority,
130
+ resource_authority_policy_from_environment,
131
+ )
132
+ from ksadk.studio.resource_build_admission import (
133
+ admit_resource_build,
134
+ resource_build_required,
135
+ )
117
136
  from ksadk.studio.resource_catalog import LocalResourceCatalog
137
+ from ksadk.studio.resource_connections import ResourceConnectionRepository
118
138
  from ksadk.studio.run_service import StudioRunService, StudioRunSpec
119
139
  from ksadk.studio.runtime_catalog import inspect_runtime_catalog
120
140
  from ksadk.studio.runtime_source import materialize_generated_runtime_source
@@ -133,6 +153,8 @@ from ksadk.studio.templates import (
133
153
  from ksadk.studio.validator import AgentValidator
134
154
  from ksadk.studio.workspace import Workspace
135
155
 
156
+ _T = TypeVar("_T")
157
+
136
158
  _TRAJECTORY_KEEPALIVE_SECONDS = 15.0
137
159
  _EVALUATION_TARGET_LABELS = {
138
160
  TargetKind.A2A: "A2A Agent",
@@ -162,6 +184,8 @@ class StudioService:
162
184
  plugin_provider_factories: Mapping[str, Any] | None = None,
163
185
  legacy_harness_sources: Sequence[LegacyHarnessSource] = (),
164
186
  dsh_provider_registration_manager: StudioDshProviderRegistrationManager | None = None,
187
+ dsh_capability_service: StudioDshCapabilityService | None = None,
188
+ resource_authority_policy: ResourceAuthorityPolicy | None = None,
165
189
  ) -> None:
166
190
  provider_manifests = dict(plugin_provider_manifests or {})
167
191
  provider_factories = dict(plugin_provider_factories or {})
@@ -180,14 +204,53 @@ class StudioService:
180
204
  self.workspace.root
181
205
  )
182
206
  )
207
+ self.dsh_capabilities = (
208
+ dsh_capability_service
209
+ or StudioDshCapabilityService.discover_or_create_workspace_default(self.workspace.root)
210
+ )
211
+ if dsh_capability_service is not None or os.environ.get(
212
+ "KSADK_DSH_HOME", ""
213
+ ).strip() or os.environ.get("KSADK_DSH_PROFILE", "").strip():
214
+ self._resource_dsh_provider_registration_manager = None
215
+ self.resource_dsh_capabilities = self.dsh_capabilities
216
+ else:
217
+ self._resource_dsh_provider_registration_manager = (
218
+ StudioDshProviderRegistrationManager.create_workspace_resource_default(
219
+ self.workspace.root
220
+ )
221
+ )
222
+ self.resource_dsh_capabilities = (
223
+ StudioDshCapabilityService.create_workspace_resource_default(
224
+ self.workspace.root
225
+ )
226
+ )
183
227
  self._start_lock = asyncio.Lock()
184
228
  self._started = False
229
+ self._closed = False
185
230
  self._apply_persisted_settings()
186
231
  self.avatar_assets = AgentAvatarAssetStore(self.workspace)
187
232
  self.conversation_attachments = ConversationAttachmentStore(self.workspace)
188
233
  self.drafts = AgentDraftRepository(self.workspace)
189
234
  self.catalog = LocalResourceCatalog(self.workspace)
190
235
  self.builds = BuildRepository(self.workspace)
236
+ self.credentials = (
237
+ credential_resolver
238
+ or getattr(model_client, "credential_resolver", None)
239
+ or CredentialResolver(self.workspace)
240
+ )
241
+ self.resource_connections = ResourceConnectionRepository(self.workspace, self.credentials)
242
+ effective_resource_policy = (
243
+ resource_authority_policy
244
+ if resource_authority_policy is not None
245
+ else resource_authority_policy_from_environment()
246
+ )
247
+ self.resource_authority = (
248
+ SignedKnowledgeResourceAuthority(
249
+ self.resource_connections, effective_resource_policy
250
+ )
251
+ if effective_resource_policy is not None
252
+ else None
253
+ )
191
254
  self.validator = AgentValidator()
192
255
  self.builder = AgentBundleBuilder(
193
256
  self.workspace,
@@ -209,6 +272,8 @@ class StudioService:
209
272
  self.codex_manifests = CodexManifestRepository(self.workspace)
210
273
  self.codex_builds = CodexBuildRepository(self.workspace)
211
274
  self.codex_drafts = CodexDraftRepository(self.workspace)
275
+ self.codex_plugin_snapshots = CodexPluginSnapshotStore(self.workspace)
276
+ self.codex_provider_builds = CodexProviderBuildManager(self)
212
277
  codex_builder_kwargs = {}
213
278
  if codex_runtime_inspector is not None:
214
279
  codex_builder_kwargs["runtime_inspector"] = codex_runtime_inspector
@@ -218,6 +283,10 @@ class StudioService:
218
283
  build_repository=self.codex_builds,
219
284
  resource_catalog=self.catalog,
220
285
  draft_repository=self.codex_drafts,
286
+ plugin_snapshot_store=self.codex_plugin_snapshots,
287
+ resource_connections=self.resource_connections,
288
+ provider_build=self.codex_provider_builds.prepare,
289
+ provider_validate=self.codex_provider_builds.bundle_root,
221
290
  **codex_builder_kwargs,
222
291
  )
223
292
  self.runtime_executor = runtime_executor or RuntimeExecutor(
@@ -230,17 +299,15 @@ class StudioService:
230
299
  session_service=self.session_service,
231
300
  runtime_events=self.runtime_events,
232
301
  )
233
- self.credentials = (
234
- credential_resolver
235
- or getattr(model_client, "credential_resolver", None)
236
- or CredentialResolver(self.workspace)
237
- )
238
302
  self.codex_runs = CodexRunSpecResolver(
239
303
  self.workspace,
240
304
  build_repository=self.codex_builds,
241
305
  manifest_repository=self.codex_manifests,
242
306
  credential_resolver=self.credentials,
243
307
  resource_catalog=self.catalog,
308
+ draft_repository=self.codex_drafts,
309
+ plugin_snapshot_store=self.codex_plugin_snapshots,
310
+ provider_bundle_resolver=self.codex_provider_builds.bundle_root,
244
311
  )
245
312
  self.framework_runs = FrameworkRunSpecResolver(
246
313
  self.workspace,
@@ -256,10 +323,17 @@ class StudioService:
256
323
  session_service=self.session_service,
257
324
  model_client=self.model_client,
258
325
  secret_resolver=self.credentials,
326
+ codex_local_launch_resolver=self.codex_provider_builds.native_launch,
327
+ runtime_executor=self.runtime_executor,
259
328
  harness_reasoner=harness_reasoner,
260
329
  provider_manifests=provider_manifests,
261
330
  provider_factories=provider_factories,
262
331
  legacy_harness_sources=legacy_harness_sources,
332
+ dsh_capability_service=self.dsh_capabilities,
333
+ resource_dsh_capability_service=self.resource_dsh_capabilities,
334
+ resource_authority=self.resource_authority,
335
+ resource_connections=self.resource_connections,
336
+ resource_actor_ref="local-user",
263
337
  )
264
338
  self.run_service.plugin_runtime = self.plugin_runs
265
339
  self.scheduler_runtimes = StudioScheduledKernelRegistry(
@@ -272,6 +346,9 @@ class StudioService:
272
346
  self.workspace,
273
347
  runtime_registry=self.scheduler_runtimes,
274
348
  )
349
+ from ksadk.studio.scheduler_assistant import StudioScheduleAssistant
350
+
351
+ self.run_service.schedule_assistant = StudioScheduleAssistant(self)
275
352
  self.mcp_runtime = MCPRuntimeAdapter(self.workspace, credentials=self.credentials)
276
353
  self._cloud_gateway_override = cloud_gateway
277
354
  self.cloud = CloudDeploymentService(
@@ -288,6 +365,7 @@ class StudioService:
288
365
  """Bind ready managed DSH registrations before build or execution."""
289
366
 
290
367
  async with self._start_lock:
368
+ self._ensure_open()
291
369
  if self._started:
292
370
  return
293
371
  await self._bootstrap_official_dsh_defaults()
@@ -304,23 +382,139 @@ class StudioService:
304
382
  """Rebind the exact current DSH Profile and release stale activations."""
305
383
 
306
384
  async with self._start_lock:
307
- if self._dsh_provider_registration_manager is None:
308
- self._dsh_provider_registration_manager = (
309
- StudioDshProviderRegistrationManager.discover_or_create_workspace_default(
310
- self.workspace.root
311
- )
385
+ self._ensure_open()
386
+ safe_to_resume = False
387
+ try:
388
+ await self.plugin_runs.suspend_admission()
389
+ await self.reset_dsh_capability_state()
390
+ await self._bind_dsh_provider_registrations_locked(refresh=True)
391
+ await self._refresh_dsh_catalog_resource(required=False)
392
+ safe_to_resume = True
393
+ finally:
394
+ if safe_to_resume:
395
+ await self.plugin_runs.resume_admission()
396
+
397
+ async def reconfigure_dsh_profile(
398
+ self,
399
+ operation: Callable[[], Awaitable[_T]],
400
+ ) -> _T:
401
+ """Run one Profile mutation while all Agent admission is suspended."""
402
+
403
+ async with self._start_lock:
404
+ self._ensure_open()
405
+ safe_to_resume = False
406
+ try:
407
+ await self.plugin_runs.suspend_admission()
408
+ await self.reset_dsh_capability_state()
409
+ try:
410
+ result = await operation()
411
+ except BaseException as mutation_error:
412
+ if (
413
+ isinstance(mutation_error, StudioError)
414
+ and mutation_error.code == "DSH_PROFILE_RECOVERY_REQUIRED"
415
+ ):
416
+ raise
417
+ try:
418
+ await self._bind_dsh_provider_registrations_locked(refresh=True)
419
+ await self._refresh_dsh_catalog_resource(required=False)
420
+ safe_to_resume = True
421
+ except Exception as recovery_error: # noqa: BLE001
422
+ logging.getLogger(__name__).warning(
423
+ "DSH provider recovery after mutation failure skipped: %s",
424
+ recovery_error,
425
+ )
426
+ raise
427
+ await self._bind_dsh_provider_registrations_locked(refresh=True)
428
+ await self._refresh_dsh_catalog_resource(required=False)
429
+ safe_to_resume = True
430
+ return result
431
+ finally:
432
+ if safe_to_resume:
433
+ await self.plugin_runs.resume_admission()
434
+
435
+ async def _bind_dsh_provider_registrations_locked(self, *, refresh: bool) -> None:
436
+ if self._dsh_provider_registration_manager is None:
437
+ self._dsh_provider_registration_manager = (
438
+ StudioDshProviderRegistrationManager.discover_or_create_workspace_default(
439
+ self.workspace.root
312
440
  )
313
- await self._bootstrap_official_dsh_defaults()
314
- if self._started:
315
- await self.plugin_runs.aclose()
316
- manifests, factories, manager_refs = await self._provider_snapshot(refresh=True)
317
- self.plugin_compositions.replace_provider_registrations(manifests)
318
- self.plugin_runs.replace_provider_registrations(manifests, factories)
319
- self._active_provider_manifests = manifests
320
- manager = self._dsh_provider_registration_manager
321
- if manager is not None and manager_refs is not None:
322
- manager.mark_bound(manager_refs)
323
- self._started = True
441
+ )
442
+ await self._bootstrap_official_dsh_defaults()
443
+ manifests, factories, manager_refs = await self._provider_snapshot(refresh=refresh)
444
+ self.plugin_compositions.replace_provider_registrations(manifests)
445
+ self.plugin_runs.replace_provider_registrations(manifests, factories)
446
+ self._active_provider_manifests = manifests
447
+ manager = self._dsh_provider_registration_manager
448
+ if manager is not None and manager_refs is not None:
449
+ manager.mark_bound(manager_refs)
450
+ self._started = True
451
+
452
+ async def reset_dsh_capability_state(self) -> None:
453
+ """Drop the current DSH capability/Core generation."""
454
+
455
+ self.catalog.clear_dsh_profile_mcp()
456
+ await self.dsh_capabilities.refresh()
457
+
458
+ async def refresh_dsh_catalog_resource(self): # type: ignore[no-untyped-def]
459
+ """Validate and publish the current DSH Profile as a bindable MCP."""
460
+
461
+ _snapshot, resource = await self.dsh_capability_catalog_snapshot()
462
+ return resource
463
+
464
+ async def dsh_capability_catalog_snapshot(self): # type: ignore[no-untyped-def]
465
+ """Atomically snapshot and publish one current DSH generation."""
466
+
467
+ async with self._start_lock:
468
+ self._ensure_open()
469
+ snapshot = await self.dsh_capabilities.capability_snapshot()
470
+ resource = self.catalog.replace_dsh_profile_mcp(snapshot.descriptor)
471
+ return snapshot, resource
472
+
473
+ async def ensure_dsh_catalog_available(self) -> None:
474
+ """Publish an explicitly enabled DSH Profile for the generic selector.
475
+
476
+ The normal Studio startup remains side-effect free for legacy users.
477
+ The generic MCP catalog request performs only a profile metadata check;
478
+ it starts the managed capability host when the user has already enabled
479
+ at least one DSH plugin.
480
+ """
481
+
482
+ async with self._start_lock:
483
+ self._ensure_open()
484
+ existing = self.catalog.list(kind="mcp", source="provider", limit=200)
485
+ if any(item.contract.get("materialization") == "dsh-profile" for item in existing):
486
+ return
487
+ checker = getattr(self.dsh_capabilities, "has_enabled_profile_plugins", None)
488
+ if checker is None:
489
+ return
490
+ try:
491
+ enabled = await checker()
492
+ except Exception as error: # noqa: BLE001 - optional ecosystem boundary
493
+ logging.getLogger(__name__).warning("DSH catalog discovery skipped: %s", error)
494
+ return
495
+ if enabled:
496
+ await self._refresh_dsh_catalog_resource(required=False)
497
+
498
+ @asynccontextmanager
499
+ async def dsh_profile_read_transaction(self) -> AsyncIterator[None]:
500
+ """Fence a UI grant read against Profile mutation and shutdown."""
501
+
502
+ async with self._start_lock:
503
+ self._ensure_open()
504
+ yield
505
+
506
+ async def _refresh_dsh_catalog_resource(self, *, required: bool): # type: ignore[no-untyped-def]
507
+ try:
508
+ snapshot = await self.dsh_capabilities.capability_snapshot()
509
+ return self.catalog.replace_dsh_profile_mcp(snapshot.descriptor)
510
+ except Exception as error: # noqa: BLE001 - optional ecosystem boundary
511
+ self.catalog.clear_dsh_profile_mcp()
512
+ if required:
513
+ raise
514
+ logging.getLogger(__name__).warning(
515
+ "DSH capability catalog publication skipped: %s", error
516
+ )
517
+ return None
324
518
 
325
519
  async def _bootstrap_official_dsh_defaults(self) -> None:
326
520
  manager = self._dsh_provider_registration_manager
@@ -332,9 +526,36 @@ class StudioService:
332
526
  logging.getLogger(__name__).warning(
333
527
  "official DSH provider bootstrap skipped: %s", error
334
528
  )
529
+ else:
530
+ if result in {"installed", "already_enabled"}:
531
+ logging.getLogger(__name__).info(
532
+ "official Codex DSH provider bootstrap: %s", result
533
+ )
534
+ try:
535
+ resource_result = await manager.bootstrap_official_resource_plugins()
536
+ except Exception as error: # optional DSH must fail closed to legacy paths
537
+ logging.getLogger(__name__).warning(
538
+ "official DSH resource bootstrap skipped: %s", error
539
+ )
540
+ else:
541
+ if resource_result in {"installed", "already_enabled"}:
542
+ logging.getLogger(__name__).info(
543
+ "official platform resource DSH bootstrap: %s", resource_result
544
+ )
545
+ resource_manager = self._resource_dsh_provider_registration_manager
546
+ if resource_manager is None:
335
547
  return
336
- if result in {"installed", "already_enabled"}:
337
- logging.getLogger(__name__).info("official Codex DSH provider bootstrap: %s", result)
548
+ try:
549
+ resource_result = await resource_manager.bootstrap_official_resource_plugins()
550
+ except Exception as error:
551
+ logging.getLogger(__name__).warning(
552
+ "official resource execution Profile bootstrap skipped: %s", error
553
+ )
554
+ else:
555
+ if resource_result in {"installed", "already_enabled"}:
556
+ logging.getLogger(__name__).info(
557
+ "official resource execution Profile bootstrap: %s", resource_result
558
+ )
338
559
 
339
560
  async def _provider_snapshot(
340
561
  self, *, refresh: bool
@@ -453,19 +674,29 @@ class StudioService:
453
674
  """Resolve one immutable Build through its only compatible resolver."""
454
675
 
455
676
  try:
677
+ self.codex_builds.get(build_id)
678
+ except Exception as exc:
679
+ if getattr(exc, "status_code", None) != 404:
680
+ raise
681
+ else:
682
+ # The record exists in the Codex repository. Any later resolution
683
+ # error belongs to that Build and must remain actionable; a nested
684
+ # 404 (for example a missing plugin snapshot) is not evidence that
685
+ # this is a framework Build.
456
686
  return self.codex_runs.resolve(
457
687
  build_id,
458
688
  model=model,
459
689
  sandbox=sandbox,
460
690
  approval_mode=approval_mode,
461
691
  )
462
- except Exception as exc:
463
- if getattr(exc, "status_code", None) != 404:
464
- raise
465
692
  framework_build = self.builds.get(build_id)
466
693
  runtime_type = framework_build.runtime_type.strip().lower()
467
694
  if runtime_type in {"harness", "plugin"}:
468
- return self.plugin_runs.resolve(build_id, model=model)
695
+ return self.plugin_runs.resolve(
696
+ build_id,
697
+ model=model,
698
+ approval_mode=approval_mode,
699
+ )
469
700
  return self.framework_runs.resolve(
470
701
  build_id,
471
702
  model=model,
@@ -605,11 +836,13 @@ class StudioService:
605
836
  return await asyncio.to_thread(self.codex_builder.build, agent_id)
606
837
  draft = self.drafts.get(agent_id)
607
838
  composition_required = self.plugin_compositions.required_for(draft)
839
+ resources_required = resource_build_required(draft)
608
840
  for record in self.builds.list_for_agent(agent_id):
609
841
  if record.status == BuildStatus.SUCCEEDED:
610
- if composition_required and (
842
+ if (composition_required or resources_required) and (
611
843
  record.source_revision != draft.metadata.revision
612
- or not self._build_has_composition(record)
844
+ or (composition_required and not self._build_has_composition(record))
845
+ or (resources_required and not self._build_has_resources(record))
613
846
  ):
614
847
  continue
615
848
  if composition_required:
@@ -638,7 +871,44 @@ class StudioService:
638
871
 
639
872
  def _build_agent_bundle(self, draft: AgentDraft):
640
873
  composition = self.plugin_compositions.compile_if_required(draft)
641
- record = self.builder.build(draft, composition=composition)
874
+ resource_build = None
875
+ if resource_build_required(draft):
876
+ dsh_profile = self.resource_dsh_capabilities.capture_resource_build_snapshot()
877
+ resource_build = admit_resource_build(
878
+ draft,
879
+ authority=self.resource_authority,
880
+ connections=self.resource_connections,
881
+ dsh_profile=dsh_profile,
882
+ )
883
+ try:
884
+ record = self.builder.build(
885
+ draft,
886
+ composition=composition,
887
+ resource_build=resource_build,
888
+ )
889
+ except BundleSecurityError as error:
890
+ first = error.findings[0]
891
+ reason = {
892
+ "literal-secret-field": "明文凭证",
893
+ "url-credentials": "含账号信息的 URL",
894
+ "local-home-path": "本机用户目录路径",
895
+ "invalid-structured-input": "无法解析的结构化数据",
896
+ }.get(first.kind, "敏感内容")
897
+ raise StudioError(
898
+ "BUNDLE_SECURITY_REJECTED",
899
+ f"AgentBundle 安全检查未通过:{first.path} 检测到{reason}",
900
+ status_code=422,
901
+ details={
902
+ "securityFindings": [
903
+ {
904
+ "path": finding.path,
905
+ "kind": finding.kind,
906
+ "field": finding.field,
907
+ }
908
+ for finding in error.findings
909
+ ]
910
+ },
911
+ ) from error
642
912
  if composition is not None:
643
913
  self.plugin_compositions.bind_build(
644
914
  composition,
@@ -670,6 +940,26 @@ class StudioService:
670
940
  except (KeyError, OSError, UnicodeError, ValueError, zipfile.BadZipFile):
671
941
  return False
672
942
 
943
+ def _build_has_resources(self, record: Any) -> bool:
944
+ if (
945
+ not record.artifact_path
946
+ or not record.resource_build_digest
947
+ or not record.resource_snapshot_digest
948
+ ):
949
+ return False
950
+ try:
951
+ archive = self.workspace.resolve(record.artifact_path, must_exist=True)
952
+ with zipfile.ZipFile(archive) as bundle:
953
+ manifest = BundleManifest.model_validate_json(bundle.read("manifest.json"))
954
+ names = frozenset(bundle.namelist())
955
+ return bool(
956
+ manifest.resource_build_digest == record.resource_build_digest
957
+ and manifest.resource_snapshot_digest == record.resource_snapshot_digest
958
+ and "platform-resources/resource-build.json" in names
959
+ )
960
+ except (KeyError, OSError, UnicodeError, ValueError, zipfile.BadZipFile):
961
+ return False
962
+
673
963
  async def create_agent_schedule(
674
964
  self,
675
965
  agent_id: str,
@@ -714,6 +1004,7 @@ class StudioService:
714
1004
  field="sessionId",
715
1005
  )
716
1006
  if continuity == "continue_session":
1007
+ await self._require_schedule_session_owner(agent_id, session_id)
717
1008
  self._require_schedule_continuation(runtime, spec.launch_context.runtime_type)
718
1009
  task = ScheduledTask(
719
1010
  task_id=f"sched-{uuid4().hex[:20]}",
@@ -736,6 +1027,29 @@ class StudioService:
736
1027
  )
737
1028
  return self.scheduler.create_task(task)
738
1029
 
1030
+ async def _require_schedule_session_owner(self, agent_id: str, session_id: str | None) -> None:
1031
+ session = (
1032
+ await self.session_service.get_session_metadata(session_id) if session_id else None
1033
+ )
1034
+ if session is None or session.agent_id != agent_id:
1035
+ raise StudioError(
1036
+ "SCHEDULE_SESSION_INVALID",
1037
+ "请选择该智能体已有的会话。",
1038
+ status_code=422,
1039
+ field="sessionId",
1040
+ )
1041
+
1042
+ async def validate_schedule_session(
1043
+ self, agent_id: str, continuity: str, session_id: str | None, build_id: str | None
1044
+ ) -> None:
1045
+ if continuity != "continue_session":
1046
+ return
1047
+ await self._require_schedule_session_owner(agent_id, session_id)
1048
+ await self.scheduler_runtimes.ensure_build(build_id, expected_agent_id=agent_id)
1049
+ runtime = self.scheduler_runtimes.runtime_for_build(build_id)
1050
+ spec = self.resolve_run_spec(build_id)
1051
+ self._require_schedule_continuation(runtime, spec.launch_context.runtime_type)
1052
+
739
1053
  @staticmethod
740
1054
  def _require_schedule_continuation(runtime: Any, runtime_type: str) -> None:
741
1055
  """Fail closed unless the bound Provider can preserve one conversation.
@@ -904,7 +1218,8 @@ class StudioService:
904
1218
  from ksadk.studio.errors import not_found
905
1219
 
906
1220
  runs = self.event_store.list_runs(session_id=session_id)
907
- if not runs:
1221
+ session = await self.session_service.get_session_metadata(session_id)
1222
+ if not runs and session is None:
908
1223
  raise not_found("session", session_id)
909
1224
  if any(run.status == RunStatus.RUNNING for run in runs):
910
1225
  raise StudioError(
@@ -920,9 +1235,46 @@ class StudioService:
920
1235
  async def aclose(self) -> None:
921
1236
  """Release local provider activations and supervised plugin processes."""
922
1237
 
923
- await self.plugin_runs.aclose()
1238
+ async with self._start_lock:
1239
+ if self._closed:
1240
+ return
1241
+ self._closed = True
1242
+ cleanup = asyncio.create_task(self._close_owned_plugin_services())
1243
+ interrupted = False
1244
+ while not cleanup.done():
1245
+ try:
1246
+ await asyncio.shield(cleanup)
1247
+ except asyncio.CancelledError:
1248
+ interrupted = True
1249
+ cleanup.result()
1250
+ if interrupted:
1251
+ raise asyncio.CancelledError
1252
+
1253
+ async def _close_owned_plugin_services(self) -> None:
1254
+ first_error: BaseException | None = None
1255
+ owned = [self.plugin_runs.aclose, self.dsh_capabilities.aclose]
1256
+ if self.resource_dsh_capabilities is not self.dsh_capabilities:
1257
+ owned.append(self.resource_dsh_capabilities.aclose)
924
1258
  if self._dsh_provider_registration_manager is not None:
925
- await self._dsh_provider_registration_manager.aclose()
1259
+ owned.append(self._dsh_provider_registration_manager.aclose)
1260
+ if self._resource_dsh_provider_registration_manager is not None:
1261
+ owned.append(self._resource_dsh_provider_registration_manager.aclose)
1262
+ for close in owned:
1263
+ try:
1264
+ await close()
1265
+ except BaseException as error: # cleanup must continue
1266
+ if first_error is None:
1267
+ first_error = error
1268
+ if first_error is not None:
1269
+ raise first_error
1270
+
1271
+ def _ensure_open(self) -> None:
1272
+ if self._closed:
1273
+ raise StudioError(
1274
+ "STUDIO_SERVICE_CLOSED",
1275
+ "Studio service 已关闭",
1276
+ status_code=503,
1277
+ )
926
1278
 
927
1279
  async def _require_runtime_session(self, session_id: str) -> None:
928
1280
  if await self.session_service.get_session_metadata(session_id) is None:
@@ -1623,6 +1975,83 @@ class StudioService:
1623
1975
  return detail["validation"]
1624
1976
  return self.validator.validate(draft, level=level)
1625
1977
 
1978
+ async def resource_binding_status(self, agent_id: str, *, activation_id: str) -> dict:
1979
+ # Check workspace ownership, but never project the mutable draft as runtime state.
1980
+ await asyncio.to_thread(self.agent_detail, agent_id)
1981
+ status = await self.dsh_capabilities.resource_runtime_status(
1982
+ agent_id=agent_id, activation_id=activation_id,
1983
+ )
1984
+ if status is None:
1985
+ raise StudioError(
1986
+ "RESOURCE_ACTIVATION_NOT_FOUND", "未找到此 Agent 的资源运行实例",
1987
+ status_code=404,
1988
+ )
1989
+ return status
1990
+
1991
+ def validate_resource_bindings(self, agent_id: str, *, expected_revision: int) -> dict:
1992
+ from ksadk.resource_runtime.plugin_config import resource_plugin_config
1993
+ from ksadk.studio.resource_binding_validation import resource_binding_diagnostics
1994
+
1995
+ draft = self.agent_detail(agent_id)["draft"]
1996
+ if draft.metadata.revision != expected_revision:
1997
+ raise StudioError(
1998
+ "AGENT_REVISION_CONFLICT", "资源校验版本与当前 Agent 不一致", status_code=409,
1999
+ )
2000
+ diagnostics = resource_binding_diagnostics(
2001
+ draft.spec.bindings.plugins, draft.spec.memory, self.resource_connections,
2002
+ )
2003
+ configs = [
2004
+ (index, config)
2005
+ for index, binding in enumerate(draft.spec.bindings.plugins)
2006
+ if binding.enabled
2007
+ for config in [
2008
+ resource_plugin_config(
2009
+ binding.plugin_ref,
2010
+ binding.ecosystem,
2011
+ binding.config,
2012
+ enabled=True,
2013
+ )
2014
+ ]
2015
+ if config is not None
2016
+ ]
2017
+ verified = []
2018
+ if (
2019
+ self.resource_authority is not None
2020
+ and configs
2021
+ and not any(item.severity == DiagnosticSeverity.ERROR for item in diagnostics)
2022
+ ):
2023
+ for index, config in configs:
2024
+ try:
2025
+ verified.append(self.resource_authority.admit(config))
2026
+ except StudioError as error:
2027
+ diagnostics.append(
2028
+ Diagnostic(
2029
+ severity=DiagnosticSeverity.ERROR,
2030
+ code=error.code,
2031
+ message=error.message,
2032
+ field=error.field
2033
+ or f"spec.bindings.plugins[{index}].config.binding",
2034
+ )
2035
+ )
2036
+ current = self.agent_detail(agent_id)["draft"]
2037
+ if current.metadata.revision != draft.metadata.revision:
2038
+ raise StudioError(
2039
+ "AGENT_REVISION_CONFLICT",
2040
+ "资源校验期间 Agent 已变更,请刷新后重试",
2041
+ status_code=409,
2042
+ )
2043
+ authorization_verified = bool(configs) and len(verified) == len(configs)
2044
+ if authorization_verified:
2045
+ diagnostics = [
2046
+ item for item in diagnostics if item.code != "RESOURCE_AUTHORITY_UNVERIFIED"
2047
+ ]
2048
+ return {
2049
+ "revision": draft.metadata.revision,
2050
+ "valid": not any(item.severity == "error" for item in diagnostics),
2051
+ "authorizationVerified": authorization_verified,
2052
+ "diagnostics": [item.model_dump(by_alias=True, mode="json") for item in diagnostics],
2053
+ }
2054
+
1626
2055
  def submit_studio_build(
1627
2056
  self,
1628
2057
  agent_id: str,
@@ -2500,6 +2929,12 @@ class StudioService:
2500
2929
  runner=managed_runtime_runner,
2501
2930
  )
2502
2931
 
2932
+ # Do not turn a stale URL or a deleted Agent's Build into an accepted
2933
+ # operation that can only fail later in the worker. The Codex lookup
2934
+ # above intentionally falls back to framework builds, so establish
2935
+ # that the fallback record exists before returning HTTP 202.
2936
+ self.builds.get(build_id)
2937
+
2503
2938
  async def runner(_operation_id: str):
2504
2939
  return await self.cloud.deploy(build_id, request)
2505
2940
 
@@ -2655,7 +3090,7 @@ class StudioService:
2655
3090
  except Exception:
2656
3091
  data = {}
2657
3092
  defaults = {
2658
- "sandbox": os.environ.get("KSADK_CODEX_SANDBOX", "read_only"),
3093
+ "sandbox": os.environ.get("KSADK_CODEX_SANDBOX", "workspace-write-auto"),
2659
3094
  "buildAfterCreate": True,
2660
3095
  "codexProxy": current_proxy_mode(),
2661
3096
  "cloudRegion": os.environ.get(
@@ -2783,24 +3218,34 @@ class StudioService:
2783
3218
  secret_key = (
2784
3219
  os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY", "")
2785
3220
  ).strip()
2786
- region = os.environ.get("AGENTENGINE_REGION", os.environ.get("KSYUN_REGION", "")).strip()
2787
- if not all((access_key, secret_key, region)):
3221
+ configured_region = os.environ.get(
3222
+ "AGENTENGINE_REGION", os.environ.get("KSYUN_REGION", "")
3223
+ ).strip()
3224
+ environment_region = os.environ.get("KSYUN_REGION", "").strip()
3225
+ logical_region = (
3226
+ "pre-online"
3227
+ if environment_region.lower() == "pre-online"
3228
+ else configured_region
3229
+ )
3230
+ if not all((access_key, secret_key, logical_region)):
2788
3231
  return UnavailableCloudGateway()
2789
3232
  control_client = AgentEngineClient(
2790
- region=region,
3233
+ region=logical_region,
2791
3234
  access_key=access_key,
2792
3235
  secret_key=secret_key,
2793
3236
  )
3237
+ is_preonline = logical_region.lower() == "pre-online"
2794
3238
  stream_base_url = os.environ.get("AGENTENGINE_STREAM_SERVER_URL", "").strip()
2795
- if not stream_base_url and region.lower() == "pre-online":
3239
+ if not stream_base_url and is_preonline:
2796
3240
  # The pre-online KOP response path currently buffers SSE until
2797
- # EOF. Its internal Server ingress validates the same V4
2798
- # signature and preserves the RunAgent streaming response.
3241
+ # EOF, and KOP may not yet publish newly deployed native Action
3242
+ # names. Its internal Server ingress validates the same V4
3243
+ # signature for RunAgent, ManagedRuntime, and plugin delivery.
2799
3244
  stream_base_url = "http://agent-api-pre.kspmas-internal.ksyun.com"
2800
3245
  stream_client = (
2801
3246
  AgentEngineClient(
2802
3247
  base_url=stream_base_url,
2803
- region=region,
3248
+ region=logical_region,
2804
3249
  access_key=access_key,
2805
3250
  secret_key=secret_key,
2806
3251
  )
@@ -2808,9 +3253,10 @@ class StudioService:
2808
3253
  else control_client
2809
3254
  )
2810
3255
  return DirectAgentEngineCloudDeploymentGateway(
2811
- region=region,
3256
+ region=logical_region,
2812
3257
  client=control_client,
2813
3258
  stream_client=stream_client,
3259
+ managed_runtime_client=stream_client if is_preonline else None,
2814
3260
  bucket=os.environ.get("KS3_BUCKET", "").strip() or None,
2815
3261
  ks3_credentials={
2816
3262
  "access_key": access_key,