agentengine-sdk-python 0.8.3__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 (509) hide show
  1. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +9 -8
  2. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/RECORD +482 -245
  3. ksadk/_build_provenance.json +1 -1
  4. ksadk/api/client.py +105 -91
  5. ksadk/builders/code_builder.py +36 -9
  6. ksadk/builders/framework_requirements.py +2 -1
  7. ksadk/builders/ks3_uploader.py +36 -7
  8. ksadk/builders/managed_runtime_builder.py +1 -0
  9. ksadk/cli/__init__.py +32 -3
  10. ksadk/cli/cmd_managed_runtime.py +13 -1
  11. ksadk/cli/cmd_plugin.py +6 -1
  12. ksadk/cli/cmd_web.py +2 -5
  13. ksadk/cli/runtime_bootstrap.py +23 -1
  14. ksadk/codex/client.py +424 -96
  15. ksadk/codex/projection.py +24 -0
  16. ksadk/codex/runtime.py +56 -298
  17. ksadk/common/auth.py +16 -10
  18. ksadk/configs/env_registry.py +29 -1
  19. ksadk/conversations/message_projection.py +135 -14
  20. ksadk/conversations/projector.py +4 -6
  21. ksadk/conversations/runtime_invocation.py +5 -0
  22. ksadk/conversations/runtime_payloads.py +1 -0
  23. ksadk/conversations/runtime_preparation.py +30 -27
  24. ksadk/conversations/runtime_resume.py +50 -2
  25. ksadk/conversations/runtime_stream_events.py +5 -0
  26. ksadk/conversations/runtime_streaming.py +25 -7
  27. ksadk/deployment/env_forward.py +2 -2
  28. ksadk/deployment/providers/serverless.py +1 -1
  29. ksadk/events/adapters/_codex_validators.py +18 -7
  30. ksadk/events/adapters/langgraph.py +15 -1
  31. ksadk/events/canonical_store.py +3 -1
  32. ksadk/events/projections.py +1 -1
  33. ksadk/harness/config.py +2 -2
  34. ksadk/harness/runtime.py +27 -27
  35. ksadk/harness/tools.py +38 -13
  36. ksadk/interaction/provider.py +1 -0
  37. ksadk/interaction/providers/langgraph.py +1 -0
  38. ksadk/kernel/bootstrap.py +28 -4
  39. ksadk/kernel/ingress.py +15 -2
  40. ksadk/kernel/sqlite_store.py +27 -0
  41. ksadk/kernel/store.py +3 -0
  42. ksadk/kernel/worker.py +65 -10
  43. ksadk/knowledge_base/client.py +57 -27
  44. ksadk/mcp_runtime/__init__.py +12 -4
  45. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  46. ksadk/memory/adk/resilient_session_service.py +25 -17
  47. ksadk/memory/adk/short_term_memory.py +26 -9
  48. ksadk/memory/models.py +7 -4
  49. ksadk/memory/provider_resolver.py +3 -0
  50. ksadk/model_proxy/server.py +10 -5
  51. ksadk/plugins/__init__.py +4 -0
  52. ksadk/plugins/artifacts.py +275 -0
  53. ksadk/plugins/bridges/__init__.py +4 -2
  54. ksadk/plugins/bridges/codex.py +120 -13
  55. ksadk/plugins/bridges/dsh.py +340 -156
  56. ksadk/plugins/builtins.py +35 -36
  57. ksadk/plugins/bundle_security.py +28 -4
  58. ksadk/plugins/codex_manifest.py +983 -0
  59. ksadk/plugins/composition.py +8 -0
  60. ksadk/plugins/contracts.py +118 -0
  61. ksadk/plugins/delivery.py +153 -0
  62. ksadk/plugins/dsh_installation_digest.py +71 -0
  63. ksadk/plugins/dsh_toolchain.py +110 -21
  64. ksadk/plugins/ecosystem_probe.py +6 -6
  65. ksadk/plugins/host.py +102 -39
  66. ksadk/plugins/kernel_adapter.py +205 -0
  67. ksadk/plugins/providers/__init__.py +23 -0
  68. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  69. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  70. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  71. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  72. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  73. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  74. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  75. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  76. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  77. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  78. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  79. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  80. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  81. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  82. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  83. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  84. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  85. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  86. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  87. ksadk/plugins/providers/codex.py +335 -69
  88. ksadk/plugins/providers/codex_native.py +368 -0
  89. ksadk/plugins/providers/codex_turn.py +301 -0
  90. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  91. ksadk/plugins/providers/dsh_mcp.py +467 -0
  92. ksadk/plugins/providers/harness.py +118 -113
  93. ksadk/plugins/providers/mcp_projection.py +150 -0
  94. ksadk/plugins/providers/platform_resources.py +657 -0
  95. ksadk/plugins/resolver.py +8 -1
  96. ksadk/resource_runtime/__init__.py +4 -0
  97. ksadk/resource_runtime/broker.py +616 -0
  98. ksadk/resource_runtime/build_artifacts.py +165 -0
  99. ksadk/resource_runtime/contracts.py +138 -0
  100. ksadk/resource_runtime/discovery_receipts.py +100 -0
  101. ksadk/resource_runtime/discovery_skills.py +172 -0
  102. ksadk/resource_runtime/errors.py +6 -0
  103. ksadk/resource_runtime/ipc.py +142 -0
  104. ksadk/resource_runtime/kernel_approval.py +165 -0
  105. ksadk/resource_runtime/knowledge.py +114 -0
  106. ksadk/resource_runtime/langgraph.py +94 -0
  107. ksadk/resource_runtime/leases.py +191 -0
  108. ksadk/resource_runtime/managed_projection.py +186 -0
  109. ksadk/resource_runtime/mcp_server.py +138 -0
  110. ksadk/resource_runtime/memory_provider.py +318 -0
  111. ksadk/resource_runtime/memory_receipts.py +34 -0
  112. ksadk/resource_runtime/operation_ledger.py +211 -0
  113. ksadk/resource_runtime/plugin_config.py +48 -0
  114. ksadk/resource_runtime/policy_authorization.py +54 -0
  115. ksadk/resource_runtime/process.py +110 -0
  116. ksadk/resource_runtime/skill_artifacts.py +153 -0
  117. ksadk/resource_runtime/skill_runtime.py +42 -0
  118. ksadk/resource_runtime/skill_workspace.py +118 -0
  119. ksadk/resource_runtime/skills.py +215 -0
  120. ksadk/resource_runtime/snapshots.py +180 -0
  121. ksadk/resource_runtime/socket_server.py +103 -0
  122. ksadk/resource_runtime/supervisor.py +380 -0
  123. ksadk/resource_runtime/worker.py +504 -0
  124. ksadk/runners/_langgraph_runner_streams.py +74 -6
  125. ksadk/runners/adk_runner.py +149 -11
  126. ksadk/runners/base_runner.py +29 -1
  127. ksadk/runners/langgraph_runner.py +475 -145
  128. ksadk/runtime/_runner_adapter/stream_mapping.py +142 -18
  129. ksadk/runtime/adapter.py +2 -0
  130. ksadk/runtime/conversation_execution.py +92 -16
  131. ksadk/runtime/executor.py +78 -2
  132. ksadk/runtime/factory.py +29 -273
  133. ksadk/runtime/framework_adapters.py +23 -0
  134. ksadk/runtime/preprocessing.py +10 -2
  135. ksadk/runtime/runner_adapter.py +73 -14
  136. ksadk/runtime_context.py +40 -2
  137. ksadk/sandbox/backends/e2b.py +52 -11
  138. ksadk/sandbox/backends/local_process.py +9 -0
  139. ksadk/sandbox/base.py +2 -0
  140. ksadk/sandbox/e2b_connection.py +66 -0
  141. ksadk/scheduler/sqlite_store.py +18 -0
  142. ksadk/server/composition.py +2 -0
  143. ksadk/server/factory.py +5 -0
  144. ksadk/server/persistence_capability.py +516 -0
  145. ksadk/server/routes/control.py +210 -46
  146. ksadk/server/routes/dependencies.py +15 -0
  147. ksadk/server/routes/models.py +47 -4
  148. ksadk/server/routes/projection.py +252 -12
  149. ksadk/server/routes/sessions.py +284 -107
  150. ksadk/server/routes/streaming.py +43 -9
  151. ksadk/server/static/assets/{ArtifactsPanel-10GPXIJ6.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  152. ksadk/server/static/assets/{CodeBlock-BXk1l-G1.js → CodeBlock-b4C7upmO.js} +3 -3
  153. ksadk/server/static/assets/{MathMessageMarkdown-D9uB55Oh.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  154. ksadk/server/static/assets/{MermaidBlock--OEYoXIJ.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  155. ksadk/server/static/assets/{NativeTerminalPanel-DrEe1syq.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  156. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-eeTFJLvo.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  157. ksadk/server/static/assets/{arc-S3ZNbIAd.js → arc-bTohInsS.js} +1 -1
  158. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  159. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-CRjgEJDX.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  160. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-C7bsBoNH.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  161. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-BX3c33Ob.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  162. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  163. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  164. ksadk/server/static/assets/{chunk-5VM5RSS4-bZ7ws-8m.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  165. ksadk/server/static/assets/{chunk-F27PBJKO-D2r0pvhY.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  166. ksadk/server/static/assets/{chunk-G27WJ6UU-CZwF3oUP.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  167. ksadk/server/static/assets/{chunk-JWPE2WC7-DigFYCML.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  168. ksadk/server/static/assets/{chunk-LCL6LL3I-CnorGV5q.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  169. ksadk/server/static/assets/{chunk-POPQ4Y6H-CexntQA-.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  170. ksadk/server/static/assets/{chunk-RHFEMEQ7-CHTC7UxA.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  171. ksadk/server/static/assets/{chunk-SVP7TREG-BC1EWt_-.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  172. ksadk/server/static/assets/{chunk-XXDRQBXY-BTG24xN0.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  173. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  174. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  175. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-CkonRdAS.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  176. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  177. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-DEOCBe15.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  178. ksadk/server/static/assets/{dagre-3AP2YEHR-DBThPuLa.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  179. ksadk/server/static/assets/{dagre-ClTPrTht.js → dagre-UBpgon5q.js} +1 -1
  180. ksadk/server/static/assets/{diagram-S7CK7UJ4-DsZHrnpJ.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  181. ksadk/server/static/assets/{diagram-UQ7AKVKN-BJR4nhVr.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  182. ksadk/server/static/assets/{diagram-VSXAHHWV-xzcERX0a.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  183. ksadk/server/static/assets/{diagram-VX7I27RA-tn2xM1xu.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  184. ksadk/server/static/assets/{diagram-Z3DM3KII-BZPGBkw5.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  185. ksadk/server/static/assets/{dist-DdRBIceA.js → dist-B2_CVgKv.js} +1 -1
  186. ksadk/server/static/assets/{dist-Cq4OL6nO.js → dist-B3FR1SKK.js} +1 -1
  187. ksadk/server/static/assets/{dist-M67Hwu0n.js → dist-BIr4DSRq.js} +1 -1
  188. ksadk/server/static/assets/{dist-B1oWRmrH.js → dist-BgV_owcB.js} +1 -1
  189. ksadk/server/static/assets/{dist-DyqV4fL4.js → dist-Bj730Ib4.js} +1 -1
  190. ksadk/server/static/assets/{dist-DfGFrb0v.js → dist-BnaTiyzN.js} +1 -1
  191. ksadk/server/static/assets/{dist-C71CsujO.js → dist-C1NMAY5a.js} +1 -1
  192. ksadk/server/static/assets/{dist-CXpH_Rdd.js → dist-C5_ZAZsG.js} +1 -1
  193. ksadk/server/static/assets/{dist-DJmCPRVB.js → dist-CB9iJrvg.js} +1 -1
  194. ksadk/server/static/assets/{dist-DjhwGUgZ.js → dist-CFzsn6BG.js} +1 -1
  195. ksadk/server/static/assets/{dist-BI1qQH4n.js → dist-Cf125P_m.js} +1 -1
  196. ksadk/server/static/assets/{dist-8VWI-2bZ.js → dist-ClYUxfeK.js} +1 -1
  197. ksadk/server/static/assets/{dist-DUwKa_l6.js → dist-DFD6Qa6T.js} +1 -1
  198. ksadk/server/static/assets/{dist-B-46q3Hk.js → dist-DVCOWtha.js} +1 -1
  199. ksadk/server/static/assets/{dist-BJLUwH6W.js → dist-D_ctSS2i.js} +1 -1
  200. ksadk/server/static/assets/{dist-4zN1_tq5.js → dist-DiixqL0J.js} +1 -1
  201. ksadk/server/static/assets/{dist-B0gdk4rl.js → dist-DoVSwoDb.js} +1 -1
  202. ksadk/server/static/assets/{dist-Bbwqa8TG.js → dist-DvFK7p5S.js} +1 -1
  203. ksadk/server/static/assets/{dist-D1V3f1B4.js → dist-QfkEHOlb.js} +1 -1
  204. ksadk/server/static/assets/{dist-Btyo4vX4.js → dist-btbmmX5O.js} +1 -1
  205. ksadk/server/static/assets/{dist-u8tVH5Ak.js → dist-fBO2v5Kt.js} +1 -1
  206. ksadk/server/static/assets/{dist-DQAB0qn_.js → dist-ufY3F5p6.js} +1 -1
  207. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-DVfMsLge.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  208. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-CWEZSYaw.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  209. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  210. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  211. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-TWIxoyYL.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  212. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  213. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-DDh2hd2S.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  214. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  215. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  216. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  217. ksadk/server/static/assets/{infoDiagram-RXCK75RN-CgoyWiDR.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  218. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-CyRIu_om.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  219. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DN5JXHzN.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  220. ksadk/server/static/assets/{kanban-definition-3QL26DDD-CNP3ui66.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  221. ksadk/server/static/assets/{katex-DWEzQy1d.js → katex-B4weu383.js} +1 -1
  222. ksadk/server/static/assets/{linear-C-qHp7d2.js → linear-V-MgYHW1.js} +1 -1
  223. ksadk/server/static/assets/{mermaid-parser.core-Cl-K943T.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  224. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-D5DB5mYm.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  225. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  226. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-BQVc9ia_.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  227. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  228. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-B6UCAvtY.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  229. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-mIr2d3eb.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  230. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  231. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  232. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  233. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  234. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  235. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-Dt3FFDmK.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  236. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-Cz_vQtgF.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  237. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-wlO1TsH5.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  238. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-CHRbElYq.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  239. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-DXX54iyO.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  240. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-Dp_lw9II.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  241. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  242. ksadk/server/static/assets/{swimlanes-XN3QIQJK-D8O5UlLG.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  243. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  244. ksadk/server/static/assets/{timeline-definition-24CTP7MA-8mfKcxvG.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  245. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  246. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  247. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-EnNl0DE7.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  248. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  249. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DBu5fbYr.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  250. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-BSVXs4IY.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  251. ksadk/server/static/index.html +2 -2
  252. ksadk/session_context.py +66 -0
  253. ksadk/sessions/__init__.py +11 -21
  254. ksadk/sessions/_local_service_sync.py +263 -1
  255. ksadk/sessions/base.py +176 -0
  256. ksadk/sessions/errors.py +4 -0
  257. ksadk/sessions/in_memory.py +309 -19
  258. ksadk/sessions/local_service.py +83 -1
  259. ksadk/sessions/persistence.py +275 -0
  260. ksadk/sessions/postgres_service.py +358 -0
  261. ksadk/sessions/resilience.py +8 -0
  262. ksadk/sessions/resilient.py +362 -4
  263. ksadk/sessions/topology.py +135 -0
  264. ksadk/skills/models.py +26 -4
  265. ksadk/skills/package_store.py +186 -38
  266. ksadk/skills/runtime/agent.py +31 -6
  267. ksadk/skills/runtime/artifact_delivery.py +139 -0
  268. ksadk/skills/runtime/backends/e2b.py +98 -6
  269. ksadk/skills/runtime/backends/local.py +73 -8
  270. ksadk/skills/runtime/base.py +3 -0
  271. ksadk/skills/runtime/executor.py +2 -0
  272. ksadk/skills/runtime/loader.py +10 -2
  273. ksadk/skills/runtime/pinned.py +114 -0
  274. ksadk/skills/runtime/request.py +31 -0
  275. ksadk/skills/service_client.py +167 -28
  276. ksadk/studio/api.py +224 -42
  277. ksadk/studio/api_catalog_routes.py +18 -0
  278. ksadk/studio/api_plugin_routes.py +526 -95
  279. ksadk/studio/api_resource_connections.py +183 -0
  280. ksadk/studio/authoring_coordinator.py +19 -14
  281. ksadk/studio/builder.py +76 -0
  282. ksadk/studio/cloud.py +342 -104
  283. ksadk/studio/cloud_shared_web.py +565 -0
  284. ksadk/studio/codex_agent_service.py +128 -26
  285. ksadk/studio/codex_builder.py +241 -2
  286. ksadk/studio/codex_credentials.py +90 -0
  287. ksadk/studio/codex_manifest.py +31 -4
  288. ksadk/studio/codex_plugin_store.py +746 -0
  289. ksadk/studio/codex_provider_build.py +231 -0
  290. ksadk/studio/codex_run.py +184 -25
  291. ksadk/studio/compatibility_report.py +12 -1
  292. ksadk/studio/compiler.py +78 -14
  293. ksadk/studio/contracts.py +132 -6
  294. ksadk/studio/dsh_application.py +137 -0
  295. ksadk/studio/dsh_capability_service.py +1107 -0
  296. ksadk/studio/dsh_models.py +59 -0
  297. ksadk/studio/dsh_provider_registration.py +320 -13
  298. ksadk/studio/hosted_kernel.py +88 -13
  299. ksadk/studio/mcp_runtime.py +11 -3
  300. ksadk/studio/model_client.py +2 -2
  301. ksadk/studio/plugin_composition.py +190 -23
  302. ksadk/studio/plugin_kernel_adapter.py +12 -112
  303. ksadk/studio/plugin_runtime.py +224 -45
  304. ksadk/studio/resource_authority.py +637 -0
  305. ksadk/studio/resource_binding_validation.py +77 -0
  306. ksadk/studio/resource_build_admission.py +196 -0
  307. ksadk/studio/resource_build_materializer.py +149 -0
  308. ksadk/studio/resource_catalog.py +143 -2
  309. ksadk/studio/resource_connections.py +220 -0
  310. ksadk/studio/run_service.py +462 -52
  311. ksadk/studio/runtime_source.py +15 -7
  312. ksadk/studio/scheduler_assistant.py +317 -0
  313. ksadk/studio/scheduler_runtime.py +9 -0
  314. ksadk/studio/scheduler_service.py +3 -0
  315. ksadk/studio/service.py +490 -44
  316. ksadk/studio/shared_web.py +446 -62
  317. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  318. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  319. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  320. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  321. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  322. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  323. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  324. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  325. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  326. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  327. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  328. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  329. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  330. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  331. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  332. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  333. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  334. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  335. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  336. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  337. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  338. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  339. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  340. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  341. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  342. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  343. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  344. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  345. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  346. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  347. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  348. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  349. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  350. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  351. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  352. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  353. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  354. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  355. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  356. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  357. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  358. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  359. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  360. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  361. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  362. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  363. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  364. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  365. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  366. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  367. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  368. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  369. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  372. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  373. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  377. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  378. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  379. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  380. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  381. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  382. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  383. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  384. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  385. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  386. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  387. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  388. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  389. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  390. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  391. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  392. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  393. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  394. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  395. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  396. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  397. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  398. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  399. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  400. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  401. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  402. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  403. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  404. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  405. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  406. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  407. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  408. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  409. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  410. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  411. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  412. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  413. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  414. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  415. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  416. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  417. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  418. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  419. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  420. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  421. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  422. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  423. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  424. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  425. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  426. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  427. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  428. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  429. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  430. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  431. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  432. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  433. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  434. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  435. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  436. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  437. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  438. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  439. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  440. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  441. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  442. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  443. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  444. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  445. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  446. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  447. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  448. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  449. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  450. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  451. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  452. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  453. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  454. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  455. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  456. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  457. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  458. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  459. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  460. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  461. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  462. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  463. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  464. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  465. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  466. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  467. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  468. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  469. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  470. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  471. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  472. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  473. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  474. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  475. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  476. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  477. ksadk/studio/static/index.html +2 -2
  478. ksadk/version.py +1 -1
  479. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +0 -1
  480. ksadk/server/static/assets/channel-s354Yo6o.js +0 -1
  481. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +0 -1
  482. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +0 -1
  483. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +0 -1
  484. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +0 -1
  485. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +0 -1
  486. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +0 -1
  487. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +0 -1
  488. ksadk/server/static/assets/index-B2k_urY8.js +0 -241
  489. ksadk/server/static/assets/index-ILPt6IWF.css +0 -2
  490. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +0 -1
  491. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +0 -1
  492. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +0 -1
  493. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +0 -1
  494. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +0 -1
  495. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +0 -1
  496. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +0 -1
  497. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +0 -1
  498. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +0 -1
  499. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +0 -8
  500. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +0 -1
  501. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +0 -1
  502. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +0 -1
  503. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  504. ksadk/studio/static/assets/index-DXs1Eq4M.css +0 -1
  505. ksadk/studio/static/assets/index-DeDqwTsD.js +0 -283
  506. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  507. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  508. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  509. {agentengine_sdk_python-0.8.3.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
ksadk/runtime/factory.py CHANGED
@@ -2,17 +2,35 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import dataclasses
6
- import hashlib
7
- import os
8
- import re
9
- import shutil
10
- import tempfile
11
- from pathlib import Path
12
5
  from typing import Any
13
6
 
14
- from ksadk.codex.client import AsyncCodexClient
15
- from ksadk.codex.runtime import CodexRuntimeAdapter
7
+ from ksadk.plugins.providers.codex_native import (
8
+ _apply_codex_overrides as _apply_codex_overrides,
9
+ )
10
+ from ksadk.plugins.providers.codex_native import (
11
+ _codex_home_key as _codex_home_key,
12
+ )
13
+ from ksadk.plugins.providers.codex_native import (
14
+ _codex_plugin_bootstrap as _codex_plugin_bootstrap,
15
+ )
16
+ from ksadk.plugins.providers.codex_native import (
17
+ _isolated_codex_home as _isolated_codex_home,
18
+ )
19
+ from ksadk.plugins.providers.codex_native import (
20
+ _manifest_has_network_mcp as _manifest_has_network_mcp,
21
+ )
22
+ from ksadk.plugins.providers.codex_native import (
23
+ _manifest_mcp_overrides as _manifest_mcp_overrides,
24
+ )
25
+ from ksadk.plugins.providers.codex_native import (
26
+ _materialize_bound_codex_skills as _materialize_bound_codex_skills,
27
+ )
28
+ from ksadk.plugins.providers.codex_native import (
29
+ codex_request_config,
30
+ )
31
+ from ksadk.plugins.providers.codex_native import (
32
+ create_codex_adapter as _create_codex,
33
+ )
16
34
  from ksadk.runners.base_runner import BaseRunner
17
35
  from ksadk.runtime.adapter import RuntimeAdapter, RuntimeRegistry, StartRequest
18
36
  from ksadk.runtime.framework_adapters import ADKRuntimeAdapter, LangGraphRuntimeAdapter
@@ -51,59 +69,7 @@ def kernel_start_request_defaults(context: RuntimeLaunchContext) -> dict[str, An
51
69
  if context.runtime_type != "codex":
52
70
  return defaults
53
71
 
54
- prompt = str(config.get("prompt") or "").strip()
55
- task_prompt = str(config.get("task_prompt") or "").strip()
56
- base_instructions = prompt
57
- if task_prompt:
58
- base_instructions = f"{prompt}\n\n{task_prompt}" if prompt else task_prompt
59
-
60
- raw_sandbox = str(config.get("sandbox") or "read_only").strip().lower()
61
- raw_approval = str(config.get("approval_mode") or "").strip().lower()
62
- approval_profiles = {
63
- "ask": ("workspace-write", "manual"),
64
- "risk": ("workspace-write", "auto_review"),
65
- "full": ("full-access", "deny_all"),
66
- }
67
- sandbox_profiles = {
68
- "read_only": ("read-only", "deny_all"),
69
- "read-only": ("read-only", "deny_all"),
70
- "workspace_write": ("workspace-write", "deny_all"),
71
- "workspace-write": ("workspace-write", "deny_all"),
72
- "workspace_write_auto": ("workspace-write", "auto_review"),
73
- "workspace-write-auto": ("workspace-write", "auto_review"),
74
- "full_access": ("full-access", "deny_all"),
75
- "full-access": ("full-access", "deny_all"),
76
- }
77
- if raw_approval in approval_profiles:
78
- sandbox, approval = approval_profiles[raw_approval]
79
- else:
80
- sandbox, default_approval = sandbox_profiles.get(raw_sandbox, ("read-only", "deny_all"))
81
- approval = raw_approval or default_approval
82
-
83
- request_config: dict[str, Any] = {
84
- "sandbox_read_only": sandbox == "read-only",
85
- "sandbox": sandbox,
86
- "approval_mode": approval,
87
- "cwd": str(context.project_dir),
88
- "summary": "auto",
89
- "ephemeral": False,
90
- }
91
- if base_instructions:
92
- request_config["base_instructions"] = base_instructions
93
- collaboration_mode = str(config.get("collaboration_mode") or "").strip().lower()
94
- if collaboration_mode:
95
- if collaboration_mode not in {"default", "plan"}:
96
- raise ValueError("Codex collaboration_mode must be default or plan")
97
- request_config["collaboration_mode"] = collaboration_mode
98
- goal_objective = str(config.get("goal_objective") or "").strip()
99
- if goal_objective:
100
- request_config["goal_objective"] = goal_objective
101
- raw_skills = config.get("skills")
102
- if isinstance(raw_skills, (list, tuple)):
103
- request_config["skills"] = [
104
- dict(item) for item in raw_skills if isinstance(item, dict)
105
- ]
106
- defaults["config"] = request_config
72
+ defaults["config"] = codex_request_config(context)
107
73
  return defaults
108
74
 
109
75
 
@@ -127,9 +93,7 @@ def apply_runtime_start_request_defaults(
127
93
  default_model = str(defaults.get("model") or "").strip() or None
128
94
  requested_model = str(request.model or "").strip()
129
95
  allowed_models = {
130
- str(item).strip()
131
- for item in (defaults.get("allowed_models") or [])
132
- if str(item).strip()
96
+ str(item).strip() for item in (defaults.get("allowed_models") or []) if str(item).strip()
133
97
  }
134
98
  selected_model = (
135
99
  requested_model
@@ -149,214 +113,6 @@ def apply_runtime_start_request_defaults(
149
113
  )
150
114
 
151
115
 
152
- def _manifest_mcp_overrides(config: dict[str, Any]) -> list[str]:
153
- """Translate declarative MCP bindings into native Codex config keys."""
154
-
155
- overrides: list[str] = []
156
- servers = config.get("mcp_servers") or []
157
- if not isinstance(servers, (list, tuple)):
158
- return overrides
159
- for server in servers:
160
- if not isinstance(server, dict):
161
- continue
162
- name = str(server.get("name") or "").strip()
163
- url = str(server.get("url") or "").strip()
164
- if not name or not url:
165
- continue
166
- overrides.append(f"mcp_servers.{name}.url={url}")
167
- env_key = str(server.get("env_key") or "").strip()
168
- if env_key:
169
- overrides.append(f"mcp_servers.{name}.bearer_token_env_var={env_key}")
170
- return overrides
171
-
172
-
173
- def _create_codex(context: RuntimeLaunchContext) -> RuntimeAdapter:
174
- client_factory = context.services.codex_client_factory or AsyncCodexClient
175
- config = dict(context.config)
176
- bound_skill_paths: dict[str, str] = {}
177
- overrides = list(config.get("codex_overrides") or [])
178
- manifest_mcp_overrides = _manifest_mcp_overrides(config)
179
- overrides.extend(item for item in manifest_mcp_overrides if item not in overrides)
180
- projected_config = kernel_start_request_defaults(context).get("config") or {}
181
- if manifest_mcp_overrides and projected_config.get("sandbox") == "workspace-write":
182
- network_override = "sandbox_workspace_write.network_access=true"
183
- if network_override not in overrides:
184
- overrides.append(network_override)
185
- # Studio's default collaboration mode must expose Codex's structured
186
- # request_user_input tool; the upstream feature is intentionally off by
187
- # default outside Plan mode. This stays process-local to the isolated
188
- # runtime and does not mutate the user's global Codex configuration.
189
- interaction_override = "features.default_mode_request_user_input=true"
190
- if interaction_override not in overrides:
191
- overrides.append(interaction_override)
192
- try:
193
- from openai_codex import CodexConfig
194
-
195
- base_cfg = CodexConfig()
196
- if overrides:
197
- base_cfg = dataclasses.replace(
198
- base_cfg,
199
- config_overrides=tuple(getattr(base_cfg, "config_overrides", ()) or ())
200
- + tuple(str(o) for o in overrides),
201
- )
202
- env = dict(getattr(base_cfg, "env", None) or {})
203
- isolated_home = _isolated_codex_home(context.project_dir)
204
- bound_skill_paths = _materialize_bound_codex_skills(
205
- isolated_home, config.get("skills")
206
- )
207
- env.setdefault("CODEX_HOME", str(isolated_home))
208
- # HOME 级隔离:codex app-server 还会按约定扫 ~/.agents/skills、
209
- # ~/.claude/skills 等宿主目录,仅设 CODEX_HOME 挡不住。隔离 HOME 后这些
210
- # 路径全部落在工作区内,宿主 skills/MCP/凭证不再进入 Agent 上下文。
211
- # 设 KSADK_CODEX_ISOLATE_HOME=0 可关闭(调试用)。
212
- if os.environ.get("KSADK_CODEX_ISOLATE_HOME", "1") != "0":
213
- env.setdefault("HOME", str(isolated_home))
214
- # 运行期解析出的凭证值(如 MCP bearer_token_env_var 所需)注入子进程环境
215
- env.update({str(k): str(v) for k, v in (context.config.get("env") or {}).items()})
216
- base_cfg = dataclasses.replace(base_cfg, env=env)
217
- try:
218
- client: Any = client_factory(config=base_cfg)
219
- except TypeError:
220
- # 自定义/测试工厂可能不接受 config 参数:退化为无参构造,
221
- # config_overrides 事后注入(自定义工厂自行承担 env 隔离)。
222
- client = client_factory()
223
- if overrides:
224
- _apply_codex_overrides(client, overrides)
225
- except ImportError:
226
- client: Any = client_factory()
227
- if overrides:
228
- _apply_codex_overrides(client, overrides)
229
- timeout = context.config.get("turn_timeout_seconds")
230
- request_defaults = kernel_start_request_defaults(context)
231
- request_config = request_defaults.get("config") or {}
232
- sandbox_read_only = (
233
- bool(context.config["sandbox_read_only"])
234
- if "sandbox_read_only" in context.config
235
- else bool(request_config.get("sandbox_read_only", True))
236
- )
237
- return CodexRuntimeAdapter(
238
- client,
239
- sandbox_read_only=sandbox_read_only,
240
- turn_timeout_seconds=float(timeout) if timeout is not None else None,
241
- bound_skill_paths=bound_skill_paths,
242
- )
243
-
244
-
245
- def _isolated_codex_home(project_dir: Any) -> Path:
246
- """Studio 运行 Agent 使用工作区级隔离 CODEX_HOME。
247
-
248
- 避免 codex app-server 继承宿主环境(~/.codex / ~/.wework/codex)里的
249
- skills、MCP 配置、插件与凭证,污染 Agent 上下文甚至泄漏宿主能力。
250
- 可用 KSADK_CODEX_HOME 显式覆盖。
251
- """
252
- override = os.environ.get("KSADK_CODEX_HOME")
253
- if override:
254
- home = Path(override).expanduser()
255
- home.mkdir(parents=True, exist_ok=True)
256
- return home
257
-
258
- # Source bundles are deliberately mounted read-only in managed runtimes.
259
- # Keep the preferred workspace-local isolation for local development, but
260
- # never make a Codex turn depend on being able to mutate that bundle.
261
- workspace_home = Path(str(project_dir)) / ".agentkit" / "codex-home"
262
- try:
263
- workspace_home.mkdir(parents=True, exist_ok=True)
264
- return workspace_home
265
- except OSError:
266
- pass
267
-
268
- # The managed runtime already provides a per-workload writable state
269
- # volume. Derive from its explicit directory first, then from the
270
- # session-store path for backward-compatible images. /tmp is a final
271
- # process-local fallback for custom read-only launchers.
272
- state_dir = os.environ.get("KSADK_RUNTIME_STATE_DIR")
273
- session_path = os.environ.get("KSADK_SESSION_PATH")
274
- fallback_root = (
275
- Path(state_dir)
276
- if state_dir
277
- else Path(session_path).expanduser().parent
278
- if session_path
279
- else Path(tempfile.gettempdir()) / "ksadk-runtime-state"
280
- )
281
- fallback_home = fallback_root / "codex-home"
282
- fallback_home.mkdir(parents=True, exist_ok=True)
283
- return fallback_home
284
-
285
-
286
- def _materialize_bound_codex_skills(
287
- codex_home: Path, value: Any
288
- ) -> dict[str, str]:
289
- """Expose immutable Bundle Skills through Codex's native skill catalog.
290
-
291
- Passing an arbitrary ``SkillInput`` path is accepted by the Python SDK but
292
- ignored by the real App Server unless the Skill is discoverable by the
293
- native host. Copy each content-addressed Bundle Skill into the isolated
294
- CODEX_HOME so the host owns discovery while the Bundle remains read-only.
295
- Content-addressed directory names avoid overwriting user-managed Skills
296
- when an explicit KSADK_CODEX_HOME is used.
297
- """
298
-
299
- if not isinstance(value, (list, tuple)):
300
- return {}
301
- skills_root = codex_home / "skills"
302
- skills_root.mkdir(parents=True, exist_ok=True)
303
- installed: dict[str, str] = {}
304
- for item in value:
305
- if not isinstance(item, dict):
306
- continue
307
- name = str(item.get("name") or "").strip()
308
- raw_path = str(item.get("path") or "").strip()
309
- if not name or not raw_path:
310
- continue
311
- skill_file = Path(raw_path).resolve()
312
- if skill_file.name != "SKILL.md" or not skill_file.is_file():
313
- continue
314
- source_dir = skill_file.parent
315
- digest = hashlib.sha256()
316
- for source in sorted(path for path in source_dir.rglob("*") if path.is_file()):
317
- digest.update(source.relative_to(source_dir).as_posix().encode("utf-8"))
318
- digest.update(b"\0")
319
- digest.update(source.read_bytes())
320
- digest.update(b"\0")
321
- safe_name = re.sub(r"[^A-Za-z0-9._-]+", "-", name).strip(".-") or "skill"
322
- target = skills_root / f"ksadk-{digest.hexdigest()[:16]}-{safe_name}"
323
- if target.is_dir():
324
- installed[name] = str(target / "SKILL.md")
325
- continue
326
- staging = Path(tempfile.mkdtemp(prefix=".ksadk-skill-", dir=skills_root))
327
- try:
328
- shutil.copytree(source_dir, staging, dirs_exist_ok=True)
329
- try:
330
- staging.replace(target)
331
- except FileExistsError:
332
- pass
333
- finally:
334
- if staging.exists():
335
- shutil.rmtree(staging)
336
- installed[name] = str(target / "SKILL.md")
337
- return installed
338
-
339
-
340
- def _apply_codex_overrides(client: Any, overrides: Any) -> None:
341
- """Append MCP server --config overrides to the client's CodexConfig."""
342
- try:
343
- from openai_codex import CodexConfig
344
- except ImportError:
345
- return
346
- # ksadk AsyncCodexClient -> AsyncCodex -> inner AsyncCodexClient.config
347
- inner_codex = getattr(client, "_codex", None)
348
- inner_client = getattr(inner_codex, "_client", None) or inner_codex
349
- cfg = getattr(inner_client, "config", None)
350
- if cfg is None or not isinstance(cfg, CodexConfig):
351
- return
352
- base_overrides = tuple(getattr(cfg, "config_overrides", ()) or ())
353
- new_overrides = tuple(str(o) for o in overrides if o not in base_overrides)
354
- if not new_overrides:
355
- return
356
- new_cfg = dataclasses.replace(cfg, config_overrides=base_overrides + new_overrides)
357
- setattr(inner_client, "config", new_cfg)
358
-
359
-
360
116
  def _create_framework_runner(context: RuntimeLaunchContext, runtime_type: str) -> BaseRunner:
361
117
  try:
362
118
  from ksadk.runners.patch_langchain import apply_patch
@@ -119,6 +119,29 @@ class LangGraphRuntimeAdapter(RunnerRuntimeAdapter):
119
119
 
120
120
  def _checkpoint_capability(self) -> CheckpointCapability:
121
121
  capability = super()._checkpoint_capability()
122
+ if not capability.supported:
123
+ describe = getattr(self._runner, "describe_checkpoint_capability", None)
124
+ try:
125
+ raw = dict(describe()) if callable(describe) else {}
126
+ except Exception: # noqa: BLE001
127
+ raw = {}
128
+ if (
129
+ str(raw.get("Scope") or "").strip().lower() == "process_local"
130
+ and str(raw.get("Backend") or "").strip().lower() in {"memory", "sqlite"}
131
+ ):
132
+ # The runner correctly refuses to advertise this checkpoint to
133
+ # hosted callers because it is not durable across a process
134
+ # restart. This adapter only resumes an attached in-process
135
+ # handle, for which LangGraph's memory saver is sufficient.
136
+ capability = capability.model_copy(
137
+ update={
138
+ "supported": True,
139
+ "reason": (
140
+ "Checkpoint resume is limited to the current process; "
141
+ "it is not durable across restarts or pods"
142
+ ),
143
+ }
144
+ )
122
145
  if not capability.supported:
123
146
  return capability
124
147
  return capability.model_copy(
@@ -19,6 +19,7 @@ from ksadk.runtime.adapter import (
19
19
  StartRequest,
20
20
  )
21
21
  from ksadk.runtime_context import PlatformInvocationContext
22
+ from ksadk.session_context import split_session_context
22
23
 
23
24
 
24
25
  @dataclass
@@ -58,17 +59,21 @@ async def prepare_runtime_start(request: StartRequest, runner: Any) -> PreparedR
58
59
  outer_metadata = {
59
60
  key: value
60
61
  for key, value in request.metadata.items()
61
- if key != CONVERSATION_PREPROCESSING_METADATA_KEY
62
+ if key not in {CONVERSATION_PREPROCESSING_METADATA_KEY, "session_context"}
62
63
  }
63
64
  request_metadata = {**outer_metadata, **conversation.request_metadata}
64
65
  messages = conversation.messages or _fallback_messages(request.input)
65
66
  raw_prepared = (conversation.model_extra or {}).get("prepared_turn")
66
67
  if isinstance(raw_prepared, Mapping):
67
68
  prepared = PreparedConversationTurn(**dict(raw_prepared))
68
- prepared.request_metadata = {
69
+ merged_metadata = {
69
70
  **prepared.request_metadata,
70
71
  **request_metadata,
71
72
  }
73
+ snapshot, prepared.request_metadata = split_session_context(merged_metadata)
74
+ controls = merged_metadata.get("agentengine")
75
+ if isinstance(controls, Mapping) and "session_context" in controls:
76
+ prepared.session_context = snapshot.to_payload()
72
77
  else:
73
78
  prepared = await build_run_input(
74
79
  agent_id=str(request.agent_id or "agent"),
@@ -114,7 +119,10 @@ async def prepare_runtime_start(request: StartRequest, runner: Any) -> PreparedR
114
119
  ambient_contexts["memory_recall_events"] = list(prepared.memory_recall_events)
115
120
  else:
116
121
  prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
122
+ from ksadk.session_context import SessionContext
123
+
117
124
  runtime_context = PlatformInvocationContext(
125
+ session=SessionContext.from_payload(prepared.session_context),
118
126
  agent_id=str(request.agent_id or "agent"),
119
127
  user_id=request.user_id,
120
128
  account_id=str(conversation.account_id or ""),
@@ -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"),
@@ -272,6 +281,15 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
272
281
  self._active_runs[run_id] = _ActiveRun(invocation_id=run_id, session_id=request.session_id)
273
282
  # 暂存 start 输入,供 stream() 使用。
274
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
+ )
275
293
  if prepared_start is not None:
276
294
  self._active_runs[run_id].__dict__["_prepared_start"] = prepared_start
277
295
  return handle
@@ -307,6 +325,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
307
325
  f"runner for {self._runtime_type!r} has no durable "
308
326
  "attach_runtime_handle capability"
309
327
  )
328
+ ensure_runner_loaded(self._runner, runtime_type=self._runtime_type)
310
329
  restored = attach(handle)
311
330
  if inspect.isawaitable(restored):
312
331
  restored = await restored
@@ -365,11 +384,14 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
365
384
  self._require_native_checkpoint_capability()
366
385
  self._known_runs.add(handle.run_id)
367
386
  prepared_start: PreparedRuntimeStart | None = None
387
+ resume_invocation_id = handle.run_id
368
388
  raw_start_request = handle.native_ref.pop(RESUME_START_REQUEST_NATIVE_KEY, None)
369
389
  if isinstance(raw_start_request, Mapping):
370
- prepared_start = await prepare_runtime_start(
371
- 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
372
393
  )
394
+ prepared_start = await prepare_runtime_start(resume_request, self._runner)
373
395
  # _resume_native 返回的 runner_input 覆盖存到 run 上,下一次 stream() 经
374
396
  # _build_runner_input 消费,以框架原生方式真驱动恢复。
375
397
  override = await self._resume_native(handle, target, payload)
@@ -392,7 +414,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
392
414
  return handle
393
415
  if resume_key in self._consumed_resumes:
394
416
  self._active_runs[handle.run_id] = _ActiveRun(
395
- invocation_id=handle.run_id,
417
+ invocation_id=resume_invocation_id,
396
418
  session_id=handle.session_id,
397
419
  resume_key=resume_key,
398
420
  resume_fingerprint=resume_fingerprint,
@@ -409,11 +431,19 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
409
431
  raise ValueError(f"run {handle.run_id!r} already has an active or pending resume")
410
432
 
411
433
  run = _ActiveRun(
412
- invocation_id=handle.run_id,
434
+ invocation_id=resume_invocation_id,
413
435
  session_id=handle.session_id,
414
436
  resume_key=resume_key,
415
437
  resume_fingerprint=resume_fingerprint,
416
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
+ )
417
447
  if prepared_start is not None:
418
448
  run.__dict__["_prepared_start"] = prepared_start
419
449
  if override:
@@ -509,23 +539,30 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
509
539
  if run is None:
510
540
  run = _ActiveRun(invocation_id=handle.run_id, session_id=handle.session_id)
511
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
+ )
512
547
 
513
548
  # 消费 pending cancel:start 时若已记 pending,立即中断该 turn。
514
549
  if handle.run_id in self._pending_cancels:
515
550
  self._pending_cancels.discard(handle.run_id)
516
- 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
+ )
517
554
  return
518
555
 
519
556
  if run.skip_runner:
520
557
  run.done = True
521
558
  self._active_runs.pop(handle.run_id, None)
522
- yield self._make_run_completed(handle)
559
+ yield self._make_run_completed(event_handle)
523
560
  return
524
561
 
525
562
  if run.resume_key is not None:
526
563
  self._consumed_resumes.add(run.resume_key)
527
564
 
528
- yield self._make_run_started(handle)
565
+ yield self._make_run_started(event_handle)
529
566
 
530
567
  request = run.__dict__.get("_start_request")
531
568
  runner_input = self._build_runner_input(handle, request)
@@ -533,7 +570,7 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
533
570
  terminal_event_seen = False
534
571
  approval_interrupted = False
535
572
  try:
536
- gen = self._map_runner_stream(handle, runner_input)
573
+ gen = self._map_runner_stream(event_handle, runner_input, active_run=run)
537
574
  run.stream = gen
538
575
  async for event in gen:
539
576
  yield event
@@ -560,18 +597,38 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
560
597
 
561
598
  if run.interrupt_event.is_set() and not terminal_event_seen:
562
599
  yield self._make_run_canceled(
563
- handle, reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value
600
+ event_handle, reason=CancelResult.INTERRUPTED_ACTIVE_TURN.value
564
601
  )
565
602
  elif approval_interrupted and not terminal_event_seen:
566
- yield self._make_run_interrupted(handle, reason="input_required")
603
+ yield self._make_run_interrupted(event_handle, reason="input_required")
567
604
  elif not terminal_event_seen:
568
- 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
+ )
569
608
  finally:
570
609
  run.stream = None
571
610
  run.done = True
572
611
  self._active_runs.pop(handle.run_id, None)
573
612
 
574
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:
575
632
  # resume 覆盖优先:_resume_native 注入的 checkpoint_resume + framework_ref
576
633
  # 直接作为 runner 输入,驱动框架原生恢复。
577
634
  run = self._active_runs.get(handle.run_id)
@@ -588,7 +645,9 @@ class RunnerRuntimeAdapter(_RunnerStreamMappingMixin, RuntimeAdapter):
588
645
  {
589
646
  "input": override.get("input"),
590
647
  "session_id": handle.session_id,
591
- "invocation_id": handle.run_id,
648
+ "invocation_id": str(
649
+ merged.get("invocation_id") or handle.run_id
650
+ ),
592
651
  "metadata": {
593
652
  **(dict(base_metadata) if isinstance(base_metadata, Mapping) else {}),
594
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
+ )