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
@@ -12,7 +12,7 @@ from pathlib import Path
12
12
  from typing import Any, Callable, Literal, cast
13
13
 
14
14
  import yaml # type: ignore[import-untyped]
15
- from pydantic import ValidationError
15
+ from pydantic import ValidationError, model_validator
16
16
 
17
17
  from ksadk.builders.managed_runtime_builder import (
18
18
  ManagedRuntimeBuilder,
@@ -24,9 +24,25 @@ from ksadk.managed_runtime import (
24
24
  validate_installed_runtime,
25
25
  validate_runtime_binary,
26
26
  )
27
+ from ksadk.plugins.artifacts import PluginArtifactReceipt
28
+ from ksadk.plugins.contracts import (
29
+ LockedPluginComponent,
30
+ PluginLock,
31
+ PluginLockEntry,
32
+ plugin_lock_digest,
33
+ )
27
34
  from ksadk.studio.codex_manifest import CodexManifestRepository
35
+ from ksadk.studio.codex_plugin_store import (
36
+ CodexPinnedMarketplace,
37
+ CodexPluginSnapshotStore,
38
+ CodexWorkspacePluginSnapshot,
39
+ component_selector,
40
+ )
41
+ from ksadk.studio.codex_provider_build import CodexProviderBuildReference
28
42
  from ksadk.studio.contracts import ContractModel, ModelSpec
29
43
  from ksadk.studio.errors import StudioError, not_found
44
+ from ksadk.studio.resource_binding_validation import resource_binding_diagnostics
45
+ from ksadk.studio.resource_connections import ResourceConnectionRepository
30
46
  from ksadk.studio.workspace import Workspace
31
47
  from ksadk.version import VERSION as SDK_VERSION
32
48
 
@@ -51,8 +67,29 @@ class CodexBuildRecord(ContractModel):
51
67
  # New builds always persist a mapping (possibly empty), so run resolution
52
68
  # never consults mutable Catalog state after the build has been created.
53
69
  model_profiles: dict[str, dict[str, Any]] | None = None
70
+ # Resource ids and model names are different namespaces. Keep the exact
71
+ # Studio bindings separately so currentness checks never compare a model
72
+ # name (``glm-5.2``) with a Catalog id (``model:provider:glm-5-2:live``).
73
+ # ``None`` only allows older local records to be read and rejected as
74
+ # stale with an actionable rebuild; Phase 2 has not shipped yet, so the
75
+ # deployment path does not carry a legacy identity-migration branch.
76
+ model_profile_ids: list[str] | None = None
77
+ # Omitted for builds without native plugins so existing on-disk receipts
78
+ # and their historical build ids remain byte-shape compatible.
79
+ plugin_lock: PluginLock | None = None
80
+ plugin_lock_digest: str | None = None
81
+ plugin_marketplace: CodexPinnedMarketplace | None = None
82
+ plugin_runtime_status: dict[str, dict[str, Any]] | None = None
83
+ local_execution: Literal["legacy", "provider"] = "legacy"
84
+ provider_bundle: CodexProviderBuildReference | None = None
54
85
  created_at: datetime
55
86
 
87
+ @model_validator(mode="after")
88
+ def local_execution_reference(self):
89
+ if (self.local_execution == "provider") != (self.provider_bundle is not None):
90
+ raise ValueError("Provider execution requires its complete local Bundle reference")
91
+ return self
92
+
56
93
 
57
94
  class CodexBuildRepository:
58
95
  def __init__(self, workspace: Workspace) -> None:
@@ -252,6 +289,10 @@ class CodexStudioBuilder:
252
289
  runtime_inspector: RuntimeInspector = _inspect_runtime,
253
290
  resource_catalog: Any = None,
254
291
  draft_repository: Any = None,
292
+ plugin_snapshot_store: CodexPluginSnapshotStore | None = None,
293
+ resource_connections: ResourceConnectionRepository | None = None,
294
+ provider_build: Callable[..., CodexProviderBuildReference] | None = None,
295
+ provider_validate: Callable[[CodexBuildRecord], Any] | None = None,
255
296
  ) -> None:
256
297
  self.workspace = workspace
257
298
  self.manifests = manifest_repository or CodexManifestRepository(workspace)
@@ -259,6 +300,10 @@ class CodexStudioBuilder:
259
300
  self.runtime_inspector = runtime_inspector
260
301
  self.catalog = resource_catalog
261
302
  self.drafts = draft_repository
303
+ self.plugin_snapshots = plugin_snapshot_store or CodexPluginSnapshotStore(workspace)
304
+ self.resource_connections = resource_connections
305
+ self.provider_build = provider_build
306
+ self.provider_validate = provider_validate
262
307
 
263
308
  def build(
264
309
  self,
@@ -267,12 +312,46 @@ class CodexStudioBuilder:
267
312
  source_revision: int = 1,
268
313
  ) -> CodexBuildRecord:
269
314
  snapshot = self.manifests.load(agent_id)
315
+ if self.resource_connections is not None:
316
+ diagnostics = resource_binding_diagnostics(
317
+ snapshot.manifest.plugins or [], snapshot.manifest.memory,
318
+ self.resource_connections,
319
+ )
320
+ if any(item.severity == "error" for item in diagnostics):
321
+ raise StudioError(
322
+ "RESOURCE_BINDING_VALIDATION_FAILED", "资源连接或策略校验失败",
323
+ status_code=422,
324
+ details={
325
+ "diagnostics": [item.model_dump(by_alias=True) for item in diagnostics]
326
+ },
327
+ )
270
328
  model_profiles = self._model_profile_snapshot(
271
329
  snapshot.manifest.name,
272
330
  allowed_models=snapshot.manifest.allowed_models,
273
331
  ignore_missing=True,
274
332
  )
275
- build_id = self._build_id(snapshot.manifest_sha256, model_profiles)
333
+ model_profile_ids = self._bound_model_profile_ids(snapshot.manifest.name)
334
+ (
335
+ native_plugin_lock,
336
+ plugin_selections,
337
+ plugin_runtime_status,
338
+ ) = self._native_plugin_lock(snapshot.manifest.plugins or [])
339
+ native_plugin_lock_digest = (
340
+ plugin_lock_digest(native_plugin_lock) if native_plugin_lock.plugins else None
341
+ )
342
+ provider_bundle = (
343
+ self.provider_build(
344
+ snapshot, model_profiles, model_profile_ids, native_plugin_lock_digest,
345
+ )
346
+ if self.provider_build is not None else None
347
+ )
348
+ build_id = self._build_id(
349
+ snapshot.manifest_sha256,
350
+ model_profiles,
351
+ model_profile_ids=model_profile_ids,
352
+ plugin_lock_digest_value=native_plugin_lock_digest,
353
+ provider_bundle_digest=provider_bundle.digest if provider_bundle else None,
354
+ )
276
355
  try:
277
356
  existing = self.repository.get(build_id)
278
357
  except StudioError as exc:
@@ -324,6 +403,14 @@ class CodexStudioBuilder:
324
403
  "构建产物与当前 agentengine.yaml 摘要不一致",
325
404
  status_code=500,
326
405
  )
406
+ pinned_marketplace = (
407
+ self.plugin_snapshots.materialize_marketplace(
408
+ plugin_lock_digest=native_plugin_lock_digest,
409
+ selections=plugin_selections,
410
+ )
411
+ if native_plugin_lock_digest is not None
412
+ else None
413
+ )
327
414
  record = CodexBuildRecord(
328
415
  id=build_id,
329
416
  agent_name=snapshot.manifest.name,
@@ -337,39 +424,121 @@ class CodexStudioBuilder:
337
424
  proxy_mode=current_proxy_mode(),
338
425
  runtime_lock=lock,
339
426
  model_profiles=model_profiles,
427
+ model_profile_ids=model_profile_ids,
428
+ plugin_lock=native_plugin_lock if native_plugin_lock.plugins else None,
429
+ plugin_lock_digest=native_plugin_lock_digest,
430
+ plugin_marketplace=pinned_marketplace,
431
+ plugin_runtime_status=plugin_runtime_status or None,
432
+ local_execution="provider" if provider_bundle else "legacy",
433
+ provider_bundle=provider_bundle,
340
434
  created_at=datetime.now(timezone.utc),
341
435
  )
342
436
  return self.repository.save(record)
343
437
 
438
+ def export_plugin_artifact(self, build_id: str) -> tuple[PluginArtifactReceipt, Path]:
439
+ """Export frozen plugin bytes without mutating the Build or installing.
440
+
441
+ This is the C1 content boundary. Deployment must still negotiate
442
+ control-plane support and validate the target dependency environment.
443
+ """
444
+ from ksadk.plugins.artifacts import export_plugin_artifact
445
+
446
+ build = self.repository.get(build_id)
447
+ pinned = build.plugin_marketplace
448
+ if pinned is None or build.plugin_lock is None:
449
+ raise StudioError("PLUGIN_ARTIFACT_EMPTY", "此 Build 未绑定原生插件", status_code=422)
450
+ if plugin_lock_digest(build.plugin_lock) != build.plugin_lock_digest:
451
+ raise StudioError("PLUGIN_LOCK_INVALID", "Build 插件锁摘要不匹配", status_code=422)
452
+ if pinned.plugin_lock_digest != build.plugin_lock_digest:
453
+ raise StudioError("PLUGIN_LOCK_INVALID", "插件快照与 Build 锁不匹配", status_code=422)
454
+ root = self.plugin_snapshots.verify_marketplace(pinned)
455
+ receipt, archive = export_plugin_artifact(
456
+ root,
457
+ self.workspace.resolve(".agentkit/plugin-artifacts"),
458
+ runtime_version=build.runtime_version,
459
+ plugin_lock_digest=build.plugin_lock_digest,
460
+ )
461
+ # Reject concurrent modifications; exported bytes must correspond to
462
+ # the frozen receipt, never a mutable workspace installation.
463
+ self.plugin_snapshots.verify_marketplace(pinned)
464
+ return receipt, archive
465
+
344
466
  def is_current(self, record: CodexBuildRecord) -> bool:
467
+ if record.local_execution == "provider":
468
+ if self.provider_validate is None:
469
+ return False
470
+ try:
471
+ self.provider_validate(record)
472
+ except StudioError:
473
+ return False
345
474
  snapshot = self.manifests.load(record.agent_name)
346
475
  if record.manifest_sha256 != snapshot.manifest_sha256:
347
476
  return False
477
+ current_plugin_lock, _selections, _status = self._native_plugin_lock(
478
+ snapshot.manifest.plugins or []
479
+ )
480
+ current_plugin_digest = (
481
+ plugin_lock_digest(current_plugin_lock) if current_plugin_lock.plugins else None
482
+ )
483
+ if record.plugin_lock_digest != current_plugin_digest:
484
+ return False
485
+ if record.plugin_lock is not None and record.plugin_lock != current_plugin_lock:
486
+ return False
487
+ if record.plugin_lock is None and current_plugin_lock.plugins:
488
+ return False
489
+ if record.plugin_marketplace is not None:
490
+ try:
491
+ self.plugin_snapshots.materialize_marketplace(
492
+ plugin_lock_digest=record.plugin_marketplace.plugin_lock_digest,
493
+ selections=_selections,
494
+ )
495
+ except (StudioError, ValueError):
496
+ return False
348
497
  if record.model_profiles is None:
349
498
  return True
350
- try:
351
- current_profiles = self._model_profile_snapshot(
352
- snapshot.manifest.name,
353
- allowed_models=snapshot.manifest.allowed_models,
354
- )
355
- except StudioError as exc:
356
- if exc.code == "RESOURCE_NOT_FOUND":
357
- # A completed Build owns its connection snapshot. A later
358
- # Catalog cleanup must not make that immutable Build
359
- # undeployable; launch resolution reads the snapshot instead.
360
- return True
361
- raise
499
+ if record.model_profile_ids is None:
500
+ return False
501
+ draft = self.drafts.get(record.agent_name) if self.drafts is not None else None
502
+ if draft is None:
503
+ return not record.model_profiles
504
+
505
+ bound_ids = set(self._bound_model_profile_ids(record.agent_name))
506
+ if set(record.model_profile_ids) != bound_ids:
507
+ return False
508
+ current_profiles = self._model_profile_snapshot(
509
+ snapshot.manifest.name,
510
+ allowed_models=snapshot.manifest.allowed_models,
511
+ ignore_missing=True,
512
+ )
513
+ # Provider-discovered Catalog entries are process-local. A restart may
514
+ # temporarily remove them, but the Build still owns an immutable,
515
+ # runnable connection snapshot and must remain deployable.
516
+ if bound_ids and not current_profiles:
517
+ return True
362
518
  return record.model_profiles == current_profiles
363
519
 
364
520
  @staticmethod
365
521
  def _build_id(
366
522
  manifest_sha256: str,
367
523
  model_profiles: dict[str, dict[str, Any]],
524
+ *,
525
+ model_profile_ids: list[str] | None = None,
526
+ plugin_lock_digest_value: str | None = None,
527
+ provider_bundle_digest: str | None = None,
368
528
  ) -> str:
369
- if not model_profiles:
529
+ if (not model_profiles and not model_profile_ids
530
+ and plugin_lock_digest_value is None and provider_bundle_digest is None):
370
531
  return f"build_{manifest_sha256[:20]}"
371
532
  fingerprint = json.dumps(
372
- model_profiles,
533
+ {
534
+ "profiles": model_profiles,
535
+ "resourceIds": sorted(model_profile_ids or []),
536
+ "pluginLockDigest": plugin_lock_digest_value,
537
+ **(
538
+ {"providerBundleDigest": provider_bundle_digest}
539
+ if provider_bundle_digest else {}
540
+ ),
541
+ },
373
542
  ensure_ascii=False,
374
543
  sort_keys=True,
375
544
  separators=(",", ":"),
@@ -379,6 +548,101 @@ class CodexStudioBuilder:
379
548
  digest = hashlib.sha256(f"{manifest_sha256}\n{fingerprint}".encode()).hexdigest()
380
549
  return f"build_{digest[:20]}"
381
550
 
551
+ def _native_plugin_lock(
552
+ self,
553
+ bindings: list[Any] | tuple[Any, ...],
554
+ ) -> tuple[
555
+ PluginLock,
556
+ tuple[
557
+ tuple[CodexWorkspacePluginSnapshot, tuple[Any, ...]],
558
+ ...,
559
+ ],
560
+ dict[str, dict[str, Any]],
561
+ ]:
562
+ entries: list[PluginLockEntry] = []
563
+ selections: list[tuple[CodexWorkspacePluginSnapshot, tuple[Any, ...]]] = []
564
+ statuses: dict[str, dict[str, Any]] = {}
565
+ for binding in bindings:
566
+ if not binding.enabled:
567
+ continue
568
+ if binding.ecosystem != "codex":
569
+ from ksadk.resource_runtime.plugin_config import resource_plugin_config
570
+
571
+ # Official platform resources are DSH capabilities materialized by
572
+ # the Provider Bundle. They belong in the resource Build lock,
573
+ # never in Codex's native marketplace lock.
574
+ if resource_plugin_config(
575
+ binding.plugin_ref,
576
+ binding.ecosystem,
577
+ binding.config,
578
+ enabled=True,
579
+ ) is not None:
580
+ continue
581
+ raise StudioError(
582
+ "CODEX_PLUGIN_ECOSYSTEM_UNSUPPORTED",
583
+ "Codex Agent 目前只能运行 Codex 原生插件绑定",
584
+ status_code=422,
585
+ details={"pluginRef": binding.plugin_ref},
586
+ )
587
+ stored = self.plugin_snapshots.load(binding.snapshot_digest)
588
+ if stored.plugin_ref != binding.plugin_ref:
589
+ raise StudioError(
590
+ "CODEX_PLUGIN_BINDING_MISMATCH",
591
+ "Codex 插件绑定与不可变快照身份不一致",
592
+ status_code=409,
593
+ details={
594
+ "pluginRef": binding.plugin_ref,
595
+ "snapshotPluginRef": stored.plugin_ref,
596
+ "snapshotDigest": binding.snapshot_digest,
597
+ },
598
+ )
599
+ selected = stored.select_components(binding.components)
600
+ plugin_id, version = binding.plugin_ref.removeprefix("plugin://").rsplit("@", 1)
601
+ components = tuple(
602
+ LockedPluginComponent(
603
+ id=component_selector(component),
604
+ kind=component.kind,
605
+ digest=component.content_digest,
606
+ path=component.path,
607
+ )
608
+ for component in selected
609
+ )
610
+ entries.append(
611
+ PluginLockEntry(
612
+ id=plugin_id,
613
+ version=version,
614
+ digest=stored.artifact_digest,
615
+ source="local" if stored.source.type == "local" else "market",
616
+ license=stored.manifest.license,
617
+ upstream=stored.source.to_plugin_source_snapshot(),
618
+ components=components,
619
+ )
620
+ )
621
+ hook_selectors = [
622
+ component_selector(component) for component in selected if component.kind == "hook"
623
+ ]
624
+ statuses[binding.plugin_ref] = (
625
+ {
626
+ "runnable": False,
627
+ "hookTrust": "unsupported",
628
+ "reason": "official-trust-api-unavailable",
629
+ "components": hook_selectors,
630
+ }
631
+ if hook_selectors
632
+ else {"runnable": True, "hookTrust": "not-required"}
633
+ )
634
+ selections.append((stored, selected))
635
+ try:
636
+ lock = PluginLock(plugins=entries)
637
+ except ValueError as exc:
638
+ raise StudioError(
639
+ "CODEX_PLUGIN_LOCK_INVALID",
640
+ "Codex 插件绑定无法编译为唯一、精确的 PluginLock",
641
+ status_code=422,
642
+ details={"reason": str(exc)},
643
+ ) from exc
644
+ return lock, tuple(selections), statuses
645
+
382
646
  def _model_profile_snapshot(
383
647
  self,
384
648
  agent_id: str,
@@ -417,10 +681,24 @@ class CodexStudioBuilder:
417
681
  by_alias=True,
418
682
  exclude_defaults=True,
419
683
  exclude_none=True,
684
+ exclude={"metadata", "discovery"},
420
685
  mode="json",
421
686
  )
422
687
  return profiles
423
688
 
689
+ def _bound_model_profile_ids(self, agent_id: str) -> list[str]:
690
+ if self.drafts is None:
691
+ return []
692
+ draft = self.drafts.get(agent_id)
693
+ if draft is None:
694
+ return []
695
+ bindings = draft.spec.bindings
696
+ resource_ids = list(getattr(bindings, "model_profile_ids", []) or [])
697
+ default_id = getattr(bindings, "model_profile_id", None)
698
+ if not resource_ids and default_id:
699
+ resource_ids = [default_id]
700
+ return list(dict.fromkeys(resource_ids))
701
+
424
702
  @staticmethod
425
703
  def _runtime_lock(artifact_path: Path) -> dict:
426
704
  if artifact_path.suffix == ".zip":
@@ -0,0 +1,90 @@
1
+ """Keep local MCP OAuth grants usable across one Agent's immutable builds.
2
+
3
+ Plugin snapshots and native transcripts remain build-isolated. Only grants for
4
+ explicitly bound, identical MCP server names and URLs may cross that boundary;
5
+ Codex account credentials and other Agents' grants never do.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import os
12
+ import re
13
+ import tempfile
14
+ from pathlib import Path
15
+ from typing import Any, Iterable
16
+
17
+ from ksadk.runtime.factory import _isolated_codex_home
18
+ from ksadk.studio.codex_builder import CodexBuildRecord
19
+
20
+
21
+ def restore_mcp_oauth_credentials(
22
+ project_dir: Path,
23
+ build: CodexBuildRecord,
24
+ builds: Iterable[CodexBuildRecord],
25
+ servers: list[dict[str, Any]],
26
+ ) -> None:
27
+ allowed = {
28
+ (str(server.get("name") or ""), str(server.get("url") or ""))
29
+ for server in servers
30
+ if server.get("enabled", True) and server.get("url") and not server.get("env_key")
31
+ }
32
+ if not allowed:
33
+ return
34
+ home = _isolated_codex_home(project_dir, build.id)
35
+ marker = home / ".ksadk-mcp-oauth-initialized"
36
+ if marker.exists():
37
+ return
38
+ target = home / ".credentials.json"
39
+ if target.is_symlink() or marker.is_symlink():
40
+ raise ValueError("Codex MCP credential store must not be a symlink")
41
+ current = _read(target)
42
+ merged = dict(current)
43
+ previous = max(
44
+ (
45
+ candidate
46
+ for candidate in builds
47
+ if candidate.agent_name == build.agent_name
48
+ and candidate.id != build.id
49
+ and candidate.created_at <= build.created_at
50
+ and re.fullmatch(r"build_[0-9a-f]{8,64}", candidate.id)
51
+ ),
52
+ key=lambda candidate: (candidate.created_at, candidate.source_revision),
53
+ default=None,
54
+ )
55
+ # Only the immediately preceding build may contribute grants. Searching
56
+ # further back could resurrect credentials removed by a user's logout.
57
+ if previous is not None:
58
+ source = home.parent / previous.id / ".credentials.json"
59
+ if source.is_file() and not source.is_symlink() and not source.parent.is_symlink():
60
+ for key, grant in _read(source).items():
61
+ if key in merged or not isinstance(grant, dict):
62
+ continue
63
+ if (grant.get("server_name"), grant.get("server_url")) in allowed:
64
+ merged[key] = grant
65
+ if merged != current:
66
+ fd, temporary = tempfile.mkstemp(prefix=".mcp-oauth-", dir=home)
67
+ try:
68
+ with os.fdopen(fd, "w", encoding="utf-8") as stream:
69
+ # mkstemp creates a private 0600 file. Never log or serialize
70
+ # this into a Build, deployment manifest, or response.
71
+ json.dump(merged, stream)
72
+ os.replace(temporary, target)
73
+ finally:
74
+ Path(temporary).unlink(missing_ok=True)
75
+ # Initialization is deliberately one-shot, even if no grant was found.
76
+ # Subsequent login, refresh and logout belong to the current build.
77
+ try:
78
+ fd = os.open(marker, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
79
+ except FileExistsError:
80
+ return
81
+ os.close(fd)
82
+
83
+
84
+ def _read(path: Path) -> dict[str, Any]:
85
+ if not path.exists():
86
+ return {}
87
+ value = json.loads(path.read_text(encoding="utf-8"))
88
+ if not isinstance(value, dict):
89
+ raise ValueError("Invalid Codex MCP credential store")
90
+ return value
@@ -13,8 +13,9 @@ import yaml # type: ignore[import-untyped]
13
13
  from pydantic import BaseModel, ConfigDict, Field, ValidationError, model_validator
14
14
 
15
15
  from ksadk.builders.managed_runtime_builder import serialize_managed_runtime_manifest
16
- from ksadk.studio.contracts import ContextSpec, MemorySpec
16
+ from ksadk.studio.contracts import ContextSpec, MemorySpec, NativePluginBinding, SoulDocument
17
17
  from ksadk.studio.errors import StudioError, not_found
18
+ from ksadk.studio.soul import soul_digest as compute_soul_digest
18
19
  from ksadk.studio.workspace import Workspace
19
20
 
20
21
 
@@ -43,8 +44,15 @@ class CodexAgentManifest(BaseModel):
43
44
  # Codex Runtime 最终仍消费合并后的 base_instructions;该字段用于在 AgentVersion /
44
45
  # Build 中保留任务契约来源,避免为了运行投影而破坏 PromptSection 审计。
45
46
  task_prompt: str | None = Field(default=None, max_length=32768)
47
+ # Soul remains reviewed source in the ManagedRuntime manifest. Runtime
48
+ # launch deterministically compiles it before ``prompt``; these provenance
49
+ # fields prevent a Draft-only Soul from masquerading as deployed behavior.
50
+ soul: SoulDocument | None = None
51
+ soul_source: Literal["AgentSpec.soul"] | None = None
52
+ soul_digest: str | None = Field(default=None, pattern=r"^sha256:[0-9a-f]{64}$")
46
53
  skills: list[str] | None = None
47
54
  mcp_servers: list[dict[str, Any]] | None = None
55
+ plugins: list[NativePluginBinding] | None = None
48
56
  sandbox: str | None = None
49
57
  approval_mode: str | None = None
50
58
  # PCM 策略(方案 §5.1):严格类型化,Build 不可变。
@@ -88,16 +96,53 @@ class CodexAgentManifest(BaseModel):
88
96
  if not isinstance(server, dict):
89
97
  raise ValueError("mcp_servers 必须是对象列表")
90
98
  name = str(server.get("name") or "").strip()
91
- url = str(server.get("url") or "").strip()
99
+ transport = str(
100
+ server.get("transport") or ("http" if server.get("url") else "")
101
+ ).strip()
102
+ url = str(server.get("url") or server.get("endpoint_url") or "").strip()
103
+ command = str(server.get("command") or "").strip()
92
104
  if not name:
93
105
  raise ValueError("mcp_servers 每项必须有 name")
94
- if not url:
95
- raise ValueError("mcp_servers 每项必须有 url")
106
+ if transport == "stdio":
107
+ args = server.get("args") or []
108
+ if (
109
+ not command
110
+ or not isinstance(args, list)
111
+ or any(not isinstance(argument, str) for argument in args)
112
+ ):
113
+ raise ValueError("stdio mcp_servers 必须有 command 与字符串 args")
114
+ if url:
115
+ raise ValueError("stdio mcp_servers 不能配置 url")
116
+ elif transport in {"http", "sse"}:
117
+ if not url:
118
+ raise ValueError("HTTP/SSE mcp_servers 每项必须有 url")
119
+ if command:
120
+ raise ValueError("HTTP/SSE mcp_servers 不能配置 command")
121
+ else:
122
+ raise ValueError("mcp_servers transport 必须是 stdio/http/sse")
96
123
  if name in mcp_seen:
97
124
  raise ValueError("mcp_servers 不能包含重复 name")
98
125
  mcp_seen.add(name)
99
126
  mcp_deduped.append(server)
100
127
  self.mcp_servers = mcp_deduped
128
+ if self.plugins is not None:
129
+ refs = [binding.plugin_ref for binding in self.plugins if binding.enabled]
130
+ if len(refs) != len(set(refs)):
131
+ raise ValueError("plugins 不能包含重复的启用 pluginRef")
132
+ from ksadk.resource_runtime.plugin_config import validate_resource_plugin_bindings
133
+
134
+ validate_resource_plugin_bindings(self.plugins)
135
+ if self.soul is None:
136
+ if self.soul_source is not None or self.soul_digest is not None:
137
+ raise ValueError("soul source/digest require a SoulDocument")
138
+ else:
139
+ expected_digest = compute_soul_digest(self.soul)
140
+ if self.soul_source not in {None, "AgentSpec.soul"}:
141
+ raise ValueError("soul_source must identify AgentSpec.soul")
142
+ if self.soul_digest not in {None, expected_digest}:
143
+ raise ValueError("soul_digest does not match the SoulDocument")
144
+ self.soul_source = "AgentSpec.soul"
145
+ self.soul_digest = expected_digest
101
146
  return self
102
147
 
103
148
  @property
@@ -113,6 +158,8 @@ def normalized_manifest_bytes(manifest: CodexAgentManifest) -> bytes:
113
158
  payload["context"] = manifest.context.model_dump(mode="python", by_alias=True)
114
159
  if manifest.memory is not None:
115
160
  payload["memory"] = manifest.memory.model_dump(mode="python", by_alias=True)
161
+ if manifest.soul is not None:
162
+ payload["soul"] = manifest.soul.model_dump(mode="python", by_alias=True)
116
163
  return serialize_managed_runtime_manifest(payload)
117
164
 
118
165