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
@@ -431,6 +431,34 @@ def _tool_event_from_call(event: Mapping[str, Any], metadata: Mapping[str, Any])
431
431
  }
432
432
 
433
433
 
434
+ def _approval_status_from_resume(response: Any, resume_input: Mapping[str, Any]) -> str:
435
+ """从 approval_response 事件的 resume_input 判断审批结果状态。
436
+
437
+ 支持两种协议:
438
+ - mcp_approval_response: resume_input 含 approve/approved bool
439
+ - ksadk_resume + decisions: resume_input.value.decisions[0].type 为
440
+ approve/edit/reject(HumanInTheLoopMiddleware 协议)
441
+ """
442
+ if response is None:
443
+ return "paused"
444
+ # ksadk_resume + decisions 协议
445
+ value = resume_input.get("value")
446
+ if isinstance(value, Mapping):
447
+ decisions = value.get("decisions")
448
+ if isinstance(decisions, list) and decisions:
449
+ first = decisions[0]
450
+ if isinstance(first, Mapping):
451
+ decision_type = str(first.get("type") or "").strip().lower()
452
+ if decision_type in {"approve", "edit"}:
453
+ return "approved"
454
+ if decision_type in {"reject", "respond"}:
455
+ return "denied"
456
+ # mcp_approval_response 协议
457
+ if resume_input.get("approve") or resume_input.get("approved"):
458
+ return "approved"
459
+ return "denied"
460
+
461
+
434
462
  def _project_approval_events(
435
463
  events: Sequence[Mapping[str, Any]],
436
464
  *,
@@ -438,10 +466,52 @@ def _project_approval_events(
438
466
  ) -> list[dict[str, Any]]:
439
467
  approvals: list[dict[str, Any]] = []
440
468
  for request in events:
441
- if request.get("EventType") != "approval_request":
469
+ event_type = str(request.get("EventType") or "")
470
+ # 识别归一化后的 approval_request,以及未归一化的 canonical interaction.requested。
471
+ if event_type not in {"approval_request", "interaction.requested"}:
442
472
  continue
443
473
  metadata = _event_metadata(request)
474
+ # 归一化路径:interrupt_info 在 metadata;canonical 路径在
475
+ # Content.runtime_event.request.detail。
444
476
  interrupt_info = metadata.get("interrupt_info")
477
+ if not isinstance(interrupt_info, Mapping):
478
+ # 尝试从 canonical event 的 Content.runtime_event 提取
479
+ raw_content = request.get("Content")
480
+ content = raw_content if isinstance(raw_content, Mapping) else {}
481
+ runtime_event = content.get("runtime_event")
482
+ if isinstance(runtime_event, Mapping):
483
+ req = runtime_event.get("request") or {}
484
+ if isinstance(req, Mapping):
485
+ detail = req.get("detail")
486
+ if isinstance(detail, Mapping):
487
+ # 从 detail.action_requests[0] 提取(HumanInTheLoopMiddleware 结构)
488
+ action_requests = detail.get("action_requests")
489
+ first_action = (
490
+ action_requests[0]
491
+ if isinstance(action_requests, list) and action_requests
492
+ else {}
493
+ )
494
+ if not isinstance(first_action, Mapping):
495
+ first_action = {}
496
+ interaction_id = runtime_event.get("interaction_id") or req.get(
497
+ "call_id"
498
+ )
499
+ interrupt_info = {
500
+ "approval_request_id": interaction_id,
501
+ "id": interaction_id,
502
+ "tool_name": detail.get("tool_name")
503
+ or first_action.get("name")
504
+ or req.get("kind"),
505
+ "arguments": detail.get("arguments")
506
+ or detail.get("args")
507
+ or first_action.get("args")
508
+ or first_action.get("arguments"),
509
+ "description": detail.get("description")
510
+ or first_action.get("description"),
511
+ "review_configs": detail.get("review_configs"),
512
+ "approval_message": detail.get("message")
513
+ or first_action.get("description"),
514
+ }
445
515
  if not isinstance(interrupt_info, Mapping):
446
516
  interrupt_info = {}
447
517
  request_id = str(
@@ -452,31 +522,56 @@ def _project_approval_events(
452
522
  resume_input = response_metadata.get("resume_input")
453
523
  if not isinstance(resume_input, Mapping):
454
524
  resume_input = {}
455
- status = (
456
- "paused"
457
- if response is None
458
- else (
459
- "approved"
460
- if resume_input.get("approve") or resume_input.get("approved")
461
- else "denied"
462
- )
525
+ status = _approval_status_from_resume(response, resume_input)
526
+ # HumanInTheLoopMiddleware 的 interrupt_info 把 tool_name 嵌在
527
+ # action_requests[0].name 里,runtime path 存的事件可能没有顶层 tool_name。
528
+ # 这里统一提取,避免 Name fallback 成 "approval" 导致前端显示不对。
529
+ action_requests = interrupt_info.get("action_requests")
530
+ first_action = (
531
+ action_requests[0]
532
+ if isinstance(action_requests, list) and action_requests
533
+ else {}
534
+ )
535
+ if not isinstance(first_action, Mapping):
536
+ first_action = {}
537
+ tool_name = (
538
+ interrupt_info.get("tool_name")
539
+ or first_action.get("name")
540
+ or "approval"
463
541
  )
464
542
  entry: dict[str, Any] = {
465
543
  "SeqId": request.get("SeqId"),
466
544
  "Type": "approval",
467
- "Name": str(interrupt_info.get("tool_name") or "approval"),
545
+ "Name": str(tool_name),
468
546
  "Status": status,
469
547
  "ApprovalRequestId": request_id or None,
470
548
  }
471
549
  if metadata.get("protocol") == "ag-ui":
472
550
  entry["Protocol"] = "ag-ui"
551
+ # arguments/description 优先从顶层取(_get_interrupt_info/归一化已提取),
552
+ # fallback 到 action_requests[0](runtime path 存的原始 interrupt_info)。
473
553
  arguments = (
474
554
  interrupt_info.get("arguments")
475
555
  or interrupt_info.get("tool_args")
476
556
  or interrupt_info.get("args")
557
+ or first_action.get("args")
558
+ or first_action.get("arguments")
477
559
  )
478
560
  if arguments is not None:
479
561
  entry["Args"] = arguments
562
+ description = (
563
+ interrupt_info.get("description")
564
+ or first_action.get("description")
565
+ )
566
+ if description:
567
+ entry["Description"] = str(description)
568
+ review_configs = interrupt_info.get("review_configs")
569
+ if isinstance(review_configs, list) and review_configs:
570
+ first_review = review_configs[0]
571
+ if isinstance(first_review, Mapping):
572
+ allowed = first_review.get("allowed_decisions")
573
+ if isinstance(allowed, list) and allowed:
574
+ entry["AllowedDecisions"] = [str(d) for d in allowed]
480
575
  approval_level = interrupt_info.get("approval_level") or interrupt_info.get("risk_level")
481
576
  if approval_level:
482
577
  entry["ApprovalLevel"] = str(approval_level)
@@ -722,15 +817,36 @@ def _normalize_canonical_event(
722
817
  detail = request.get("detail")
723
818
  if not isinstance(detail, Mapping):
724
819
  detail = {}
820
+ # HumanInTheLoopMiddleware 的 detail 把 tool_name/arguments/description
821
+ # 嵌在 action_requests[0] 里,detail 顶层没有,需要提取。
822
+ action_requests = detail.get("action_requests")
823
+ first_action = (
824
+ action_requests[0]
825
+ if isinstance(action_requests, list) and action_requests
826
+ else {}
827
+ )
828
+ if not isinstance(first_action, Mapping):
829
+ first_action = {}
830
+ review_configs = detail.get("review_configs")
725
831
  normalized["EventType"] = "approval_request"
726
832
  normalized["Content"] = {"detail": detail}
727
833
  normalized_metadata["interrupt_info"] = {
728
834
  "approval_request_id": interaction_id or call_id,
729
835
  "id": interaction_id or call_id,
730
- "tool_name": detail.get("tool_name") or kind,
731
- "arguments": detail.get("arguments") or detail.get("args"),
732
- "approval_level": detail.get("approval_level"),
733
- "approval_message": detail.get("message"),
836
+ "tool_name": detail.get("tool_name")
837
+ or first_action.get("name")
838
+ or kind,
839
+ "arguments": detail.get("arguments")
840
+ or detail.get("args")
841
+ or first_action.get("args")
842
+ or first_action.get("arguments"),
843
+ "description": detail.get("description")
844
+ or first_action.get("description"),
845
+ "review_configs": review_configs if isinstance(review_configs, list) else None,
846
+ "approval_level": detail.get("approval_level")
847
+ or first_action.get("approval_level"),
848
+ "approval_message": detail.get("message")
849
+ or first_action.get("description"),
734
850
  }
735
851
  # Preserve ag-ui protocol tag from source metadata.
736
852
  source = runtime_event.get("source") or {}
@@ -861,6 +977,11 @@ def _normalize_runtime_event(
861
977
  or approval_request.get("args")
862
978
  or detail.get("arguments")
863
979
  or detail.get("args"),
980
+ "description": action.get("description")
981
+ or approval_request.get("description")
982
+ or detail.get("description"),
983
+ "review_configs": approval_request.get("review_configs")
984
+ or detail.get("review_configs"),
864
985
  "approval_level": action.get("approval_level")
865
986
  or approval_request.get("approval_level")
866
987
  or detail.get("approval_level")
@@ -203,6 +203,7 @@ def project_conversation_item(
203
203
  )
204
204
  payload = {
205
205
  "interactionId": event.interaction_id,
206
+ "callId": getattr(event.request, "call_id", None),
206
207
  "kind": getattr(event.request, "kind", event.interaction_kind),
207
208
  "detail": getattr(event.request, "detail", None),
208
209
  "prompt": getattr(event.request, "prompt", None),
@@ -250,7 +251,7 @@ def project_conversation_item(
250
251
  schema = "conversation.item.error/v1"
251
252
  payload = {
252
253
  "status": "failed" if isinstance(event, RunFailed) else "canceled",
253
- "error": event.error.message if isinstance(event, RunFailed) else event.reason or ""
254
+ "error": event.error.message if isinstance(event, RunFailed) else event.reason or "",
254
255
  }
255
256
  elif isinstance(event, (ContinuationCreated, ContinuationResumed)):
256
257
  kind = "progress"
@@ -524,9 +525,7 @@ def _item_snapshot(
524
525
  def _artifact_payload(snapshot: ContentSnapshot | None) -> dict[str, Any]:
525
526
  if snapshot is None:
526
527
  return {}
527
- artifact = next(
528
- (part for part in snapshot.parts if isinstance(part, ArtifactContent)), None
529
- )
528
+ artifact = next((part for part in snapshot.parts if isinstance(part, ArtifactContent)), None)
530
529
  if artifact is None:
531
530
  return {}
532
531
  return {
@@ -583,8 +582,7 @@ def _is_codex_goal_item(event: RuntimeEvent) -> bool:
583
582
  isinstance(event, (ItemStarted, ItemUpdated, ItemSnapshotReplaced, ItemCompleted))
584
583
  and event.item_kind == "data"
585
584
  and event.source.framework == "codex"
586
- and event.source.metadata.get("method")
587
- in {"thread/goal/updated", "thread/goal/cleared"}
585
+ and event.source.metadata.get("method") in {"thread/goal/updated", "thread/goal/cleared"}
588
586
  )
589
587
 
590
588
 
@@ -123,6 +123,7 @@ async def invoke_conversation_once(
123
123
  agent_system: str = "",
124
124
  agent_task: str = "",
125
125
  prompt_integration_mode: str = "",
126
+ resume_lifecycle_prepared: bool = False,
126
127
  ) -> tuple[str, dict[str, Any]]:
127
128
  """非流式 turn 编排入口。
128
129
 
@@ -159,6 +160,7 @@ async def invoke_conversation_once(
159
160
  agent_system=agent_system,
160
161
  agent_task=agent_task,
161
162
  prompt_integration_mode=prompt_integration_mode,
163
+ resume_lifecycle_prepared=resume_lifecycle_prepared,
162
164
  )
163
165
  # prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
164
166
  run_mode = prepared.run_mode
@@ -184,7 +186,10 @@ async def invoke_conversation_once(
184
186
  user_input=prepared.user_input,
185
187
  )
186
188
  prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
189
+ from ksadk.session_context import SessionContext
190
+
187
191
  runtime_context = PlatformInvocationContext(
192
+ session=SessionContext.from_payload(prepared.session_context),
188
193
  agent_id=agent_id,
189
194
  user_id=user_id,
190
195
  account_id=str(account_id or ""),
@@ -91,6 +91,7 @@ class PreparedConversationTurn:
91
91
  memory_write_mode: str = "candidate"
92
92
  flush_before_compaction: bool = True
93
93
  provider_ref: str = "local-default"
94
+ session_context: dict[str, Any] = field(default_factory=dict)
94
95
 
95
96
 
96
97
  @dataclass
@@ -49,6 +49,7 @@ from ksadk.conversations.runtime_metadata import (
49
49
  )
50
50
  from ksadk.conversations.runtime_observability import _latest_deferred_tool_names
51
51
  from ksadk.conversations.runtime_payloads import PreparedConversationTurn
52
+ from ksadk.session_context import split_session_context
52
53
  from ksadk.conversations.runtime_persistence import (
53
54
  append_conversation_event,
54
55
  append_run_resume_event,
@@ -110,6 +111,7 @@ async def build_run_input(
110
111
  deployment_mode: str = "local",
111
112
  agent_max_input_tokens: int | None = None,
112
113
  agent_reserve_output_tokens: int | None = None,
114
+ resume_lifecycle_prepared: bool = False,
113
115
  ) -> PreparedConversationTurn:
114
116
  """构建一次 turn 的标准运行输入,并在进入模型前做上下文投影/压缩。
115
117
 
@@ -138,7 +140,7 @@ async def build_run_input(
138
140
  model,
139
141
  model_metadata=model_metadata,
140
142
  )
141
- normalized_request_metadata = dict(request_metadata or {})
143
+ session_context, normalized_request_metadata = split_session_context(request_metadata)
142
144
  normalized_custom_metadata = dict(custom_metadata or {})
143
145
  policy_model = model or os.getenv("OPENAI_MODEL_NAME") or os.getenv("MODEL_NAME")
144
146
  normalized_model_options = {
@@ -170,39 +172,37 @@ async def build_run_input(
170
172
  if resume_input is not None:
171
173
  if not session_id:
172
174
  raise ValueError("Responses resume input requires session_id")
173
- existing_events = await service.get_events(resolved_session_id)
174
175
  normalized_resume_input = dict(resume_input)
175
176
  if _is_checkpoint_resume_input(normalized_resume_input):
176
177
  normalized_resume_input = _normalize_checkpoint_resume_input(normalized_resume_input)
177
- await append_run_resume_event(
178
- session_id=resolved_session_id,
179
- author=agent_id,
180
- run_id=str(normalized_resume_input["run_id"]),
181
- checkpoint_id=str(normalized_resume_input["checkpoint_id"]),
182
- resume_attempt_id=str(normalized_resume_input["resume_attempt_id"]),
183
- framework=str(normalized_resume_input["framework"]),
184
- framework_ref=normalized_resume_input["framework_ref"],
185
- invocation_id=resolved_invocation_id,
186
- session_service_provider=provider,
187
- )
188
- # 补写 run_status(resuming):让 ActiveRunStatus 在 resume 期间正确反映"恢复中"。
189
- # append_run_resume_event 写的是 run_resume 事件(status=resuming),而
190
- # _latest_session_run_status 只扫 run_status 事件 → 不补写则
191
- # resuming 不进 ActiveRunStatus。
192
- await append_run_status_event(
193
- session_id=resolved_session_id,
194
- author=agent_id,
195
- status="resuming",
196
- invocation_id=resolved_invocation_id,
197
- detail="checkpoint_resume",
198
- session_service_provider=provider,
199
- run_mode=caller_run_mode,
200
- run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
201
- )
178
+ if not resume_lifecycle_prepared:
179
+ await append_run_resume_event(
180
+ session_id=resolved_session_id,
181
+ author=agent_id,
182
+ run_id=str(normalized_resume_input["run_id"]),
183
+ checkpoint_id=str(normalized_resume_input["checkpoint_id"]),
184
+ resume_attempt_id=str(normalized_resume_input["resume_attempt_id"]),
185
+ framework=str(normalized_resume_input["framework"]),
186
+ framework_ref=normalized_resume_input["framework_ref"],
187
+ invocation_id=resolved_invocation_id,
188
+ session_service_provider=provider,
189
+ )
190
+ # run_resume 与 ActiveRunStatus 分属不同事件类型,因此补写 resuming。
191
+ await append_run_status_event(
192
+ session_id=resolved_session_id,
193
+ author=agent_id,
194
+ status="resuming",
195
+ invocation_id=resolved_invocation_id,
196
+ detail="checkpoint_resume",
197
+ session_service_provider=provider,
198
+ run_mode=caller_run_mode,
199
+ run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
200
+ )
202
201
  event_history = await service.get_events(resolved_session_id)
203
202
  history = build_history_from_events(event_history)
204
203
  responses_history = project_responses_history(event_history)
205
204
  return PreparedConversationTurn(
205
+ session_context=session_context.to_payload(),
206
206
  session_id=resolved_session_id,
207
207
  invocation_id=resolved_invocation_id,
208
208
  user_input="",
@@ -239,6 +239,7 @@ async def build_run_input(
239
239
  provider_ref=provider_ref,
240
240
  )
241
241
 
242
+ existing_events = await service.get_events(resolved_session_id)
242
243
  is_approval_resume = _is_approval_resume_input(normalized_resume_input)
243
244
  existing_tool_receipt_event = None
244
245
  if is_approval_resume and not _has_pending_approval(existing_events):
@@ -319,6 +320,7 @@ async def build_run_input(
319
320
  history = build_history_from_events(event_history)
320
321
  responses_history = project_responses_history(event_history)
321
322
  return PreparedConversationTurn(
323
+ session_context=session_context.to_payload(),
322
324
  session_id=resolved_session_id,
323
325
  invocation_id=resolved_invocation_id,
324
326
  user_input=resume_text,
@@ -478,6 +480,7 @@ async def build_run_input(
478
480
  working_state = _latest_checkpoint_working_state(event_history)
479
481
 
480
482
  prepared = PreparedConversationTurn(
483
+ session_context=session_context.to_payload(),
481
484
  session_id=resolved_session_id,
482
485
  invocation_id=resolved_invocation_id,
483
486
  user_id=resolved_user_id,
@@ -185,6 +185,48 @@ def _parse_approval_arguments(value: Any) -> dict[str, Any]:
185
185
 
186
186
 
187
187
  def _approval_decision_from_resume(resume_input: Mapping[str, Any]) -> dict[str, Any]:
188
+ # ksadk_resume + decisions 协议(HumanInTheLoopMiddleware):
189
+ # resume_input.value.decisions[0].type 为 approve/edit/reject。
190
+ value = resume_input.get("value")
191
+ if isinstance(value, Mapping):
192
+ decisions = value.get("decisions")
193
+ if isinstance(decisions, list) and decisions:
194
+ first = decisions[0]
195
+ if isinstance(first, Mapping):
196
+ decision_type = str(first.get("type") or "").strip().lower()
197
+ if decision_type in {"approve", "edit"}:
198
+ approved = True
199
+ if decision_type == "edit":
200
+ # edit 带修改后的参数;记录到 decision 供下游使用。
201
+ edited = first.get("edited_action")
202
+ if isinstance(edited, Mapping):
203
+ return {
204
+ "approved": True,
205
+ "approval_request_id": str(
206
+ resume_input.get("approval_request_id")
207
+ or resume_input.get("interrupt_id")
208
+ or resume_input.get("id")
209
+ or ""
210
+ ),
211
+ "edited_action": dict(edited),
212
+ }
213
+ elif decision_type in {"reject", "respond"}:
214
+ approved = False
215
+ else:
216
+ approved = True
217
+ decision = {
218
+ "approved": approved,
219
+ "approval_request_id": str(
220
+ resume_input.get("approval_request_id")
221
+ or resume_input.get("interrupt_id")
222
+ or resume_input.get("id")
223
+ or ""
224
+ ),
225
+ }
226
+ message = first.get("message") or first.get("feedback")
227
+ if message is not None:
228
+ decision["reason"] = str(message)
229
+ return decision
188
230
  if "approve" in resume_input:
189
231
  approved = bool(resume_input.get("approve"))
190
232
  elif "approved" in resume_input:
@@ -624,7 +666,11 @@ def _extract_agentengine_metadata(result: Mapping[str, Any] | None) -> dict[str,
624
666
  agentengine = metadata.get("agentengine")
625
667
  if not isinstance(agentengine, Mapping):
626
668
  return {}
627
- return {"agentengine": dict(agentengine)}
669
+ return {
670
+ "agentengine": {
671
+ key: value for key, value in agentengine.items() if key != "session_context"
672
+ }
673
+ }
628
674
 
629
675
 
630
676
  def _checkpoint_event_args_from_agentengine_metadata(
@@ -682,7 +728,9 @@ def _merge_agentengine_metadata(
682
728
  agentengine = metadata.get("agentengine")
683
729
  if not isinstance(agentengine, Mapping):
684
730
  continue
685
- next_agentengine = dict(agentengine)
731
+ next_agentengine = {
732
+ key: value for key, value in agentengine.items() if key != "session_context"
733
+ }
686
734
  merged.update(next_agentengine)
687
735
  framework_ref = agentengine.get("framework_ref")
688
736
  if isinstance(framework_ref, Mapping):
@@ -136,6 +136,7 @@ async def _iter_conversation_turn_events(
136
136
  agent_system: str = "",
137
137
  agent_task: str = "",
138
138
  prompt_integration_mode: str = "",
139
+ resume_lifecycle_prepared: bool = False,
139
140
  ) -> AsyncIterator[dict[str, Any]]:
140
141
  """Internal semantic event stream shared by protocol serializers."""
141
142
  provider = session_service_provider or resolve_session_service
@@ -198,6 +199,7 @@ async def _iter_conversation_turn_events(
198
199
  agent_system=agent_system,
199
200
  agent_task=agent_task,
200
201
  prompt_integration_mode=prompt_integration_mode,
202
+ resume_lifecycle_prepared=resume_lifecycle_prepared,
201
203
  )
202
204
  # prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
203
205
  run_mode = prepared.run_mode
@@ -224,7 +226,10 @@ async def _iter_conversation_turn_events(
224
226
  user_input=prepared.user_input,
225
227
  )
226
228
  prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
229
+ from ksadk.session_context import SessionContext
230
+
227
231
  runtime_context = PlatformInvocationContext(
232
+ session=SessionContext.from_payload(prepared.session_context),
228
233
  agent_id=agent_id,
229
234
  user_id=user_id,
230
235
  account_id=str(account_id or ""),
@@ -39,6 +39,7 @@ async def stream_conversation_turn(
39
39
  invocation_id: Optional[str] = None,
40
40
  session_service_provider: Callable[[], Any] | None = None,
41
41
  run_mode: str = RUN_MODE_FOREGROUND,
42
+ resume_lifecycle_prepared: bool = False,
42
43
  ) -> AsyncIterator[str]:
43
44
  """Legacy ksadk response SSE stream used by hosted chat and chat-completions."""
44
45
  events = _iter_conversation_turn_events(
@@ -60,6 +61,7 @@ async def stream_conversation_turn(
60
61
  invocation_id=invocation_id,
61
62
  session_service_provider=session_service_provider,
62
63
  run_mode=run_mode,
64
+ resume_lifecycle_prepared=resume_lifecycle_prepared,
63
65
  )
64
66
  async for chunk in _stream_conversation_semantic_events(
65
67
  events=events,
@@ -151,7 +153,7 @@ async def _stream_conversation_semantic_events(
151
153
  yield _response_sse(
152
154
  "response.tool_call",
153
155
  {
154
- "name": event.get("name"),
156
+ "name": event.get("tool_name") or event.get("name"),
155
157
  "args": event.get("args", {}),
156
158
  "run_id": event.get("run_id"),
157
159
  "stage": event.get("stage"),
@@ -164,7 +166,7 @@ async def _stream_conversation_semantic_events(
164
166
  yield _response_sse(
165
167
  "response.tool_result",
166
168
  {
167
- "name": event.get("name"),
169
+ "name": event.get("tool_name") or event.get("name"),
168
170
  "output": event.get("output", ""),
169
171
  "run_id": event.get("run_id"),
170
172
  },
@@ -174,7 +176,7 @@ async def _stream_conversation_semantic_events(
174
176
  f"response.ksadk.{event_type}",
175
177
  {
176
178
  "type": event_type,
177
- "name": event.get("name"),
179
+ "name": event.get("tool_name") or event.get("name"),
178
180
  "args": event.get("args", {}),
179
181
  "output": event.get("output", ""),
180
182
  "run_id": event.get("run_id"),
@@ -228,6 +230,7 @@ async def stream_responses_conversation_turn(
228
230
  invocation_id: Optional[str] = None,
229
231
  session_service_provider: Callable[[], Any] | None = None,
230
232
  run_mode: str = RUN_MODE_FOREGROUND,
233
+ resume_lifecycle_prepared: bool = False,
231
234
  ) -> AsyncIterator[str]:
232
235
  """OpenAI Responses-style SSE stream."""
233
236
  response_id = f"resp_{uuid.uuid4().hex}"
@@ -476,12 +479,14 @@ async def _stream_responses_semantic_events(
476
479
  call_id = str(event.get("run_id") or f"call_{uuid.uuid4().hex[:12]}")
477
480
  item_id = f"fc_{uuid.uuid4().hex[:12]}"
478
481
  call_output_index = _next_output_index()
482
+ # tool_name 是 runner stream 的字段名;name 用于向后兼容旧事件源。
483
+ tool_name = event.get("tool_name") or event.get("name") or "unknown"
479
484
  item = {
480
485
  "id": item_id,
481
486
  "type": "function_call",
482
487
  "status": "in_progress",
483
488
  "call_id": call_id,
484
- "name": event.get("name") or "unknown",
489
+ "name": tool_name,
485
490
  "arguments": "",
486
491
  }
487
492
  yield _response_sse(
@@ -505,7 +510,7 @@ async def _stream_responses_semantic_events(
505
510
  "response.ksadk.tool_call",
506
511
  {
507
512
  "type": "tool_call",
508
- "name": event.get("name"),
513
+ "name": tool_name,
509
514
  "args": event.get("args", {}),
510
515
  "run_id": event.get("run_id"),
511
516
  "stage": event.get("stage"),
@@ -520,7 +525,7 @@ async def _stream_responses_semantic_events(
520
525
  yield _response_sse(
521
526
  "response.ksadk.tool_result",
522
527
  {
523
- "name": event.get("name"),
528
+ "name": event.get("tool_name") or event.get("name"),
524
529
  "output": event.get("output", ""),
525
530
  "run_id": event.get("run_id"),
526
531
  },
@@ -532,7 +537,7 @@ async def _stream_responses_semantic_events(
532
537
  f"response.ksadk.{event_type}",
533
538
  {
534
539
  "type": event_type,
535
- "name": event.get("name"),
540
+ "name": event.get("tool_name") or event.get("name"),
536
541
  "args": event.get("args", {}),
537
542
  "output": event.get("output", ""),
538
543
  "run_id": event.get("run_id"),
@@ -569,6 +574,19 @@ async def _stream_responses_semantic_events(
569
574
  "arguments": arguments,
570
575
  "server_label": str(interrupt_info.get("server_label") or "ksadk"),
571
576
  }
577
+ # 透传 HumanInTheLoopMiddleware 的可读描述和允许决策类型,
578
+ # 供前端审批卡展示操作说明和 edit 按钮。
579
+ if interrupt_info.get("description"):
580
+ approval_item["description"] = str(interrupt_info.get("description"))
581
+ review_configs = interrupt_info.get("review_configs")
582
+ if isinstance(review_configs, list) and review_configs:
583
+ first_review = review_configs[0]
584
+ if isinstance(first_review, Mapping):
585
+ allowed = first_review.get("allowed_decisions")
586
+ if isinstance(allowed, list) and allowed:
587
+ approval_item["allowed_decisions"] = [
588
+ str(d) for d in allowed
589
+ ]
572
590
  approval_output_index = _next_output_index()
573
591
  yield _response_sse(
574
592
  "response.output_item.added",
@@ -1,7 +1,7 @@
1
1
  """部署时的 shell 进程环境变量转发规则。
2
2
 
3
3
  通用 deploy (serverless/kcf/kce) 与 hermes/openclaw deploy 共用同一套规则:
4
- 按前缀 (KSADK_/OPENAI_/KSYUN_/E2B_) + 显式 allowlist 转发 shell 环境变量,
4
+ 按前缀 (KSADK_/OPENAI_/KSYUN_/E2B_/AGENTENGINE_/AGENTKIT_) + 显式 allowlist 转发 shell 环境变量,
5
5
  denylist 中的 CLI/builders/configs/web 模块本地键不转发。
6
6
  """
7
7
 
@@ -37,7 +37,7 @@ DEPLOY_PROCESS_ENV_ALLOWLIST = frozenset(
37
37
  "KSYUN_SECRET_KEY",
38
38
  }
39
39
  )
40
- DEPLOY_PROCESS_ENV_PREFIXES = ("KSADK_", "OPENAI_", "KSYUN_", "E2B_")
40
+ DEPLOY_PROCESS_ENV_PREFIXES = ("KSADK_", "OPENAI_", "KSYUN_", "E2B_", "AGENTENGINE_", "AGENTKIT_")
41
41
  DEPLOY_PROCESS_ENV_DENYLIST = frozenset(
42
42
  {spec.name for spec in ENV_VAR_REGISTRY if spec.module in {"builders", "cli", "configs", "web"}}
43
43
  ) | frozenset(
@@ -49,7 +49,7 @@ logger = logging.getLogger(__name__)
49
49
  _HOSTED_CODE_COMMAND = (
50
50
  "ksadk",
51
51
  "web",
52
- "/app/code/runtime",
52
+ "/app/code",
53
53
  "--port",
54
54
  "8080",
55
55
  "--host",