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
@@ -54,6 +54,7 @@ from ksadk.runtime.adapter import (
54
54
  )
55
55
  from ksadk.runtime.preprocessing import PreparedRuntimeStart, prepare_runtime_start
56
56
  from ksadk.runtime.runner_loading import ensure_runner_loaded
57
+ from ksadk.runtime_context import session_invocation_context
57
58
 
58
59
  logger = logging.getLogger(__name__)
59
60
 
@@ -138,6 +139,10 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
138
139
 
139
140
  # ---- 框架钩子(子类按需 override) ----
140
141
 
142
+ def _requires_stable_stream_context(self) -> bool:
143
+ """Whether one Task must own the runner generator for its lifetime."""
144
+ return self._runtime_type == "adk"
145
+
141
146
  def capabilities(self) -> RuntimeCapabilityMatrix:
142
147
  """诚实矩阵:cancel 经 asyncio 任务打断(emulated,过 conformance);
143
148
  resume/checkpoint 依赖 runner 声明的原生 checkpoint;attach/durable_restore
@@ -170,8 +175,12 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
170
175
  submit_interaction=_unavailable("runtime_no_live_interaction_channel"),
171
176
  attach=(
172
177
  RuntimeCapability(supported=True, mode="native")
173
- if attach_seam
174
- else _unavailable("runner_no_durable_attach_seam")
178
+ if durable_supported
179
+ else _unavailable(
180
+ "runner_no_durable_attach_seam"
181
+ if not attach_seam
182
+ else "attach_requires_cross_process_checkpoint"
183
+ )
175
184
  ),
176
185
  steer=_unavailable("runtime_no_native_steer"),
177
186
  inject=_unavailable("runtime_no_native_inject"),
@@ -185,6 +194,11 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
185
194
  if durable_supported
186
195
  else _unavailable("durable_restore_requires_cross_process_checkpoint")
187
196
  ),
197
+ # A generic Runner cannot claim interaction delivery merely from a
198
+ # checkpoint capability. ADK is forward-only and only the
199
+ # LangGraph specialization below binds a checkpoint to the
200
+ # original interrupt identity.
201
+ interaction_mode="unavailable",
188
202
  )
189
203
 
190
204
  async def durable_restore(self, handle: RunHandle) -> RunHandle:
@@ -267,6 +281,15 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
267
281
  self._active_runs[run_id] = _ActiveRun(invocation_id=run_id, session_id=request.session_id)
268
282
  # 暂存 start 输入,供 stream() 使用。
269
283
  self._active_runs[run_id].__dict__["_start_request"] = request
284
+ snapshot = request.metadata.get("session_context")
285
+ if snapshot is not None:
286
+ self._active_runs[run_id].__dict__["_tag_context"] = session_invocation_context(
287
+ snapshot,
288
+ agent_id=request.agent_id or "",
289
+ user_id=request.user_id,
290
+ session_id=request.session_id,
291
+ runner_type=self._runtime_type,
292
+ )
270
293
  if prepared_start is not None:
271
294
  self._active_runs[run_id].__dict__["_prepared_start"] = prepared_start
272
295
  return handle
@@ -302,6 +325,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
302
325
  f"runner for {self._runtime_type!r} has no durable "
303
326
  "attach_runtime_handle capability"
304
327
  )
328
+ ensure_runner_loaded(self._runner, runtime_type=self._runtime_type)
305
329
  restored = attach(handle)
306
330
  if inspect.isawaitable(restored):
307
331
  restored = await restored
@@ -360,11 +384,14 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
360
384
  self._require_native_checkpoint_capability()
361
385
  self._known_runs.add(handle.run_id)
362
386
  prepared_start: PreparedRuntimeStart | None = None
387
+ resume_invocation_id = handle.run_id
363
388
  raw_start_request = handle.native_ref.pop(RESUME_START_REQUEST_NATIVE_KEY, None)
364
389
  if isinstance(raw_start_request, Mapping):
365
- prepared_start = await prepare_runtime_start(
366
- StartRequest.model_validate(raw_start_request), self._runner
390
+ resume_request = StartRequest.model_validate(raw_start_request)
391
+ resume_invocation_id = str(
392
+ resume_request.metadata.get("invocation_id") or handle.run_id
367
393
  )
394
+ prepared_start = await prepare_runtime_start(resume_request, self._runner)
368
395
  # _resume_native 返回的 runner_input 覆盖存到 run 上,下一次 stream() 经
369
396
  # _build_runner_input 消费,以框架原生方式真驱动恢复。
370
397
  override = await self._resume_native(handle, target, payload)
@@ -387,7 +414,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
387
414
  return handle
388
415
  if resume_key in self._consumed_resumes:
389
416
  self._active_runs[handle.run_id] = _ActiveRun(
390
- invocation_id=handle.run_id,
417
+ invocation_id=resume_invocation_id,
391
418
  session_id=handle.session_id,
392
419
  resume_key=resume_key,
393
420
  resume_fingerprint=resume_fingerprint,
@@ -404,11 +431,19 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
404
431
  raise ValueError(f"run {handle.run_id!r} already has an active or pending resume")
405
432
 
406
433
  run = _ActiveRun(
407
- invocation_id=handle.run_id,
434
+ invocation_id=resume_invocation_id,
408
435
  session_id=handle.session_id,
409
436
  resume_key=resume_key,
410
437
  resume_fingerprint=resume_fingerprint,
411
438
  )
439
+ if payload is not None and payload.session_context is not None:
440
+ run.__dict__["_tag_context"] = session_invocation_context(
441
+ payload.session_context,
442
+ agent_id=str(handle.native_ref.get("agent_id") or ""),
443
+ user_id=str(handle.native_ref.get("user_id") or ""),
444
+ session_id=handle.session_id,
445
+ runner_type=self._runtime_type,
446
+ )
412
447
  if prepared_start is not None:
413
448
  run.__dict__["_prepared_start"] = prepared_start
414
449
  if override:
@@ -504,23 +539,30 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
504
539
  if run is None:
505
540
  run = _ActiveRun(invocation_id=handle.run_id, session_id=handle.session_id)
506
541
  self._active_runs[handle.run_id] = run
542
+ event_handle = (
543
+ handle
544
+ if run.invocation_id == handle.run_id
545
+ else handle.model_copy(update={"run_id": run.invocation_id})
546
+ )
507
547
 
508
548
  # 消费 pending cancel:start 时若已记 pending,立即中断该 turn。
509
549
  if handle.run_id in self._pending_cancels:
510
550
  self._pending_cancels.discard(handle.run_id)
511
- yield self._make_run_canceled(handle, reason=CancelResult.PENDING_CANCEL_RECORDED.value)
551
+ yield self._make_run_canceled(
552
+ event_handle, reason=CancelResult.PENDING_CANCEL_RECORDED.value
553
+ )
512
554
  return
513
555
 
514
556
  if run.skip_runner:
515
557
  run.done = True
516
558
  self._active_runs.pop(handle.run_id, None)
517
- yield self._make_run_completed(handle)
559
+ yield self._make_run_completed(event_handle)
518
560
  return
519
561
 
520
562
  if run.resume_key is not None:
521
563
  self._consumed_resumes.add(run.resume_key)
522
564
 
523
- yield self._make_run_started(handle)
565
+ yield self._make_run_started(event_handle)
524
566
 
525
567
  request = run.__dict__.get("_start_request")
526
568
  runner_input = self._build_runner_input(handle, request)
@@ -528,7 +570,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
528
570
  terminal_event_seen = False
529
571
  approval_interrupted = False
530
572
  try:
531
- gen = self._map_runner_stream(handle, runner_input)
573
+ gen = self._map_runner_stream(event_handle, runner_input, active_run=run)
532
574
  run.stream = gen
533
575
  async for event in gen:
534
576
  yield event
@@ -555,18 +597,38 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
555
597
 
556
598
  if run.interrupt_event.is_set() and not terminal_event_seen:
557
599
  yield self._make_run_canceled(
558
- handle, reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value
600
+ event_handle, reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value
559
601
  )
560
602
  elif approval_interrupted and not terminal_event_seen:
561
- yield self._make_run_interrupted(handle, reason="input_required")
603
+ yield self._make_run_interrupted(event_handle, reason="input_required")
562
604
  elif not terminal_event_seen:
563
- yield self._make_run_completed(handle, run=run, metrics=run.completion_metrics)
605
+ yield self._make_run_completed(
606
+ event_handle, run=run, metrics=run.completion_metrics
607
+ )
564
608
  finally:
565
609
  run.stream = None
566
610
  run.done = True
567
611
  self._active_runs.pop(handle.run_id, None)
568
612
 
569
613
  def _build_runner_input(self, handle: RunHandle, request: Optional[StartRequest]) -> dict:
614
+ result = self._build_base_runner_input(handle, request)
615
+ run = self._active_runs.get(handle.run_id)
616
+ context = run.__dict__.get("_tag_context") if run is not None else None
617
+ if context is not None:
618
+ existing_context = result.get("platform_context")
619
+ result["platform_context"] = (
620
+ {**existing_context, "session": context.session.to_payload()}
621
+ if isinstance(existing_context, dict)
622
+ else context.to_payload()
623
+ )
624
+ result["metadata"] = {
625
+ key: value
626
+ for key, value in dict(result.get("metadata") or {}).items()
627
+ if key != "session_context"
628
+ }
629
+ return result
630
+
631
+ def _build_base_runner_input(self, handle: RunHandle, request: Optional[StartRequest]) -> dict:
570
632
  # resume 覆盖优先:_resume_native 注入的 checkpoint_resume + framework_ref
571
633
  # 直接作为 runner 输入,驱动框架原生恢复。
572
634
  run = self._active_runs.get(handle.run_id)
@@ -583,7 +645,9 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
583
645
  {
584
646
  "input": override.get("input"),
585
647
  "session_id": handle.session_id,
586
- "invocation_id": handle.run_id,
648
+ "invocation_id": str(
649
+ merged.get("invocation_id") or handle.run_id
650
+ ),
587
651
  "metadata": {
588
652
  **(dict(base_metadata) if isinstance(base_metadata, Mapping) else {}),
589
653
  **dict(override.get("metadata") or {}),
ksadk/runtime_context.py CHANGED
@@ -3,7 +3,9 @@ from __future__ import annotations
3
3
  from contextlib import contextmanager
4
4
  from contextvars import ContextVar, Token
5
5
  from dataclasses import dataclass, field
6
- from typing import Any, Iterator
6
+ from typing import Any, Iterator, Mapping
7
+
8
+ from ksadk.session_context import SessionContext
7
9
 
8
10
 
9
11
  @dataclass
@@ -30,9 +32,10 @@ class PlatformInvocationContext:
30
32
  # Request-scoped runtime control. It is intentionally separate from
31
33
  # public caller metadata so built-in tools can enforce it consistently.
32
34
  tool_approval_mode: str = ""
35
+ session: SessionContext = field(default_factory=SessionContext)
33
36
 
34
37
  def to_payload(self) -> dict[str, Any]:
35
- return {
38
+ payload = {
36
39
  "agent_id": self.agent_id,
37
40
  "user_id": self.user_id,
38
41
  "account_id": self.account_id,
@@ -52,6 +55,10 @@ class PlatformInvocationContext:
52
55
  "model_options": dict(self.model_options or {}),
53
56
  }
54
57
 
58
+ if self.session.tags or self.session.revision:
59
+ payload["session"] = self.session.to_payload()
60
+ return payload
61
+
55
62
 
56
63
  @dataclass
57
64
  class ToolExecutionContext:
@@ -179,3 +186,34 @@ def tool_execution_scope(
179
186
  yield context
180
187
  finally:
181
188
  reset_current_tool_execution_context(token)
189
+
190
+
191
+ def get_current_session_context() -> SessionContext:
192
+ """Read the current immutable snapshot in LangChain, LangGraph or ADK code."""
193
+ context = get_current_invocation_context()
194
+ return context.session if context is not None else SessionContext()
195
+
196
+
197
+ def get_current_session_tags() -> Mapping[str, str]:
198
+ """Return read-only business labels; these are not authorization claims."""
199
+ return get_current_session_context().tags
200
+
201
+
202
+ def session_invocation_context(snapshot, *, agent_id="", user_id="", session_id="", runner_type=""):
203
+ """Build the narrow context for kernel starts without conversation preprocessing."""
204
+ return PlatformInvocationContext(
205
+ agent_id=agent_id,
206
+ user_id=user_id,
207
+ session_id=session_id,
208
+ runner_type=runner_type,
209
+ history=[],
210
+ input_content=[],
211
+ input_messages=[],
212
+ input_parts=[],
213
+ attachments=[],
214
+ attachment_results=[],
215
+ current_attachments=[],
216
+ current_attachment_results=[],
217
+ has_current_files=False,
218
+ session=SessionContext.from_payload(snapshot),
219
+ )
ksadk/sandbox/__init__.py CHANGED
@@ -12,7 +12,7 @@ from ksadk.sandbox.base import (
12
12
  SandboxSpec,
13
13
  SandboxType,
14
14
  )
15
- from ksadk.sandbox.factory import create_sandbox_backend, sandbox_spec_from_env
15
+ from ksadk.sandbox.factory import create_sandbox_backend, sandbox_spec_from_env, setup_sandbox_api_url_if_needed
16
16
 
17
17
  __all__ = [
18
18
  "E2BSandboxBackend",
@@ -28,4 +28,5 @@ __all__ = [
28
28
  "SandboxType",
29
29
  "create_sandbox_backend",
30
30
  "sandbox_spec_from_env",
31
+ "setup_sandbox_api_url_if_needed",
31
32
  ]
@@ -12,6 +12,7 @@ from ksadk.sandbox.base import (
12
12
  SandboxSession,
13
13
  SandboxSpec,
14
14
  )
15
+ from ksadk.sandbox.e2b_connection import ExplicitE2BConnection
15
16
 
16
17
  logger = logging.getLogger(__name__)
17
18
 
@@ -81,6 +82,22 @@ class E2BSandboxSession:
81
82
  def read_file(self, path: str) -> str:
82
83
  return str(self._sandbox.files.read(path))
83
84
 
85
+ def read_file_bytes(self, path: str, *, max_bytes: int) -> bytes:
86
+ if type(max_bytes) is not int or max_bytes < 1:
87
+ raise ValueError("File download limit must be positive")
88
+ stream = self._sandbox.files.read(path, format="stream", request_timeout=30)
89
+ content = bytearray()
90
+ try:
91
+ for chunk in stream:
92
+ if len(content) + len(chunk) > max_bytes:
93
+ raise ValueError("Sandbox file exceeds download limit")
94
+ content.extend(chunk)
95
+ finally:
96
+ close = getattr(stream, "close", None)
97
+ if close is not None:
98
+ close()
99
+ return bytes(content)
100
+
84
101
  def run_command(
85
102
  self,
86
103
  command: str,
@@ -116,19 +133,24 @@ class E2BSandboxBackend:
116
133
  *,
117
134
  spec: SandboxSpec,
118
135
  sandbox_cls: Any | None = None,
136
+ connection: ExplicitE2BConnection | None = None,
119
137
  ):
120
138
  if not spec.template_id:
121
139
  raise SandboxError("E2B sandbox backend requires a template id")
122
140
  self.spec = spec
123
141
  self.sandbox_cls = sandbox_cls
142
+ self.connection = (
143
+ ExplicitE2BConnection.model_validate(connection.model_dump())
144
+ if connection is not None else None
145
+ )
124
146
 
125
- def create_session(
126
- self,
127
- *,
128
- session_id: str,
129
- env: dict[str, str] | None = None,
130
- input_files: list[SandboxInputFile] | None = None,
131
- ) -> SandboxSession:
147
+ def check_available(self) -> None:
148
+ """Validate local SDK/connection configuration without creating a sandbox."""
149
+ if self.connection is not None:
150
+ self.connection.sdk_options()
151
+ self._sandbox_class()
152
+
153
+ def _sandbox_class(self):
132
154
  sandbox_cls = self.sandbox_cls
133
155
  if sandbox_cls is None:
134
156
  try:
@@ -138,6 +160,17 @@ class E2BSandboxBackend:
138
160
  "e2b>=2.15.3,<2.25.0 is required for KSADK_SANDBOX_BACKEND=e2b"
139
161
  ) from exc
140
162
  sandbox_cls = Sandbox
163
+ return sandbox_cls
164
+
165
+ def create_session(
166
+ self,
167
+ *,
168
+ session_id: str,
169
+ env: dict[str, str] | None = None,
170
+ input_files: list[SandboxInputFile] | None = None,
171
+ ) -> SandboxSession:
172
+ connection_options = self.connection.sdk_options() if self.connection is not None else {}
173
+ sandbox_cls = self._sandbox_class()
141
174
 
142
175
  metadata = {
143
176
  "runtime": "ksadk",
@@ -152,12 +185,20 @@ class E2BSandboxBackend:
152
185
  metadata=metadata,
153
186
  envs=runtime_env,
154
187
  allow_internet_access=self.spec.allow_internet_access,
188
+ **connection_options,
155
189
  )
156
190
  session = self._wrap_sandbox(sandbox)
157
- self._wait_until_ready(session, runtime_env)
158
- session.write_files(
159
- [(item.target_path, item.source.read_bytes()) for item in input_files or []]
160
- )
191
+ try:
192
+ self._wait_until_ready(session, runtime_env)
193
+ session.write_files(
194
+ [(item.target_path, item.source.read_bytes()) for item in input_files or []]
195
+ )
196
+ except BaseException:
197
+ try:
198
+ session.kill()
199
+ except Exception:
200
+ logger.warning("E2B sandbox cleanup failed after initialization failure")
201
+ raise
161
202
  return session
162
203
 
163
204
  def _wrap_sandbox(self, sandbox: Any) -> E2BSandboxSession:
@@ -38,6 +38,15 @@ class LocalProcessSandboxSession:
38
38
  def read_file(self, path: str) -> str:
39
39
  return self._resolve_workspace_path(path).read_text(encoding="utf-8")
40
40
 
41
+ def read_file_bytes(self, path: str, *, max_bytes: int) -> bytes:
42
+ if type(max_bytes) is not int or max_bytes < 1:
43
+ raise ValueError("File download limit must be positive")
44
+ with self._resolve_workspace_path(path).open("rb") as source:
45
+ content = source.read(max_bytes + 1)
46
+ if len(content) > max_bytes:
47
+ raise ValueError("Sandbox file exceeds download limit")
48
+ return content
49
+
41
50
  def run_command(
42
51
  self,
43
52
  command: str,
ksadk/sandbox/base.py CHANGED
@@ -72,6 +72,8 @@ class SandboxSession(Protocol):
72
72
 
73
73
  def read_file(self, path: str) -> str: ...
74
74
 
75
+ def read_file_bytes(self, path: str, *, max_bytes: int) -> bytes: ...
76
+
75
77
  def run_command(
76
78
  self,
77
79
  command: str,
@@ -0,0 +1,66 @@
1
+ """Explicit E2B connection for dedicated, environment-isolated resource workers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import re
7
+ from urllib.parse import urlsplit
8
+
9
+ from pydantic import BaseModel, ConfigDict, Field, SecretStr, model_validator
10
+
11
+ from ksadk.sandbox.base import SandboxError
12
+
13
+
14
+ class ExplicitE2BConnection(BaseModel):
15
+ model_config = ConfigDict(extra="forbid", frozen=True, hide_input_in_errors=True)
16
+
17
+ api_url: str = Field(strict=True)
18
+ domain: str = Field(strict=True)
19
+ api_key: SecretStr = Field(min_length=1, repr=False)
20
+
21
+ @model_validator(mode="after")
22
+ def validate_target(self):
23
+ url = urlsplit(self.api_url)
24
+ if (
25
+ url.scheme != "https"
26
+ or not url.hostname
27
+ or url.username is not None
28
+ or url.password is not None
29
+ or url.query
30
+ or url.fragment
31
+ or url.path not in {"", "/"}
32
+ or any(c.isspace() for c in self.api_url)
33
+ ):
34
+ raise ValueError("E2B API target must be an explicit HTTPS origin")
35
+ if not re.fullmatch(r"[a-zA-Z0-9]+(?:[.-][a-zA-Z0-9-]+)*", self.domain):
36
+ raise ValueError("E2B domain must be an explicit hostname")
37
+ return self
38
+
39
+ def sdk_options(self) -> dict:
40
+ """Credential-bearing arguments for SDK creation only, never for logs/archives.
41
+
42
+ E2B 2.15.3 uses boolean-or defaults for debug and sandbox URL. Passing
43
+ False/None cannot disable their env fallback; dedicated workers omit them.
44
+ """
45
+ contaminated = (
46
+ "E2B_DEBUG",
47
+ "E2B_SANDBOX_URL",
48
+ "E2B_ACCESS_TOKEN",
49
+ "HTTP_PROXY",
50
+ "HTTPS_PROXY",
51
+ "ALL_PROXY",
52
+ "http_proxy",
53
+ "https_proxy",
54
+ "all_proxy",
55
+ "SSL_CERT_FILE",
56
+ "SSL_CERT_DIR",
57
+ )
58
+ if any(os.environ.get(name) for name in contaminated):
59
+ raise SandboxError("E2B explicit connections require an isolated worker environment")
60
+ return {
61
+ "api_key": self.api_key.get_secret_value(),
62
+ "api_url": self.api_url,
63
+ "domain": self.domain,
64
+ "debug": False,
65
+ "request_timeout": 30,
66
+ }
ksadk/sandbox/factory.py CHANGED
@@ -16,11 +16,83 @@ def bool_env(name: str, default: bool = True) -> bool:
16
16
  return raw.strip().lower() in {"1", "true", "yes", "on"}
17
17
 
18
18
 
19
+ def _resolve_sandbox_api_url() -> str:
20
+ """Probe sandbox control-plane URL at runtime (in-Pod).
21
+
22
+ agentengine-server injects public E2B_API_URL on the management cluster.
23
+ public_only compute pods can reach the public address directly; private_only
24
+ pods have no public egress. Strategy: try the original (public) URL first;
25
+ if reachable keep it, otherwise fall back to the 198 public-service-net
26
+ internal address. Mirrors KSPMAS get_kspmas_api_base(): probe runs in-Pod.
27
+ """
28
+ raw = (os.environ.get("E2B_API_URL") or "").strip()
29
+ if not raw:
30
+ return raw
31
+
32
+ from urllib.parse import urlsplit, urlunsplit
33
+
34
+ parsed = urlsplit(raw)
35
+ host = (parsed.hostname or "").lower()
36
+ if host.endswith(".sdns.ksyun.com"):
37
+ return raw
38
+ if not host.endswith(".sandbox.ksyun.com"):
39
+ return raw
40
+
41
+ parts = host.split(".")
42
+ region = ""
43
+ if len(parts) >= 4 and parts[0] == "mgr":
44
+ region = parts[1]
45
+ elif len(parts) >= 4:
46
+ region = parts[1] if parts[1] != "sandbox" else ""
47
+ if not region:
48
+ return raw
49
+
50
+ import socket
51
+
52
+ port = parsed.port or (443 if parsed.scheme == "https" else 80)
53
+
54
+ # 1) Try the original (public) URL first; reachable => keep it.
55
+ try:
56
+ s = socket.socket()
57
+ s.settimeout(1.5)
58
+ s.connect((host, port))
59
+ s.close()
60
+ return raw
61
+ except OSError:
62
+ pass
63
+
64
+ # 2) Public unreachable (e.g. private_only node) => fall back to internal.
65
+ internal_host = f"sandbox.{region}.sandbox.sdns.ksyun.com"
66
+ try:
67
+ s = socket.socket()
68
+ s.settimeout(1.5)
69
+ s.connect((internal_host, port))
70
+ s.close()
71
+ except OSError:
72
+ return raw
73
+
74
+ internal_url = urlunsplit((parsed.scheme or "https", internal_host, parsed.path, parsed.query, ""))
75
+ return internal_url
76
+
77
+
78
+ def setup_sandbox_api_url_if_needed() -> None:
79
+ """Override E2B_API_URL to internal address before creating E2B backend.
80
+
81
+ Only runs in managed runtime (AGENT_RUNTIME_ID / K8S); local dev unaffected.
82
+ """
83
+ if not os.environ.get("AGENT_RUNTIME_ID") and not os.environ.get("KUBERNETES_SERVICE_HOST"):
84
+ return
85
+ resolved = _resolve_sandbox_api_url()
86
+ if resolved != (os.environ.get("E2B_API_URL") or ""):
87
+ os.environ["E2B_API_URL"] = resolved
88
+
89
+
19
90
  def create_sandbox_backend(
20
91
  backend: str | None = None,
21
92
  *,
22
93
  sandbox_cls: Any | None = None,
23
94
  ) -> SandboxBackend:
95
+ setup_sandbox_api_url_if_needed()
24
96
  resolved = (backend or os.environ.get("KSADK_SANDBOX_BACKEND") or "e2b").strip().lower()
25
97
  if resolved in {"local", "local_process"}:
26
98
  return LocalProcessSandboxBackend(
@@ -0,0 +1,18 @@
1
+ """Local Scheduler Lite contracts and deterministic calendar calculations."""
2
+
3
+ from ksadk.scheduler.calendar import next_schedule_time
4
+ from ksadk.scheduler.contracts import ScheduledTask, ScheduleOccurrence, ScheduleSpec
5
+ from ksadk.scheduler.dispatcher import AgentControlSchedulerDispatcher
6
+ from ksadk.scheduler.engine import SchedulerDispatchError, SchedulerEngine
7
+ from ksadk.scheduler.sqlite_store import SchedulerSQLiteStore
8
+
9
+ __all__ = [
10
+ "ScheduleOccurrence",
11
+ "ScheduledTask",
12
+ "ScheduleSpec",
13
+ "AgentControlSchedulerDispatcher",
14
+ "SchedulerDispatchError",
15
+ "SchedulerEngine",
16
+ "SchedulerSQLiteStore",
17
+ "next_schedule_time",
18
+ ]