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
@@ -0,0 +1,231 @@
1
+ """Local Codex Provider admission and Bundle references, separate from cloud YAML.
2
+
3
+ A local Provider Bundle binds the existing immutable Codex record; native
4
+ marketplace bytes remain governed by that record's original plugin lock.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import hashlib
10
+ import json
11
+ from typing import Any
12
+
13
+ from pydantic import Field
14
+
15
+ from ksadk.plugins.providers.codex_dsh import (
16
+ SHIPPED_CODEX_PROVIDER_ID,
17
+ SHIPPED_CODEX_PROVIDER_VERSION,
18
+ )
19
+ from ksadk.studio.contracts import ContractModel, RuntimeRef
20
+ from ksadk.studio.errors import StudioError
21
+ from ksadk.studio.resource_build_admission import (
22
+ admit_resource_build,
23
+ resource_build_required,
24
+ )
25
+
26
+ CODEX_PROVIDER_REF = f"plugin://{SHIPPED_CODEX_PROVIDER_ID}@{SHIPPED_CODEX_PROVIDER_VERSION}"
27
+
28
+
29
+ def _digest(value: Any) -> str:
30
+ return (
31
+ "sha256:"
32
+ + hashlib.sha256(
33
+ json.dumps(
34
+ value,
35
+ sort_keys=True,
36
+ separators=(",", ":"),
37
+ ensure_ascii=False,
38
+ ).encode()
39
+ ).hexdigest()
40
+ )
41
+
42
+
43
+ class CodexProviderBuildReference(ContractModel):
44
+ provider_ref: str = Field(pattern=r"^plugin://io\.ksadk\.codex-provider@[^/]+$")
45
+ registration_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
46
+ bundle_build_id: str = Field(pattern=r"^build_[0-9a-f]+$")
47
+ bundle_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
48
+
49
+ @property
50
+ def digest(self) -> str:
51
+ return _digest(self.model_dump(by_alias=True))
52
+
53
+
54
+ class CodexProviderBuildManager:
55
+ def __init__(self, studio: Any):
56
+ self.studio = studio
57
+
58
+ def _registration_digest(self) -> str:
59
+ manifest = self.studio._active_provider_manifests.get(CODEX_PROVIDER_REF)
60
+ if manifest is None:
61
+ raise StudioError(
62
+ "AGENT_PROVIDER_NOT_REGISTERED",
63
+ "Codex Provider 未注册;请在插件中心安装并启用官方 Codex Provider,"
64
+ "确认 DSH 工具链可用后重试",
65
+ status_code=409,
66
+ )
67
+ return _digest(manifest.model_dump(by_alias=True, mode="json", exclude_none=True))
68
+
69
+ def prepare(
70
+ self,
71
+ snapshot,
72
+ model_profiles: dict,
73
+ model_profile_ids: list[str],
74
+ native_plugin_lock_digest: str | None,
75
+ ) -> CodexProviderBuildReference:
76
+ registration_digest = self._registration_digest()
77
+ # The current Provider owns one native client connection per activation.
78
+ # Model names may vary, but a different endpoint/credential needs a new
79
+ # activation contract; never silently send it to the default connection.
80
+ connections = {
81
+ (
82
+ p.get("provider", "openai-compatible"),
83
+ p.get("endpointUrl"),
84
+ p.get("baseUrl"),
85
+ p.get("credentialRef"),
86
+ p.get("wireApi"),
87
+ )
88
+ for p in model_profiles.values()
89
+ }
90
+ missing_profiles = set(snapshot.manifest.allowed_models) - set(model_profiles)
91
+ if len(connections) > 1 or (model_profiles and missing_profiles):
92
+ raise StudioError(
93
+ "CODEX_PROVIDER_MODEL_CONNECTION_UNSUPPORTED",
94
+ "当前 Codex Provider Build 的模型必须具有完整且相同的连接快照;"
95
+ "请补齐模型配置,或拆分不同连接的 Agent",
96
+ status_code=422,
97
+ )
98
+ draft = self.studio.codex_agents._project(snapshot).model_copy(deep=True)
99
+ draft.spec.runtime = RuntimeRef(
100
+ type="plugin",
101
+ provider_ref=CODEX_PROVIDER_REF,
102
+ version=snapshot.manifest.runtime.version,
103
+ provider_config={
104
+ "studioManifestDigest": "sha256:" + snapshot.manifest_sha256,
105
+ "studioBuildFingerprint": _digest(
106
+ {
107
+ "manifest": snapshot.manifest_sha256,
108
+ "profiles": model_profiles,
109
+ "resourceIds": sorted(model_profile_ids),
110
+ "pluginLockDigest": native_plugin_lock_digest,
111
+ }
112
+ ),
113
+ },
114
+ )
115
+ # This Bundle describes the Python AgentProvider. Codex-native marketplace
116
+ # selections stay in the manifest lock, while official DSH platform
117
+ # resources remain in this projected Draft and pass the same trusted
118
+ # resource admission used by framework runtimes.
119
+ draft.spec.bindings.plugins = [
120
+ binding
121
+ for binding in draft.spec.bindings.plugins
122
+ if binding.ecosystem == "dsh"
123
+ ]
124
+ manifest = self.studio._active_provider_manifests[CODEX_PROVIDER_REF]
125
+ missing_permissions = sorted(
126
+ set(manifest.spec.permissions) - set(draft.spec.security.allowed_permissions)
127
+ )
128
+ if missing_permissions:
129
+ raise StudioError(
130
+ "AGENT_PROVIDER_PERMISSION_DENIED",
131
+ "请打开 Agent 编辑页,在 Codex 本地执行权限中确认 Provider 请求的权限并保存;"
132
+ "安装插件时的同意不代替 Agent 授权",
133
+ status_code=422,
134
+ field="spec.security.allowedPermissions",
135
+ details={"missingPermissions": missing_permissions},
136
+ )
137
+ composition = self.studio.plugin_compositions.compile(draft)
138
+ resource_build = None
139
+ if resource_build_required(draft):
140
+ resource_build = admit_resource_build(
141
+ draft,
142
+ authority=self.studio.resource_authority,
143
+ connections=self.studio.resource_connections,
144
+ dsh_profile=(
145
+ self.studio.resource_dsh_capabilities.capture_resource_build_snapshot()
146
+ ),
147
+ )
148
+ built = self.studio.builder.build(
149
+ draft,
150
+ composition=composition,
151
+ resource_build=resource_build,
152
+ )
153
+ # Refuse a registration change during staging, before saving success.
154
+ if self._registration_digest() != registration_digest:
155
+ raise StudioError(
156
+ "CODEX_PROVIDER_CHANGED", "Provider 构建期间发生变更", status_code=409
157
+ )
158
+ return CodexProviderBuildReference(
159
+ provider_ref=CODEX_PROVIDER_REF,
160
+ registration_digest=registration_digest,
161
+ bundle_build_id=built.id,
162
+ bundle_digest=built.bundle_digest,
163
+ )
164
+
165
+ def bundle_root(self, record):
166
+ reference = record.provider_bundle
167
+ if reference is None:
168
+ return None
169
+ if reference.provider_ref != CODEX_PROVIDER_REF or (
170
+ reference.registration_digest != self._registration_digest()
171
+ ):
172
+ raise StudioError(
173
+ "CODEX_PROVIDER_CHANGED", "Provider 注册已变更,请重新构建", status_code=409
174
+ )
175
+ try:
176
+ built = self.studio.builds.get(reference.bundle_build_id)
177
+ except StudioError as error:
178
+ raise StudioError(
179
+ "CODEX_PROVIDER_BUNDLE_UNAVAILABLE", "Provider Bundle 记录不可用,请重新构建",
180
+ status_code=409,
181
+ ) from error
182
+ if built.agent_id != record.agent_name or built.bundle_digest != reference.bundle_digest:
183
+ raise StudioError(
184
+ "CODEX_PROVIDER_BUILD_MISMATCH", "Provider Bundle 与 Build 不一致", status_code=409
185
+ )
186
+ root = self.studio.plugin_runs._bundle_root(built)
187
+ bundle = self.studio.plugin_runs._resolve_bundle(root)
188
+ if (
189
+ bundle.bundle_digest != reference.bundle_digest
190
+ or (bundle.composition.profile.agent_provider.ref != reference.provider_ref)
191
+ or bundle.composition.profile.agent_provider.config.get("studioManifestDigest")
192
+ != ("sha256:" + record.manifest_sha256)
193
+ or bundle.composition.profile.agent_provider.config.get("studioBuildFingerprint")
194
+ != _digest(
195
+ {
196
+ "manifest": record.manifest_sha256,
197
+ "profiles": record.model_profiles,
198
+ "resourceIds": sorted(record.model_profile_ids or []),
199
+ "pluginLockDigest": record.plugin_lock_digest,
200
+ }
201
+ )
202
+ ):
203
+ raise StudioError(
204
+ "CODEX_PROVIDER_BUILD_MISMATCH", "Provider Bundle 引用校验失败", status_code=409
205
+ )
206
+ return root
207
+
208
+ def native_launch(self, bundle):
209
+ """Trusted host callback; no model arguments or serialized secrets accepted."""
210
+ marker = bundle.composition.profile.agent_provider.config.get("studioManifestDigest")
211
+ if marker is None:
212
+ return None
213
+ registration_digest = self._registration_digest()
214
+ matches = [
215
+ record
216
+ for record in self.studio.codex_builds.list()
217
+ if record.provider_bundle is not None
218
+ and record.provider_bundle.bundle_digest == bundle.bundle_digest
219
+ and record.provider_bundle.registration_digest == registration_digest
220
+ ]
221
+ if len(matches) != 1:
222
+ raise StudioError(
223
+ "CODEX_PROVIDER_BUILD_MISMATCH",
224
+ "Provider Bundle 缺少唯一 Codex Build",
225
+ status_code=409,
226
+ )
227
+ record = matches[0]
228
+ self.bundle_root(record)
229
+ # Retain native bootstrap, credentials, exact build HOME and workspace
230
+ # from the existing resolver. No cloud schema or second launch policy.
231
+ return self.studio.codex_runs.resolve(record.id).launch_context
ksadk/studio/codex_run.py CHANGED
@@ -2,19 +2,25 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import json
5
6
  import os
6
7
  import zipfile
7
8
  from typing import Any, cast
9
+ from urllib.parse import urlparse
8
10
 
9
11
  import yaml # type: ignore[import-untyped]
10
12
 
11
13
  from ksadk.configs import ModelConfig
14
+ from ksadk.plugins.contracts import plugin_lock_digest
12
15
  from ksadk.runtime import RuntimeLaunchContext
13
16
  from ksadk.studio.codex_builder import CodexBuildRepository
17
+ from ksadk.studio.codex_credentials import restore_mcp_oauth_credentials
14
18
  from ksadk.studio.codex_manifest import CodexAgentManifest, CodexManifestRepository
15
- from ksadk.studio.contracts import ModelSpec
19
+ from ksadk.studio.codex_plugin_store import CodexPluginSnapshotStore
20
+ from ksadk.studio.contracts import Instructions, ModelSpec
16
21
  from ksadk.studio.errors import StudioError
17
22
  from ksadk.studio.run_service import StudioRunSpec
23
+ from ksadk.studio.soul import compose_system_instruction
18
24
  from ksadk.studio.workspace import Workspace
19
25
  from ksadk.tools.gateway import normalize_tool_approval_mode
20
26
 
@@ -31,6 +37,8 @@ class CodexRunSpecResolver:
31
37
  credential_resolver: Any = None,
32
38
  resource_catalog: Any = None,
33
39
  draft_repository: Any = None,
40
+ plugin_snapshot_store: CodexPluginSnapshotStore | None = None,
41
+ provider_bundle_resolver: Any = None,
34
42
  ) -> None:
35
43
  self.workspace = workspace
36
44
  self.builds = build_repository or CodexBuildRepository(workspace)
@@ -38,6 +46,8 @@ class CodexRunSpecResolver:
38
46
  self.credentials = credential_resolver
39
47
  self.catalog = resource_catalog
40
48
  self.drafts = draft_repository
49
+ self.plugin_snapshots = plugin_snapshot_store or CodexPluginSnapshotStore(workspace)
50
+ self.provider_bundle_resolver = provider_bundle_resolver
41
51
 
42
52
  def resolve(
43
53
  self,
@@ -48,6 +58,16 @@ class CodexRunSpecResolver:
48
58
  approval_mode: str | None = None,
49
59
  ) -> StudioRunSpec:
50
60
  build = self.builds.get(build_id)
61
+ provider_root = None
62
+ if build.local_execution == "provider":
63
+ if self.provider_bundle_resolver is None:
64
+ raise StudioError("CODEX_PROVIDER_REQUIRED", "此 Build 必须通过 Provider 运行",
65
+ status_code=409)
66
+ provider_root = self.provider_bundle_resolver(build)
67
+ if provider_root is None:
68
+ raise StudioError(
69
+ "CODEX_PROVIDER_REQUIRED", "Provider Bundle 不可用", status_code=409,
70
+ )
51
71
  current = self.manifests.load(build.agent_name)
52
72
  if build.manifest_sha256 != current.manifest_sha256:
53
73
  raise StudioError(
@@ -60,6 +80,13 @@ class CodexRunSpecResolver:
60
80
  },
61
81
  )
62
82
  manifest = self._load_build_manifest(build.artifact_path)
83
+ restore_mcp_oauth_credentials(
84
+ self.workspace.root,
85
+ build,
86
+ self.builds.list(),
87
+ manifest.mcp_servers or [],
88
+ )
89
+ plugin_bootstrap = self._plugin_bootstrap(build, manifest)
63
90
  selected_model = self._select_model(manifest, model)
64
91
  project_dir = self.workspace.root.resolve()
65
92
  skills = self._skill_inputs(manifest)
@@ -71,15 +98,20 @@ class CodexRunSpecResolver:
71
98
  approval_mode=approval_profile or None,
72
99
  )
73
100
  if sandbox == "workspace-write":
74
- # workspace-write 默认断网;MCP/搜索类工具需要显式放行网络
101
+ # workspace-write 默认断网;原生搜索和 MCP 都需要显式放行网络。
75
102
  codex_overrides = [*codex_overrides, "sandbox_workspace_write.network_access=true"]
76
103
  launch_config: dict[str, Any] = {
104
+ "model": selected_model,
105
+ "models": list(manifest.allowed_models),
77
106
  "sandbox_read_only": sandbox == "read-only",
78
107
  "sandbox": sandbox,
79
108
  "approval_mode": approval,
109
+ "codex_home_key": build.id,
80
110
  }
81
111
  if codex_overrides:
82
112
  launch_config["codex_overrides"] = codex_overrides
113
+ if plugin_bootstrap is not None:
114
+ launch_config["codex_plugin_bootstrap"] = plugin_bootstrap
83
115
  runtime_env = {
84
116
  **self._resolve_model_env(build, manifest, selected_model),
85
117
  **self._resolve_mcp_env(manifest),
@@ -87,18 +119,22 @@ class CodexRunSpecResolver:
87
119
  if runtime_env:
88
120
  launch_config["env"] = runtime_env
89
121
  agent_task = str(manifest.task_prompt or "").strip()
122
+ agent_system = compose_system_instruction(
123
+ Instructions(system=manifest.prompt),
124
+ manifest.soul,
125
+ ).system
90
126
  # PCM 策略从不可变 Manifest 读取(方案 §5.1:Build 锁定后 sidecar 修改不影响旧 Build)
91
127
  # manifest.context/memory 由 _manifest() 从 AgentSpec 写入,随 Build 进入 Artifact
92
128
  resolved_context = manifest.context
93
129
  resolved_memory = manifest.memory
94
- base_instructions = manifest.prompt
130
+ base_instructions = agent_system
95
131
  if agent_task:
96
- base_instructions = f"{manifest.prompt}\n\n{agent_task}"
132
+ base_instructions = f"{agent_system}\n\n{agent_task}"
97
133
  request_config: dict[str, Any] = {
98
134
  # Codex 原生只接收 base_instructions,因此运行前合并;PCM 证据仍使用下面
99
135
  # 两个独立来源生成 agent_identity / agent_policy 的分段 hash。
100
136
  "base_instructions": base_instructions,
101
- "agent_system": manifest.prompt,
137
+ "agent_system": agent_system,
102
138
  "agent_task": agent_task,
103
139
  "cwd": str(project_dir),
104
140
  "skills": skills,
@@ -136,6 +172,13 @@ class CodexRunSpecResolver:
136
172
  }
137
173
  if approval_profile:
138
174
  request_config["tool_approval_mode"] = approval_profile
175
+ if manifest.soul is not None:
176
+ request_config.update(
177
+ {
178
+ "soul_source": manifest.soul_source,
179
+ "soul_digest": manifest.soul_digest,
180
+ }
181
+ )
139
182
  return StudioRunSpec(
140
183
  launch_context=RuntimeLaunchContext(
141
184
  runtime_type="codex",
@@ -147,8 +190,85 @@ class CodexRunSpecResolver:
147
190
  model=selected_model,
148
191
  request_config=request_config,
149
192
  manifest_sha256=build.manifest_sha256,
193
+ plugin_bundle_root=provider_root,
150
194
  )
151
195
 
196
+ def _plugin_bootstrap(
197
+ self,
198
+ build: Any,
199
+ manifest: CodexAgentManifest,
200
+ ) -> dict[str, Any] | None:
201
+ # Only Codex-native bindings belong to the App Server bootstrap. DSH
202
+ # bindings are materialized by the Provider Bundle and intentionally do
203
+ # not have entries in the Codex plugin snapshot store.
204
+ bindings = [
205
+ item
206
+ for item in (manifest.plugins or [])
207
+ if item.enabled and item.ecosystem == "codex"
208
+ ]
209
+ lock = getattr(build, "plugin_lock", None)
210
+ lock_digest = getattr(build, "plugin_lock_digest", None)
211
+ marketplace = getattr(build, "plugin_marketplace", None)
212
+ statuses = getattr(build, "plugin_runtime_status", None) or {}
213
+ if not bindings:
214
+ if lock is not None or lock_digest is not None or marketplace is not None:
215
+ raise StudioError(
216
+ "CODEX_PLUGIN_BUILD_INVALID",
217
+ "Codex Build 含有未绑定的插件锁信息",
218
+ status_code=409,
219
+ details={"buildId": build.id},
220
+ )
221
+ return None
222
+ if lock is None or lock_digest is None or marketplace is None:
223
+ raise StudioError(
224
+ "CODEX_PLUGIN_REBUILD_REQUIRED",
225
+ "Codex Build 缺少原生插件不可变快照,请重新构建",
226
+ status_code=409,
227
+ details={"buildId": build.id},
228
+ )
229
+ actual_lock_digest = plugin_lock_digest(lock)
230
+ if actual_lock_digest != lock_digest or marketplace.plugin_lock_digest != lock_digest:
231
+ raise StudioError(
232
+ "CODEX_PLUGIN_LOCK_DIGEST_MISMATCH",
233
+ "Codex Build 的 PluginLock 摘要不一致",
234
+ status_code=409,
235
+ details={
236
+ "buildId": build.id,
237
+ "expected": lock_digest,
238
+ "actual": actual_lock_digest,
239
+ },
240
+ )
241
+ for binding in bindings:
242
+ stored = self.plugin_snapshots.load(binding.snapshot_digest)
243
+ if stored.plugin_ref != binding.plugin_ref:
244
+ raise StudioError(
245
+ "CODEX_PLUGIN_BINDING_MISMATCH",
246
+ "Codex 插件绑定与不可变快照身份不一致",
247
+ status_code=409,
248
+ details={"pluginRef": binding.plugin_ref},
249
+ )
250
+ stored.select_components(binding.components)
251
+ status = statuses.get(binding.plugin_ref) or {}
252
+ if status.get("runnable") is False or any(
253
+ selector.startswith("hook:") for selector in binding.components
254
+ ):
255
+ raise StudioError(
256
+ "CODEX_PLUGIN_HOOK_TRUST_UNAVAILABLE",
257
+ "Codex App Server 尚无可验证的 hook trust API;该绑定已安全阻断",
258
+ status_code=409,
259
+ details={
260
+ "pluginRef": binding.plugin_ref,
261
+ "hookTrust": status.get("hookTrust", "unsupported"),
262
+ },
263
+ )
264
+ root = self.plugin_snapshots.verify_marketplace(marketplace)
265
+ return {
266
+ "marketplace_path": str(root),
267
+ "marketplace_name": marketplace.marketplace_name,
268
+ "plugin_names": list(marketplace.plugin_names),
269
+ "snapshot_digest": marketplace.marketplace_digest,
270
+ }
271
+
152
272
  def _resolve_model_env(
153
273
  self,
154
274
  build: Any,
@@ -172,12 +292,23 @@ class CodexRunSpecResolver:
172
292
  if profile is not None
173
293
  else ModelConfig().api_base.rstrip("/")
174
294
  )
175
- return {
295
+ env = {
176
296
  "OPENAI_API_KEY": credential,
177
297
  "OPENAI_BASE_URL": base_url,
178
298
  "OPENAI_API_BASE": base_url,
179
299
  "OPENAI_MODEL_NAME": selected_model,
180
300
  }
301
+ # A chat-only profile necessarily needs the Responses-to-Chat bridge.
302
+ # KSPMAS build snapshots created before wireApi was persisted have the
303
+ # same requirement. Route those known profiles directly so every fresh
304
+ # Studio process does not spend several seconds probing /models and two
305
+ # /responses payload dialects before the user's first turn.
306
+ if "KSADK_CODEX_USE_PROXY" not in os.environ and (
307
+ (profile is not None and profile.wire_api == "chat")
308
+ or self._is_known_chat_model_gateway(base_url)
309
+ ):
310
+ env["KSADK_CODEX_USE_PROXY"] = "1"
311
+ return env
181
312
 
182
313
  def _resolve_model_profile(
183
314
  self,
@@ -236,19 +367,41 @@ class CodexRunSpecResolver:
236
367
  return raw[: -len(suffix)]
237
368
  return raw
238
369
 
370
+ @staticmethod
371
+ def _is_known_chat_model_gateway(base_url: str) -> bool:
372
+ host = (urlparse(base_url).hostname or "").lower()
373
+ return host == "kspmas.ksyun.com" or host.startswith("kspmas-internal.")
374
+
239
375
  @staticmethod
240
376
  def _mcp_overrides(manifest: CodexAgentManifest) -> list[str]:
241
377
  """Translate bound MCP servers into codex --config overrides."""
242
378
  overrides: list[str] = []
243
379
  for server in manifest.mcp_servers or []:
244
380
  name = str(server.get("name") or "").strip()
381
+ transport = str(
382
+ server.get("transport") or ("http" if server.get("url") else "")
383
+ ).lower()
245
384
  url = str(server.get("url") or "").strip()
246
- if not name or not url:
385
+ if not name:
247
386
  continue
248
- overrides.append(f"mcp_servers.{name}.url={url}")
249
- env_key = str(server.get("env_key") or "").strip()
250
- if env_key:
251
- overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
387
+ if transport == "stdio":
388
+ command = str(server.get("command") or "").strip()
389
+ if not command:
390
+ continue
391
+ args = [str(argument) for argument in (server.get("args") or [])]
392
+ overrides.append(f"mcp_servers.{name}.command={json.dumps(command)}")
393
+ overrides.append(f"mcp_servers.{name}.args={json.dumps(args)}")
394
+ env_refs = server.get("env_refs") or {}
395
+ if isinstance(env_refs, dict) and env_refs:
396
+ overrides.append(
397
+ f"mcp_servers.{name}.env_vars="
398
+ f"{json.dumps(sorted(str(key) for key in env_refs))}"
399
+ )
400
+ elif transport in {"http", "sse"} and url:
401
+ overrides.append(f"mcp_servers.{name}.url={url}")
402
+ env_key = str(server.get("env_key") or "").strip()
403
+ if env_key:
404
+ overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
252
405
  return overrides
253
406
 
254
407
  def _resolve_mcp_env(self, manifest: CodexAgentManifest) -> dict[str, str]:
@@ -260,10 +413,20 @@ class CodexRunSpecResolver:
260
413
  """
261
414
  env: dict[str, str] = {}
262
415
  for server in manifest.mcp_servers or []:
416
+ references: dict[str, str] = {}
263
417
  env_key = str(server.get("env_key") or "").strip()
264
- if not env_key:
265
- continue
266
- if env_key in env:
418
+ if env_key:
419
+ references[env_key] = f"env://{env_key}"
420
+ raw_references = server.get("env_refs") or {}
421
+ if isinstance(raw_references, dict):
422
+ references.update(
423
+ {
424
+ str(name).strip(): str(reference).strip()
425
+ for name, reference in raw_references.items()
426
+ if str(name).strip() and str(reference).strip()
427
+ }
428
+ )
429
+ if not references:
267
430
  continue
268
431
  resolver = self.credentials
269
432
  if resolver is None:
@@ -271,19 +434,22 @@ class CodexRunSpecResolver:
271
434
 
272
435
  resolver = CredentialResolver(self.workspace)
273
436
  self.credentials = resolver
274
- try:
275
- env[env_key] = resolver.resolve(f"env://{env_key}")
276
- except Exception as exc:
277
- raise StudioError(
278
- "MCP_CREDENTIAL_MISSING",
279
- f"MCP Server「{server.get('name')}」需要凭证 {env_key},"
280
- "请先在 MCP 页连接时保存该环境变量的值",
281
- status_code=422,
282
- details={
283
- "server": str(server.get("name") or ""),
284
- "reference": f"env://{env_key}",
285
- },
286
- ) from exc
437
+ for name, reference in references.items():
438
+ if name in env:
439
+ continue
440
+ try:
441
+ env[name] = resolver.resolve(reference)
442
+ except Exception as exc:
443
+ raise StudioError(
444
+ "MCP_CREDENTIAL_MISSING",
445
+ f"MCP Server「{server.get('name')}」需要凭证 {name},"
446
+ "请先保存对应 Secret 引用",
447
+ status_code=422,
448
+ details={
449
+ "server": str(server.get("name") or ""),
450
+ "reference": reference,
451
+ },
452
+ ) from exc
287
453
  return env
288
454
 
289
455
  @staticmethod
@@ -314,11 +480,16 @@ class CodexRunSpecResolver:
314
480
  if approval_mode:
315
481
  return approval_presets[normalize_tool_approval_mode(approval_mode)]
316
482
  raw = (
317
- (override or os.environ.get("KSADK_CODEX_SANDBOX") or manifest.sandbox or "read_only")
483
+ (
484
+ override
485
+ or os.environ.get("KSADK_CODEX_SANDBOX")
486
+ or manifest.sandbox
487
+ or "workspace_write_auto"
488
+ )
318
489
  .strip()
319
490
  .lower()
320
491
  )
321
- return presets.get(raw, ("read-only", "deny_all"))
492
+ return presets.get(raw, ("workspace-write", "auto_review"))
322
493
 
323
494
  def _skill_inputs(self, manifest: CodexAgentManifest) -> list[dict[str, str]]:
324
495
  """Resolve bound skill resource ids to codex SkillInput wire dicts."""