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/cloud.py CHANGED
@@ -3,16 +3,19 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import hashlib
6
+ import io
6
7
  import json
7
8
  import logging
8
9
  import os
9
10
  import tempfile
11
+ import zipfile
10
12
  from collections.abc import AsyncIterator
11
13
  from dataclasses import dataclass
12
14
  from pathlib import Path
13
15
  from typing import Any, Callable, Protocol, cast
14
16
  from uuid import uuid4
15
17
 
18
+ import yaml
16
19
  from pydantic import ValidationError
17
20
 
18
21
  from ksadk.api import AgentEngineAPIError, AgentEngineClient
@@ -110,9 +113,7 @@ class CloudDeploymentGateway(Protocol):
110
113
  self, agent_id: str, *, version_id: str
111
114
  ) -> dict[str, Any]: ...
112
115
 
113
- async def get_account_agent_dashboard_access(
114
- self, agent_id: str
115
- ) -> dict[str, str | None]: ...
116
+ async def get_account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]: ...
116
117
 
117
118
  async def delete_account_agent(self, agent_id: str) -> bool: ...
118
119
 
@@ -226,9 +227,7 @@ class UnavailableCloudGateway:
226
227
  status_code=501,
227
228
  )
228
229
 
229
- async def get_account_agent_dashboard_access(
230
- self, _agent_id: str
231
- ) -> dict[str, str | None]:
230
+ async def get_account_agent_dashboard_access(self, _agent_id: str) -> dict[str, str | None]:
232
231
  raise StudioError(
233
232
  "CLOUD_DASHBOARD_UNAVAILABLE",
234
233
  "当前未配置可用的云端签名账号,不能打开云端 Agent UI",
@@ -383,9 +382,7 @@ class InMemoryCloudGateway:
383
382
  "noop": False,
384
383
  }
385
384
 
386
- async def get_account_agent_dashboard_access(
387
- self, agent_id: str
388
- ) -> dict[str, str | None]:
385
+ async def get_account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
389
386
  return {
390
387
  "access_url": f"memory://dashboard/{agent_id}",
391
388
  "agent_id": agent_id,
@@ -450,6 +447,7 @@ class DirectAgentEngineCloudDeploymentGateway:
450
447
  region: str,
451
448
  client: Any | None = None,
452
449
  stream_client: Any | None = None,
450
+ managed_runtime_client: Any | None = None,
453
451
  uploader_factory: Callable[..., Any] = KS3Uploader,
454
452
  bucket: str | None = None,
455
453
  ks3_credentials: dict[str, str] | None = None,
@@ -488,8 +486,37 @@ class DirectAgentEngineCloudDeploymentGateway:
488
486
  # complete response body even when RunAgent returns SSE; both clients
489
487
  # still use the same process-only V4 credentials and Server admission.
490
488
  self.stream_client = stream_client or self.client
489
+ # Native ManagedRuntime and plugin-delivery actions may be available
490
+ # on Server before KOP publishes their Action names. Studio composes
491
+ # this client explicitly from its environment instead of inferring the
492
+ # deployment environment from the physical Region selected in UI.
493
+ self._native_runtime_client = managed_runtime_client
491
494
  self._bundles: dict[str, dict[str, str]] = {}
492
495
 
496
+ def _managed_runtime_client(self) -> Any:
497
+ """Use the deployed Server ingress for pre-online native runtime actions.
498
+
499
+ KOP remains the ordinary control-plane entry point. Pre-online may
500
+ publish a new ManagedRuntime or plugin-delivery action against a
501
+ different Server revision, while Studio's dedicated Server client is
502
+ already V4-signed and points at the deployment being validated.
503
+ """
504
+
505
+ if self._native_runtime_client is not None:
506
+ return self._native_runtime_client
507
+ if self.region.lower() == "pre-online":
508
+ return self.stream_client
509
+ return self.client
510
+
511
+ def cached_identity(self) -> dict[str, str] | None:
512
+ """Read the SDK's per-AK identity cache without making an IAM request."""
513
+ from ksadk.identity import get_cached_identity
514
+
515
+ identity = get_cached_identity(self._ks3_credentials["access_key"])
516
+ if not identity or not identity.user_uuid or not identity.user_name:
517
+ return None
518
+ return {"userName": identity.user_name, "userId": identity.user_uuid}
519
+
493
520
  async def upload_bundle(self, **kwargs) -> str:
494
521
  bundle = bytes(kwargs["bundle"])
495
522
  provenance = dict(kwargs["provenance"])
@@ -510,7 +537,12 @@ class DirectAgentEngineCloudDeploymentGateway:
510
537
  status_code=422,
511
538
  )
512
539
  object_key = f"studio-bundles/{_safe_object_component(agent_id)}/{archive_sha}/bundle.zip"
513
- uploader = self.uploader_factory(region=self.ks3_region, bucket=self.bucket)
540
+ uploader = self.uploader_factory(
541
+ region=self.ks3_region,
542
+ bucket=self.bucket,
543
+ access_key=self._ks3_credentials["access_key"],
544
+ secret_key=self._ks3_credentials["secret_key"],
545
+ )
514
546
  local_path: Path | None = None
515
547
  try:
516
548
  with tempfile.NamedTemporaryFile(
@@ -741,9 +773,7 @@ class DirectAgentEngineCloudDeploymentGateway:
741
773
  return False
742
774
 
743
775
  @classmethod
744
- def _cloud_chat_route(
745
- cls, *, runtime_type: str, capabilities: Any
746
- ) -> tuple[str, str]:
776
+ def _cloud_chat_route(cls, *, runtime_type: str, capabilities: Any) -> tuple[str, str]:
747
777
  if cls._session_event_chat_declared(capabilities):
748
778
  return (
749
779
  "studio-session-events",
@@ -767,9 +797,7 @@ class DirectAgentEngineCloudDeploymentGateway:
767
797
  else {}
768
798
  )
769
799
  deployment = (
770
- payload.get("deployment")
771
- if isinstance(payload.get("deployment"), dict)
772
- else {}
800
+ payload.get("deployment") if isinstance(payload.get("deployment"), dict) else {}
773
801
  )
774
802
  runtime_config = (
775
803
  deployment.get("runtime_config")
@@ -801,21 +829,24 @@ class DirectAgentEngineCloudDeploymentGateway:
801
829
  return None
802
830
 
803
831
  agent_id = str(
804
- first("agent_id", "agentId", "agent_runtime_id", "agentRuntimeId", "id")
805
- or fallback_id
832
+ first("agent_id", "agentId", "agent_runtime_id", "agentRuntimeId", "id") or fallback_id
806
833
  ).strip()
807
- runtime_type = str(
808
- first(
809
- "framework",
810
- "runtime_kind",
811
- "runtimeKind",
812
- "runtime_type",
813
- "runtimeType",
814
- "runtime_name",
815
- "runtimeName",
816
- )
817
- or ""
818
- ).strip().lower()
834
+ runtime_type = (
835
+ str(
836
+ first(
837
+ "framework",
838
+ "runtime_kind",
839
+ "runtimeKind",
840
+ "runtime_type",
841
+ "runtimeType",
842
+ "runtime_name",
843
+ "runtimeName",
844
+ )
845
+ or ""
846
+ )
847
+ .strip()
848
+ .lower()
849
+ )
819
850
  capabilities = first("capabilities", "Capabilities")
820
851
  chat_transport, chat_routing_reason = (
821
852
  DirectAgentEngineCloudDeploymentGateway._cloud_chat_route(
@@ -824,11 +855,14 @@ class DirectAgentEngineCloudDeploymentGateway:
824
855
  )
825
856
  )
826
857
  version_id = str(first("version_id", "versionId", "revision") or "").strip()
827
- manifest_sha256 = str(
828
- runtime_config.get("manifest_sha256")
829
- or runtime_config.get("manifestSha256")
830
- or ""
831
- ).strip().lower()
858
+ manifest_sha256 = (
859
+ str(runtime_config.get("manifest_sha256") or runtime_config.get("manifestSha256") or "")
860
+ .strip()
861
+ .lower()
862
+ )
863
+ kernel_ready_value = first("agent_kernel_ready", "agentKernelReady")
864
+ kernel_report_value = first("agent_kernel_runtime", "agentKernelRuntime")
865
+ kernel_report = kernel_report_value if isinstance(kernel_report_value, dict) else {}
832
866
  if not version_id and len(manifest_sha256) == 64:
833
867
  try:
834
868
  bytes.fromhex(manifest_sha256)
@@ -860,7 +894,8 @@ class DirectAgentEngineCloudDeploymentGateway:
860
894
  or quick_access.get("privateEndpoint")
861
895
  or lifecycle_first("endpoint")
862
896
  or ""
863
- ).strip() or None,
897
+ ).strip()
898
+ or None,
864
899
  "framework": runtime_type or None,
865
900
  "runtimeType": runtime_type or None,
866
901
  "capabilities": capabilities if isinstance(capabilities, dict) else None,
@@ -873,21 +908,26 @@ class DirectAgentEngineCloudDeploymentGateway:
873
908
  lifecycle_first("updated_at", "updatedAt", "update_time", "updateTime") or ""
874
909
  ).strip()
875
910
  or None,
911
+ # Keep cloud lifecycle and AgentKernel readiness separate. A Pod
912
+ # can be RUNNING while control admission still rejects chat; these
913
+ # fields let Studio explain that state without exposing credentials
914
+ # or the full Server deployment record.
915
+ "kernelReady": (kernel_ready_value if isinstance(kernel_ready_value, bool) else None),
916
+ "deploymentPhase": str(first("deployment_phase", "deploymentPhase") or "").strip()
917
+ or None,
918
+ "statusMessage": str(first("message", "Message") or "").strip() or None,
919
+ "kernelReason": str(kernel_report.get("reason") or "").strip() or None,
920
+ "kernelObservedAt": str(
921
+ kernel_report.get("observed_at") or kernel_report.get("observedAt") or ""
922
+ ).strip()
923
+ or None,
876
924
  }
877
925
 
878
926
  async def list_account_agents(self, *, page: int, size: int) -> dict[str, Any]:
879
927
  payload = await self.client.list_agents(page=page, page_size=size)
880
928
  raw_items = payload.get("agents") or payload.get("Agents") or []
881
- items = [
882
- self._account_agent_view(item)
883
- for item in raw_items
884
- if isinstance(item, dict)
885
- ]
886
- items = [
887
- item
888
- for item in items
889
- if item["agentId"] and item["status"] != "DELETED"
890
- ]
929
+ items = [self._account_agent_view(item) for item in raw_items if isinstance(item, dict)]
930
+ items = [item for item in items if item["agentId"] and item["status"] != "DELETED"]
891
931
  return {
892
932
  "items": items,
893
933
  "total": len(items),
@@ -912,9 +952,7 @@ class DirectAgentEngineCloudDeploymentGateway:
912
952
 
913
953
  return {
914
954
  "versionId": str(first("version_id", "VersionId", default="") or "").strip(),
915
- "versionName": str(
916
- first("version_name", "VersionName", default="") or ""
917
- ).strip(),
955
+ "versionName": str(first("version_name", "VersionName", default="") or "").strip(),
918
956
  "tag": str(first("tag", "Tag", default="") or "").strip(),
919
957
  "status": str(first("status", "Status", default="") or "").strip(),
920
958
  "trafficPercentage": int(
@@ -929,8 +967,7 @@ class DirectAgentEngineCloudDeploymentGateway:
929
967
  )
930
968
  or ""
931
969
  ).strip(),
932
- "createdAt": str(first("created_at", "CreatedAt", default="") or "").strip()
933
- or None,
970
+ "createdAt": str(first("created_at", "CreatedAt", default="") or "").strip() or None,
934
971
  "createdBy": str(first("created_by", "CreatedBy", default="") or "").strip(),
935
972
  }
936
973
 
@@ -958,9 +995,7 @@ class DirectAgentEngineCloudDeploymentGateway:
958
995
  ) from exc
959
996
  raw_items = payload.get("versions") or payload.get("Versions") or []
960
997
  items = [
961
- self._account_agent_version_view(item)
962
- for item in raw_items
963
- if isinstance(item, dict)
998
+ self._account_agent_version_view(item) for item in raw_items if isinstance(item, dict)
964
999
  ]
965
1000
  items = [item for item in items if item["versionId"]]
966
1001
  current = next(
@@ -973,11 +1008,7 @@ class DirectAgentEngineCloudDeploymentGateway:
973
1008
  )
974
1009
  return {
975
1010
  "items": items,
976
- "total": int(
977
- payload.get("total_count")
978
- or payload.get("TotalCount")
979
- or len(items)
980
- ),
1011
+ "total": int(payload.get("total_count") or payload.get("TotalCount") or len(items)),
981
1012
  "currentVersionId": current,
982
1013
  }
983
1014
 
@@ -1016,16 +1047,12 @@ class DirectAgentEngineCloudDeploymentGateway:
1016
1047
  ) from exc
1017
1048
  return {
1018
1049
  "agentId": str(payload.get("agent_id") or normalized_id),
1019
- "targetVersionId": str(
1020
- payload.get("target_version_id") or normalized_version_id
1021
- ),
1050
+ "targetVersionId": str(payload.get("target_version_id") or normalized_version_id),
1022
1051
  "status": str(payload.get("status") or "UPDATING"),
1023
1052
  "noop": bool(payload.get("noop")),
1024
1053
  }
1025
1054
 
1026
- async def get_account_agent_dashboard_access(
1027
- self, agent_id: str
1028
- ) -> dict[str, str | None]:
1055
+ async def get_account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
1029
1056
  detail = await self.get_account_agent(agent_id)
1030
1057
  path = (
1031
1058
  _NATIVE_DASHBOARD_UI_PATH
@@ -1067,9 +1094,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1067
1094
  )
1068
1095
  return True
1069
1096
 
1070
- def _chat_agent_id(
1071
- self, deployment: DeploymentRecord | AccountCloudAgentReference
1072
- ) -> str:
1097
+ def _chat_agent_id(self, deployment: DeploymentRecord | AccountCloudAgentReference) -> str:
1073
1098
  """Bind local cloud chat to an immutable Studio deployment receipt.
1074
1099
 
1075
1100
  In particular, the browser cannot provide an arbitrary AgentId and
@@ -1109,6 +1134,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1109
1134
  *,
1110
1135
  session_id: str,
1111
1136
  after_seq_id: int | None = None,
1137
+ before_seq_id: int | None = None,
1112
1138
  limit: int = 100,
1113
1139
  ) -> dict[str, Any]:
1114
1140
  """Return the Server/Runtime message projection for a bound session."""
@@ -1118,6 +1144,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1118
1144
  agent_id=self._chat_agent_id(deployment),
1119
1145
  session_id=session_id,
1120
1146
  after_seq_id=after_seq_id,
1147
+ before_seq_id=before_seq_id,
1121
1148
  limit=limit,
1122
1149
  )
1123
1150
  except AgentEngineAPIError as exc:
@@ -1242,14 +1269,10 @@ class DirectAgentEngineCloudDeploymentGateway:
1242
1269
  },
1243
1270
  ) from exc
1244
1271
 
1245
- async def list_deployment_chat_models(
1246
- self, deployment: DeploymentRecord
1247
- ) -> dict[str, Any]:
1272
+ async def list_deployment_chat_models(self, deployment: DeploymentRecord) -> dict[str, Any]:
1248
1273
  """Read the Server-authoritative model catalog for this Agent."""
1249
1274
 
1250
- return await self.client.list_agent_models(
1251
- agent_id=self._chat_agent_id(deployment)
1252
- )
1275
+ return await self.client.list_agent_models(agent_id=self._chat_agent_id(deployment))
1253
1276
 
1254
1277
  async def submit_deployment_chat_interaction(
1255
1278
  self,
@@ -1264,23 +1287,106 @@ class DirectAgentEngineCloudDeploymentGateway:
1264
1287
  idempotency_key: str,
1265
1288
  ) -> dict[str, Any]:
1266
1289
  """Forward only Interaction/v1's caller-visible response fields."""
1290
+ try:
1291
+ # Match the transport used by the active cloud run. Pre-online
1292
+ # uses the private Server ingress because its public KOP action
1293
+ # catalog can lag the Server revision; production remains on the
1294
+ # account-scoped KOP client. Both are AgentEngineClient instances
1295
+ # and therefore reuse the same AWS V4 and verified IAM identity
1296
+ # header construction.
1297
+ return await self.stream_client.submit_interaction(
1298
+ agent_id=self._chat_agent_id(deployment),
1299
+ session_id=session_id,
1300
+ run_id=run_id,
1301
+ interaction_id=interaction_id,
1302
+ expected_revision=expected_revision,
1303
+ action=action,
1304
+ response=response,
1305
+ idempotency_key=idempotency_key,
1306
+ )
1307
+ except AgentEngineAPIError as exc:
1308
+ logger.warning(
1309
+ "cloud interaction submit rejected: agent=%s session=%s run=%s "
1310
+ "interaction=%s revision=%s action=%s reason=%s",
1311
+ self._chat_agent_id(deployment),
1312
+ session_id,
1313
+ run_id,
1314
+ interaction_id,
1315
+ expected_revision,
1316
+ action,
1317
+ AgentEngineClient._safe_log_error_summary(
1318
+ details={"code": exc.raw_code, "message": exc.message}
1319
+ ),
1320
+ )
1321
+ raise StudioError(
1322
+ "CLOUD_INTERACTION_SUBMIT_FAILED",
1323
+ exc.message,
1324
+ status_code=502,
1325
+ details={
1326
+ "serverCode": exc.raw_code,
1327
+ **{
1328
+ key: value
1329
+ for key, value in exc.details.items()
1330
+ if key in {"request_id", "action", "http_status"}
1331
+ },
1332
+ },
1333
+ ) from exc
1267
1334
 
1268
- return await self.client.submit_interaction(
1269
- agent_id=self._chat_agent_id(deployment),
1270
- session_id=session_id,
1271
- run_id=run_id,
1272
- interaction_id=interaction_id,
1273
- expected_revision=expected_revision,
1274
- action=action,
1275
- response=response,
1276
- idempotency_key=idempotency_key,
1335
+ async def prepare_plugin_delivery(
1336
+ self, workspace: Workspace, build_id: str, manifest: str, runtime_version: str
1337
+ ) -> list[dict[str, Any]]:
1338
+ from ksadk.plugins.delivery import PluginDelivery
1339
+ from ksadk.studio.codex_builder import CodexStudioBuilder
1340
+
1341
+ builder = CodexStudioBuilder(workspace)
1342
+ build = builder.repository.get(build_id)
1343
+ if (
1344
+ build.runtime_version != runtime_version
1345
+ or build.manifest_sha256 != hashlib.sha256(manifest.encode()).hexdigest()
1346
+ ):
1347
+ raise StudioError(
1348
+ "PLUGIN_BUILD_MISMATCH", "部署声明与冻结 Build 不一致", status_code=409
1349
+ )
1350
+ receipt, archive = builder.export_plugin_artifact(build_id)
1351
+ object_key = f"plugin-artifacts/v1/{receipt.artifact_digest[7:]}.zip"
1352
+ uploader = self.uploader_factory(
1353
+ region=self.ks3_region,
1354
+ bucket=self.bucket,
1355
+ access_key=self._ks3_credentials["access_key"],
1356
+ secret_key=self._ks3_credentials["secret_key"],
1357
+ public_read=False,
1277
1358
  )
1359
+ artifact_path = await uploader.upload(archive, object_key)
1360
+ if not artifact_path:
1361
+ raise StudioError(
1362
+ "PLUGIN_UPLOAD_FAILED",
1363
+ "插件归档上传到 Agent 代码包 KS3 桶失败",
1364
+ status_code=502,
1365
+ )
1366
+ pinned = build.plugin_marketplace
1367
+ delivery = PluginDelivery(
1368
+ artifact_path=str(artifact_path),
1369
+ storage_region=self.ks3_region,
1370
+ receipt=receipt,
1371
+ build_id=build_id,
1372
+ manifest_sha256=build.manifest_sha256,
1373
+ marketplace_name=pinned.marketplace_name,
1374
+ plugin_names=list(pinned.plugin_names),
1375
+ snapshot_digest=pinned.marketplace_digest,
1376
+ bindings=[
1377
+ b
1378
+ for b in yaml.safe_load(manifest).get("plugins", [])
1379
+ if b.get("enabled", True) and b.get("ecosystem") == "codex"
1380
+ ],
1381
+ )
1382
+ delivery.validate_manifest(yaml.safe_load(manifest))
1383
+ return [delivery.model_dump()]
1278
1384
 
1279
1385
  async def create_managed_runtime_deployment(self, **kwargs) -> DeploymentRecord:
1280
1386
  request: DeploymentRequest = kwargs["request"]
1281
1387
  digest = str(kwargs["manifest_digest"])
1282
1388
  runtime_environment = dict(kwargs.get("runtime_environment") or {})
1283
- result = await self.client.create_agent(
1389
+ result = await self._managed_runtime_client().create_agent(
1284
1390
  self._managed_runtime_payload(
1285
1391
  agent_name=str(kwargs["agent_name"]),
1286
1392
  manifest=str(kwargs["manifest"]),
@@ -1288,6 +1394,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1288
1394
  runtime_version=str(kwargs["runtime_version"]),
1289
1395
  request=request,
1290
1396
  runtime_environment=runtime_environment,
1397
+ plugin_artifacts=kwargs.get("plugin_artifacts"),
1291
1398
  )
1292
1399
  )
1293
1400
  agent_id = str(result.get("agent_id") or "").strip()
@@ -1334,12 +1441,16 @@ class DirectAgentEngineCloudDeploymentGateway:
1334
1441
  "manifest": str(kwargs["manifest"]),
1335
1442
  },
1336
1443
  }
1444
+ if kwargs.get("plugin_artifacts"):
1445
+ update_payload["managed_runtime_config"]["plugin_artifacts"] = kwargs[
1446
+ "plugin_artifacts"
1447
+ ]
1337
1448
  if runtime_environment:
1338
1449
  # A changed MCP/model binding can introduce a new credential ref.
1339
1450
  # Re-resolve it for every immutable revision instead of relying on
1340
1451
  # the environment captured by the first CreateAgent call.
1341
1452
  update_payload["environment_variables"] = runtime_environment
1342
- await self.client.update_agent(
1453
+ await self._managed_runtime_client().update_agent(
1343
1454
  deployment.agent_id,
1344
1455
  update_payload,
1345
1456
  )
@@ -1398,6 +1509,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1398
1509
  runtime_version: str,
1399
1510
  request: DeploymentRequest,
1400
1511
  runtime_environment: dict[str, str] | None = None,
1512
+ plugin_artifacts: list[dict[str, Any]] | None = None,
1401
1513
  ) -> dict[str, Any]:
1402
1514
  payload = {
1403
1515
  "name": _server_agent_name(agent_name),
@@ -1420,6 +1532,8 @@ class DirectAgentEngineCloudDeploymentGateway:
1420
1532
  "scaling": {"min_replicas": 1, "max_replicas": 1, "concurrency": 20},
1421
1533
  "auth_type": "ApiKey",
1422
1534
  }
1535
+ if plugin_artifacts:
1536
+ payload["managed_runtime_config"]["plugin_artifacts"] = plugin_artifacts
1423
1537
  if runtime_environment:
1424
1538
  # Model credentials are resolved only for this in-memory deployment
1425
1539
  # request. They are never written into the YAML build or local
@@ -1527,6 +1641,28 @@ class CloudDeploymentService:
1527
1641
  status_code=409,
1528
1642
  details={"deploymentId": replacing.id},
1529
1643
  )
1644
+ plugin_artifacts = None
1645
+ if runtime_name == "codex":
1646
+ declaration = yaml.safe_load(manifest) or {}
1647
+ bindings = [
1648
+ b
1649
+ for b in declaration.get("plugins", [])
1650
+ if (
1651
+ not isinstance(b, dict)
1652
+ or (b.get("enabled", True) and b.get("ecosystem") == "codex")
1653
+ )
1654
+ ]
1655
+ if bindings:
1656
+ prepare = getattr(self.gateway, "prepare_plugin_delivery", None)
1657
+ if prepare is None:
1658
+ raise StudioError(
1659
+ "NATIVE_PLUGIN_DELIVERY_UNAVAILABLE",
1660
+ "云端尚未声明插件交付能力",
1661
+ status_code=409,
1662
+ )
1663
+ plugin_artifacts = await prepare(
1664
+ self.workspace, build_id, manifest, runtime_version
1665
+ )
1530
1666
  if replacing is None:
1531
1667
  record = await self.gateway.create_managed_runtime_deployment(
1532
1668
  build_id=build_id,
@@ -1537,18 +1673,45 @@ class CloudDeploymentService:
1537
1673
  manifest_digest=manifest_digest,
1538
1674
  request=request,
1539
1675
  runtime_environment=runtime_environment,
1676
+ plugin_artifacts=plugin_artifacts,
1540
1677
  )
1541
1678
  else:
1542
- record = await self.gateway.replace_managed_runtime_deployment(
1543
- replacing,
1544
- build_id=build_id,
1545
- manifest=manifest,
1546
- runtime_name=runtime_name,
1547
- runtime_version=runtime_version,
1548
- manifest_digest=manifest_digest,
1549
- request=request,
1550
- runtime_environment=runtime_environment,
1551
- )
1679
+ try:
1680
+ record = await self.gateway.replace_managed_runtime_deployment(
1681
+ replacing,
1682
+ build_id=build_id,
1683
+ manifest=manifest,
1684
+ runtime_name=runtime_name,
1685
+ runtime_version=runtime_version,
1686
+ manifest_digest=manifest_digest,
1687
+ request=request,
1688
+ runtime_environment=runtime_environment,
1689
+ plugin_artifacts=plugin_artifacts,
1690
+ )
1691
+ except (AgentEngineAPIError, StudioError) as error:
1692
+ status_code = (
1693
+ error.status_code
1694
+ if isinstance(error, StudioError)
1695
+ else error.details.get("http_status", error.code)
1696
+ )
1697
+ if status_code != 404:
1698
+ raise
1699
+ # Local receipts may outlive an Agent removed through the
1700
+ # console or another client. The authoritative 404 means this
1701
+ # is a fresh create, while all other update failures remain
1702
+ # fail-closed to avoid duplicate Agents.
1703
+ record = await self.gateway.create_managed_runtime_deployment(
1704
+ build_id=build_id,
1705
+ agent_name=agent_name,
1706
+ manifest=manifest,
1707
+ runtime_name=runtime_name,
1708
+ runtime_version=runtime_version,
1709
+ manifest_digest=manifest_digest,
1710
+ request=request,
1711
+ runtime_environment=runtime_environment,
1712
+ plugin_artifacts=plugin_artifacts,
1713
+ )
1714
+ record = self._capture_creator(record, replacing)
1552
1715
  self._save(record, request)
1553
1716
  return record
1554
1717
 
@@ -1586,9 +1749,30 @@ class CloudDeploymentService:
1586
1749
  bundle_digest=build.bundle_digest,
1587
1750
  request=request,
1588
1751
  )
1752
+ record = self._capture_creator(record, replacing)
1589
1753
  self._save(record, request)
1590
1754
  return record
1591
1755
 
1756
+ def cached_identity(self) -> dict[str, str] | None:
1757
+ reader = getattr(self.gateway, "cached_identity", None)
1758
+ return reader() if reader else None
1759
+
1760
+ def _capture_creator(
1761
+ self, record: DeploymentRecord, replacing: DeploymentRecord | None
1762
+ ) -> DeploymentRecord:
1763
+ if replacing is not None:
1764
+ return record.model_copy(update={
1765
+ "created_by_name": replacing.created_by_name,
1766
+ "created_by_user_id": replacing.created_by_user_id,
1767
+ })
1768
+ identity = self.cached_identity()
1769
+ if not identity:
1770
+ return record
1771
+ return record.model_copy(update={
1772
+ "created_by_name": identity["userName"],
1773
+ "created_by_user_id": identity["userId"],
1774
+ })
1775
+
1592
1776
  def _prepared_build(self, build_id: str) -> tuple[BuildRecord, bytes, dict[str, Any]]:
1593
1777
  build = self.build_repository.get(build_id)
1594
1778
  if build.status != BuildStatus.SUCCEEDED or not build.artifact_path:
@@ -1599,6 +1783,7 @@ class CloudDeploymentService:
1599
1783
  )
1600
1784
  archive = self.workspace.resolve(build.artifact_path, must_exist=True)
1601
1785
  bundle = archive.read_bytes()
1786
+ self._reject_local_only_materializers(bundle, artifact_name=archive.name)
1602
1787
  checked_bundle = (
1603
1788
  preflight_hosted_kernel_bundle(bundle)
1604
1789
  if getattr(self.gateway, "requires_hosted_kernel_bundle_preflight", False)
@@ -1637,6 +1822,63 @@ class CloudDeploymentService:
1637
1822
  provenance["runtimeType"] = str(manifest.get("runtimeType") or build.runtime_type)
1638
1823
  return build, bundle, provenance
1639
1824
 
1825
+ @staticmethod
1826
+ def _reject_local_only_materializers(
1827
+ bundle_bytes: bytes,
1828
+ *,
1829
+ artifact_name: str,
1830
+ ) -> None:
1831
+ """Check the exact bytes that will be uploaded for local-only materializers."""
1832
+
1833
+ try:
1834
+ with zipfile.ZipFile(io.BytesIO(bundle_bytes)) as bundle:
1835
+
1836
+ def load_optional(name: str) -> dict[str, Any]:
1837
+ try:
1838
+ info = bundle.getinfo(name)
1839
+ except KeyError:
1840
+ return {}
1841
+ if info.file_size > 8 * 1024 * 1024:
1842
+ raise ValueError(f"{name} is too large")
1843
+ payload = json.loads(bundle.read(info).decode("utf-8"))
1844
+ if not isinstance(payload, dict):
1845
+ raise ValueError(f"{name} must be an object")
1846
+ return payload
1847
+
1848
+ composition = load_optional("composition-profile.json")
1849
+ resolved = load_optional("resolved-agent-spec.json")
1850
+ except (
1851
+ OSError,
1852
+ UnicodeError,
1853
+ ValueError,
1854
+ zipfile.BadZipFile,
1855
+ json.JSONDecodeError,
1856
+ ) as error:
1857
+ raise StudioError(
1858
+ "BUILD_ARTIFACT_INVALID",
1859
+ "部署前无法验证 Bundle 的本地运行时依赖",
1860
+ status_code=422,
1861
+ details={"buildArtifact": artifact_name},
1862
+ ) from error
1863
+
1864
+ dynamic_ref = any(
1865
+ isinstance(item, dict)
1866
+ and str(item.get("ref") or "").startswith("plugin://io.ksadk.mcp.dsh-profile@")
1867
+ for item in composition.get("capabilities", [])
1868
+ )
1869
+ resolved_capabilities = resolved.get("capabilities")
1870
+ dynamic_server = isinstance(resolved_capabilities, dict) and any(
1871
+ isinstance(item, dict) and item.get("materialization") == "dsh-profile"
1872
+ for item in resolved_capabilities.get("mcpServers", [])
1873
+ )
1874
+ if dynamic_ref or dynamic_server:
1875
+ raise StudioError(
1876
+ "DSH_MCP_DEPLOYMENT_UNSUPPORTED",
1877
+ "DSH Profile MCP 当前只能由本地 Studio 按 activation 物化,尚不能部署到云端",
1878
+ status_code=422,
1879
+ details={"materialization": "dsh-profile"},
1880
+ )
1881
+
1640
1882
  def get(self, deployment_id: str) -> DeploymentRecord:
1641
1883
  path = self.workspace.resolve(Path(".agentkit/deployments") / f"{deployment_id}.json")
1642
1884
  if not path.is_file():
@@ -1751,9 +1993,7 @@ class CloudDeploymentService:
1751
1993
  )
1752
1994
  await deleter(deployment)
1753
1995
 
1754
- deleted_receipts = self._delete_receipts_for_agent(
1755
- agent_id, required=deployment
1756
- )
1996
+ deleted_receipts = self._delete_receipts_for_agent(agent_id, required=deployment)
1757
1997
  return {"agentId": agent_id, "deletedReceiptIds": deleted_receipts}
1758
1998
 
1759
1999
  def _delete_receipts_for_agent(
@@ -1818,9 +2058,7 @@ class CloudDeploymentService:
1818
2058
  )
1819
2059
  return await rollback(agent_id, version_id=version_id)
1820
2060
 
1821
- async def account_agent_dashboard_access(
1822
- self, agent_id: str
1823
- ) -> dict[str, str | None]:
2061
+ async def account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
1824
2062
  reader = getattr(self.gateway, "get_account_agent_dashboard_access", None)
1825
2063
  if reader is None:
1826
2064
  raise StudioError(
@@ -1844,9 +2082,7 @@ class CloudDeploymentService:
1844
2082
  "deletedReceiptIds": self._delete_receipts_for_agent(agent_id),
1845
2083
  }
1846
2084
 
1847
- async def _chat_target(
1848
- self, target_id: str
1849
- ) -> DeploymentRecord | AccountCloudAgentReference:
2085
+ async def _chat_target(self, target_id: str) -> DeploymentRecord | AccountCloudAgentReference:
1850
2086
  if not target_id.startswith("account:"):
1851
2087
  return self.get(target_id)
1852
2088
  agent_id = target_id.removeprefix("account:").strip()
@@ -1901,6 +2137,7 @@ class CloudDeploymentService:
1901
2137
  *,
1902
2138
  session_id: str,
1903
2139
  after_seq_id: int | None = None,
2140
+ before_seq_id: int | None = None,
1904
2141
  limit: int = 100,
1905
2142
  ) -> dict[str, Any]:
1906
2143
  deployment = await self._chat_target(deployment_id)
@@ -1915,6 +2152,7 @@ class CloudDeploymentService:
1915
2152
  deployment,
1916
2153
  session_id=session_id,
1917
2154
  after_seq_id=after_seq_id,
2155
+ before_seq_id=before_seq_id,
1918
2156
  limit=limit,
1919
2157
  )
1920
2158