agentengine-sdk-python 0.8.2__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 (563) hide show
  1. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
  2. agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/agui/_agent_helpers.py +4 -0
  5. ksadk/api/client.py +108 -91
  6. ksadk/builders/code_builder.py +36 -9
  7. ksadk/builders/framework_requirements.py +2 -1
  8. ksadk/builders/ks3_uploader.py +36 -7
  9. ksadk/builders/managed_runtime_builder.py +4 -0
  10. ksadk/cli/__init__.py +38 -3
  11. ksadk/cli/cmd_managed_runtime.py +13 -1
  12. ksadk/cli/cmd_plugin.py +662 -0
  13. ksadk/cli/cmd_web.py +2 -5
  14. ksadk/cli/runtime_bootstrap.py +23 -1
  15. ksadk/codex/client.py +424 -96
  16. ksadk/codex/projection.py +24 -0
  17. ksadk/codex/runtime.py +83 -283
  18. ksadk/common/auth.py +16 -10
  19. ksadk/configs/env_registry.py +59 -3
  20. ksadk/configs/settings.py +9 -0
  21. ksadk/context_engine/contributors.py +73 -8
  22. ksadk/conversations/__init__.py +19 -0
  23. ksadk/conversations/context.py +104 -24
  24. ksadk/conversations/contracts.py +266 -0
  25. ksadk/conversations/message_projection.py +154 -15
  26. ksadk/conversations/projector.py +614 -0
  27. ksadk/conversations/reducer.py +98 -0
  28. ksadk/conversations/runtime_invocation.py +5 -0
  29. ksadk/conversations/runtime_payloads.py +1 -0
  30. ksadk/conversations/runtime_preparation.py +30 -27
  31. ksadk/conversations/runtime_resume.py +50 -2
  32. ksadk/conversations/runtime_stream_events.py +5 -0
  33. ksadk/conversations/runtime_streaming.py +25 -7
  34. ksadk/deployment/env_forward.py +2 -2
  35. ksadk/deployment/providers/serverless.py +1 -1
  36. ksadk/events/_v1_compat/projection.py +2 -0
  37. ksadk/events/adapters/_codex_validators.py +18 -7
  38. ksadk/events/adapters/codex.py +190 -0
  39. ksadk/events/adapters/langgraph.py +15 -1
  40. ksadk/events/canonical_store.py +3 -1
  41. ksadk/events/projections.py +1 -1
  42. ksadk/harness/__init__.py +45 -35
  43. ksadk/harness/config.py +2 -2
  44. ksadk/harness/runtime.py +75 -16
  45. ksadk/harness/tools.py +38 -13
  46. ksadk/interaction/provider.py +1 -0
  47. ksadk/interaction/providers/langgraph.py +1 -0
  48. ksadk/kernel/bootstrap.py +28 -4
  49. ksadk/kernel/contract_fingerprints.py +5 -4
  50. ksadk/kernel/contracts.py +8 -0
  51. ksadk/kernel/control.py +1 -0
  52. ksadk/kernel/ingress.py +36 -2
  53. ksadk/kernel/memory_store.py +1 -0
  54. ksadk/kernel/postgres_store.py +1 -0
  55. ksadk/kernel/sqlite_store.py +28 -0
  56. ksadk/kernel/store.py +3 -0
  57. ksadk/kernel/worker.py +76 -10
  58. ksadk/knowledge_base/client.py +57 -27
  59. ksadk/mcp_runtime/__init__.py +12 -4
  60. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  61. ksadk/memory/adk/resilient_session_service.py +25 -17
  62. ksadk/memory/adk/short_term_memory.py +26 -9
  63. ksadk/memory/models.py +7 -4
  64. ksadk/memory/provider_resolver.py +3 -0
  65. ksadk/memory/providers/local_sqlite.py +7 -0
  66. ksadk/model_proxy/server.py +10 -5
  67. ksadk/plugins/__init__.py +171 -0
  68. ksadk/plugins/artifacts.py +275 -0
  69. ksadk/plugins/bridges/__init__.py +47 -0
  70. ksadk/plugins/bridges/codex.py +659 -0
  71. ksadk/plugins/bridges/dsh.py +1300 -0
  72. ksadk/plugins/builtins.py +746 -0
  73. ksadk/plugins/bundle.py +246 -0
  74. ksadk/plugins/bundle_security.py +191 -0
  75. ksadk/plugins/codex_manifest.py +983 -0
  76. ksadk/plugins/composition.py +537 -0
  77. ksadk/plugins/context_contributor.py +437 -0
  78. ksadk/plugins/contracts.py +569 -0
  79. ksadk/plugins/delivery.py +153 -0
  80. ksadk/plugins/dsh_installation_digest.py +71 -0
  81. ksadk/plugins/dsh_toolchain.py +1024 -0
  82. ksadk/plugins/ecosystem_bridge.py +1105 -0
  83. ksadk/plugins/ecosystem_probe.py +191 -0
  84. ksadk/plugins/host.py +787 -0
  85. ksadk/plugins/kernel_adapter.py +205 -0
  86. ksadk/plugins/providers/__init__.py +108 -0
  87. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  88. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  89. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  90. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  91. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  92. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  93. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  94. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  95. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  96. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  97. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  98. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  99. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  100. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  101. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  102. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  103. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  104. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  105. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  106. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  107. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  108. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  109. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  110. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  111. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  112. ksadk/plugins/providers/codex.py +988 -0
  113. ksadk/plugins/providers/codex_dsh.py +83 -0
  114. ksadk/plugins/providers/codex_native.py +368 -0
  115. ksadk/plugins/providers/codex_turn.py +301 -0
  116. ksadk/plugins/providers/dsh.py +951 -0
  117. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  118. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  119. ksadk/plugins/providers/dsh_mcp.py +467 -0
  120. ksadk/plugins/providers/harness.py +632 -0
  121. ksadk/plugins/providers/harness_dsh.py +91 -0
  122. ksadk/plugins/providers/legacy.py +215 -0
  123. ksadk/plugins/providers/legacy_catalog.py +100 -0
  124. ksadk/plugins/providers/mcp_projection.py +150 -0
  125. ksadk/plugins/providers/platform_resources.py +657 -0
  126. ksadk/plugins/providers/shipped_dsh.py +370 -0
  127. ksadk/plugins/resolver.py +338 -0
  128. ksadk/plugins/subagent_providers/__init__.py +12 -0
  129. ksadk/plugins/subagent_providers/codex.py +443 -0
  130. ksadk/plugins/subagents.py +333 -0
  131. ksadk/resource_runtime/__init__.py +4 -0
  132. ksadk/resource_runtime/broker.py +616 -0
  133. ksadk/resource_runtime/build_artifacts.py +165 -0
  134. ksadk/resource_runtime/contracts.py +138 -0
  135. ksadk/resource_runtime/discovery_receipts.py +100 -0
  136. ksadk/resource_runtime/discovery_skills.py +172 -0
  137. ksadk/resource_runtime/errors.py +6 -0
  138. ksadk/resource_runtime/ipc.py +142 -0
  139. ksadk/resource_runtime/kernel_approval.py +165 -0
  140. ksadk/resource_runtime/knowledge.py +114 -0
  141. ksadk/resource_runtime/langgraph.py +94 -0
  142. ksadk/resource_runtime/leases.py +191 -0
  143. ksadk/resource_runtime/managed_projection.py +186 -0
  144. ksadk/resource_runtime/mcp_server.py +138 -0
  145. ksadk/resource_runtime/memory_provider.py +318 -0
  146. ksadk/resource_runtime/memory_receipts.py +34 -0
  147. ksadk/resource_runtime/operation_ledger.py +211 -0
  148. ksadk/resource_runtime/plugin_config.py +48 -0
  149. ksadk/resource_runtime/policy_authorization.py +54 -0
  150. ksadk/resource_runtime/process.py +110 -0
  151. ksadk/resource_runtime/skill_artifacts.py +153 -0
  152. ksadk/resource_runtime/skill_runtime.py +42 -0
  153. ksadk/resource_runtime/skill_workspace.py +118 -0
  154. ksadk/resource_runtime/skills.py +215 -0
  155. ksadk/resource_runtime/snapshots.py +180 -0
  156. ksadk/resource_runtime/socket_server.py +103 -0
  157. ksadk/resource_runtime/supervisor.py +380 -0
  158. ksadk/resource_runtime/worker.py +504 -0
  159. ksadk/runners/_langgraph_runner_streams.py +74 -6
  160. ksadk/runners/adk_runner.py +149 -11
  161. ksadk/runners/base_runner.py +29 -1
  162. ksadk/runners/langgraph_runner.py +475 -145
  163. ksadk/runtime/_runner_adapter/stream_mapping.py +193 -60
  164. ksadk/runtime/adapter.py +3 -0
  165. ksadk/runtime/conversation_execution.py +92 -16
  166. ksadk/runtime/executor.py +78 -2
  167. ksadk/runtime/factory.py +30 -200
  168. ksadk/runtime/framework_adapters.py +41 -0
  169. ksadk/runtime/preprocessing.py +10 -2
  170. ksadk/runtime/runner_adapter.py +78 -14
  171. ksadk/runtime_context.py +40 -2
  172. ksadk/sandbox/__init__.py +2 -1
  173. ksadk/sandbox/backends/e2b.py +52 -11
  174. ksadk/sandbox/backends/local_process.py +9 -0
  175. ksadk/sandbox/base.py +2 -0
  176. ksadk/sandbox/e2b_connection.py +66 -0
  177. ksadk/sandbox/factory.py +72 -0
  178. ksadk/scheduler/__init__.py +18 -0
  179. ksadk/scheduler/calendar.py +102 -0
  180. ksadk/scheduler/contracts.py +254 -0
  181. ksadk/scheduler/dispatcher.py +129 -0
  182. ksadk/scheduler/engine.py +416 -0
  183. ksadk/scheduler/sqlite_store.py +581 -0
  184. ksadk/server/composition.py +2 -0
  185. ksadk/server/factory.py +5 -0
  186. ksadk/server/persistence_capability.py +516 -0
  187. ksadk/server/routes/control.py +210 -46
  188. ksadk/server/routes/dependencies.py +15 -0
  189. ksadk/server/routes/models.py +47 -4
  190. ksadk/server/routes/projection.py +252 -12
  191. ksadk/server/routes/sessions.py +284 -107
  192. ksadk/server/routes/streaming.py +43 -9
  193. ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  194. ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
  195. ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  196. ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  197. ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  198. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  199. ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
  200. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  201. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  202. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  203. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  204. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  205. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  206. ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  207. ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  208. ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  209. ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  210. ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  211. ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  212. ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  213. ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  214. ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  215. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  216. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  217. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  218. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  219. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  220. ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  221. ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
  222. ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  223. ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  224. ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  225. ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  226. ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  227. ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
  228. ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
  229. ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
  230. ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
  231. ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
  232. ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
  233. ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
  234. ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
  235. ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
  236. ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
  237. ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
  238. ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
  239. ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
  240. ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
  241. ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
  242. ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
  243. ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
  244. ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
  245. ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
  246. ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
  247. ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
  248. ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
  249. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  250. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  251. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  252. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  253. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  254. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  255. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  256. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  257. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  258. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  259. ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  260. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  261. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  262. ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  263. ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
  264. ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
  265. ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  266. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  267. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  268. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  269. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  270. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  271. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  272. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  273. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  274. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  275. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  276. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  277. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  278. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  279. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  280. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  281. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  282. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  283. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  284. ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  285. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  286. ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  287. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  288. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  289. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  290. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  291. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  292. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  293. ksadk/server/static/index.html +2 -2
  294. ksadk/session_context.py +66 -0
  295. ksadk/sessions/__init__.py +11 -21
  296. ksadk/sessions/_local_service_sync.py +263 -1
  297. ksadk/sessions/base.py +176 -0
  298. ksadk/sessions/errors.py +4 -0
  299. ksadk/sessions/in_memory.py +309 -19
  300. ksadk/sessions/local_service.py +83 -1
  301. ksadk/sessions/persistence.py +275 -0
  302. ksadk/sessions/postgres_service.py +358 -0
  303. ksadk/sessions/resilience.py +8 -0
  304. ksadk/sessions/resilient.py +362 -4
  305. ksadk/sessions/topology.py +135 -0
  306. ksadk/skills/models.py +26 -4
  307. ksadk/skills/package_store.py +186 -38
  308. ksadk/skills/runtime/agent.py +31 -6
  309. ksadk/skills/runtime/artifact_delivery.py +139 -0
  310. ksadk/skills/runtime/backends/e2b.py +98 -6
  311. ksadk/skills/runtime/backends/local.py +73 -8
  312. ksadk/skills/runtime/base.py +3 -0
  313. ksadk/skills/runtime/executor.py +2 -0
  314. ksadk/skills/runtime/loader.py +10 -2
  315. ksadk/skills/runtime/pinned.py +114 -0
  316. ksadk/skills/runtime/request.py +31 -0
  317. ksadk/skills/service_client.py +211 -24
  318. ksadk/studio/agent_lifecycle.py +26 -20
  319. ksadk/studio/api.py +714 -90
  320. ksadk/studio/api_catalog_routes.py +23 -0
  321. ksadk/studio/api_contracts.py +34 -1
  322. ksadk/studio/api_plugin_routes.py +911 -0
  323. ksadk/studio/api_resource_connections.py +183 -0
  324. ksadk/studio/attachment_store.py +187 -0
  325. ksadk/studio/authoring.py +10 -4
  326. ksadk/studio/authoring_coordinator.py +31 -16
  327. ksadk/studio/builder.py +199 -43
  328. ksadk/studio/cloud.py +346 -104
  329. ksadk/studio/cloud_shared_web.py +565 -0
  330. ksadk/studio/codex_agent_service.py +140 -27
  331. ksadk/studio/codex_builder.py +294 -16
  332. ksadk/studio/codex_credentials.py +90 -0
  333. ksadk/studio/codex_manifest.py +51 -4
  334. ksadk/studio/codex_plugin_store.py +746 -0
  335. ksadk/studio/codex_provider_build.py +231 -0
  336. ksadk/studio/codex_run.py +200 -29
  337. ksadk/studio/compatibility_report.py +456 -0
  338. ksadk/studio/compiler.py +84 -15
  339. ksadk/studio/contracts.py +249 -4
  340. ksadk/studio/dsh_application.py +137 -0
  341. ksadk/studio/dsh_capability_service.py +1107 -0
  342. ksadk/studio/dsh_models.py +59 -0
  343. ksadk/studio/dsh_provider_registration.py +1075 -0
  344. ksadk/studio/event_store.py +54 -6
  345. ksadk/studio/framework_run.py +37 -4
  346. ksadk/studio/hosted_kernel.py +89 -14
  347. ksadk/studio/mcp_runtime.py +11 -3
  348. ksadk/studio/model_client.py +2 -2
  349. ksadk/studio/operations.py +12 -2
  350. ksadk/studio/plugin_composition.py +468 -0
  351. ksadk/studio/plugin_kernel_adapter.py +28 -0
  352. ksadk/studio/plugin_runtime.py +831 -0
  353. ksadk/studio/resource_authority.py +637 -0
  354. ksadk/studio/resource_binding_validation.py +77 -0
  355. ksadk/studio/resource_build_admission.py +196 -0
  356. ksadk/studio/resource_build_materializer.py +149 -0
  357. ksadk/studio/resource_catalog.py +149 -3
  358. ksadk/studio/resource_connections.py +220 -0
  359. ksadk/studio/run_service.py +1144 -96
  360. ksadk/studio/runtime_source.py +24 -8
  361. ksadk/studio/scheduler_assistant.py +317 -0
  362. ksadk/studio/scheduler_runtime.py +383 -0
  363. ksadk/studio/scheduler_service.py +214 -0
  364. ksadk/studio/service.py +1131 -95
  365. ksadk/studio/shared_web.py +610 -87
  366. ksadk/studio/soul.py +52 -0
  367. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  368. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  369. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  372. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  373. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  377. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  378. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  379. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  380. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  381. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  382. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  383. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  384. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  385. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  386. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  387. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  388. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  389. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  390. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  391. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  392. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  393. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  394. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  395. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  396. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  397. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  398. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  399. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  400. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  401. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  402. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  403. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  404. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  405. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  406. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  407. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  408. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  409. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  410. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  411. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  412. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  413. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  414. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  415. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  416. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  417. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  418. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  419. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  420. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  421. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  422. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  423. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  424. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  425. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  426. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  427. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  428. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  429. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  430. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  431. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  432. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  433. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  434. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  435. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  436. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  437. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  438. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  439. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  440. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  441. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  442. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  443. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  444. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  445. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  446. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  447. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  448. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  449. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  450. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  451. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  452. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  453. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  454. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  455. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  456. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  457. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  458. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  459. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  460. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  461. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  462. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  463. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  464. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  465. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  466. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  467. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  468. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  469. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  470. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  471. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  472. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  473. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  474. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  475. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  476. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  477. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  478. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  479. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  480. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  481. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  482. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  483. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  484. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  485. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  486. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  487. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  488. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  489. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  490. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  491. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  492. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  493. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  494. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  495. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  496. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  497. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  498. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  499. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  500. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  501. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  502. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  503. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  504. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  505. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  506. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  507. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  508. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  509. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  510. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  511. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  512. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  513. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  514. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  515. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  516. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  517. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  518. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  519. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  520. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  521. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  522. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  523. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  524. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  525. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  526. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  527. ksadk/studio/static/index.html +2 -2
  528. ksadk/studio/validator.py +1 -1
  529. ksadk/studio/workspace.py +1 -0
  530. ksadk/version.py +1 -1
  531. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  532. agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
  533. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
  534. ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
  535. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
  536. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
  537. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
  538. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
  539. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
  540. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
  541. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
  542. ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
  543. ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
  544. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
  545. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
  546. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
  547. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
  548. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
  549. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
  550. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
  551. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
  552. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
  553. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
  554. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
  555. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
  556. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
  557. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  558. ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
  559. ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
  560. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  561. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  562. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  563. {agentengine_sdk_python-0.8.2.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:
@@ -1151,6 +1178,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1151
1178
  *,
1152
1179
  session_id: str,
1153
1180
  after_seq_id: int | None = None,
1181
+ offset: int | None = None,
1154
1182
  limit: int = 200,
1155
1183
  ) -> dict[str, Any]:
1156
1184
  """Read canonical events, including public Interaction/v1 frames."""
@@ -1160,6 +1188,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1160
1188
  agent_id=self._chat_agent_id(deployment),
1161
1189
  session_id=session_id,
1162
1190
  after_seq_id=after_seq_id,
1191
+ offset=offset,
1163
1192
  limit=limit,
1164
1193
  )
1165
1194
  except AgentEngineAPIError as exc:
@@ -1240,14 +1269,10 @@ class DirectAgentEngineCloudDeploymentGateway:
1240
1269
  },
1241
1270
  ) from exc
1242
1271
 
1243
- async def list_deployment_chat_models(
1244
- self, deployment: DeploymentRecord
1245
- ) -> dict[str, Any]:
1272
+ async def list_deployment_chat_models(self, deployment: DeploymentRecord) -> dict[str, Any]:
1246
1273
  """Read the Server-authoritative model catalog for this Agent."""
1247
1274
 
1248
- return await self.client.list_agent_models(
1249
- agent_id=self._chat_agent_id(deployment)
1250
- )
1275
+ return await self.client.list_agent_models(agent_id=self._chat_agent_id(deployment))
1251
1276
 
1252
1277
  async def submit_deployment_chat_interaction(
1253
1278
  self,
@@ -1262,23 +1287,106 @@ class DirectAgentEngineCloudDeploymentGateway:
1262
1287
  idempotency_key: str,
1263
1288
  ) -> dict[str, Any]:
1264
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
1265
1334
 
1266
- return await self.client.submit_interaction(
1267
- agent_id=self._chat_agent_id(deployment),
1268
- session_id=session_id,
1269
- run_id=run_id,
1270
- interaction_id=interaction_id,
1271
- expected_revision=expected_revision,
1272
- action=action,
1273
- response=response,
1274
- 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,
1275
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()]
1276
1384
 
1277
1385
  async def create_managed_runtime_deployment(self, **kwargs) -> DeploymentRecord:
1278
1386
  request: DeploymentRequest = kwargs["request"]
1279
1387
  digest = str(kwargs["manifest_digest"])
1280
1388
  runtime_environment = dict(kwargs.get("runtime_environment") or {})
1281
- result = await self.client.create_agent(
1389
+ result = await self._managed_runtime_client().create_agent(
1282
1390
  self._managed_runtime_payload(
1283
1391
  agent_name=str(kwargs["agent_name"]),
1284
1392
  manifest=str(kwargs["manifest"]),
@@ -1286,6 +1394,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1286
1394
  runtime_version=str(kwargs["runtime_version"]),
1287
1395
  request=request,
1288
1396
  runtime_environment=runtime_environment,
1397
+ plugin_artifacts=kwargs.get("plugin_artifacts"),
1289
1398
  )
1290
1399
  )
1291
1400
  agent_id = str(result.get("agent_id") or "").strip()
@@ -1332,12 +1441,16 @@ class DirectAgentEngineCloudDeploymentGateway:
1332
1441
  "manifest": str(kwargs["manifest"]),
1333
1442
  },
1334
1443
  }
1444
+ if kwargs.get("plugin_artifacts"):
1445
+ update_payload["managed_runtime_config"]["plugin_artifacts"] = kwargs[
1446
+ "plugin_artifacts"
1447
+ ]
1335
1448
  if runtime_environment:
1336
1449
  # A changed MCP/model binding can introduce a new credential ref.
1337
1450
  # Re-resolve it for every immutable revision instead of relying on
1338
1451
  # the environment captured by the first CreateAgent call.
1339
1452
  update_payload["environment_variables"] = runtime_environment
1340
- await self.client.update_agent(
1453
+ await self._managed_runtime_client().update_agent(
1341
1454
  deployment.agent_id,
1342
1455
  update_payload,
1343
1456
  )
@@ -1396,6 +1509,7 @@ class DirectAgentEngineCloudDeploymentGateway:
1396
1509
  runtime_version: str,
1397
1510
  request: DeploymentRequest,
1398
1511
  runtime_environment: dict[str, str] | None = None,
1512
+ plugin_artifacts: list[dict[str, Any]] | None = None,
1399
1513
  ) -> dict[str, Any]:
1400
1514
  payload = {
1401
1515
  "name": _server_agent_name(agent_name),
@@ -1418,6 +1532,8 @@ class DirectAgentEngineCloudDeploymentGateway:
1418
1532
  "scaling": {"min_replicas": 1, "max_replicas": 1, "concurrency": 20},
1419
1533
  "auth_type": "ApiKey",
1420
1534
  }
1535
+ if plugin_artifacts:
1536
+ payload["managed_runtime_config"]["plugin_artifacts"] = plugin_artifacts
1421
1537
  if runtime_environment:
1422
1538
  # Model credentials are resolved only for this in-memory deployment
1423
1539
  # request. They are never written into the YAML build or local
@@ -1525,6 +1641,28 @@ class CloudDeploymentService:
1525
1641
  status_code=409,
1526
1642
  details={"deploymentId": replacing.id},
1527
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
+ )
1528
1666
  if replacing is None:
1529
1667
  record = await self.gateway.create_managed_runtime_deployment(
1530
1668
  build_id=build_id,
@@ -1535,18 +1673,45 @@ class CloudDeploymentService:
1535
1673
  manifest_digest=manifest_digest,
1536
1674
  request=request,
1537
1675
  runtime_environment=runtime_environment,
1676
+ plugin_artifacts=plugin_artifacts,
1538
1677
  )
1539
1678
  else:
1540
- record = await self.gateway.replace_managed_runtime_deployment(
1541
- replacing,
1542
- build_id=build_id,
1543
- manifest=manifest,
1544
- runtime_name=runtime_name,
1545
- runtime_version=runtime_version,
1546
- manifest_digest=manifest_digest,
1547
- request=request,
1548
- runtime_environment=runtime_environment,
1549
- )
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)
1550
1715
  self._save(record, request)
1551
1716
  return record
1552
1717
 
@@ -1584,9 +1749,30 @@ class CloudDeploymentService:
1584
1749
  bundle_digest=build.bundle_digest,
1585
1750
  request=request,
1586
1751
  )
1752
+ record = self._capture_creator(record, replacing)
1587
1753
  self._save(record, request)
1588
1754
  return record
1589
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
+
1590
1776
  def _prepared_build(self, build_id: str) -> tuple[BuildRecord, bytes, dict[str, Any]]:
1591
1777
  build = self.build_repository.get(build_id)
1592
1778
  if build.status != BuildStatus.SUCCEEDED or not build.artifact_path:
@@ -1597,6 +1783,7 @@ class CloudDeploymentService:
1597
1783
  )
1598
1784
  archive = self.workspace.resolve(build.artifact_path, must_exist=True)
1599
1785
  bundle = archive.read_bytes()
1786
+ self._reject_local_only_materializers(bundle, artifact_name=archive.name)
1600
1787
  checked_bundle = (
1601
1788
  preflight_hosted_kernel_bundle(bundle)
1602
1789
  if getattr(self.gateway, "requires_hosted_kernel_bundle_preflight", False)
@@ -1635,6 +1822,63 @@ class CloudDeploymentService:
1635
1822
  provenance["runtimeType"] = str(manifest.get("runtimeType") or build.runtime_type)
1636
1823
  return build, bundle, provenance
1637
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
+
1638
1882
  def get(self, deployment_id: str) -> DeploymentRecord:
1639
1883
  path = self.workspace.resolve(Path(".agentkit/deployments") / f"{deployment_id}.json")
1640
1884
  if not path.is_file():
@@ -1749,9 +1993,7 @@ class CloudDeploymentService:
1749
1993
  )
1750
1994
  await deleter(deployment)
1751
1995
 
1752
- deleted_receipts = self._delete_receipts_for_agent(
1753
- agent_id, required=deployment
1754
- )
1996
+ deleted_receipts = self._delete_receipts_for_agent(agent_id, required=deployment)
1755
1997
  return {"agentId": agent_id, "deletedReceiptIds": deleted_receipts}
1756
1998
 
1757
1999
  def _delete_receipts_for_agent(
@@ -1816,9 +2058,7 @@ class CloudDeploymentService:
1816
2058
  )
1817
2059
  return await rollback(agent_id, version_id=version_id)
1818
2060
 
1819
- async def account_agent_dashboard_access(
1820
- self, agent_id: str
1821
- ) -> dict[str, str | None]:
2061
+ async def account_agent_dashboard_access(self, agent_id: str) -> dict[str, str | None]:
1822
2062
  reader = getattr(self.gateway, "get_account_agent_dashboard_access", None)
1823
2063
  if reader is None:
1824
2064
  raise StudioError(
@@ -1842,9 +2082,7 @@ class CloudDeploymentService:
1842
2082
  "deletedReceiptIds": self._delete_receipts_for_agent(agent_id),
1843
2083
  }
1844
2084
 
1845
- async def _chat_target(
1846
- self, target_id: str
1847
- ) -> DeploymentRecord | AccountCloudAgentReference:
2085
+ async def _chat_target(self, target_id: str) -> DeploymentRecord | AccountCloudAgentReference:
1848
2086
  if not target_id.startswith("account:"):
1849
2087
  return self.get(target_id)
1850
2088
  agent_id = target_id.removeprefix("account:").strip()
@@ -1899,6 +2137,7 @@ class CloudDeploymentService:
1899
2137
  *,
1900
2138
  session_id: str,
1901
2139
  after_seq_id: int | None = None,
2140
+ before_seq_id: int | None = None,
1902
2141
  limit: int = 100,
1903
2142
  ) -> dict[str, Any]:
1904
2143
  deployment = await self._chat_target(deployment_id)
@@ -1913,6 +2152,7 @@ class CloudDeploymentService:
1913
2152
  deployment,
1914
2153
  session_id=session_id,
1915
2154
  after_seq_id=after_seq_id,
2155
+ before_seq_id=before_seq_id,
1916
2156
  limit=limit,
1917
2157
  )
1918
2158
 
@@ -1922,6 +2162,7 @@ class CloudDeploymentService:
1922
2162
  *,
1923
2163
  session_id: str,
1924
2164
  after_seq_id: int | None = None,
2165
+ offset: int | None = None,
1925
2166
  limit: int = 200,
1926
2167
  ) -> dict[str, Any]:
1927
2168
  deployment = await self._chat_target(deployment_id)
@@ -1936,6 +2177,7 @@ class CloudDeploymentService:
1936
2177
  deployment,
1937
2178
  session_id=session_id,
1938
2179
  after_seq_id=after_seq_id,
2180
+ offset=offset,
1939
2181
  limit=limit,
1940
2182
  )
1941
2183