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,831 @@
1
+ """Local Studio execution for immutable PluginHost AgentBundle v2 builds."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ from collections.abc import Mapping, Sequence
8
+ from dataclasses import dataclass
9
+ from pathlib import Path
10
+ from typing import Any, cast
11
+
12
+ from ksadk.harness.reasoner import (
13
+ HarnessReasoner,
14
+ HarnessReasoningTurn,
15
+ HarnessToolCall,
16
+ )
17
+ from ksadk.plugins.builtins import (
18
+ builtin_capability_factories,
19
+ builtin_capability_manifests,
20
+ builtin_capability_permissions,
21
+ )
22
+ from ksadk.plugins.bundle import PluginBundleError, PluginBundleResolver, ResolvedPluginBundle
23
+ from ksadk.plugins.contracts import CompositionProfile, PluginManifest
24
+ from ksadk.plugins.host import PluginHost, PluginHostError
25
+ from ksadk.plugins.providers.codex import CodexTurnResult
26
+ from ksadk.plugins.providers.dsh_mcp import (
27
+ DSH_PROFILE_MCP_PLUGIN_ID,
28
+ DshProfileMCPFactory,
29
+ dsh_profile_mcp_manifest,
30
+ )
31
+ from ksadk.plugins.providers.harness import (
32
+ HarnessTurnResult,
33
+ KsADKHarnessProviderFactory,
34
+ )
35
+ from ksadk.plugins.providers.legacy import (
36
+ LegacyBundleAdapter,
37
+ LegacyBundleCompatibilityError,
38
+ LegacyHarnessSource,
39
+ )
40
+ from ksadk.plugins.providers.legacy_catalog import (
41
+ CODEX_AGENT_PROVIDER_PLUGIN_ID,
42
+ KSADK_HARNESS_AGENT_PROVIDER_PLUGIN_ID,
43
+ builtin_agent_provider_manifests,
44
+ legacy_harness_agent_provider_manifest,
45
+ )
46
+ from ksadk.plugins.providers.platform_resources import (
47
+ PLATFORM_RESOURCE_MCP_PLUGIN_ID,
48
+ PLATFORM_RESOURCE_MCP_REF,
49
+ PlatformResourceMCPFactory,
50
+ platform_resource_mcp_manifest,
51
+ )
52
+ from ksadk.plugins.resolver import PluginRegistry
53
+ from ksadk.resource_runtime.policy_authorization import FullAccessResourceWriteAuthorizer
54
+ from ksadk.runtime import RuntimeExecutor, RuntimeLaunchContext
55
+ from ksadk.sessions.base import BaseSessionService
56
+ from ksadk.studio.contracts import (
57
+ BuildRecord,
58
+ NetworkPolicy,
59
+ ResolvedModel,
60
+ )
61
+ from ksadk.studio.errors import StudioError
62
+ from ksadk.studio.model_client import OpenAICompatibleModelClient
63
+ from ksadk.studio.plugin_kernel_adapter import StudioPluginKernelAdapter
64
+ from ksadk.studio.repository import BuildRepository
65
+ from ksadk.studio.run_service import StudioRunSpec
66
+ from ksadk.studio.workspace import Workspace
67
+ from ksadk.tools.gateway import normalize_tool_approval_mode
68
+
69
+ _COMPOSED_RUNTIME_TYPES = frozenset({"harness", "plugin"})
70
+
71
+
72
+ @dataclass(frozen=True)
73
+ class StudioPluginTurnResult:
74
+ """Normalized result retained at the Studio/third-party boundary."""
75
+
76
+ output_text: str
77
+ session_id: str
78
+ usage: Mapping[str, Any]
79
+ metadata: Mapping[str, Any]
80
+ raw: Any
81
+
82
+
83
+ @dataclass
84
+ class _HostEntry:
85
+ agent_id: str
86
+ bundle: ResolvedPluginBundle
87
+ host: PluginHost
88
+
89
+
90
+ class _StudioHarnessReasoner:
91
+ """Bind the Harness loop to the immutable Studio model/network policy."""
92
+
93
+ def __init__(
94
+ self,
95
+ client: OpenAICompatibleModelClient,
96
+ *,
97
+ model: ResolvedModel,
98
+ network_policy: NetworkPolicy,
99
+ timeout_seconds: int,
100
+ max_attempts: int,
101
+ backoff_seconds: float,
102
+ ) -> None:
103
+ self._client = client
104
+ self._model = model
105
+ self._network_policy = network_policy
106
+ self._timeout_seconds = timeout_seconds
107
+ self._max_attempts = max_attempts
108
+ self._backoff_seconds = backoff_seconds
109
+
110
+ async def complete(
111
+ self,
112
+ *,
113
+ model: str,
114
+ prompt: str,
115
+ messages: Sequence[dict[str, Any]],
116
+ tools: Sequence[Any],
117
+ ) -> HarnessReasoningTurn:
118
+ del prompt
119
+ if model != self._model.model:
120
+ raise PluginHostError(
121
+ "harness_model_not_bound",
122
+ f"Harness requested unbound model {model!r}",
123
+ )
124
+ response = await self._client.complete(
125
+ self._model,
126
+ messages=[dict(message) for message in messages],
127
+ network_policy=self._network_policy,
128
+ timeout_seconds=self._timeout_seconds,
129
+ max_attempts=self._max_attempts,
130
+ backoff_seconds=self._backoff_seconds,
131
+ tools=[dict(tool.openai_schema) for tool in tools],
132
+ allow_empty=bool(tools),
133
+ )
134
+ calls: list[HarnessToolCall] = []
135
+ for call in response.tool_calls:
136
+ try:
137
+ arguments = json.loads(call.arguments or "{}")
138
+ except json.JSONDecodeError as error:
139
+ raise PluginHostError(
140
+ "harness_tool_arguments_invalid",
141
+ f"model emitted invalid arguments for tool {call.name!r}",
142
+ ) from error
143
+ if not isinstance(arguments, dict):
144
+ raise PluginHostError(
145
+ "harness_tool_arguments_invalid",
146
+ f"model emitted non-object arguments for tool {call.name!r}",
147
+ )
148
+ calls.append(
149
+ HarnessToolCall(
150
+ call_id=call.id,
151
+ name=call.name,
152
+ arguments=arguments,
153
+ )
154
+ )
155
+ return HarnessReasoningTurn(
156
+ final_text=response.content or None,
157
+ tool_calls=tuple(calls),
158
+ )
159
+
160
+
161
+ class StudioPluginRuntime:
162
+ """Resolve, activate, and retain composed providers for Studio sessions."""
163
+
164
+ def __init__(
165
+ self,
166
+ workspace: Workspace,
167
+ *,
168
+ build_repository: BuildRepository,
169
+ session_service: BaseSessionService,
170
+ model_client: OpenAICompatibleModelClient,
171
+ secret_resolver: Any,
172
+ harness_reasoner: HarnessReasoner | None = None,
173
+ provider_manifests: Mapping[str, PluginManifest] | None = None,
174
+ provider_factories: Mapping[str, Any] | None = None,
175
+ legacy_harness_sources: Sequence[LegacyHarnessSource] = (),
176
+ dsh_capability_service: Any | None = None,
177
+ resource_dsh_capability_service: Any | None = None,
178
+ resource_authority: Any | None = None,
179
+ resource_connections: Any | None = None,
180
+ resource_actor_ref: str = "local-user",
181
+ codex_local_launch_resolver: Any = None,
182
+ runtime_executor: RuntimeExecutor | None = None,
183
+ ) -> None:
184
+ self.workspace = workspace
185
+ self.builds = build_repository
186
+ self._session_service = session_service
187
+ self._model_client = model_client
188
+ self._secret_resolver = secret_resolver
189
+ self._harness_reasoner = harness_reasoner
190
+ self._provider_manifests = dict(provider_manifests or {})
191
+ self._provider_factories = dict(provider_factories or {})
192
+ self._dsh_capability_service = dsh_capability_service
193
+ self._resource_dsh_capability_service = (
194
+ resource_dsh_capability_service or dsh_capability_service
195
+ )
196
+ self._resource_authority = resource_authority
197
+ self._resource_connections = resource_connections
198
+ self._resource_actor_ref = resource_actor_ref
199
+ self._codex_local_launch_resolver = codex_local_launch_resolver
200
+ self._runtime_executor = runtime_executor
201
+ self._legacy_bundles = LegacyBundleAdapter(legacy_harness_sources)
202
+ self._lock = asyncio.Lock()
203
+ self._hosts: dict[str, _HostEntry] = {}
204
+ self._resource_write_modes: dict[str, str] = {}
205
+ self._admission_open = True
206
+ self._closed = False
207
+
208
+ def replace_provider_registrations(
209
+ self,
210
+ provider_manifests: Mapping[str, PluginManifest],
211
+ provider_factories: Mapping[str, Any],
212
+ ) -> None:
213
+ """Bind one startup snapshot before any provider activation exists."""
214
+
215
+ manifests = dict(provider_manifests)
216
+ factories = dict(provider_factories)
217
+ if manifests.keys() != factories.keys():
218
+ raise ValueError(
219
+ "plugin provider manifests and factories must use the same exact references"
220
+ )
221
+ if self._closed:
222
+ raise RuntimeError("cannot replace provider registrations after runtime close")
223
+ if self._hosts:
224
+ raise RuntimeError("cannot replace provider registrations after activation")
225
+ self._provider_manifests = manifests
226
+ self._provider_factories = factories
227
+
228
+ @property
229
+ def active_activation_count(self) -> int:
230
+ return sum(entry.host.activation_count for entry in self._hosts.values())
231
+
232
+ def resolve(
233
+ self,
234
+ build_id: str,
235
+ *,
236
+ model: str | None = None,
237
+ approval_mode: str | None = None,
238
+ ) -> StudioRunSpec:
239
+ build = self.builds.get(build_id)
240
+ runtime_type = build.runtime_type.strip().lower()
241
+ if runtime_type not in _COMPOSED_RUNTIME_TYPES:
242
+ raise StudioError(
243
+ "BUILD_RUNTIME_UNSUPPORTED",
244
+ "Build 不是 PluginHost Harness/Provider Runtime",
245
+ status_code=422,
246
+ details={"buildId": build_id, "runtimeType": runtime_type},
247
+ )
248
+ bundle_root = self._bundle_root(build)
249
+ bundle = self._resolve_bundle(bundle_root)
250
+ self._preflight_bundle(bundle)
251
+ dynamic_dsh_mcp = self._bundle_uses_dynamic_dsh(bundle)
252
+ selected_model = self._select_model(build, model)
253
+ resolved = bundle.resolved_agent_spec
254
+ instructions = resolved.get("instructions")
255
+ instructions = instructions if isinstance(instructions, Mapping) else {}
256
+ provider_id, _provider_version = _parse_plugin_ref(
257
+ bundle.composition.profile.agent_provider.ref
258
+ )
259
+ provider_runtime_type = {
260
+ CODEX_AGENT_PROVIDER_PLUGIN_ID: "codex",
261
+ KSADK_HARNESS_AGENT_PROVIDER_PLUGIN_ID: "harness",
262
+ }.get(provider_id)
263
+ return StudioRunSpec(
264
+ launch_context=RuntimeLaunchContext(
265
+ runtime_type=runtime_type,
266
+ project_dir=bundle_root,
267
+ config={"plugin_bundle_digest": bundle.bundle_digest},
268
+ ),
269
+ build_id=build.id,
270
+ agent_id=build.agent_id,
271
+ model=selected_model,
272
+ request_config={
273
+ "agent_system": str(instructions.get("system") or ""),
274
+ "agent_task": str(instructions.get("task") or ""),
275
+ "plugin_bundle_digest": bundle.bundle_digest,
276
+ "dynamic_dsh_mcp": dynamic_dsh_mcp,
277
+ "provider_runtime_adapter": provider_runtime_type is not None,
278
+ "provider_runtime_type": provider_runtime_type or "",
279
+ "provider_ref": bundle.composition.profile.agent_provider.ref,
280
+ **(
281
+ {"tool_approval_mode": normalize_tool_approval_mode(approval_mode)}
282
+ if approval_mode
283
+ else {}
284
+ ),
285
+ },
286
+ manifest_sha256=build.resolved_digest,
287
+ plugin_bundle_root=bundle_root,
288
+ )
289
+
290
+ async def execute(
291
+ self,
292
+ spec: StudioRunSpec,
293
+ request: Mapping[str, Any],
294
+ *,
295
+ session_id: str,
296
+ ) -> StudioPluginTurnResult:
297
+ if spec.plugin_bundle_root is None:
298
+ raise PluginHostError(
299
+ "plugin_bundle_unavailable", "Studio run has no PluginHost Bundle"
300
+ )
301
+ entry = await self._host_for(spec.plugin_bundle_root)
302
+ if entry.agent_id != spec.agent_id:
303
+ raise PluginHostError(
304
+ "plugin_bundle_agent_mismatch",
305
+ "Studio run Agent does not match its immutable PluginHost Bundle",
306
+ )
307
+ self._resource_write_modes[session_id] = str(
308
+ spec.request_config.get("tool_approval_mode") or ""
309
+ )
310
+ try:
311
+ activation = await entry.host.open_activation(
312
+ entry.bundle,
313
+ activation_key=session_id,
314
+ )
315
+ except BaseException:
316
+ self._resource_write_modes.pop(session_id, None)
317
+ raise
318
+ try:
319
+ raw = await activation.execute(dict(request))
320
+ return _normalize_result(raw, session_id=session_id)
321
+ finally:
322
+ # Dynamic DSH leases are generation-bound. Rebuilding the
323
+ # activation per turn guarantees a restarted sidecar never leaves
324
+ # a session pinned to an expired port or scoped token.
325
+ if self._bundle_uses_dynamic_dsh(entry.bundle):
326
+ try:
327
+ await activation.close()
328
+ finally:
329
+ self._resource_write_modes.pop(session_id, None)
330
+
331
+ def kernel_adapter_provider(self, spec: StudioRunSpec): # type: ignore[no-untyped-def]
332
+ """Return a lazy, Build-pinned adapter factory for Scheduler Kernel."""
333
+
334
+ if spec.plugin_bundle_root is None:
335
+ raise StudioError(
336
+ "PLUGIN_RUNTIME_UNAVAILABLE",
337
+ "Studio Build 没有 PluginHost Bundle",
338
+ status_code=409,
339
+ )
340
+ return lambda: StudioPluginKernelAdapter(self, spec)
341
+
342
+ async def kernel_adapter(
343
+ self,
344
+ spec: StudioRunSpec,
345
+ *,
346
+ session_id: str,
347
+ ) -> Any:
348
+ """Bind a Scheduler run to the provider-owned activation adapter."""
349
+
350
+ if spec.plugin_bundle_root is None:
351
+ raise StudioError(
352
+ "PLUGIN_RUNTIME_UNAVAILABLE",
353
+ "Studio Build 没有 PluginHost Bundle",
354
+ status_code=409,
355
+ )
356
+ entry = await self._host_for(spec.plugin_bundle_root)
357
+ if entry.agent_id != spec.agent_id:
358
+ raise PluginHostError(
359
+ "plugin_bundle_agent_mismatch",
360
+ "Studio run Agent does not match its immutable PluginHost Bundle",
361
+ )
362
+ self._resource_write_modes[session_id] = str(
363
+ spec.request_config.get("tool_approval_mode") or ""
364
+ )
365
+ try:
366
+ activation = await entry.host.open_activation(
367
+ entry.bundle,
368
+ activation_key=session_id,
369
+ )
370
+ except BaseException:
371
+ self._resource_write_modes.pop(session_id, None)
372
+ raise
373
+ try:
374
+ return await activation.runtime_adapter()
375
+ except BaseException:
376
+ try:
377
+ await activation.close()
378
+ finally:
379
+ self._resource_write_modes.pop(session_id, None)
380
+ raise
381
+
382
+ async def close_session(self, session_id: str) -> None:
383
+ async with self._lock:
384
+ entries = tuple(self._hosts.values())
385
+ try:
386
+ for entry in entries:
387
+ await entry.host.close_activation(session_id)
388
+ finally:
389
+ self._resource_write_modes.pop(session_id, None)
390
+
391
+ async def close_session_if_dynamic(self, spec: StudioRunSpec, session_id: str) -> None:
392
+ if bool(spec.request_config.get("dynamic_dsh_mcp")):
393
+ await self.close_session(session_id)
394
+
395
+ async def suspend_admission(self) -> None:
396
+ """Stop new activations and drain every currently owned host."""
397
+
398
+ async with self._lock:
399
+ self._admission_open = False
400
+ entries = tuple(self._hosts.values())
401
+ self._hosts.clear()
402
+ cleanup = asyncio.create_task(self._dispose_entries(entries))
403
+ interrupted = False
404
+ while not cleanup.done():
405
+ try:
406
+ await asyncio.shield(cleanup)
407
+ except asyncio.CancelledError:
408
+ interrupted = True
409
+ cleanup.result()
410
+ if interrupted:
411
+ raise asyncio.CancelledError
412
+
413
+ async def resume_admission(self) -> None:
414
+ async with self._lock:
415
+ if self._closed:
416
+ raise PluginHostError(
417
+ "plugin_runtime_closed",
418
+ "Studio plugin runtime is closed",
419
+ )
420
+ self._admission_open = True
421
+
422
+ @staticmethod
423
+ async def _dispose_entries(entries: Sequence[_HostEntry]) -> None:
424
+ if entries:
425
+ results = await asyncio.gather(
426
+ *(entry.host.dispose() for entry in entries),
427
+ return_exceptions=True,
428
+ )
429
+ for result in results:
430
+ if isinstance(result, BaseException):
431
+ raise result
432
+
433
+ async def aclose(self) -> None:
434
+ async with self._lock:
435
+ if self._closed:
436
+ return
437
+ self._closed = True
438
+ self._admission_open = False
439
+ entries = tuple(self._hosts.values())
440
+ self._hosts.clear()
441
+ cleanup = asyncio.create_task(self._dispose_entries(entries))
442
+ interrupted = False
443
+ while not cleanup.done():
444
+ try:
445
+ await asyncio.shield(cleanup)
446
+ except asyncio.CancelledError:
447
+ interrupted = True
448
+ cleanup.result()
449
+ if interrupted:
450
+ raise asyncio.CancelledError
451
+
452
+ async def _host_for(self, bundle_root: Path) -> _HostEntry:
453
+ # Re-resolve every turn. This deliberately rechecks enabled receipts and
454
+ # package digests rather than trusting a previously healthy child.
455
+ bundle = self._resolve_bundle(bundle_root)
456
+ key = bundle.bundle_digest
457
+ async with self._lock:
458
+ if self._closed:
459
+ raise PluginHostError(
460
+ "plugin_runtime_closed",
461
+ "Studio plugin runtime is closed",
462
+ )
463
+ if not self._admission_open:
464
+ raise PluginHostError(
465
+ "plugin_runtime_reconfiguring",
466
+ "Studio plugin runtime is reconfiguring",
467
+ )
468
+ existing = self._hosts.get(key)
469
+ if existing is not None:
470
+ return existing
471
+
472
+ registry, factories, permissions = self._runtime_components(bundle)
473
+ verified = (
474
+ bundle
475
+ if bundle.manifest.bundle_format == "agentkit.bundle/v1"
476
+ else PluginBundleResolver(registry).resolve(bundle_root)
477
+ )
478
+ services: dict[str, Any] = {
479
+ "session_service": self._session_service,
480
+ "runtime_state_root": self.workspace.resolve(".agentkit/plugin-runtime/state"),
481
+ # Providers resolve credential *references* at activation time.
482
+ # The DSH discovery host never receives this service.
483
+ "credential_resolver": self._secret_resolver,
484
+ "codex_local_launch_resolver": self._codex_local_launch_resolver,
485
+ "runtime_executor": self._runtime_executor,
486
+ "dsh_capability_service": self._resource_dsh_capability_service,
487
+ "resource_authority": self._resource_authority,
488
+ "resource_connections": self._resource_connections,
489
+ "resource_actor_ref": self._resource_actor_ref,
490
+ "resource_write_authorizer_factory": self._resource_write_authorizer,
491
+ }
492
+ provider_id, _provider_version = _parse_plugin_ref(
493
+ verified.composition.profile.agent_provider.ref
494
+ )
495
+ if provider_id == KSADK_HARNESS_AGENT_PROVIDER_PLUGIN_ID:
496
+ services["harness_reasoner"] = (
497
+ self._harness_reasoner or self._bound_harness_reasoner(verified)
498
+ )
499
+ host = PluginHost(
500
+ registry,
501
+ factories,
502
+ allowed_permissions=permissions,
503
+ services=services,
504
+ )
505
+ try:
506
+ await host.apply(verified.composition.profile)
507
+ except BaseException:
508
+ await host.dispose()
509
+ raise
510
+ candidate = _HostEntry(
511
+ agent_id=verified.manifest.agent_id,
512
+ bundle=verified,
513
+ host=host,
514
+ )
515
+ stale = [
516
+ (digest, entry)
517
+ for digest, entry in self._hosts.items()
518
+ if entry.agent_id == candidate.agent_id and digest != key
519
+ ]
520
+ self._hosts[key] = candidate
521
+ for digest, entry in stale:
522
+ self._hosts.pop(digest, None)
523
+ await entry.host.dispose()
524
+ return candidate
525
+
526
+ def _resource_write_authorizer(
527
+ self,
528
+ activation_key: str,
529
+ _bundle: ResolvedPluginBundle,
530
+ ) -> FullAccessResourceWriteAuthorizer | None:
531
+ if self._resource_write_modes.get(activation_key) != "full":
532
+ return None
533
+ return FullAccessResourceWriteAuthorizer(activation_key=activation_key)
534
+
535
+ @staticmethod
536
+ def _bundle_uses_dynamic_dsh(bundle: ResolvedPluginBundle) -> bool:
537
+ reference = (
538
+ f"plugin://{DSH_PROFILE_MCP_PLUGIN_ID}@{dsh_profile_mcp_manifest().metadata.version}"
539
+ )
540
+ dynamic_refs = {reference, PLATFORM_RESOURCE_MCP_REF}
541
+ return any(
542
+ capability.ref in dynamic_refs
543
+ for capability in bundle.composition.profile.capabilities
544
+ )
545
+
546
+ def _resolve_bundle(self, bundle_root: Path) -> ResolvedPluginBundle:
547
+ registered_ids = {manifest.metadata.id for manifest in self._provider_manifests.values()}
548
+ try:
549
+ manifest, selection = self._legacy_bundles.select_from_bundle(
550
+ bundle_root,
551
+ registered_provider_ids=registered_ids,
552
+ )
553
+ except LegacyBundleCompatibilityError as error:
554
+ code = (
555
+ "AGENT_PROVIDER_NOT_REGISTERED"
556
+ if error.code == "agent_provider_not_registered"
557
+ else "PLUGIN_BUNDLE_INVALID"
558
+ )
559
+ raise StudioError(
560
+ code,
561
+ "Harness Bundle 兼容性校验失败",
562
+ status_code=409,
563
+ details={"reason": error.code},
564
+ ) from error
565
+ if selection is not None and selection.route == "legacy":
566
+ assert selection.manifest is not None
567
+ profile = CompositionProfile.model_validate(
568
+ {
569
+ "agentProvider": {
570
+ "ref": (
571
+ f"plugin://{selection.manifest.metadata.id}"
572
+ f"@{selection.manifest.metadata.version}"
573
+ )
574
+ }
575
+ }
576
+ )
577
+ registry = PluginRegistry([selection.manifest, *builtin_capability_manifests()])
578
+ try:
579
+ resolved = json.loads(
580
+ (bundle_root / "resolved-agent-spec.json").read_text(encoding="utf-8")
581
+ )
582
+ except (OSError, UnicodeError, json.JSONDecodeError) as error:
583
+ raise StudioError(
584
+ "PLUGIN_BUNDLE_INVALID",
585
+ "Legacy Harness Bundle 缺少 resolved Agent spec",
586
+ status_code=409,
587
+ details={"reason": "legacy_resolved_spec_invalid"},
588
+ ) from error
589
+ if not isinstance(resolved, dict):
590
+ raise StudioError(
591
+ "PLUGIN_BUNDLE_INVALID",
592
+ "Legacy Harness resolved Agent spec 必须是对象",
593
+ status_code=409,
594
+ details={"reason": "legacy_resolved_spec_invalid"},
595
+ )
596
+ return ResolvedPluginBundle(
597
+ root=bundle_root,
598
+ manifest=manifest,
599
+ resolved_agent_spec=resolved,
600
+ composition=registry.resolve(profile),
601
+ )
602
+ profile = self._read_profile(bundle_root)
603
+ manifests = [
604
+ *builtin_agent_provider_manifests(),
605
+ *builtin_capability_manifests(),
606
+ dsh_profile_mcp_manifest(),
607
+ platform_resource_mcp_manifest(),
608
+ ]
609
+ external = self._external_manifest(profile)
610
+ if external is not None:
611
+ manifests.append(external)
612
+ try:
613
+ return PluginBundleResolver(PluginRegistry(manifests)).resolve(bundle_root)
614
+ except PluginBundleError as error:
615
+ raise StudioError(
616
+ "PLUGIN_BUNDLE_INVALID",
617
+ "PluginHost Bundle 校验失败",
618
+ status_code=409,
619
+ details={"reason": error.code},
620
+ ) from error
621
+
622
+ def _runtime_components(
623
+ self,
624
+ bundle: ResolvedPluginBundle,
625
+ ) -> tuple[PluginRegistry, dict[str, Any], frozenset[str]]:
626
+ manifests: list[PluginManifest] = [
627
+ *builtin_agent_provider_manifests(),
628
+ *builtin_capability_manifests(),
629
+ dsh_profile_mcp_manifest(),
630
+ platform_resource_mcp_manifest(),
631
+ ]
632
+ factories = builtin_capability_factories(
633
+ state_root=self.workspace.resolve(".agentkit/plugin-runtime/state"),
634
+ secret_resolver=self._secret_resolver.resolve,
635
+ )
636
+ factories[DSH_PROFILE_MCP_PLUGIN_ID] = DshProfileMCPFactory(self._dsh_capability_service)
637
+ factories[PLATFORM_RESOURCE_MCP_PLUGIN_ID] = PlatformResourceMCPFactory()
638
+ provider_id, provider_version = _parse_plugin_ref(
639
+ bundle.composition.profile.agent_provider.ref
640
+ )
641
+ provider_ref = f"plugin://{provider_id}@{provider_version}"
642
+ if bundle.manifest.bundle_format == "agentkit.bundle/v1":
643
+ manifest = legacy_harness_agent_provider_manifest()
644
+ factory = KsADKHarnessProviderFactory(session_service=self._session_service)
645
+ else:
646
+ manifest = self._provider_manifests.get(provider_ref)
647
+ factory = self._provider_factories.get(provider_ref)
648
+ if manifest is None or factory is None:
649
+ raise StudioError(
650
+ "AGENT_PROVIDER_NOT_REGISTERED",
651
+ "AgentProvider 尚未由当前 DSH Profile 完成预检与注册",
652
+ status_code=409,
653
+ details={"provider": provider_ref},
654
+ )
655
+ manifests.append(manifest)
656
+ factories[provider_id] = factory
657
+
658
+ allowed = set(builtin_capability_permissions(bundle.composition.profile))
659
+ builtin_ids = {
660
+ manifest.metadata.id
661
+ for manifest in (
662
+ *builtin_agent_provider_manifests(),
663
+ *builtin_capability_manifests(),
664
+ dsh_profile_mcp_manifest(),
665
+ platform_resource_mcp_manifest(),
666
+ )
667
+ }
668
+ builtin_ids.discard(DSH_PROFILE_MCP_PLUGIN_ID)
669
+ allowed.update(
670
+ permission
671
+ for manifest in manifests
672
+ if manifest.metadata.id in builtin_ids
673
+ for permission in manifest.spec.permissions
674
+ )
675
+ security = bundle.resolved_agent_spec.get("security")
676
+ if isinstance(security, Mapping):
677
+ raw = security.get("allowedPermissions") or security.get("allowed_permissions") or []
678
+ if isinstance(raw, Sequence) and not isinstance(raw, (str, bytes)):
679
+ allowed.update(str(item) for item in raw)
680
+ return PluginRegistry(manifests), factories, frozenset(allowed)
681
+
682
+ def _preflight_bundle(self, bundle: ResolvedPluginBundle) -> None:
683
+ """Reject an unusable composition before a Run or Schedule is admitted.
684
+
685
+ Provider activation is intentionally lazy, but permission and graph
686
+ admission are deterministic from the immutable Bundle. Delaying this
687
+ check until ``RuntimeAdapter.start`` lets an accepted Inbox message
688
+ repeatedly create PENDING Runs that can never become runnable.
689
+ """
690
+
691
+ registry, factories, permissions = self._runtime_components(bundle)
692
+ host = PluginHost(
693
+ registry,
694
+ factories,
695
+ allowed_permissions=permissions,
696
+ )
697
+ try:
698
+ host.preflight(bundle.composition.profile)
699
+ except PluginHostError as error:
700
+ code = (
701
+ "PLUGIN_PERMISSION_DENIED"
702
+ if error.code == "plugin_permission_denied"
703
+ else "PLUGIN_RUNTIME_PREFLIGHT_FAILED"
704
+ )
705
+ raise StudioError(
706
+ code,
707
+ "Agent 插件组合未通过运行前检查",
708
+ status_code=409,
709
+ details={"reason": error.code},
710
+ ) from error
711
+
712
+ def _bound_harness_reasoner(self, bundle: ResolvedPluginBundle) -> HarnessReasoner:
713
+ spec = bundle.resolved_agent_spec
714
+ model = ResolvedModel.model_validate(spec.get("model"))
715
+ security = spec.get("security")
716
+ security = security if isinstance(security, Mapping) else {}
717
+ network = NetworkPolicy.model_validate(security.get("network") or {})
718
+ execution = spec.get("execution")
719
+ execution = execution if isinstance(execution, Mapping) else {}
720
+ retry = execution.get("retry")
721
+ retry = retry if isinstance(retry, Mapping) else {}
722
+ return _StudioHarnessReasoner(
723
+ self._model_client,
724
+ model=model,
725
+ network_policy=network,
726
+ timeout_seconds=int(
727
+ execution.get("timeoutSeconds") or execution.get("timeout_seconds") or 120
728
+ ),
729
+ max_attempts=int(retry.get("maxAttempts") or retry.get("max_attempts") or 2),
730
+ backoff_seconds=float(retry.get("backoffSeconds") or retry.get("backoff_seconds") or 1),
731
+ )
732
+
733
+ def _external_manifest(self, profile: CompositionProfile) -> PluginManifest | None:
734
+ plugin_id, version = _parse_plugin_ref(profile.agent_provider.ref)
735
+ builtin_ids = {manifest.metadata.id for manifest in builtin_agent_provider_manifests()}
736
+ if plugin_id in builtin_ids:
737
+ return None
738
+ provider_ref = f"plugin://{plugin_id}@{version}"
739
+ manifest = self._provider_manifests.get(provider_ref)
740
+ if manifest is None:
741
+ raise StudioError(
742
+ "AGENT_PROVIDER_NOT_REGISTERED",
743
+ "AgentProvider 尚未由当前 DSH Profile 完成预检与注册",
744
+ status_code=409,
745
+ details={"provider": provider_ref},
746
+ )
747
+ return manifest
748
+
749
+ def _read_profile(self, bundle_root: Path) -> CompositionProfile:
750
+ try:
751
+ return cast(
752
+ CompositionProfile,
753
+ CompositionProfile.model_validate_json(
754
+ (bundle_root / "composition-profile.json").read_text(encoding="utf-8")
755
+ ),
756
+ )
757
+ except (OSError, UnicodeError, ValueError) as error:
758
+ raise StudioError(
759
+ "PLUGIN_BUNDLE_INVALID",
760
+ "PluginHost Bundle 缺少有效的 Composition Profile",
761
+ status_code=409,
762
+ ) from error
763
+
764
+ def _bundle_root(self, build: BuildRecord) -> Path:
765
+ if not build.artifact_path:
766
+ raise StudioError("BUILD_NOT_READY", "Build 尚未生成制品", status_code=409)
767
+ archive = cast(
768
+ Path,
769
+ self.workspace.resolve(build.artifact_path, must_exist=True),
770
+ )
771
+ bundle_root = archive.parent / "agent-bundle"
772
+ if not bundle_root.is_dir():
773
+ raise StudioError(
774
+ "PLUGIN_BUNDLE_UNAVAILABLE",
775
+ "Build 缺少可运行的 PluginHost Bundle",
776
+ status_code=409,
777
+ )
778
+ return bundle_root
779
+
780
+ @staticmethod
781
+ def _select_model(build: BuildRecord, requested: str | None) -> str:
782
+ allowed = [str(item) for item in build.runtime_lock.get("models") or [] if str(item)]
783
+ default = str(build.runtime_lock.get("model") or "").strip()
784
+ if default and default not in allowed:
785
+ allowed.insert(0, default)
786
+ selected = str(requested or default).strip()
787
+ if not selected:
788
+ raise StudioError("AGENT_MODEL_REQUIRED", "Build 没有绑定可运行模型", status_code=422)
789
+ if allowed and selected not in allowed:
790
+ raise StudioError(
791
+ "MODEL_NOT_BOUND",
792
+ "请求模型未绑定到当前 Agent Build",
793
+ status_code=422,
794
+ details={"model": selected, "allowedModels": allowed},
795
+ )
796
+ return selected
797
+
798
+
799
+ def _parse_plugin_ref(value: str) -> tuple[str, str]:
800
+ plugin_id, version = value.removeprefix("plugin://").rsplit("@", 1)
801
+ return plugin_id, version
802
+
803
+
804
+ def _normalize_result(raw: Any, *, session_id: str) -> StudioPluginTurnResult:
805
+ if isinstance(raw, (CodexTurnResult, HarnessTurnResult)):
806
+ return StudioPluginTurnResult(
807
+ output_text=raw.output_text,
808
+ session_id=raw.session_id,
809
+ usage=dict(raw.usage),
810
+ metadata=dict(raw.metadata),
811
+ raw=raw,
812
+ )
813
+ if not isinstance(raw, Mapping):
814
+ raise PluginHostError("provider_result_invalid", "AgentProvider result must be an object")
815
+ output_text = str(raw.get("outputText") or raw.get("output_text") or raw.get("output") or "")
816
+ if not output_text:
817
+ raise PluginHostError(
818
+ "provider_result_invalid", "AgentProvider result must contain outputText"
819
+ )
820
+ usage = raw.get("usage") if isinstance(raw.get("usage"), Mapping) else {}
821
+ metadata = raw.get("metadata") if isinstance(raw.get("metadata"), Mapping) else {}
822
+ return StudioPluginTurnResult(
823
+ output_text=output_text,
824
+ session_id=str(raw.get("sessionId") or raw.get("session_id") or session_id),
825
+ usage=dict(usage),
826
+ metadata=dict(metadata),
827
+ raw=raw,
828
+ )
829
+
830
+
831
+ __all__ = ["StudioPluginRuntime", "StudioPluginTurnResult"]