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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (563) hide show
  1. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/METADATA +22 -28
  2. agentengine_sdk_python-0.8.4.dist-info/RECORD +1070 -0
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/agui/_agent_helpers.py +4 -0
  5. ksadk/api/client.py +108 -91
  6. ksadk/builders/code_builder.py +36 -9
  7. ksadk/builders/framework_requirements.py +2 -1
  8. ksadk/builders/ks3_uploader.py +36 -7
  9. ksadk/builders/managed_runtime_builder.py +4 -0
  10. ksadk/cli/__init__.py +38 -3
  11. ksadk/cli/cmd_managed_runtime.py +13 -1
  12. ksadk/cli/cmd_plugin.py +662 -0
  13. ksadk/cli/cmd_web.py +2 -5
  14. ksadk/cli/runtime_bootstrap.py +23 -1
  15. ksadk/codex/client.py +424 -96
  16. ksadk/codex/projection.py +24 -0
  17. ksadk/codex/runtime.py +83 -283
  18. ksadk/common/auth.py +16 -10
  19. ksadk/configs/env_registry.py +59 -3
  20. ksadk/configs/settings.py +9 -0
  21. ksadk/context_engine/contributors.py +73 -8
  22. ksadk/conversations/__init__.py +19 -0
  23. ksadk/conversations/context.py +104 -24
  24. ksadk/conversations/contracts.py +266 -0
  25. ksadk/conversations/message_projection.py +154 -15
  26. ksadk/conversations/projector.py +614 -0
  27. ksadk/conversations/reducer.py +98 -0
  28. ksadk/conversations/runtime_invocation.py +5 -0
  29. ksadk/conversations/runtime_payloads.py +1 -0
  30. ksadk/conversations/runtime_preparation.py +30 -27
  31. ksadk/conversations/runtime_resume.py +50 -2
  32. ksadk/conversations/runtime_stream_events.py +5 -0
  33. ksadk/conversations/runtime_streaming.py +25 -7
  34. ksadk/deployment/env_forward.py +2 -2
  35. ksadk/deployment/providers/serverless.py +1 -1
  36. ksadk/events/_v1_compat/projection.py +2 -0
  37. ksadk/events/adapters/_codex_validators.py +18 -7
  38. ksadk/events/adapters/codex.py +190 -0
  39. ksadk/events/adapters/langgraph.py +15 -1
  40. ksadk/events/canonical_store.py +3 -1
  41. ksadk/events/projections.py +1 -1
  42. ksadk/harness/__init__.py +45 -35
  43. ksadk/harness/config.py +2 -2
  44. ksadk/harness/runtime.py +75 -16
  45. ksadk/harness/tools.py +38 -13
  46. ksadk/interaction/provider.py +1 -0
  47. ksadk/interaction/providers/langgraph.py +1 -0
  48. ksadk/kernel/bootstrap.py +28 -4
  49. ksadk/kernel/contract_fingerprints.py +5 -4
  50. ksadk/kernel/contracts.py +8 -0
  51. ksadk/kernel/control.py +1 -0
  52. ksadk/kernel/ingress.py +36 -2
  53. ksadk/kernel/memory_store.py +1 -0
  54. ksadk/kernel/postgres_store.py +1 -0
  55. ksadk/kernel/sqlite_store.py +28 -0
  56. ksadk/kernel/store.py +3 -0
  57. ksadk/kernel/worker.py +76 -10
  58. ksadk/knowledge_base/client.py +57 -27
  59. ksadk/mcp_runtime/__init__.py +12 -4
  60. ksadk/memory/adk/backends/sdk_ltm_backend.py +161 -41
  61. ksadk/memory/adk/resilient_session_service.py +25 -17
  62. ksadk/memory/adk/short_term_memory.py +26 -9
  63. ksadk/memory/models.py +7 -4
  64. ksadk/memory/provider_resolver.py +3 -0
  65. ksadk/memory/providers/local_sqlite.py +7 -0
  66. ksadk/model_proxy/server.py +10 -5
  67. ksadk/plugins/__init__.py +171 -0
  68. ksadk/plugins/artifacts.py +275 -0
  69. ksadk/plugins/bridges/__init__.py +47 -0
  70. ksadk/plugins/bridges/codex.py +659 -0
  71. ksadk/plugins/bridges/dsh.py +1300 -0
  72. ksadk/plugins/builtins.py +746 -0
  73. ksadk/plugins/bundle.py +246 -0
  74. ksadk/plugins/bundle_security.py +191 -0
  75. ksadk/plugins/codex_manifest.py +983 -0
  76. ksadk/plugins/composition.py +537 -0
  77. ksadk/plugins/context_contributor.py +437 -0
  78. ksadk/plugins/contracts.py +569 -0
  79. ksadk/plugins/delivery.py +153 -0
  80. ksadk/plugins/dsh_installation_digest.py +71 -0
  81. ksadk/plugins/dsh_toolchain.py +1024 -0
  82. ksadk/plugins/ecosystem_bridge.py +1105 -0
  83. ksadk/plugins/ecosystem_probe.py +191 -0
  84. ksadk/plugins/host.py +787 -0
  85. ksadk/plugins/kernel_adapter.py +205 -0
  86. ksadk/plugins/providers/__init__.py +108 -0
  87. ksadk/plugins/providers/bundles/dsh-knowledge/cordis.patch.yml +3 -0
  88. ksadk/plugins/providers/bundles/dsh-knowledge/index.mjs +53 -0
  89. ksadk/plugins/providers/bundles/dsh-knowledge/package.json +16 -0
  90. ksadk/plugins/providers/bundles/dsh-memory/cordis.patch.yml +3 -0
  91. ksadk/plugins/providers/bundles/dsh-memory/index.mjs +175 -0
  92. ksadk/plugins/providers/bundles/dsh-memory/package.json +16 -0
  93. ksadk/plugins/providers/bundles/dsh-platform-resources/client.mjs +166 -0
  94. ksadk/plugins/providers/bundles/dsh-platform-resources/cordis.patch.yml +3 -0
  95. ksadk/plugins/providers/bundles/dsh-platform-resources/index.mjs +9 -0
  96. ksadk/plugins/providers/bundles/dsh-platform-resources/package.json +12 -0
  97. ksadk/plugins/providers/bundles/dsh-skill-center/cordis.patch.yml +3 -0
  98. ksadk/plugins/providers/bundles/dsh-skill-center/index.mjs +125 -0
  99. ksadk/plugins/providers/bundles/dsh-skill-center/package.json +16 -0
  100. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  101. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  102. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  103. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/cordis.patch.yml +3 -0
  104. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/index.mjs +870 -0
  105. ksadk/plugins/providers/bundles/ksadk-dsh-capability-host/package.json +27 -0
  106. ksadk/plugins/providers/bundles/ksadk-dsh-studio/client.js +92 -0
  107. ksadk/plugins/providers/bundles/ksadk-dsh-studio/index.mjs +15 -0
  108. ksadk/plugins/providers/bundles/ksadk-dsh-studio/package.json +7 -0
  109. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  110. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  111. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  112. ksadk/plugins/providers/codex.py +988 -0
  113. ksadk/plugins/providers/codex_dsh.py +83 -0
  114. ksadk/plugins/providers/codex_native.py +368 -0
  115. ksadk/plugins/providers/codex_turn.py +301 -0
  116. ksadk/plugins/providers/dsh.py +951 -0
  117. ksadk/plugins/providers/dsh_capabilities.py +1389 -0
  118. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  119. ksadk/plugins/providers/dsh_mcp.py +467 -0
  120. ksadk/plugins/providers/harness.py +632 -0
  121. ksadk/plugins/providers/harness_dsh.py +91 -0
  122. ksadk/plugins/providers/legacy.py +215 -0
  123. ksadk/plugins/providers/legacy_catalog.py +100 -0
  124. ksadk/plugins/providers/mcp_projection.py +150 -0
  125. ksadk/plugins/providers/platform_resources.py +657 -0
  126. ksadk/plugins/providers/shipped_dsh.py +370 -0
  127. ksadk/plugins/resolver.py +338 -0
  128. ksadk/plugins/subagent_providers/__init__.py +12 -0
  129. ksadk/plugins/subagent_providers/codex.py +443 -0
  130. ksadk/plugins/subagents.py +333 -0
  131. ksadk/resource_runtime/__init__.py +4 -0
  132. ksadk/resource_runtime/broker.py +616 -0
  133. ksadk/resource_runtime/build_artifacts.py +165 -0
  134. ksadk/resource_runtime/contracts.py +138 -0
  135. ksadk/resource_runtime/discovery_receipts.py +100 -0
  136. ksadk/resource_runtime/discovery_skills.py +172 -0
  137. ksadk/resource_runtime/errors.py +6 -0
  138. ksadk/resource_runtime/ipc.py +142 -0
  139. ksadk/resource_runtime/kernel_approval.py +165 -0
  140. ksadk/resource_runtime/knowledge.py +114 -0
  141. ksadk/resource_runtime/langgraph.py +94 -0
  142. ksadk/resource_runtime/leases.py +191 -0
  143. ksadk/resource_runtime/managed_projection.py +186 -0
  144. ksadk/resource_runtime/mcp_server.py +138 -0
  145. ksadk/resource_runtime/memory_provider.py +318 -0
  146. ksadk/resource_runtime/memory_receipts.py +34 -0
  147. ksadk/resource_runtime/operation_ledger.py +211 -0
  148. ksadk/resource_runtime/plugin_config.py +48 -0
  149. ksadk/resource_runtime/policy_authorization.py +54 -0
  150. ksadk/resource_runtime/process.py +110 -0
  151. ksadk/resource_runtime/skill_artifacts.py +153 -0
  152. ksadk/resource_runtime/skill_runtime.py +42 -0
  153. ksadk/resource_runtime/skill_workspace.py +118 -0
  154. ksadk/resource_runtime/skills.py +215 -0
  155. ksadk/resource_runtime/snapshots.py +180 -0
  156. ksadk/resource_runtime/socket_server.py +103 -0
  157. ksadk/resource_runtime/supervisor.py +380 -0
  158. ksadk/resource_runtime/worker.py +504 -0
  159. ksadk/runners/_langgraph_runner_streams.py +74 -6
  160. ksadk/runners/adk_runner.py +149 -11
  161. ksadk/runners/base_runner.py +29 -1
  162. ksadk/runners/langgraph_runner.py +475 -145
  163. ksadk/runtime/_runner_adapter/stream_mapping.py +193 -60
  164. ksadk/runtime/adapter.py +3 -0
  165. ksadk/runtime/conversation_execution.py +92 -16
  166. ksadk/runtime/executor.py +78 -2
  167. ksadk/runtime/factory.py +30 -200
  168. ksadk/runtime/framework_adapters.py +41 -0
  169. ksadk/runtime/preprocessing.py +10 -2
  170. ksadk/runtime/runner_adapter.py +78 -14
  171. ksadk/runtime_context.py +40 -2
  172. ksadk/sandbox/__init__.py +2 -1
  173. ksadk/sandbox/backends/e2b.py +52 -11
  174. ksadk/sandbox/backends/local_process.py +9 -0
  175. ksadk/sandbox/base.py +2 -0
  176. ksadk/sandbox/e2b_connection.py +66 -0
  177. ksadk/sandbox/factory.py +72 -0
  178. ksadk/scheduler/__init__.py +18 -0
  179. ksadk/scheduler/calendar.py +102 -0
  180. ksadk/scheduler/contracts.py +254 -0
  181. ksadk/scheduler/dispatcher.py +129 -0
  182. ksadk/scheduler/engine.py +416 -0
  183. ksadk/scheduler/sqlite_store.py +581 -0
  184. ksadk/server/composition.py +2 -0
  185. ksadk/server/factory.py +5 -0
  186. ksadk/server/persistence_capability.py +516 -0
  187. ksadk/server/routes/control.py +210 -46
  188. ksadk/server/routes/dependencies.py +15 -0
  189. ksadk/server/routes/models.py +47 -4
  190. ksadk/server/routes/projection.py +252 -12
  191. ksadk/server/routes/sessions.py +284 -107
  192. ksadk/server/routes/streaming.py +43 -9
  193. ksadk/server/static/assets/{ArtifactsPanel-DSU1sWD_.js → ArtifactsPanel-CGbWlMNh.js} +1 -1
  194. ksadk/server/static/assets/{CodeBlock-DOH6MVcn.js → CodeBlock-b4C7upmO.js} +3 -3
  195. ksadk/server/static/assets/{MathMessageMarkdown-BL8my1R2.js → MathMessageMarkdown-DbdW5A4_.js} +4 -4
  196. ksadk/server/static/assets/{MermaidBlock-Dz4IP-Tx.js → MermaidBlock-BEBN4Ksz.js} +6 -6
  197. ksadk/server/static/assets/{NativeTerminalPanel-DUrK0JpZ.js → NativeTerminalPanel-zvL-WpAn.js} +1 -1
  198. ksadk/server/static/assets/{abnfDiagram-VCTEODGH-g20pFzNV.js → abnfDiagram-VCTEODGH-BYafW7Za.js} +1 -1
  199. ksadk/server/static/assets/{arc-C4FzinUA.js → arc-bTohInsS.js} +1 -1
  200. ksadk/server/static/assets/architecture-7GRP2DOG-BW5UtSnx.js +1 -0
  201. ksadk/server/static/assets/{architectureDiagram-5GKGNRK7-DpIqL5h4.js → architectureDiagram-5GKGNRK7-Ch5Lbzsi.js} +1 -1
  202. ksadk/server/static/assets/{blockDiagram-NRAW4CY4-BjkljTNz.js → blockDiagram-NRAW4CY4-kqF4MDOG.js} +1 -1
  203. ksadk/server/static/assets/{c4Diagram-UCG6FXSJ-Dk_ieq2X.js → c4Diagram-UCG6FXSJ-8uSRIODv.js} +1 -1
  204. ksadk/server/static/assets/channel-CF5Up3hQ.js +1 -0
  205. ksadk/server/static/assets/chunk-2Q5K7J3B-KkXX47WI.js +1 -0
  206. ksadk/server/static/assets/{chunk-5VM5RSS4-BVHAchFb.js → chunk-5VM5RSS4-DkhehZDr.js} +1 -1
  207. ksadk/server/static/assets/{chunk-F27PBJKO-C-ipQzuS.js → chunk-F27PBJKO-BdXhtPe9.js} +1 -1
  208. ksadk/server/static/assets/{chunk-G27WJ6UU-C2EyJbIK.js → chunk-G27WJ6UU-DPTpvpwi.js} +1 -1
  209. ksadk/server/static/assets/{chunk-JWPE2WC7-vYvVJb_M.js → chunk-JWPE2WC7-Pqoh38el.js} +1 -1
  210. ksadk/server/static/assets/{chunk-LCL6LL3I-BcI6ysPT.js → chunk-LCL6LL3I-DeU00qC-.js} +1 -1
  211. ksadk/server/static/assets/{chunk-POPQ4Y6H-C030x_Z1.js → chunk-POPQ4Y6H-CzxScFkr.js} +1 -1
  212. ksadk/server/static/assets/{chunk-RHFEMEQ7-yyGpsz4n.js → chunk-RHFEMEQ7-DpqMx-ux.js} +1 -1
  213. ksadk/server/static/assets/{chunk-SVP7TREG-BLTlmMU7.js → chunk-SVP7TREG-C6t0SypQ.js} +1 -1
  214. ksadk/server/static/assets/{chunk-XXDRQBXY-C_32ArgP.js → chunk-XXDRQBXY-DVaeafZk.js} +1 -1
  215. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Cz81acRQ.js +1 -0
  216. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Cz81acRQ.js +1 -0
  217. ksadk/server/static/assets/{cose-bilkent-JH36ORCC-9YQYwdl0.js → cose-bilkent-JH36ORCC-Bf9D3tzJ.js} +1 -1
  218. ksadk/server/static/assets/cynefin-OW5HDTMX-DVWs8a2t.js +1 -0
  219. ksadk/server/static/assets/{cynefinDiagram-5FMLGOSQ-ErLF5N13.js → cynefinDiagram-5FMLGOSQ-B9cY3iTz.js} +1 -1
  220. ksadk/server/static/assets/{dagre-3AP2YEHR-DFiQF-6f.js → dagre-3AP2YEHR-CSwlx3CB.js} +1 -1
  221. ksadk/server/static/assets/{dagre-BuhGnRI1.js → dagre-UBpgon5q.js} +1 -1
  222. ksadk/server/static/assets/{diagram-S7CK7UJ4-Bt1v8-GC.js → diagram-S7CK7UJ4-C9akhN9a.js} +1 -1
  223. ksadk/server/static/assets/{diagram-UQ7AKVKN-DSCxJdBK.js → diagram-UQ7AKVKN-CgedhTPI.js} +1 -1
  224. ksadk/server/static/assets/{diagram-VSXAHHWV-DHfYwp_9.js → diagram-VSXAHHWV-Cjucz5BY.js} +1 -1
  225. ksadk/server/static/assets/{diagram-VX7I27RA-DdzD-4Le.js → diagram-VX7I27RA-Dd4Vleyn.js} +1 -1
  226. ksadk/server/static/assets/{diagram-Z3DM3KII-Du-nAJ9F.js → diagram-Z3DM3KII-CZ2jGtYW.js} +1 -1
  227. ksadk/server/static/assets/{dist-B7seoj3d.js → dist-B2_CVgKv.js} +1 -1
  228. ksadk/server/static/assets/{dist-CSh_DE14.js → dist-B3FR1SKK.js} +1 -1
  229. ksadk/server/static/assets/{dist-DUX-id_F.js → dist-BIr4DSRq.js} +1 -1
  230. ksadk/server/static/assets/{dist-C_wsv-Qd.js → dist-BgV_owcB.js} +1 -1
  231. ksadk/server/static/assets/{dist-W-TIVntx.js → dist-Bj730Ib4.js} +1 -1
  232. ksadk/server/static/assets/{dist-BytlxIDT.js → dist-BnaTiyzN.js} +1 -1
  233. ksadk/server/static/assets/{dist-CXYYBw3_.js → dist-C1NMAY5a.js} +1 -1
  234. ksadk/server/static/assets/{dist-dDdADKFA.js → dist-C5_ZAZsG.js} +1 -1
  235. ksadk/server/static/assets/{dist-BVDffZ0U.js → dist-CB9iJrvg.js} +1 -1
  236. ksadk/server/static/assets/{dist-Bf2M8m3N.js → dist-CFzsn6BG.js} +1 -1
  237. ksadk/server/static/assets/{dist-ngtN0DJB.js → dist-Cf125P_m.js} +1 -1
  238. ksadk/server/static/assets/{dist-BE7bu-DL.js → dist-ClYUxfeK.js} +1 -1
  239. ksadk/server/static/assets/{dist-DNp6rLRA.js → dist-DFD6Qa6T.js} +1 -1
  240. ksadk/server/static/assets/{dist-BX8z72IC.js → dist-DVCOWtha.js} +1 -1
  241. ksadk/server/static/assets/{dist-dydu68Fl.js → dist-D_ctSS2i.js} +1 -1
  242. ksadk/server/static/assets/{dist-ClxGviKw.js → dist-DiixqL0J.js} +1 -1
  243. ksadk/server/static/assets/{dist-BjU6y-A2.js → dist-DoVSwoDb.js} +1 -1
  244. ksadk/server/static/assets/{dist-Dq9gLD7L.js → dist-DvFK7p5S.js} +1 -1
  245. ksadk/server/static/assets/{dist-8hqcx0sU.js → dist-QfkEHOlb.js} +1 -1
  246. ksadk/server/static/assets/{dist-CttYUqzS.js → dist-btbmmX5O.js} +1 -1
  247. ksadk/server/static/assets/{dist-DmldrHd_.js → dist-fBO2v5Kt.js} +1 -1
  248. ksadk/server/static/assets/{dist-DnfXs8Vn.js → dist-ufY3F5p6.js} +1 -1
  249. ksadk/server/static/assets/{ebnfDiagram-PWID7BFC-Da9C9NO1.js → ebnfDiagram-PWID7BFC-Ci8NqqZu.js} +1 -1
  250. ksadk/server/static/assets/{erDiagram-SSCWMZ5O-EAGqqR79.js → erDiagram-SSCWMZ5O-CCIOhLZG.js} +1 -1
  251. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CQqR2hg3.js +1 -0
  252. ksadk/server/static/assets/flowDiagram-A5DVABFB-DDRRbGPm.js +1 -0
  253. ksadk/server/static/assets/{ganttDiagram-EL5Y4UJY-DqJsKb59.js → ganttDiagram-EL5Y4UJY-Cp_r9Hb6.js} +1 -1
  254. ksadk/server/static/assets/gitGraph-4MIJSDKK-fgWEf7UD.js +1 -0
  255. ksadk/server/static/assets/{gitGraphDiagram-WWUBYQGX-B6g4dtDi.js → gitGraphDiagram-WWUBYQGX-Dlhc8Wr8.js} +1 -1
  256. ksadk/server/static/assets/index-DcTML1Up.css +2 -0
  257. ksadk/server/static/assets/index-Dh2XHqPK.js +244 -0
  258. ksadk/server/static/assets/info-A6RAGUB7-BUecLTdt.js +1 -0
  259. ksadk/server/static/assets/{infoDiagram-RXCK75RN-Djm_nbd5.js → infoDiagram-RXCK75RN-CO0rRTRA.js} +1 -1
  260. ksadk/server/static/assets/{ishikawaDiagram-5VMMS53U-DWya9SG2.js → ishikawaDiagram-5VMMS53U-CHiaedSS.js} +1 -1
  261. ksadk/server/static/assets/{journeyDiagram-EYS64GPL-DutxhSNI.js → journeyDiagram-EYS64GPL-CHcCIB09.js} +1 -1
  262. ksadk/server/static/assets/{kanban-definition-3QL26DDD-DJdOF8Fm.js → kanban-definition-3QL26DDD-CJ_ebBZf.js} +1 -1
  263. ksadk/server/static/assets/{katex-vFWytM5c.js → katex-B4weu383.js} +1 -1
  264. ksadk/server/static/assets/{linear-BHjG8b-J.js → linear-V-MgYHW1.js} +1 -1
  265. ksadk/server/static/assets/{mermaid-parser.core-KGSy4jWT.js → mermaid-parser.core-CBijEX_c.js} +2 -2
  266. ksadk/server/static/assets/{mindmap-definition-FBJOCRG2-9-HC88D4.js → mindmap-definition-FBJOCRG2-Bc-pQvpp.js} +1 -1
  267. ksadk/server/static/assets/packet-AYTQ26CC-BeW-btFv.js +1 -0
  268. ksadk/server/static/assets/{pegDiagram-XKGWAZYB-DrEZd4fD.js → pegDiagram-XKGWAZYB-D7genGLl.js} +1 -1
  269. ksadk/server/static/assets/pie-WAS4IAKB-X0xh4SaT.js +1 -0
  270. ksadk/server/static/assets/{pieDiagram-E7YTZNPT-DpjqOFFp.js → pieDiagram-E7YTZNPT-Bxj32zwD.js} +1 -1
  271. ksadk/server/static/assets/{quadrantDiagram-AXDQQJYC-BiNhgOXX.js → quadrantDiagram-AXDQQJYC-BURv2mGh.js} +1 -1
  272. ksadk/server/static/assets/radar-RG4KPBEZ-DzRMSqjd.js +1 -0
  273. ksadk/server/static/assets/railroad-74A4TZTK-Cc44icX-.js +1 -0
  274. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-D6S4BdV-.js +1 -0
  275. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-vD3aVE2o.js +1 -0
  276. ksadk/server/static/assets/railroad-peg-WCYAUIDC-CYbW_b4T.js +1 -0
  277. ksadk/server/static/assets/{railroadDiagram-O6MQD6OU-_Y3Ojg6G.js → railroadDiagram-O6MQD6OU-CCsh3avW.js} +1 -1
  278. ksadk/server/static/assets/{requirementDiagram-EFPCY7ZU-DeCFdg9K.js → requirementDiagram-EFPCY7ZU-_FRRBKEd.js} +1 -1
  279. ksadk/server/static/assets/{sankeyDiagram-P5KCCOFB-CPH75rhw.js → sankeyDiagram-P5KCCOFB-C-gr2o9M.js} +1 -1
  280. ksadk/server/static/assets/{sequenceDiagram-WJ2MYXX4-OEpQQdr4.js → sequenceDiagram-WJ2MYXX4-D97NmfKg.js} +1 -1
  281. ksadk/server/static/assets/{sizeCapture-X5ZJPWSS-heUErzhI.js → sizeCapture-X5ZJPWSS-DjrPC5FX.js} +1 -1
  282. ksadk/server/static/assets/{stateDiagram-HBIQ2CUA-DvA3jSMB.js → stateDiagram-HBIQ2CUA-DzMNg1hh.js} +1 -1
  283. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BIcjKFhF.js +1 -0
  284. ksadk/server/static/assets/{swimlanes-XN3QIQJK-CR-dfN_t.js → swimlanes-XN3QIQJK-Cssf_CsU.js} +1 -1
  285. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-tq3K3Ybl.js +8 -0
  286. ksadk/server/static/assets/{timeline-definition-24CTP7MA-DAVJf1TX.js → timeline-definition-24CTP7MA-BWTHzyS1.js} +1 -1
  287. ksadk/server/static/assets/treeView-Q6P3EWNA-DBXt3GdU.js +1 -0
  288. ksadk/server/static/assets/treemap-WGGIJYW6-DrCy4E_l.js +1 -0
  289. ksadk/server/static/assets/{vennDiagram-4TSXK5OY-DwM8eDkh.js → vennDiagram-4TSXK5OY-BSKgJsmR.js} +1 -1
  290. ksadk/server/static/assets/wardley-WFR3VGLG-CefhOliM.js +1 -0
  291. ksadk/server/static/assets/{wardleyDiagram-VM6X3IG4-DZL-Zz2t.js → wardleyDiagram-VM6X3IG4-eflHNoaZ.js} +1 -1
  292. ksadk/server/static/assets/{xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js → xychartDiagram-S5SC5T6Z-eYqrQ-v4.js} +1 -1
  293. ksadk/server/static/index.html +2 -2
  294. ksadk/session_context.py +66 -0
  295. ksadk/sessions/__init__.py +11 -21
  296. ksadk/sessions/_local_service_sync.py +263 -1
  297. ksadk/sessions/base.py +176 -0
  298. ksadk/sessions/errors.py +4 -0
  299. ksadk/sessions/in_memory.py +309 -19
  300. ksadk/sessions/local_service.py +83 -1
  301. ksadk/sessions/persistence.py +275 -0
  302. ksadk/sessions/postgres_service.py +358 -0
  303. ksadk/sessions/resilience.py +8 -0
  304. ksadk/sessions/resilient.py +362 -4
  305. ksadk/sessions/topology.py +135 -0
  306. ksadk/skills/models.py +26 -4
  307. ksadk/skills/package_store.py +186 -38
  308. ksadk/skills/runtime/agent.py +31 -6
  309. ksadk/skills/runtime/artifact_delivery.py +139 -0
  310. ksadk/skills/runtime/backends/e2b.py +98 -6
  311. ksadk/skills/runtime/backends/local.py +73 -8
  312. ksadk/skills/runtime/base.py +3 -0
  313. ksadk/skills/runtime/executor.py +2 -0
  314. ksadk/skills/runtime/loader.py +10 -2
  315. ksadk/skills/runtime/pinned.py +114 -0
  316. ksadk/skills/runtime/request.py +31 -0
  317. ksadk/skills/service_client.py +211 -24
  318. ksadk/studio/agent_lifecycle.py +26 -20
  319. ksadk/studio/api.py +714 -90
  320. ksadk/studio/api_catalog_routes.py +23 -0
  321. ksadk/studio/api_contracts.py +34 -1
  322. ksadk/studio/api_plugin_routes.py +911 -0
  323. ksadk/studio/api_resource_connections.py +183 -0
  324. ksadk/studio/attachment_store.py +187 -0
  325. ksadk/studio/authoring.py +10 -4
  326. ksadk/studio/authoring_coordinator.py +31 -16
  327. ksadk/studio/builder.py +199 -43
  328. ksadk/studio/cloud.py +346 -104
  329. ksadk/studio/cloud_shared_web.py +565 -0
  330. ksadk/studio/codex_agent_service.py +140 -27
  331. ksadk/studio/codex_builder.py +294 -16
  332. ksadk/studio/codex_credentials.py +90 -0
  333. ksadk/studio/codex_manifest.py +51 -4
  334. ksadk/studio/codex_plugin_store.py +746 -0
  335. ksadk/studio/codex_provider_build.py +231 -0
  336. ksadk/studio/codex_run.py +200 -29
  337. ksadk/studio/compatibility_report.py +456 -0
  338. ksadk/studio/compiler.py +84 -15
  339. ksadk/studio/contracts.py +249 -4
  340. ksadk/studio/dsh_application.py +137 -0
  341. ksadk/studio/dsh_capability_service.py +1107 -0
  342. ksadk/studio/dsh_models.py +59 -0
  343. ksadk/studio/dsh_provider_registration.py +1075 -0
  344. ksadk/studio/event_store.py +54 -6
  345. ksadk/studio/framework_run.py +37 -4
  346. ksadk/studio/hosted_kernel.py +89 -14
  347. ksadk/studio/mcp_runtime.py +11 -3
  348. ksadk/studio/model_client.py +2 -2
  349. ksadk/studio/operations.py +12 -2
  350. ksadk/studio/plugin_composition.py +468 -0
  351. ksadk/studio/plugin_kernel_adapter.py +28 -0
  352. ksadk/studio/plugin_runtime.py +831 -0
  353. ksadk/studio/resource_authority.py +637 -0
  354. ksadk/studio/resource_binding_validation.py +77 -0
  355. ksadk/studio/resource_build_admission.py +196 -0
  356. ksadk/studio/resource_build_materializer.py +149 -0
  357. ksadk/studio/resource_catalog.py +149 -3
  358. ksadk/studio/resource_connections.py +220 -0
  359. ksadk/studio/run_service.py +1144 -96
  360. ksadk/studio/runtime_source.py +24 -8
  361. ksadk/studio/scheduler_assistant.py +317 -0
  362. ksadk/studio/scheduler_runtime.py +383 -0
  363. ksadk/studio/scheduler_service.py +214 -0
  364. ksadk/studio/service.py +1131 -95
  365. ksadk/studio/shared_web.py +610 -87
  366. ksadk/studio/soul.py +52 -0
  367. ksadk/studio/static/assets/CodeBlock-DCUUY0PL-BLjA7kbS.js +41 -0
  368. ksadk/studio/static/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  369. ksadk/studio/static/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  370. ksadk/studio/static/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  371. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  372. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  373. ksadk/studio/static/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  374. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  375. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  376. ksadk/studio/static/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  377. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  378. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  379. ksadk/studio/static/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  380. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  381. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  382. ksadk/studio/static/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  383. ksadk/studio/static/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  384. ksadk/studio/static/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  385. ksadk/studio/static/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  386. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  387. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  388. ksadk/studio/static/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  389. ksadk/studio/static/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  390. ksadk/studio/static/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  391. ksadk/studio/static/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  392. ksadk/studio/static/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  393. ksadk/studio/static/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  394. ksadk/studio/static/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  395. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  396. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  397. ksadk/studio/static/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  398. ksadk/studio/static/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  399. ksadk/studio/static/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  400. ksadk/studio/static/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  401. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  402. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  403. ksadk/studio/static/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  404. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  405. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  406. ksadk/studio/static/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  407. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  408. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  409. ksadk/studio/static/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  410. ksadk/studio/static/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  411. ksadk/studio/static/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  412. ksadk/studio/static/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  413. ksadk/studio/static/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  414. ksadk/studio/static/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  415. ksadk/studio/static/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  416. ksadk/studio/static/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  417. ksadk/studio/static/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  418. ksadk/studio/static/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  419. ksadk/studio/static/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  420. ksadk/studio/static/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  421. ksadk/studio/static/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  422. ksadk/studio/static/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  423. ksadk/studio/static/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  424. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  425. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  426. ksadk/studio/static/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  427. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--BEOyPC3w.css +1 -0
  428. ksadk/studio/static/assets/MathMessageMarkdown-CBcDrAw--CUYIXwgI.js +8 -0
  429. ksadk/studio/static/assets/MermaidBlock-DBFTztfQ-BTYKWEbD.js +44 -0
  430. ksadk/studio/static/assets/PrismRenderer-wiXRHURw.js +3 -0
  431. ksadk/studio/static/assets/abnfDiagram-VCTEODGH-CLETGjKq.js +1 -0
  432. ksadk/studio/static/assets/arc-Pry-7G1_.js +1 -0
  433. ksadk/studio/static/assets/architecture-7GRP2DOG-hXMiO_AU.js +1 -0
  434. ksadk/studio/static/assets/architectureDiagram-5GKGNRK7-B5EQysk6.js +36 -0
  435. ksadk/studio/static/assets/array-BifhSqXX.js +1 -0
  436. ksadk/studio/static/assets/blockDiagram-I7D4REHJ-CFmPl1de.js +129 -0
  437. ksadk/studio/static/assets/c4Diagram-7LVT6UL2-BRrGu8qt.js +38 -0
  438. ksadk/studio/static/assets/channel-BqO-gtEw.js +1 -0
  439. ksadk/studio/static/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  440. ksadk/studio/static/assets/chunk-4HAMMTFA-D220vUtq.js +62 -0
  441. ksadk/studio/static/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  442. ksadk/studio/static/assets/chunk-75Z2AOVW-C8lLv_qc.js +2 -0
  443. ksadk/studio/static/assets/chunk-DU6HZSFF-C4DtVpCu.js +128 -0
  444. ksadk/studio/static/assets/chunk-F27PBJKO-Cpw14SNG.js +1 -0
  445. ksadk/studio/static/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  446. ksadk/studio/static/assets/chunk-GMAD6QVW-DiQA-u2N.js +72 -0
  447. ksadk/studio/static/assets/chunk-GVQU2GXP-DUdNBUCi.js +1 -0
  448. ksadk/studio/static/assets/chunk-IMKFNOWR-BSlbjT_b.js +231 -0
  449. ksadk/studio/static/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  450. ksadk/studio/static/assets/chunk-L3NEJ4N5-Db8Ab22W.js +1 -0
  451. ksadk/studio/static/assets/chunk-OSK3NFVY-M2m6G3j4.js +10 -0
  452. ksadk/studio/static/assets/chunk-P2QGCYS3-DezaQxiK.js +1 -0
  453. ksadk/studio/static/assets/chunk-POPQ4Y6H-DOpufJ3t.js +1 -0
  454. ksadk/studio/static/assets/chunk-PWAF6VOD-CfLb1gSc.js +1 -0
  455. ksadk/studio/static/assets/chunk-SHT3W25Y-DAyIVp5H.js +168 -0
  456. ksadk/studio/static/assets/chunk-SVP7TREG-DulomOrS.js +88 -0
  457. ksadk/studio/static/assets/chunk-TICWLB2K-bHJYoflj.js +206 -0
  458. ksadk/studio/static/assets/chunk-XXDRQBXY-7PcdR2B1.js +1 -0
  459. ksadk/studio/static/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  460. ksadk/studio/static/assets/classDiagram-ZZMXUADV-D_bW8JjA.js +1 -0
  461. ksadk/studio/static/assets/classDiagram-v2-VYDZK3BY-D_bW8JjA.js +1 -0
  462. ksadk/studio/static/assets/cose-bilkent-JH36ORCC-snL88wkX.js +1 -0
  463. ksadk/studio/static/assets/cynefin-OW5HDTMX-Bd1YhRo1.js +1 -0
  464. ksadk/studio/static/assets/cynefinDiagram-5FMLGOSQ-BBrIG_mI.js +62 -0
  465. ksadk/studio/static/assets/cytoscape.esm-CGd-uY3x.js +321 -0
  466. ksadk/studio/static/assets/dagre-GXQ25YYZ-DtF1nGdY.js +4 -0
  467. ksadk/studio/static/assets/dagre-PrKaheQc.js +1 -0
  468. ksadk/studio/static/assets/defaultLocale-BFoDCU3G.js +1 -0
  469. ksadk/studio/static/assets/diagram-S7CK7UJ4-0BZ98mya.js +30 -0
  470. ksadk/studio/static/assets/diagram-UQ7AKVKN-6mLKEo6L.js +41 -0
  471. ksadk/studio/static/assets/diagram-VSXAHHWV-CJBIaiZ2.js +3 -0
  472. ksadk/studio/static/assets/diagram-VX7I27RA-BohLEE1C.js +24 -0
  473. ksadk/studio/static/assets/diagram-Z3DM3KII-D8KIGonG.js +24 -0
  474. ksadk/studio/static/assets/dist-v5Q1xZ2K.js +1 -0
  475. ksadk/studio/static/assets/ebnfDiagram-PWID7BFC-C99HU61t.js +1 -0
  476. ksadk/studio/static/assets/erDiagram-RLTQ6QDP-DLGry2Ap.js +99 -0
  477. ksadk/studio/static/assets/eventmodeling-NTZA5JFV-B1_5Ac8j.js +1 -0
  478. ksadk/studio/static/assets/flowDiagram-HODETNUW-DD5hmicn.js +1 -0
  479. ksadk/studio/static/assets/ganttDiagram-EL5Y4UJY-BPJrVLSG.js +292 -0
  480. ksadk/studio/static/assets/gitGraph-4MIJSDKK-Cy_ZQBGi.js +1 -0
  481. ksadk/studio/static/assets/gitGraphDiagram-WWUBYQGX-CZCUz4MT.js +106 -0
  482. ksadk/studio/static/assets/graphlib-DS17s2tU.js +1 -0
  483. ksadk/studio/static/assets/index-CeHL9ARV.css +2 -0
  484. ksadk/studio/static/assets/index-D9QEcVpL.js +320 -0
  485. ksadk/studio/static/assets/info-A6RAGUB7-DBzDQB_I.js +1 -0
  486. ksadk/studio/static/assets/infoDiagram-27XIBGKW-B-sq07Hi.js +2 -0
  487. ksadk/studio/static/assets/init-C-OQMol4.js +1 -0
  488. ksadk/studio/static/assets/ishikawaDiagram-5VMMS53U-CljI2wyf.js +70 -0
  489. ksadk/studio/static/assets/journeyDiagram-3NMN7TZE-D50Fo2sL.js +139 -0
  490. ksadk/studio/static/assets/kanban-definition-UXKFOSKX-DimfOTam.js +89 -0
  491. ksadk/studio/static/assets/katex-DhON-x74.js +257 -0
  492. ksadk/studio/static/assets/line-CX5BOOUP.js +1 -0
  493. ksadk/studio/static/assets/linear-BCxN9JLv.js +1 -0
  494. ksadk/studio/static/assets/mermaid-parser.core-BdCz8fkS.js +7 -0
  495. ksadk/studio/static/assets/mindmap-definition-YA3MSWOX-Bizzqy5R.js +96 -0
  496. ksadk/studio/static/assets/ordinal-BDEzSJ7C.js +1 -0
  497. ksadk/studio/static/assets/packet-AYTQ26CC-gPln-_kG.js +1 -0
  498. ksadk/studio/static/assets/path-fybaL0A-.js +1 -0
  499. ksadk/studio/static/assets/pegDiagram-XKGWAZYB-Dy3fB-gW.js +1 -0
  500. ksadk/studio/static/assets/pie-WAS4IAKB-qZdHMr7B.js +1 -0
  501. ksadk/studio/static/assets/pieDiagram-E7YTZNPT-B9mrFSDF.js +39 -0
  502. ksadk/studio/static/assets/quadrantDiagram-AXDQQJYC-NzUfCbMR.js +7 -0
  503. ksadk/studio/static/assets/radar-RG4KPBEZ-BZlnaea9.js +1 -0
  504. ksadk/studio/static/assets/railroad-74A4TZTK-Ce3__H9c.js +1 -0
  505. ksadk/studio/static/assets/railroad-abnf-HS5TGJTU-DqQn7EzD.js +1 -0
  506. ksadk/studio/static/assets/railroad-ebnf-LZEXJU2U-B55kCA8F.js +1 -0
  507. ksadk/studio/static/assets/railroad-peg-WCYAUIDC-DfQnvkHd.js +1 -0
  508. ksadk/studio/static/assets/railroadDiagram-O6MQD6OU-DnhMjZCk.js +1 -0
  509. ksadk/studio/static/assets/requirementDiagram-BXWQKSXE-BF3d103U.js +84 -0
  510. ksadk/studio/static/assets/rolldown-runtime-Dy4uBu1J-DK3Fl9T5.js +1 -0
  511. ksadk/studio/static/assets/rough.esm-Dy-Kn_BL.js +1 -0
  512. ksadk/studio/static/assets/sankeyDiagram-P5KCCOFB-Bo-JTwt0.js +40 -0
  513. ksadk/studio/static/assets/sequenceDiagram-WJ2MYXX4-Dh4wZtUm.js +162 -0
  514. ksadk/studio/static/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  515. ksadk/studio/static/assets/src-SFn9St9H.js +1 -0
  516. ksadk/studio/static/assets/stateDiagram-D77RDMKH-DH774G6d.js +1 -0
  517. ksadk/studio/static/assets/stateDiagram-v2-MP3YSRHH-DZvVWPBo.js +1 -0
  518. ksadk/studio/static/assets/swimlanes-42K2YHIH-Bl13OvTX.js +1 -0
  519. ksadk/studio/static/assets/swimlanesDiagram-VR7AAH4N-BnFOTALJ.js +8 -0
  520. ksadk/studio/static/assets/timeline-definition-24CTP7MA-DxmSSjRB.js +120 -0
  521. ksadk/studio/static/assets/treeView-Q6P3EWNA-D5Nn9Swz.js +1 -0
  522. ksadk/studio/static/assets/treemap-WGGIJYW6-CgHgnQhE.js +1 -0
  523. ksadk/studio/static/assets/vennDiagram-4TSXK5OY-B9QEXcJq.js +34 -0
  524. ksadk/studio/static/assets/wardley-WFR3VGLG-DXrK2RRY.js +1 -0
  525. ksadk/studio/static/assets/wardleyDiagram-VM6X3IG4-Ba1AOWoe.js +78 -0
  526. ksadk/studio/static/assets/xychartDiagram-S5SC5T6Z-Cr5pt5Y-.js +7 -0
  527. ksadk/studio/static/index.html +2 -2
  528. ksadk/studio/validator.py +1 -1
  529. ksadk/studio/workspace.py +1 -0
  530. ksadk/version.py +1 -1
  531. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  532. agentengine_sdk_python-0.8.2.dist-info/RECORD +0 -778
  533. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +0 -1
  534. ksadk/server/static/assets/channel-4cQHKtx1.js +0 -1
  535. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +0 -1
  536. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +0 -1
  537. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +0 -1
  538. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +0 -1
  539. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +0 -1
  540. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +0 -1
  541. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +0 -1
  542. ksadk/server/static/assets/index-8ipRcQ-M.js +0 -240
  543. ksadk/server/static/assets/index-ByFCqjlh.css +0 -2
  544. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +0 -1
  545. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +0 -1
  546. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +0 -1
  547. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +0 -1
  548. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +0 -1
  549. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +0 -1
  550. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +0 -1
  551. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +0 -1
  552. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +0 -1
  553. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +0 -8
  554. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +0 -1
  555. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +0 -1
  556. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +0 -1
  557. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +0 -3
  558. ksadk/studio/static/assets/index-BLpcdrgW.css +0 -1
  559. ksadk/studio/static/assets/index-CYekR2Xv.js +0 -260
  560. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/WHEEL +0 -0
  561. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/entry_points.txt +0 -0
  562. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/licenses/LICENSE +0 -0
  563. {agentengine_sdk_python-0.8.2.dist-info → agentengine_sdk_python-0.8.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,98 @@
1
+ """Identity-aware reducer for a ConversationItem surface.
2
+
3
+ This reducer deliberately does not deduplicate by author or text. Providers
4
+ may emit the same content in two different items, and both are user-visible
5
+ truth. Reconnect de-duplication is limited to a previously applied source
6
+ event for the same item.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections import OrderedDict
12
+
13
+ from ksadk.conversations.contracts import ConversationItem
14
+
15
+
16
+ class ConversationItemReducer:
17
+ """Apply append/replace/completed operations while preserving item identity."""
18
+
19
+ def __init__(self) -> None:
20
+ self._items: OrderedDict[str, ConversationItem] = OrderedDict()
21
+ self._source_events: set[tuple[str, str]] = set()
22
+
23
+ def apply(self, item: ConversationItem) -> bool:
24
+ """Apply one item operation and return whether this changed the view."""
25
+
26
+ keys = {(item.item_id, source_id) for source_id in item.source_event_ids}
27
+ if keys and keys.issubset(self._source_events):
28
+ return False
29
+
30
+ existing = self._items.get(item.item_id)
31
+ if existing is not None and _terminal(existing) and not _terminal(item):
32
+ # A reconnect may replay an older delta after the terminal snapshot
33
+ # has already arrived on the live connection. Remember its event
34
+ # identity, but never regress a completed item back to streaming or
35
+ # append the stale delta a second time.
36
+ self._source_events.update(keys)
37
+ return False
38
+ if existing is None:
39
+ merged = item
40
+ elif item.operation == "append":
41
+ merged = item.model_copy(
42
+ update={
43
+ "payload": _append_payload(existing.payload, item.payload),
44
+ "source_event_ids": _merge_sources(
45
+ existing.source_event_ids,
46
+ item.source_event_ids,
47
+ ),
48
+ }
49
+ )
50
+ else:
51
+ merged = item.model_copy(
52
+ update={
53
+ "source_event_ids": _merge_sources(
54
+ existing.source_event_ids,
55
+ item.source_event_ids,
56
+ )
57
+ }
58
+ )
59
+ self._items[item.item_id] = merged
60
+ self._source_events.update(keys)
61
+ return True
62
+
63
+ def items(self) -> tuple[ConversationItem, ...]:
64
+ """Return presentation items in first-seen order."""
65
+
66
+ return tuple(self._items.values())
67
+
68
+
69
+ def _append_payload(
70
+ existing: dict[str, object],
71
+ update: dict[str, object],
72
+ ) -> dict[str, object]:
73
+ merged = dict(existing)
74
+ for key, value in update.items():
75
+ previous = merged.get(key)
76
+ if key == "text" and isinstance(previous, str) and isinstance(value, str):
77
+ merged[key] = previous + value
78
+ elif key in {"data", "operations"} and isinstance(previous, list) and isinstance(
79
+ value, list
80
+ ):
81
+ merged[key] = [*previous, *value]
82
+ else:
83
+ merged[key] = value
84
+ return merged
85
+
86
+
87
+ def _merge_sources(
88
+ current: tuple[str, ...],
89
+ incoming: tuple[str, ...],
90
+ ) -> tuple[str, ...]:
91
+ return tuple(dict.fromkeys((*current, *incoming)))
92
+
93
+
94
+ def _terminal(item: ConversationItem) -> bool:
95
+ return item.lifecycle in {"completed", "failed"}
96
+
97
+
98
+ __all__ = ["ConversationItemReducer"]
@@ -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",
@@ -370,6 +370,8 @@ def _project_item_completed(
370
370
  if text_projection or event.item_kind in {"message", "reasoning"}:
371
371
  return text_projection
372
372
  if event.item_kind == "data":
373
+ if event.source.metadata.get("operation_batch") is True:
374
+ return ()
373
375
  ref = _a2ui_surface_ref(event, context)
374
376
  if ref is None:
375
377
  return ()
@@ -8,15 +8,19 @@ from typing import Any, Literal, NoReturn, cast
8
8
 
9
9
  from pydantic import JsonValue
10
10
 
11
- _CODEX_ERROR_INFO_VALUES = frozenset("""
11
+ _CODEX_ERROR_INFO_VALUES = frozenset(
12
+ """
12
13
  contextWindowExceeded sessionBudgetExceeded usageLimitExceeded serverOverloaded
13
14
  cyberPolicy internalServerError unauthorized badRequest threadRollbackFailed
14
15
  sandboxError other
15
- """.split())
16
- _CODEX_ERROR_INFO_VARIANTS = frozenset("""
16
+ """.split()
17
+ )
18
+ _CODEX_ERROR_INFO_VARIANTS = frozenset(
19
+ """
17
20
  httpConnectionFailed responseStreamConnectionFailed responseStreamDisconnected
18
21
  responseTooManyFailedAttempts activeTurnNotSteerable
19
- """.split())
22
+ """.split()
23
+ )
20
24
 
21
25
 
22
26
  class CodexMappingError(ValueError):
@@ -151,16 +155,23 @@ def _question_schema(
151
155
  )
152
156
  )
153
157
  option_details.append(_json_value(option))
158
+ multiple = bool(question.get("isMultiSelect", False))
159
+ allow_other = bool(question.get("isOther", False))
154
160
  property_schema: dict[str, JsonValue] = {
155
- "type": "string",
161
+ "type": "array" if multiple else "string",
156
162
  "title": header,
157
163
  "description": prompt,
158
164
  "x-codex-options": option_details,
159
165
  "x-codex-is-secret": is_secret,
160
166
  "x-codex-is-other": bool(question.get("isOther", False)),
161
167
  }
162
- if labels:
163
- property_schema["enum"] = cast(JsonValue, labels)
168
+ value_schema: dict[str, JsonValue] = {"type": "string", "minLength": 1}
169
+ if labels and not allow_other:
170
+ value_schema["enum"] = cast(JsonValue, labels)
171
+ if multiple:
172
+ property_schema.update({"items": value_schema, "minItems": 1, "uniqueItems": True})
173
+ else:
174
+ property_schema.update(value_schema)
164
175
  properties[question_id] = property_schema
165
176
  required.append(question_id)
166
177
  prompts.append(prompt)