agentengine-sdk-python 0.8.2__py3-none-any.whl → 0.8.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
  2. agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/agui/_agent_helpers.py +4 -0
  5. ksadk/api/client.py +108 -91
  6. ksadk/builders/code_builder.py +36 -9
  7. ksadk/builders/framework_requirements.py +2 -1
  8. ksadk/builders/ks3_uploader.py +36 -7
  9. ksadk/builders/managed_runtime_builder.py +4 -0
  10. ksadk/cli/__init__.py +38 -3
  11. ksadk/cli/cmd_managed_runtime.py +13 -1
  12. ksadk/cli/cmd_plugin.py +662 -0
  13. ksadk/cli/cmd_web.py +2 -5
  14. ksadk/cli/runtime_bootstrap.py +23 -1
  15. ksadk/codex/client.py +424 -96
  16. ksadk/codex/projection.py +24 -0
  17. ksadk/codex/runtime.py +83 -283
  18. ksadk/common/auth.py +16 -10
  19. ksadk/configs/env_registry.py +59 -3
  20. ksadk/configs/settings.py +9 -0
  21. ksadk/context_engine/contributors.py +73 -8
  22. ksadk/conversations/__init__.py +19 -0
  23. ksadk/conversations/context.py +104 -24
  24. ksadk/conversations/contracts.py +266 -0
  25. ksadk/conversations/message_projection.py +154 -15
  26. ksadk/conversations/projector.py +614 -0
  27. ksadk/conversations/reducer.py +98 -0
  28. ksadk/conversations/runtime_invocation.py +5 -0
  29. ksadk/conversations/runtime_payloads.py +1 -0
  30. ksadk/conversations/runtime_preparation.py +30 -27
  31. ksadk/conversations/runtime_resume.py +50 -2
  32. ksadk/conversations/runtime_stream_events.py +5 -0
  33. ksadk/conversations/runtime_streaming.py +25 -7
  34. ksadk/deployment/env_forward.py +2 -2
  35. ksadk/deployment/providers/serverless.py +1 -1
  36. ksadk/events/_v1_compat/projection.py +2 -0
  37. ksadk/events/adapters/_codex_validators.py +18 -7
  38. ksadk/events/adapters/codex.py +190 -0
  39. ksadk/events/adapters/langgraph.py +15 -1
  40. ksadk/events/canonical_store.py +3 -1
  41. ksadk/events/projections.py +1 -1
  42. ksadk/harness/__init__.py +45 -35
  43. ksadk/harness/config.py +2 -2
  44. ksadk/harness/runtime.py +75 -16
  45. ksadk/harness/tools.py +38 -13
  46. ksadk/interaction/provider.py +1 -0
  47. ksadk/interaction/providers/langgraph.py +1 -0
  48. ksadk/kernel/bootstrap.py +28 -4
  49. ksadk/kernel/contract_fingerprints.py +5 -4
  50. ksadk/kernel/contracts.py +8 -0
  51. ksadk/kernel/control.py +1 -0
  52. ksadk/kernel/ingress.py +36 -2
  53. ksadk/kernel/memory_store.py +1 -0
  54. ksadk/kernel/postgres_store.py +1 -0
  55. ksadk/kernel/sqlite_store.py +28 -0
  56. ksadk/kernel/store.py +3 -0
  57. ksadk/kernel/worker.py +76 -10
  58. ksadk/knowledge_base/client.py +57 -27
  59. ksadk/mcp_runtime/__init__.py +12 -4
  60. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  61. ksadk/memory/adk/resilient_session_service.py +25 -17
  62. ksadk/memory/adk/short_term_memory.py +26 -9
  63. ksadk/memory/models.py +7 -4
  64. ksadk/memory/provider_resolver.py +3 -0
  65. ksadk/memory/providers/local_sqlite.py +7 -0
  66. ksadk/model_proxy/server.py +10 -5
  67. ksadk/plugins/__init__.py +171 -0
  68. ksadk/plugins/artifacts.py +275 -0
  69. ksadk/plugins/bridges/__init__.py +47 -0
  70. ksadk/plugins/bridges/codex.py +659 -0
  71. ksadk/plugins/bridges/dsh.py +1300 -0
  72. ksadk/plugins/builtins.py +746 -0
  73. ksadk/plugins/bundle.py +246 -0
  74. ksadk/plugins/bundle_security.py +191 -0
  75. ksadk/plugins/codex_manifest.py +983 -0
  76. ksadk/plugins/composition.py +537 -0
  77. ksadk/plugins/context_contributor.py +437 -0
  78. ksadk/plugins/contracts.py +569 -0
  79. ksadk/plugins/delivery.py +153 -0
  80. ksadk/plugins/dsh_installation_digest.py +71 -0
  81. ksadk/plugins/dsh_toolchain.py +1024 -0
  82. ksadk/plugins/ecosystem_bridge.py +1105 -0
  83. ksadk/plugins/ecosystem_probe.py +191 -0
  84. ksadk/plugins/host.py +787 -0
  85. ksadk/plugins/kernel_adapter.py +205 -0
  86. ksadk/plugins/providers/__init__.py +108 -0
  87. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  88. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  89. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  90. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  91. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  92. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  93. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  94. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  95. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  96. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  97. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  98. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  99. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  100. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  101. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  102. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  103. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  104. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  105. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  106. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  107. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  108. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  109. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  110. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  111. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  112. ksadk/plugins/providers/codex.py +988 -0
  113. ksadk/plugins/providers/codex_dsh.py +83 -0
  114. ksadk/plugins/providers/codex_native.py +368 -0
  115. ksadk/plugins/providers/codex_turn.py +301 -0
  116. ksadk/plugins/providers/dsh.py +951 -0
  117. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  118. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  119. ksadk/plugins/providers/dsh_mcp.py +467 -0
  120. ksadk/plugins/providers/harness.py +632 -0
  121. ksadk/plugins/providers/harness_dsh.py +91 -0
  122. ksadk/plugins/providers/legacy.py +215 -0
  123. ksadk/plugins/providers/legacy_catalog.py +100 -0
  124. ksadk/plugins/providers/mcp_projection.py +150 -0
  125. ksadk/plugins/providers/platform_resources.py +657 -0
  126. ksadk/plugins/providers/shipped_dsh.py +370 -0
  127. ksadk/plugins/resolver.py +338 -0
  128. ksadk/plugins/subagent_providers/__init__.py +12 -0
  129. ksadk/plugins/subagent_providers/codex.py +443 -0
  130. ksadk/plugins/subagents.py +333 -0
  131. ksadk/resource_runtime/__init__.py +4 -0
  132. ksadk/resource_runtime/broker.py +616 -0
  133. ksadk/resource_runtime/build_artifacts.py +165 -0
  134. ksadk/resource_runtime/contracts.py +138 -0
  135. ksadk/resource_runtime/discovery_receipts.py +100 -0
  136. ksadk/resource_runtime/discovery_skills.py +172 -0
  137. ksadk/resource_runtime/errors.py +6 -0
  138. ksadk/resource_runtime/ipc.py +142 -0
  139. ksadk/resource_runtime/kernel_approval.py +165 -0
  140. ksadk/resource_runtime/knowledge.py +114 -0
  141. ksadk/resource_runtime/langgraph.py +94 -0
  142. ksadk/resource_runtime/leases.py +191 -0
  143. ksadk/resource_runtime/managed_projection.py +186 -0
  144. ksadk/resource_runtime/mcp_server.py +138 -0
  145. ksadk/resource_runtime/memory_provider.py +318 -0
  146. ksadk/resource_runtime/memory_receipts.py +34 -0
  147. ksadk/resource_runtime/operation_ledger.py +211 -0
  148. ksadk/resource_runtime/plugin_config.py +48 -0
  149. ksadk/resource_runtime/policy_authorization.py +54 -0
  150. ksadk/resource_runtime/process.py +110 -0
  151. ksadk/resource_runtime/skill_artifacts.py +153 -0
  152. ksadk/resource_runtime/skill_runtime.py +42 -0
  153. ksadk/resource_runtime/skill_workspace.py +118 -0
  154. ksadk/resource_runtime/skills.py +215 -0
  155. ksadk/resource_runtime/snapshots.py +180 -0
  156. ksadk/resource_runtime/socket_server.py +103 -0
  157. ksadk/resource_runtime/supervisor.py +380 -0
  158. ksadk/resource_runtime/worker.py +504 -0
  159. ksadk/runners/_langgraph_runner_streams.py +74 -6
  160. ksadk/runners/adk_runner.py +149 -11
  161. ksadk/runners/base_runner.py +29 -1
  162. ksadk/runners/langgraph_runner.py +475 -145
  163. ksadk/runtime/_runner_adapter/stream_mapping.py +193 -60
  164. ksadk/runtime/adapter.py +3 -0
  165. ksadk/runtime/conversation_execution.py +92 -16
  166. ksadk/runtime/executor.py +78 -2
  167. ksadk/runtime/factory.py +30 -200
  168. ksadk/runtime/framework_adapters.py +41 -0
  169. ksadk/runtime/preprocessing.py +10 -2
  170. ksadk/runtime/runner_adapter.py +78 -14
  171. ksadk/runtime_context.py +40 -2
  172. ksadk/sandbox/__init__.py +2 -1
  173. ksadk/sandbox/backends/e2b.py +52 -11
  174. ksadk/sandbox/backends/local_process.py +9 -0
  175. ksadk/sandbox/base.py +2 -0
  176. ksadk/sandbox/e2b_connection.py +66 -0
  177. ksadk/sandbox/factory.py +72 -0
  178. ksadk/scheduler/__init__.py +18 -0
  179. ksadk/scheduler/calendar.py +102 -0
  180. ksadk/scheduler/contracts.py +254 -0
  181. ksadk/scheduler/dispatcher.py +129 -0
  182. ksadk/scheduler/engine.py +416 -0
  183. ksadk/scheduler/sqlite_store.py +581 -0
  184. ksadk/server/composition.py +2 -0
  185. ksadk/server/factory.py +5 -0
  186. ksadk/server/persistence_capability.py +516 -0
  187. ksadk/server/routes/control.py +210 -46
  188. ksadk/server/routes/dependencies.py +15 -0
  189. ksadk/server/routes/models.py +47 -4
  190. ksadk/server/routes/projection.py +252 -12
  191. ksadk/server/routes/sessions.py +284 -107
  192. ksadk/server/routes/streaming.py +43 -9
  193. ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  194. ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
  195. ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  196. ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  197. ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  198. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  199. ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
  200. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  201. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  202. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  203. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  204. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  205. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  206. ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  207. ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  208. ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  209. ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  210. ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  211. ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  212. ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  213. ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  214. ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  215. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  216. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  217. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  218. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  219. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  220. ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  221. ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
  222. ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  223. ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  224. ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  225. ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  226. ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  227. ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
  228. ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
  229. ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
  230. ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
  231. ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
  232. ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
  233. ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
  234. ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
  235. ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
  236. ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
  237. ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
  238. ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
  239. ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
  240. ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
  241. ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
  242. ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
  243. ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
  244. ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
  245. ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
  246. ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
  247. ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
  248. ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
  249. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  250. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  251. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  252. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  253. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  254. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  255. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  256. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  257. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  258. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  259. ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  260. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  261. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  262. ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  263. ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
  264. ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
  265. ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  266. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  267. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  268. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  269. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  270. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  271. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  272. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  273. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  274. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  275. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  276. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  277. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  278. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  279. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  280. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  281. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  282. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  283. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  284. ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  285. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  286. ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  287. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  288. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  289. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  290. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  291. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  292. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  293. ksadk/server/static/index.html +2 -2
  294. ksadk/session_context.py +66 -0
  295. ksadk/sessions/__init__.py +11 -21
  296. ksadk/sessions/_local_service_sync.py +263 -1
  297. ksadk/sessions/base.py +176 -0
  298. ksadk/sessions/errors.py +4 -0
  299. ksadk/sessions/in_memory.py +309 -19
  300. ksadk/sessions/local_service.py +83 -1
  301. ksadk/sessions/persistence.py +275 -0
  302. ksadk/sessions/postgres_service.py +358 -0
  303. ksadk/sessions/resilience.py +8 -0
  304. ksadk/sessions/resilient.py +362 -4
  305. ksadk/sessions/topology.py +135 -0
  306. ksadk/skills/models.py +26 -4
  307. ksadk/skills/package_store.py +186 -38
  308. ksadk/skills/runtime/agent.py +31 -6
  309. ksadk/skills/runtime/artifact_delivery.py +139 -0
  310. ksadk/skills/runtime/backends/e2b.py +98 -6
  311. ksadk/skills/runtime/backends/local.py +73 -8
  312. ksadk/skills/runtime/base.py +3 -0
  313. ksadk/skills/runtime/executor.py +2 -0
  314. ksadk/skills/runtime/loader.py +10 -2
  315. ksadk/skills/runtime/pinned.py +114 -0
  316. ksadk/skills/runtime/request.py +31 -0
  317. ksadk/skills/service_client.py +211 -24
  318. ksadk/studio/agent_lifecycle.py +26 -20
  319. ksadk/studio/api.py +714 -90
  320. ksadk/studio/api_catalog_routes.py +23 -0
  321. ksadk/studio/api_contracts.py +34 -1
  322. ksadk/studio/api_plugin_routes.py +911 -0
  323. ksadk/studio/api_resource_connections.py +183 -0
  324. ksadk/studio/attachment_store.py +187 -0
  325. ksadk/studio/authoring.py +10 -4
  326. ksadk/studio/authoring_coordinator.py +31 -16
  327. ksadk/studio/builder.py +199 -43
  328. ksadk/studio/cloud.py +346 -104
  329. ksadk/studio/cloud_shared_web.py +565 -0
  330. ksadk/studio/codex_agent_service.py +140 -27
  331. ksadk/studio/codex_builder.py +294 -16
  332. ksadk/studio/codex_credentials.py +90 -0
  333. ksadk/studio/codex_manifest.py +51 -4
  334. ksadk/studio/codex_plugin_store.py +746 -0
  335. ksadk/studio/codex_provider_build.py +231 -0
  336. ksadk/studio/codex_run.py +200 -29
  337. ksadk/studio/compatibility_report.py +456 -0
  338. ksadk/studio/compiler.py +84 -15
  339. ksadk/studio/contracts.py +249 -4
  340. ksadk/studio/dsh_application.py +137 -0
  341. ksadk/studio/dsh_capability_service.py +1107 -0
  342. ksadk/studio/dsh_models.py +59 -0
  343. ksadk/studio/dsh_provider_registration.py +1075 -0
  344. ksadk/studio/event_store.py +54 -6
  345. ksadk/studio/framework_run.py +37 -4
  346. ksadk/studio/hosted_kernel.py +89 -14
  347. ksadk/studio/mcp_runtime.py +11 -3
  348. ksadk/studio/model_client.py +2 -2
  349. ksadk/studio/operations.py +12 -2
  350. ksadk/studio/plugin_composition.py +468 -0
  351. ksadk/studio/plugin_kernel_adapter.py +28 -0
  352. ksadk/studio/plugin_runtime.py +831 -0
  353. ksadk/studio/resource_authority.py +637 -0
  354. ksadk/studio/resource_binding_validation.py +77 -0
  355. ksadk/studio/resource_build_admission.py +196 -0
  356. ksadk/studio/resource_build_materializer.py +149 -0
  357. ksadk/studio/resource_catalog.py +149 -3
  358. ksadk/studio/resource_connections.py +220 -0
  359. ksadk/studio/run_service.py +1144 -96
  360. ksadk/studio/runtime_source.py +24 -8
  361. ksadk/studio/scheduler_assistant.py +317 -0
  362. ksadk/studio/scheduler_runtime.py +383 -0
  363. ksadk/studio/scheduler_service.py +214 -0
  364. ksadk/studio/service.py +1131 -95
  365. ksadk/studio/shared_web.py +610 -87
  366. ksadk/studio/soul.py +52 -0
  367. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  368. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  369. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  372. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  373. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  377. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  378. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  379. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  380. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  381. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  382. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  383. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  384. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  385. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  386. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  387. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  388. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  389. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  390. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  391. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  392. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  393. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  394. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  395. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  396. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  397. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  398. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  399. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  400. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  401. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  402. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  403. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  404. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  405. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  406. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  407. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  408. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  409. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  410. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  411. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  412. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  413. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  414. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  415. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  416. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  417. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  418. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  419. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  420. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  421. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  422. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  423. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  424. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  425. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  426. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  427. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  428. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  429. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  430. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  431. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  432. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  433. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  434. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  435. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  436. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  437. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  438. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  439. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  440. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  441. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  442. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  443. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  444. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  445. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  446. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  447. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  448. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  449. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  450. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  451. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  452. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  453. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  454. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  455. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  456. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  457. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  458. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  459. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  460. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  461. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  462. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  463. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  464. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  465. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  466. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  467. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  468. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  469. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  470. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  471. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  472. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  473. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  474. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  475. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  476. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  477. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  478. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  479. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  480. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  481. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  482. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  483. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  484. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  485. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  486. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  487. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  488. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  489. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  490. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  491. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  492. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  493. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  494. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  495. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  496. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  497. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  498. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  499. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  500. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  501. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  502. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  503. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  504. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  505. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  506. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  507. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  508. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  509. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  510. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  511. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  512. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  513. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  514. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  515. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  516. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  517. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  518. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  519. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  520. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  521. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  522. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  523. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  524. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  525. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  526. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  527. ksadk/studio/static/index.html +2 -2
  528. ksadk/studio/validator.py +1 -1
  529. ksadk/studio/workspace.py +1 -0
  530. ksadk/version.py +1 -1
  531. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  532. agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
  533. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
  534. ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
  535. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
  536. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
  537. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
  538. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
  539. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
  540. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
  541. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
  542. ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
  543. ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
  544. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
  545. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
  546. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
  547. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
  548. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
  549. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
  550. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
  551. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
  552. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
  553. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
  554. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
  555. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
  556. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
  557. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  558. ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
  559. ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
  560. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  561. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  562. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  563. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
ksadk/studio/contracts.py CHANGED
@@ -43,6 +43,28 @@ class Instructions(ContractModel):
43
43
  task: str = Field(default="", max_length=32768)
44
44
 
45
45
 
46
+ class SoulDocument(ContractModel):
47
+ """Reviewed identity/boundary source that compiles ahead of task prompts.
48
+
49
+ This is deliberately an immutable revision input, not a mutable memory
50
+ file. Runtime may read the compiled snapshot but cannot promote a new
51
+ SoulDocument from a conversation.
52
+ """
53
+
54
+ schema_version: Literal["agentkit.soul/v1"] = "agentkit.soul/v1"
55
+ identity: str = Field(min_length=1, max_length=4096)
56
+ principles: list[str] = Field(default_factory=list, max_length=64)
57
+ boundaries: list[str] = Field(default_factory=list, max_length=64)
58
+ tone: str | None = Field(default=None, max_length=1024)
59
+
60
+ @field_validator("principles", "boundaries")
61
+ @classmethod
62
+ def validate_nonempty_items(cls, value: list[str]) -> list[str]:
63
+ if any(not item.strip() for item in value):
64
+ raise ValueError("soul principles and boundaries must not contain empty items")
65
+ return value
66
+
67
+
46
68
  class ModelParameters(ContractModel):
47
69
  # 三者 None=未配置:请求 payload 一律不携带该字段,使用服务端默认,
48
70
  # 规避各模型族对 temperature/max_tokens 的硬约束(如 kimi 只接受默认温度)。
@@ -85,9 +107,40 @@ class MCPServerRef(CapabilityRef):
85
107
  args: list[str] = Field(default_factory=list)
86
108
  endpoint_url: str | None = None
87
109
  env_refs: dict[str, str] = Field(default_factory=dict)
110
+ # ``dsh-profile`` is resolved at PluginHost activation time. Only the
111
+ # immutable profile/inventory identity is allowed into an Agent Build;
112
+ # the loopback endpoint and bearer token remain process-scoped lease data.
113
+ materialization: Literal["dsh-profile"] | None = None
114
+ profile: str | None = None
115
+ profile_digest: str | None = None
116
+ descriptor_digest: str | None = None
117
+ inventory_digest: str | None = None
88
118
 
89
119
  @model_validator(mode="after")
90
120
  def validate_transport(self) -> "MCPServerRef":
121
+ dynamic_fields = (
122
+ self.profile,
123
+ self.profile_digest,
124
+ self.descriptor_digest,
125
+ self.inventory_digest,
126
+ )
127
+ if self.materialization == "dsh-profile":
128
+ if self.transport != "http":
129
+ raise ValueError("DSH Profile MCP 必须使用运行时 HTTP 租约")
130
+ if self.endpoint_url or self.command or self.args or self.env_refs:
131
+ raise ValueError("DSH Profile MCP 不能持久化 endpoint、命令或环境变量")
132
+ if not all(dynamic_fields):
133
+ raise ValueError("DSH Profile MCP 必须锁定 Profile 与能力摘要")
134
+ if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]{0,63}", self.profile or ""):
135
+ raise ValueError("DSH Profile 名称无效")
136
+ if any(
137
+ not re.fullmatch(r"sha256:[0-9a-f]{64}", value or "")
138
+ for value in dynamic_fields[1:]
139
+ ):
140
+ raise ValueError("DSH Profile MCP 摘要无效")
141
+ return self
142
+ if any(value is not None for value in dynamic_fields):
143
+ raise ValueError("静态 MCP 不能声明 DSH Profile 运行时字段")
91
144
  if self.transport == "stdio" and not self.command:
92
145
  raise ValueError("stdio MCP 必须配置 command")
93
146
  if self.transport in {"http", "sse"} and not self.endpoint_url:
@@ -176,6 +229,53 @@ class CapabilityBinding(ContractModel):
176
229
  config: dict[str, Any] = Field(default_factory=dict)
177
230
 
178
231
 
232
+ class NativePluginBinding(ContractModel):
233
+ """Immutable component selection from a host-managed native plugin."""
234
+
235
+ ecosystem: Literal["codex", "dsh"]
236
+ plugin_ref: str = Field(min_length=12, max_length=256)
237
+ snapshot_digest: str = Field(pattern=r"^sha256:[0-9a-f]{64}$")
238
+ components: list[str] = Field(min_length=1, max_length=128)
239
+ enabled: bool = True
240
+ config: dict[str, Any] = Field(default_factory=dict)
241
+
242
+ @field_validator("plugin_ref")
243
+ @classmethod
244
+ def validate_plugin_ref(cls, value: str) -> str:
245
+ if not re.fullmatch(
246
+ r"plugin://[a-z0-9]+(?:[._-][a-z0-9]+)*@"
247
+ r"\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?",
248
+ value,
249
+ ):
250
+ raise ValueError("插件绑定必须使用 plugin://<id>@<exact-version>")
251
+ return value
252
+
253
+ @field_validator("components")
254
+ @classmethod
255
+ def validate_components(cls, value: list[str]) -> list[str]:
256
+ if len(value) != len(set(value)):
257
+ raise ValueError("插件组件不能重复")
258
+ if any(
259
+ not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}", component)
260
+ for component in value
261
+ ):
262
+ raise ValueError("插件组件 ID 无效")
263
+ return value
264
+
265
+ @field_validator("config")
266
+ @classmethod
267
+ def validate_config(cls, value: dict[str, Any]) -> dict[str, Any]:
268
+ _reject_clear_runtime_secrets(value, path="pluginBinding.config")
269
+ return value
270
+
271
+ @model_validator(mode="after")
272
+ def validate_platform_resource_config(self) -> "NativePluginBinding":
273
+ from ksadk.resource_runtime.plugin_config import resource_plugin_config
274
+
275
+ resource_plugin_config(self.plugin_ref, self.ecosystem, self.config, enabled=self.enabled)
276
+ return self
277
+
278
+
179
279
  class AgentBindings(ContractModel):
180
280
  model_profile_id: str | None = None
181
281
  model_profile_ids: list[str] = Field(default_factory=list)
@@ -184,6 +284,7 @@ class AgentBindings(ContractModel):
184
284
  tools: list[CapabilityBinding] = Field(default_factory=list)
185
285
  mcp_servers: list[CapabilityBinding] = Field(default_factory=list)
186
286
  skills: list[CapabilityBinding] = Field(default_factory=list)
287
+ plugins: list[NativePluginBinding] = Field(default_factory=list)
187
288
 
188
289
  @model_validator(mode="after")
189
290
  def validate_model_profiles(self) -> "AgentBindings":
@@ -197,6 +298,12 @@ class AgentBindings(ContractModel):
197
298
  and self.model_profile_id not in self.model_profile_ids
198
299
  ):
199
300
  raise ValueError("默认 modelProfileId 必须包含在 modelProfileIds 中")
301
+ plugin_refs = [binding.plugin_ref for binding in self.plugins if binding.enabled]
302
+ if len(plugin_refs) != len(set(plugin_refs)):
303
+ raise ValueError("启用的插件绑定不能重复 pluginRef")
304
+ from ksadk.resource_runtime.plugin_config import validate_resource_plugin_bindings
305
+
306
+ validate_resource_plugin_bindings(self.plugins)
200
307
  return self
201
308
 
202
309
 
@@ -292,6 +399,13 @@ class MemoryWriteSpec(ContractModel):
292
399
  flush_before_compaction: bool = True
293
400
 
294
401
 
402
+ MemoryScope = Literal["tenant", "workspace", "agent", "user"]
403
+
404
+
405
+ def _default_memory_scopes() -> list[MemoryScope]:
406
+ return ["workspace", "agent", "user"]
407
+
408
+
295
409
  class MemorySpec(ContractModel):
296
410
  """AgentVersion 级 Memory 策略(方案 §5.1 / §10)。Build 只存 providerRef,不存凭证。"""
297
411
 
@@ -299,9 +413,7 @@ class MemorySpec(ContractModel):
299
413
  provider_ref: str = Field(default="local-default", max_length=128)
300
414
  recall: MemoryRecallSpec = Field(default_factory=MemoryRecallSpec)
301
415
  write: MemoryWriteSpec = Field(default_factory=MemoryWriteSpec)
302
- scopes: list[Literal["tenant", "workspace", "agent", "user"]] = Field(
303
- default_factory=lambda: ["workspace", "agent", "user"]
304
- )
416
+ scopes: list[MemoryScope] = Field(default_factory=_default_memory_scopes)
305
417
 
306
418
 
307
419
  class NetworkPolicy(ContractModel):
@@ -329,12 +441,17 @@ class RuntimeRef(ContractModel):
329
441
  project entrypoint that is snapshotted by its Build.
330
442
  """
331
443
 
332
- type: Literal["codex", "adk", "langgraph"]
444
+ type: Literal["codex", "adk", "langgraph", "harness", "plugin"]
333
445
  project_path: str | None = Field(default=None, min_length=1, max_length=1024)
334
446
  entry_point: str | None = Field(default=None, min_length=1, max_length=1024)
335
447
  agent_variable: str = Field(default="root_agent", min_length=1, max_length=256)
336
448
  version: str | None = Field(default=None, min_length=1, max_length=64)
337
449
  detection: Literal["declared", "auto"] = "declared"
450
+ provider_ref: str | None = Field(default=None, min_length=12, max_length=256)
451
+ provider_config: dict[str, Any] = Field(
452
+ default_factory=dict,
453
+ exclude_if=lambda value: not value,
454
+ )
338
455
 
339
456
  @field_validator("project_path", "entry_point")
340
457
  @classmethod
@@ -352,8 +469,32 @@ class RuntimeRef(ContractModel):
352
469
  raise ValueError("Runtime 路径必须是工作区内的相对路径")
353
470
  return normalized
354
471
 
472
+ @field_validator("provider_ref")
473
+ @classmethod
474
+ def validate_provider_ref(cls, value: str | None) -> str | None:
475
+ if value is None:
476
+ return None
477
+ if not re.fullmatch(
478
+ r"plugin://[a-z0-9]+(?:[._-][a-z0-9]+)*@"
479
+ r"\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?",
480
+ value,
481
+ ):
482
+ raise ValueError("Provider 引用必须固定为 plugin://<id>@<exact-version>")
483
+ return value
484
+
485
+ @field_validator("provider_config")
486
+ @classmethod
487
+ def validate_provider_config(cls, value: dict[str, Any]) -> dict[str, Any]:
488
+ _reject_clear_runtime_secrets(value)
489
+ return value
490
+
355
491
  @model_validator(mode="after")
356
492
  def validate_framework_source(self) -> "RuntimeRef":
493
+ if self.type == "plugin":
494
+ if not self.provider_ref:
495
+ raise ValueError("plugin Runtime 必须配置 providerRef")
496
+ elif self.provider_ref is not None or self.provider_config:
497
+ raise ValueError("只有 plugin Runtime 可以配置 providerRef/providerConfig")
357
498
  if self.type in {"adk", "langgraph"}:
358
499
  if not self.project_path:
359
500
  raise ValueError(f"{self.type} Runtime 必须配置 projectPath")
@@ -362,10 +503,35 @@ class RuntimeRef(ContractModel):
362
503
  return self
363
504
 
364
505
 
506
+ _RUNTIME_SECRET_KEY = re.compile(r"(?:secret|password|token|api[_-]?key)", re.IGNORECASE)
507
+ _RUNTIME_SECRET_REF_PREFIXES = (
508
+ "secret://",
509
+ "env://",
510
+ "credential://",
511
+ "vault://",
512
+ )
513
+
514
+
515
+ def _reject_clear_runtime_secrets(value: Any, *, path: str = "providerConfig") -> None:
516
+ """Provider config is revision data: it may only retain secret references."""
517
+
518
+ if isinstance(value, dict):
519
+ for key, child in value.items():
520
+ child_path = f"{path}.{key}"
521
+ if _RUNTIME_SECRET_KEY.search(str(key)) and child is not None:
522
+ if not isinstance(child, str) or not child.startswith(_RUNTIME_SECRET_REF_PREFIXES):
523
+ raise ValueError(f"{child_path} 必须保存 Secret 引用,不能保存明文")
524
+ _reject_clear_runtime_secrets(child, path=child_path)
525
+ elif isinstance(value, list):
526
+ for index, child in enumerate(value):
527
+ _reject_clear_runtime_secrets(child, path=f"{path}[{index}]")
528
+
529
+
365
530
  class AgentSpec(ContractModel):
366
531
  description: str = Field(default="", max_length=1024)
367
532
  runtime: RuntimeRef | None = None
368
533
  instructions: Instructions = Field(default_factory=Instructions)
534
+ soul: SoulDocument | None = None
369
535
  model: ModelSpec | None = None
370
536
  capabilities: CapabilitiesSpec = Field(default_factory=CapabilitiesSpec)
371
537
  bindings: AgentBindings = Field(default_factory=AgentBindings)
@@ -375,6 +541,27 @@ class AgentSpec(ContractModel):
375
541
  security: SecuritySpec = Field(default_factory=SecuritySpec)
376
542
  evaluation: EvaluationSpec = Field(default_factory=EvaluationSpec)
377
543
 
544
+ @model_validator(mode="after")
545
+ def validate_memory_resource_reference(self) -> "AgentSpec":
546
+ if not self.memory.enabled or not self.memory.provider_ref.startswith("binding://"):
547
+ return self
548
+ from ksadk.resource_runtime.plugin_config import resource_plugin_config
549
+
550
+ binding_id = self.memory.provider_ref.removeprefix("binding://")
551
+ for binding in self.bindings.plugins:
552
+ if not binding.enabled:
553
+ continue
554
+ resource = resource_plugin_config(
555
+ binding.plugin_ref, binding.ecosystem, binding.config, enabled=True
556
+ )
557
+ if resource is not None and resource.binding.id == binding_id:
558
+ if resource.binding.resource.kind != "memory-instance":
559
+ raise ValueError("Memory providerRef must reference a memory-instance binding")
560
+ if self.memory.scopes != ["user"]:
561
+ raise ValueError("Platform memory requires explicit scopes: [user]")
562
+ return self
563
+ raise ValueError("Memory providerRef references a missing or disabled resource binding")
564
+
378
565
 
379
566
  _AGENT_ID_PATTERN = re.compile(r"^[a-z][a-z0-9-]{2,62}$")
380
567
  _AGENT_AVATAR_URL_PATTERN = re.compile(r"^/api/v1/assets/agent-avatars/[0-9a-f]{64}\.(?:png|webp)$")
@@ -498,6 +685,7 @@ class ResolvedAgentSpec(ContractModel):
498
685
  source_revision: int
499
686
  compiler_version: str = "1"
500
687
  instructions: Instructions
688
+ soul: SoulDocument | None = None
501
689
  model: ResolvedModel
502
690
  capabilities: ResolvedCapabilities
503
691
  execution: ExecutionSpec
@@ -545,11 +733,56 @@ class BundleManifest(ContractModel):
545
733
  source_digest: str = ""
546
734
  runtime_contract: Literal["agentkit.runtime/v1"] = "agentkit.runtime/v1"
547
735
  plugin_lock_digest: str = ""
736
+ # A v0.8.2 bundle already used the v2 envelope without a composition.
737
+ # Keep that wire shape readable as the explicit legacy execution profile;
738
+ # newly built bundles write ``composition_mode`` so consumers never need
739
+ # to infer whether PluginHost admission is required from missing files.
740
+ composition_mode: Literal["legacy", "composed"] | None = None
741
+ composition_profile_digest: str | None = None
548
742
  hosted_kernel_requirement_digest: str = ""
743
+ resource_build_digest: str | None = Field(
744
+ default=None,
745
+ pattern=r"^sha256:[0-9a-f]{64}$",
746
+ )
747
+ resource_snapshot_digest: str | None = Field(
748
+ default=None,
749
+ pattern=r"^sha256:[0-9a-f]{64}$",
750
+ )
549
751
  files: list[FileEntry]
550
752
  created_at: str = "1970-01-01T00:00:00Z"
551
753
  bundle_digest: str = ""
552
754
 
755
+ @model_validator(mode="after")
756
+ def validate_composition_mode(self) -> "BundleManifest":
757
+ if self.composition_mode == "composed" and not self.composition_profile_digest:
758
+ raise ValueError("composed Bundle v2 requires compositionProfileDigest")
759
+ if self.composition_mode == "legacy" and self.composition_profile_digest:
760
+ raise ValueError("legacy Bundle v2 cannot declare compositionProfileDigest")
761
+ if bool(self.resource_build_digest) != bool(self.resource_snapshot_digest):
762
+ raise ValueError(
763
+ "resourceBuildDigest and resourceSnapshotDigest must be declared together"
764
+ )
765
+ return self
766
+
767
+ @property
768
+ def execution_profile(self) -> Literal["legacy", "composed"]:
769
+ """Normalize historical v2 manifests without rewriting their bytes.
770
+
771
+ ``compositionMode`` was added after the v0.8.2 envelope. Its absence
772
+ remains a backward-compatible projection: an embedded composition
773
+ digest is composed; its absence selects the established runtime path.
774
+ """
775
+
776
+ if self.composition_mode is not None:
777
+ return self.composition_mode
778
+ return "composed" if self.composition_profile_digest else "legacy"
779
+
780
+
781
+ # ``BundleManifest`` is the existing, installed source type. The explicit
782
+ # name documents that its ``agentkit.bundle/v2`` branch is the Phase 2
783
+ # AgentBundleManifest/v2 contract; it is an alias, not a parallel manifest.
784
+ AgentBundleManifest = BundleManifest
785
+
553
786
 
554
787
  class BuildRecord(ContractModel):
555
788
  id: str
@@ -561,6 +794,14 @@ class BuildRecord(ContractModel):
561
794
  source_digest: str = ""
562
795
  runtime_lock: dict[str, Any] = Field(default_factory=dict)
563
796
  bundle_digest: str = ""
797
+ resource_build_digest: str | None = Field(
798
+ default=None,
799
+ pattern=r"^sha256:[0-9a-f]{64}$",
800
+ )
801
+ resource_snapshot_digest: str | None = Field(
802
+ default=None,
803
+ pattern=r"^sha256:[0-9a-f]{64}$",
804
+ )
564
805
  artifact_path: str | None = None
565
806
  diagnostics: list[Diagnostic] = Field(default_factory=list)
566
807
  created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
@@ -735,6 +976,10 @@ class DeploymentRequest(ContractModel):
735
976
 
736
977
 
737
978
  class DeploymentRecord(ContractModel):
979
+ # Identity observed when the cloud Agent was created, never inferred from
980
+ # whichever credentials happen to be configured when history is read.
981
+ created_by_name: str | None = None
982
+ created_by_user_id: str | None = None
738
983
  id: str
739
984
  build_id: str
740
985
  bundle_digest: str
@@ -0,0 +1,137 @@
1
+ """Same-origin transport for the official Core client under the Studio shell.
2
+
3
+ This forwards bytes to the one supervised Core. It implements no DSH services,
4
+ plugin protocol, settings store, or module loader.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import asyncio
9
+ import hmac
10
+ from http.cookiejar import CookieJar
11
+ from urllib.request import HTTPCookieProcessor, ProxyHandler, build_opener
12
+ from urllib.parse import urlsplit
13
+ from urllib.error import URLError
14
+
15
+ import httpx
16
+ from fastapi import FastAPI, Request, WebSocket
17
+ from starlette.background import BackgroundTask
18
+ from starlette.responses import Response, StreamingResponse
19
+
20
+ from ksadk.studio.errors import StudioError
21
+ from ksadk.plugins.host import PluginHostError
22
+
23
+ _HOP_HEADERS = {"host", "connection", "transfer-encoding", "content-length"}
24
+
25
+
26
+ def register_dsh_application(app: FastAPI, studio, *, session_secret: str, security_enabled: bool):
27
+ def authorized(cookies):
28
+ token = cookies.get("agentkit_studio_session", "")
29
+ return not security_enabled or hmac.compare_digest(token, session_secret)
30
+
31
+ @app.api_route("/studio-core/", methods=["GET"])
32
+ async def application(request: Request):
33
+ if not authorized(request.cookies):
34
+ raise StudioError("LOCAL_SESSION_REQUIRED", "请从 Studio 启动链接进入", status_code=401)
35
+ try:
36
+ lease = await studio.dsh_capabilities.connector_lease()
37
+ except PluginHostError:
38
+ raise StudioError("DSH_CORE_UNAVAILABLE", "插件服务暂时不可用,请返回 Studio 重试", status_code=503) from None
39
+ def bootstrap():
40
+ # urllib does not log the process-token URL at INFO like httpx.
41
+ jar = CookieJar()
42
+ opener = build_opener(ProxyHandler({}), HTTPCookieProcessor(jar))
43
+ with opener.open(lease.browser_url(), timeout=30) as response:
44
+ return response.read(), tuple(jar)
45
+
46
+ try:
47
+ body, cookies = await asyncio.to_thread(bootstrap)
48
+ except (URLError, OSError):
49
+ # The upstream bootstrap URL contains a process token. Do not
50
+ # allow urllib's URL-bearing exception into API responses/logs.
51
+ raise StudioError("DSH_CORE_UNAVAILABLE", "插件服务连接失败,请返回 Studio 重试", status_code=503) from None
52
+ body = body.replace(b'<base href="/">', b'<base href="/studio-core/">')
53
+ result = Response(body, media_type="text/html", headers={"Cache-Control": "no-store"})
54
+ for cookie in cookies:
55
+ result.set_cookie(cookie.name, cookie.value, path=cookie.path, httponly=True, samesite="strict")
56
+ return result
57
+
58
+ # Registered last: the Studio API/static routes retain ownership of their paths.
59
+ @app.api_route("/{core_path:path}", methods=["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"])
60
+ async def core_http(core_path: str, request: Request):
61
+ if not authorized(request.cookies):
62
+ raise StudioError("LOCAL_SESSION_REQUIRED", "缺少有效的 Studio 本地会话", status_code=401)
63
+ # Retired Studio chat URLs must not start Core or depend on its availability.
64
+ if core_path.rstrip("/") == "chat" or core_path.startswith(("api/v1/", "v1/")):
65
+ raise StudioError("NOT_FOUND", "接口不存在", status_code=404)
66
+ # Browser mutations must originate in this document; never treat a
67
+ # cross-port loopback origin as trusted just because it is local.
68
+ if request.method not in {"GET", "HEAD"} and request.headers.get("origin") != str(request.base_url).rstrip("/"):
69
+ raise StudioError("LOCAL_ORIGIN_FORBIDDEN", "插件请求来源无效", status_code=403)
70
+ lease = await studio.dsh_capabilities.application_lease()
71
+ origin = lease.endpoint.rsplit("/", 1)[0]
72
+ path = request.url.path.removeprefix("/studio-core")
73
+ if request.url.query:
74
+ path += "?" + request.url.query
75
+ client = httpx.AsyncClient(trust_env=False, timeout=None)
76
+ headers = {key: value for key, value in request.headers.items() if key.lower() not in _HOP_HEADERS}
77
+ # Core checks origin against its own listening socket.
78
+ if "origin" in headers:
79
+ headers["origin"] = origin
80
+ try:
81
+ upstream = await client.send(client.build_request(request.method, origin + path, headers=headers, content=request.stream()), stream=True)
82
+ except BaseException:
83
+ await client.aclose()
84
+ raise
85
+
86
+ async def close():
87
+ await upstream.aclose()
88
+ await client.aclose()
89
+
90
+ result = StreamingResponse(upstream.aiter_raw(), status_code=upstream.status_code, background=BackgroundTask(close))
91
+ result.raw_headers = [(key, value) for key, value in upstream.headers.raw if key.decode().lower() not in _HOP_HEADERS]
92
+ return result
93
+
94
+ @app.websocket("/{core_path:path}")
95
+ async def core_socket(websocket: WebSocket, core_path: str):
96
+ # The SDK supports websockets 12 through 15; the legacy client is
97
+ # available throughout this range (the asyncio client starts at 13).
98
+ from websockets.legacy.client import connect
99
+
100
+ origin = websocket.headers.get("origin")
101
+ expected = f"http://{websocket.headers.get('host')}"
102
+ if not authorized(websocket.cookies) or origin != expected:
103
+ await websocket.close(code=1008)
104
+ return
105
+ lease = await studio.dsh_capabilities.application_lease()
106
+ endpoint = urlsplit(lease.endpoint)
107
+ path = websocket.url.path.removeprefix("/studio-core") + ("?" + websocket.url.query if websocket.url.query else "")
108
+ protocols = websocket.scope.get("subprotocols", [])
109
+ async with connect(
110
+ f"ws://127.0.0.1:{endpoint.port}{path}",
111
+ origin=f"http://127.0.0.1:{endpoint.port}",
112
+ extra_headers={"Cookie": websocket.headers.get("cookie", "")},
113
+ subprotocols=protocols or None, max_size=16 * 1024 * 1024,
114
+ ) as upstream:
115
+ await websocket.accept(subprotocol=upstream.subprotocol)
116
+
117
+ async def to_core():
118
+ while True:
119
+ message = await websocket.receive()
120
+ if message["type"] == "websocket.disconnect":
121
+ return
122
+ await upstream.send(message.get("text") if message.get("text") is not None else message["bytes"])
123
+
124
+ async def to_browser():
125
+ async for message in upstream:
126
+ if isinstance(message, str):
127
+ await websocket.send_text(message)
128
+ else:
129
+ await websocket.send_bytes(message)
130
+
131
+ tasks = [asyncio.create_task(to_core()), asyncio.create_task(to_browser())]
132
+ try:
133
+ await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
134
+ finally:
135
+ for task in tasks:
136
+ task.cancel()
137
+ await asyncio.gather(*tasks, return_exceptions=True)