agentengine-sdk-python 0.8.0__py3-none-any.whl → 0.8.2__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 (494) hide show
  1. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +43 -7
  2. agentengine_sdk_python-0.8.2.dist-info/RECORD +778 -0
  3. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +2 -0
  5. ksadk/a2a/_space_client_events.py +381 -0
  6. ksadk/a2a/bootstrap.py +0 -2
  7. ksadk/a2a/card.py +6 -111
  8. ksadk/a2a/control_plane.py +239 -1
  9. ksadk/a2a/event_adapter.py +156 -64
  10. ksadk/a2a/executor.py +195 -172
  11. ksadk/a2a/routes.py +12 -5
  12. ksadk/a2a/server.py +1 -8
  13. ksadk/a2a/service_env.py +33 -0
  14. ksadk/a2a/space_client.py +43 -349
  15. ksadk/a2a_card.py +101 -0
  16. ksadk/a2ui/core.py +222 -53
  17. ksadk/agui/_agent_helpers.py +243 -0
  18. ksadk/agui/a2ui_projection.py +12 -5
  19. ksadk/agui/agent.py +474 -275
  20. ksadk/agui/config.py +11 -5
  21. ksadk/agui/routes.py +7 -15
  22. ksadk/api/client.py +530 -40
  23. ksadk/api/environment.py +27 -0
  24. ksadk/builders/code_builder.py +352 -53
  25. ksadk/builders/container_builder.py +71 -44
  26. ksadk/builders/framework_requirements.py +2 -1
  27. ksadk/builders/ks3_uploader.py +2 -2
  28. ksadk/builders/managed_runtime_builder.py +60 -28
  29. ksadk/cli/__init__.py +25 -0
  30. ksadk/cli/cmd_a2a.py +18 -31
  31. ksadk/cli/cmd_create.py +13 -26
  32. ksadk/cli/cmd_dashboard.py +15 -1
  33. ksadk/cli/cmd_deploy.py +28 -3
  34. ksadk/cli/cmd_eval.py +443 -0
  35. ksadk/cli/cmd_evalset.py +284 -0
  36. ksadk/cli/cmd_files.py +5 -1
  37. ksadk/cli/cmd_hermes.py +137 -163
  38. ksadk/cli/cmd_invoke.py +28 -38
  39. ksadk/cli/cmd_launch.py +12 -0
  40. ksadk/cli/cmd_managed_runtime.py +95 -0
  41. ksadk/cli/cmd_observe.py +85 -0
  42. ksadk/cli/cmd_openclaw.py +85 -479
  43. ksadk/cli/cmd_replay.py +28 -4
  44. ksadk/cli/cmd_run.py +29 -67
  45. ksadk/cli/cmd_studio.py +201 -0
  46. ksadk/cli/cmd_web.py +15 -6
  47. ksadk/cli/dry_run.py +2 -1
  48. ksadk/cli/env_options.py +83 -0
  49. ksadk/cli/global_options.py +3 -1
  50. ksadk/cli/hermes_env.py +151 -0
  51. ksadk/cli/invoke_payload.py +49 -0
  52. ksadk/cli/network_options.py +7 -5
  53. ksadk/cli/openclaw_env.py +458 -0
  54. ksadk/cli/runtime_bootstrap.py +51 -0
  55. ksadk/cli/ui.py +6 -0
  56. ksadk/cli/workflow_common.py +5 -5
  57. ksadk/codex/__init__.py +3 -3
  58. ksadk/codex/client.py +833 -49
  59. ksadk/codex/phase.py +1 -1
  60. ksadk/codex/runtime.py +720 -127
  61. ksadk/common/kop_client.py +232 -0
  62. ksadk/configs/__init__.py +1 -3
  63. ksadk/configs/env_registry.py +244 -45
  64. ksadk/configs/env_registry_pcm.py +181 -0
  65. ksadk/configs/env_var_spec.py +18 -0
  66. ksadk/configs/global_config.py +6 -1
  67. ksadk/configs/settings.py +5 -108
  68. ksadk/context_engine/__init__.py +98 -0
  69. ksadk/context_engine/assembler.py +176 -0
  70. ksadk/context_engine/baseline.py +419 -0
  71. ksadk/context_engine/cache_observability.py +228 -0
  72. ksadk/context_engine/capabilities.py +443 -0
  73. ksadk/context_engine/contributors.py +344 -0
  74. ksadk/context_engine/hosted_pipeline.py +417 -0
  75. ksadk/context_engine/models.py +117 -0
  76. ksadk/context_engine/planner.py +698 -0
  77. ksadk/context_engine/policies.py +319 -0
  78. ksadk/context_engine/projection.py +31 -0
  79. ksadk/context_engine/shadow_plan.py +266 -0
  80. ksadk/context_engine/tokenizer.py +164 -0
  81. ksadk/conversations/__init__.py +85 -94
  82. ksadk/conversations/context.py +126 -6
  83. ksadk/conversations/message_projection.py +292 -28
  84. ksadk/conversations/model_context.py +49 -3
  85. ksadk/conversations/runtime_compaction.py +207 -5
  86. ksadk/conversations/runtime_input.py +193 -3
  87. ksadk/conversations/runtime_invocation.py +81 -3
  88. ksadk/conversations/runtime_observability.py +157 -4
  89. ksadk/conversations/runtime_payloads.py +42 -0
  90. ksadk/conversations/runtime_preparation.py +280 -2
  91. ksadk/conversations/runtime_resume.py +71 -32
  92. ksadk/conversations/runtime_stream_events.py +94 -9
  93. ksadk/conversations/runtime_streaming.py +175 -22
  94. ksadk/conversations/semantic_summary.py +311 -1
  95. ksadk/conversations/session_lock.py +51 -0
  96. ksadk/deployment/env_forward.py +72 -0
  97. ksadk/deployment/managed_runtime.py +38 -0
  98. ksadk/deployment/manager.py +24 -8
  99. ksadk/deployment/providers/serverless.py +228 -92
  100. ksadk/evaluation/__init__.py +116 -0
  101. ksadk/evaluation/a2a_adapter.py +452 -0
  102. ksadk/evaluation/adapters.py +67 -0
  103. ksadk/evaluation/agent_eval_client.py +395 -0
  104. ksadk/evaluation/cloud_binding.py +80 -0
  105. ksadk/evaluation/cloud_converter.py +194 -0
  106. ksadk/evaluation/cloud_service.py +199 -0
  107. ksadk/evaluation/contracts.py +478 -0
  108. ksadk/evaluation/evalset.py +351 -0
  109. ksadk/evaluation/evaluators.py +627 -0
  110. ksadk/evaluation/evidence.py +258 -0
  111. ksadk/evaluation/executor.py +143 -0
  112. ksadk/evaluation/local_adapter.py +550 -0
  113. ksadk/evaluation/service_env.py +27 -0
  114. ksadk/evaluation/storage.py +68 -0
  115. ksadk/evaluation/studio_build_adapter.py +253 -0
  116. ksadk/evaluation/target.py +82 -0
  117. ksadk/events/__init__.py +13 -13
  118. ksadk/events/_v1_compat/__init__.py +1 -0
  119. ksadk/events/_v1_compat/models.py +299 -0
  120. ksadk/events/_v1_compat/parser.py +247 -0
  121. ksadk/events/_v1_compat/projection.py +753 -0
  122. ksadk/events/adapters/__init__.py +34 -0
  123. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  124. ksadk/events/adapters/_a2a_support.py +275 -0
  125. ksadk/events/adapters/_codex_interactions.py +375 -0
  126. ksadk/events/adapters/_codex_items.py +801 -0
  127. ksadk/events/adapters/_codex_validators.py +311 -0
  128. ksadk/events/adapters/_langgraph_support.py +785 -0
  129. ksadk/events/adapters/a2a.py +841 -0
  130. ksadk/events/adapters/adk.py +503 -0
  131. ksadk/events/adapters/codex.py +717 -0
  132. ksadk/events/adapters/langgraph.py +745 -0
  133. ksadk/events/canonical.py +440 -0
  134. ksadk/events/canonical_replay.py +497 -0
  135. ksadk/events/canonical_store.py +468 -0
  136. ksadk/events/cold_recovery.py +257 -0
  137. ksadk/events/content.py +89 -0
  138. ksadk/events/identity.py +86 -0
  139. ksadk/events/pipeline.py +455 -0
  140. ksadk/events/projections.py +66 -0
  141. ksadk/events/reducer.py +661 -0
  142. ksadk/events/replay.py +3 -36
  143. ksadk/events/runtime_event.py +20 -256
  144. ksadk/events/session_event.py +324 -0
  145. ksadk/events/store.py +3 -316
  146. ksadk/events/v1_compat.py +41 -0
  147. ksadk/harness/__init__.py +3 -2
  148. ksadk/harness/app.py +114 -123
  149. ksadk/harness/config.py +1 -1
  150. ksadk/harness/runtime.py +467 -0
  151. ksadk/hermes_terminal.py +5 -0
  152. ksadk/identity/resolver.py +4 -3
  153. ksadk/interaction/__init__.py +28 -0
  154. ksadk/interaction/contracts.py +136 -0
  155. ksadk/interaction/ledger.py +189 -0
  156. ksadk/interaction/provider.py +122 -0
  157. ksadk/interaction/providers/__init__.py +52 -0
  158. ksadk/interaction/providers/adk.py +40 -0
  159. ksadk/interaction/providers/codex.py +94 -0
  160. ksadk/interaction/providers/langgraph.py +58 -0
  161. ksadk/kernel/__init__.py +117 -0
  162. ksadk/kernel/authorization.py +258 -0
  163. ksadk/kernel/bootstrap.py +1074 -0
  164. ksadk/kernel/contract_fingerprints.py +61 -0
  165. ksadk/kernel/contracts.py +362 -0
  166. ksadk/kernel/control.py +219 -0
  167. ksadk/kernel/errors.py +79 -0
  168. ksadk/kernel/ingress.py +1102 -0
  169. ksadk/kernel/mapping.py +111 -0
  170. ksadk/kernel/memory_store.py +1133 -0
  171. ksadk/kernel/postgres_store.py +1756 -0
  172. ksadk/kernel/recovery.py +452 -0
  173. ksadk/kernel/runtime_identity.py +103 -0
  174. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  175. ksadk/kernel/sqlite_store.py +1410 -0
  176. ksadk/kernel/state.py +145 -0
  177. ksadk/kernel/store.py +232 -0
  178. ksadk/kernel/worker.py +953 -0
  179. ksadk/knowledge_base/client.py +22 -4
  180. ksadk/knowledge_base/service.py +32 -5
  181. ksadk/managed_a2a_card.py +160 -0
  182. ksadk/managed_runtime.py +16 -9
  183. ksadk/memory/__init__.py +61 -0
  184. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  185. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  186. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  187. ksadk/memory/adk/backends/sdk_ltm_backend.py +394 -5
  188. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  189. ksadk/memory/adk/long_term_memory.py +3 -2
  190. ksadk/memory/coordinator.py +461 -0
  191. ksadk/memory/events.py +202 -0
  192. ksadk/memory/extraction.py +228 -0
  193. ksadk/memory/ltm_backend_factory.py +16 -3
  194. ksadk/memory/models.py +316 -0
  195. ksadk/memory/policy.py +215 -0
  196. ksadk/memory/provider.py +47 -0
  197. ksadk/memory/provider_adapter.py +159 -0
  198. ksadk/memory/provider_resolver.py +71 -0
  199. ksadk/memory/providers/__init__.py +5 -0
  200. ksadk/memory/providers/local_sqlite.py +490 -0
  201. ksadk/memory/resolved_policy.py +145 -0
  202. ksadk/memory/service.py +198 -8
  203. ksadk/memory/tool.py +4 -0
  204. ksadk/model_proxy/bootstrap.py +16 -9
  205. ksadk/model_proxy/config.py +22 -1
  206. ksadk/model_proxy/detect.py +202 -9
  207. ksadk/model_proxy/namespace.py +67 -15
  208. ksadk/model_proxy/server.py +168 -6
  209. ksadk/model_proxy/transform.py +105 -3
  210. ksadk/observability/__init__.py +25 -0
  211. ksadk/observability/session_log.py +420 -0
  212. ksadk/observability/trajectory.py +105 -0
  213. ksadk/prompts/__init__.py +71 -0
  214. ksadk/prompts/compiler.py +215 -0
  215. ksadk/prompts/models.py +82 -0
  216. ksadk/prompts/projection.py +89 -0
  217. ksadk/prompts/resolved.py +137 -0
  218. ksadk/prompts/sources.py +233 -0
  219. ksadk/runners/_langgraph_runner_streams.py +822 -0
  220. ksadk/runners/adk_runner.py +14 -31
  221. ksadk/runners/base_runner.py +44 -3
  222. ksadk/runners/factory.py +3 -3
  223. ksadk/runners/langgraph_runner.py +252 -433
  224. ksadk/runners/utils/__init__.py +0 -10
  225. ksadk/runners/utils/loader.py +16 -0
  226. ksadk/runtime/__init__.py +67 -41
  227. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  228. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  229. ksadk/runtime/adapter.py +199 -16
  230. ksadk/runtime/conversation_execution.py +687 -0
  231. ksadk/runtime/executor.py +392 -0
  232. ksadk/runtime/factory.py +342 -0
  233. ksadk/runtime/framework_adapters.py +6 -12
  234. ksadk/runtime/hosted_finalizer.py +268 -0
  235. ksadk/runtime/launch.py +61 -0
  236. ksadk/runtime/preprocessing.py +49 -14
  237. ksadk/runtime/runner_adapter.py +330 -391
  238. ksadk/runtime/runner_loading.py +36 -0
  239. ksadk/runtime/usage.py +33 -0
  240. ksadk/sandbox/backends/e2b.py +36 -3
  241. ksadk/server/__init__.py +39 -4
  242. ksadk/server/app.py +18 -492
  243. ksadk/server/composition.py +36 -2
  244. ksadk/server/factory.py +210 -149
  245. ksadk/server/routes/common.py +15 -46
  246. ksadk/server/routes/control.py +13 -9
  247. ksadk/server/routes/kernel_ingress.py +258 -0
  248. ksadk/server/routes/misc.py +10 -33
  249. ksadk/server/routes/models.py +14 -6
  250. ksadk/server/routes/openai_compat.py +129 -27
  251. ksadk/server/routes/projection.py +84 -16
  252. ksadk/server/routes/run.py +347 -460
  253. ksadk/server/routes/sessions.py +37 -40
  254. ksadk/server/routes/streaming.py +52 -7
  255. ksadk/server/routes/workspace.py +54 -21
  256. ksadk/server/static/assets/{ArtifactsPanel-Cjnqt-8W.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  257. ksadk/server/static/assets/{CodeBlock-BqyqZfuB.js → CodeBlock-DOH6MVcn.js} +4 -4
  258. ksadk/server/static/assets/{MathMessageMarkdown-BpH7jiFM.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  259. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  260. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  261. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  262. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  263. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  264. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  265. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  266. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  267. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  268. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  269. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  270. ksadk/server/static/assets/{chunk-FMBD7UC4-BGhvzDYt.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  271. ksadk/server/static/assets/{chunk-ND2GUHAM-D98vPd-E.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  272. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  273. ksadk/server/static/assets/{chunk-4BX2VUAB-CsWIQRhc.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  274. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  275. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  276. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  277. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  278. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  279. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  280. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  281. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-CX3yotHq.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  282. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  283. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  284. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  285. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  286. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  287. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  288. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  289. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  290. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  291. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  292. ksadk/server/static/assets/{dist-D82mtD2s.js → dist-8hqcx0sU.js} +1 -1
  293. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  294. ksadk/server/static/assets/{dist-DHn6nBzr.js → dist-BE7bu-DL.js} +1 -1
  295. ksadk/server/static/assets/{dist-eoW6tZXA.js → dist-BVDffZ0U.js} +1 -1
  296. ksadk/server/static/assets/{dist-C2xjE7cO.js → dist-BX8z72IC.js} +1 -1
  297. ksadk/server/static/assets/{dist-CgF3fj15.js → dist-Bf2M8m3N.js} +1 -1
  298. ksadk/server/static/assets/{dist-Bs-jQcRX.js → dist-BjU6y-A2.js} +1 -1
  299. ksadk/server/static/assets/{dist-Djgl2wVZ.js → dist-BytlxIDT.js} +1 -1
  300. ksadk/server/static/assets/{dist-CVQRZjPu.js → dist-CSh_DE14.js} +1 -1
  301. ksadk/server/static/assets/{dist-6CVKuTAe.js → dist-CXYYBw3_.js} +1 -1
  302. ksadk/server/static/assets/{dist-DlzCRy0S.js → dist-C_wsv-Qd.js} +1 -1
  303. ksadk/server/static/assets/{dist-DF06ORQo.js → dist-ClxGviKw.js} +1 -1
  304. ksadk/server/static/assets/{dist-Cf23NY4L.js → dist-CttYUqzS.js} +1 -1
  305. ksadk/server/static/assets/{dist-ivOya1LD.js → dist-DNp6rLRA.js} +1 -1
  306. ksadk/server/static/assets/{dist-BibcG1V9.js → dist-DUX-id_F.js} +1 -1
  307. ksadk/server/static/assets/{dist-BUHRxvDG.js → dist-DmldrHd_.js} +1 -1
  308. ksadk/server/static/assets/{dist-BZ9n9AjO.js → dist-DnfXs8Vn.js} +2 -2
  309. ksadk/server/static/assets/{dist-DqNnNFrw.js → dist-Dq9gLD7L.js} +1 -1
  310. ksadk/server/static/assets/{dist-CGcp2ex8.js → dist-W-TIVntx.js} +1 -1
  311. ksadk/server/static/assets/{dist-Cwt7koer.js → dist-dDdADKFA.js} +1 -1
  312. ksadk/server/static/assets/{dist-C7-3jInC.js → dist-dydu68Fl.js} +1 -1
  313. ksadk/server/static/assets/{dist-C99THtIA.js → dist-ngtN0DJB.js} +1 -1
  314. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  315. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  316. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  317. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  318. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  319. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  320. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  321. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  322. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  323. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  324. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  325. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-DLOHGvWw.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  326. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-BIzKeejT.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  327. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-BWHoFSw2.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  328. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  329. ksadk/server/static/assets/{linear-CvMBw9cA.js → linear-BHjG8b-J.js} +1 -1
  330. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  331. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-CSAQxEAe.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  332. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  333. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  334. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  335. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  336. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-CxIR4JXI.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  337. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  338. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  339. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  340. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  341. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  342. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  343. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  344. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-DpGa6EAV.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  345. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-NTKNGGe5.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  346. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  347. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  348. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  349. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  350. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  351. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-jqoYs3jQ.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  352. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  353. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  354. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  355. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  356. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  357. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  358. ksadk/server/static/index.html +2 -2
  359. ksadk/sessions/__init__.py +26 -9
  360. ksadk/sessions/_local_service_sync.py +688 -0
  361. ksadk/sessions/_local_tables.py +21 -0
  362. ksadk/sessions/_postgres_schema.py +305 -0
  363. ksadk/sessions/_postgres_tables.py +15 -0
  364. ksadk/sessions/base.py +80 -1
  365. ksadk/sessions/in_memory.py +53 -2
  366. ksadk/sessions/local_service.py +63 -604
  367. ksadk/sessions/postgres_service.py +58 -148
  368. ksadk/sessions/resilient.py +35 -1
  369. ksadk/skills/runtime/backends/e2b.py +1 -1
  370. ksadk/skills/service_client.py +13 -3
  371. ksadk/studio/__init__.py +5 -0
  372. ksadk/studio/agent_avatar_assets.py +120 -0
  373. ksadk/studio/agent_lifecycle.py +51 -0
  374. ksadk/studio/api.py +1598 -0
  375. ksadk/studio/api_catalog_routes.py +324 -0
  376. ksadk/studio/api_contracts.py +286 -0
  377. ksadk/studio/api_helpers.py +132 -0
  378. ksadk/studio/api_memory_routes.py +82 -0
  379. ksadk/studio/authoring.py +749 -0
  380. ksadk/studio/authoring_coordinator.py +1017 -0
  381. ksadk/studio/builder.py +397 -0
  382. ksadk/studio/capabilities.py +368 -0
  383. ksadk/studio/cloud.py +2099 -0
  384. ksadk/studio/codex_agent_service.py +694 -0
  385. ksadk/studio/codex_authoring.py +469 -0
  386. ksadk/studio/codex_builder.py +437 -0
  387. ksadk/studio/codex_manifest.py +307 -0
  388. ksadk/studio/codex_run.py +395 -0
  389. ksadk/studio/compiler.py +190 -0
  390. ksadk/studio/contracts.py +755 -0
  391. ksadk/studio/errors.py +47 -0
  392. ksadk/studio/event_store.py +214 -0
  393. ksadk/studio/framework_run.py +342 -0
  394. ksadk/studio/hosted_kernel.py +317 -0
  395. ksadk/studio/identifiers.py +33 -0
  396. ksadk/studio/manifest_resolver.py +131 -0
  397. ksadk/studio/mcp_runtime.py +229 -0
  398. ksadk/studio/model_client.py +629 -0
  399. ksadk/studio/model_profile_service.py +214 -0
  400. ksadk/studio/operations.py +275 -0
  401. ksadk/studio/otel_trace.py +1060 -0
  402. ksadk/studio/pagination.py +182 -0
  403. ksadk/studio/pcm_memory.py +85 -0
  404. ksadk/studio/python_tool_inspection.py +183 -0
  405. ksadk/studio/repository.py +327 -0
  406. ksadk/studio/resource_catalog.py +1260 -0
  407. ksadk/studio/run_service.py +1133 -0
  408. ksadk/studio/runtime_catalog.py +74 -0
  409. ksadk/studio/runtime_source.py +365 -0
  410. ksadk/studio/service.py +2249 -0
  411. ksadk/studio/shared_web.py +1004 -0
  412. ksadk/studio/skill_discovery.py +628 -0
  413. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  414. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  415. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  416. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  417. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  418. ksadk/studio/static/index.html +15 -0
  419. ksadk/studio/templates.py +722 -0
  420. ksadk/studio/validator.py +265 -0
  421. ksadk/studio/workspace.py +135 -0
  422. ksadk/tools/gateway.py +9 -0
  423. ksadk/toolsets/__init__.py +27 -1
  424. ksadk/toolsets/a2a.py +426 -0
  425. ksadk/tracing/__init__.py +19 -21
  426. ksadk/tracing/setup.py +317 -403
  427. ksadk/tracing/span_utils.py +0 -44
  428. ksadk/version.py +1 -1
  429. ksadk_runtime_common/memory_backend/registry.py +56 -56
  430. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  431. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  432. ksadk_runtime_common/workspace_files/router.py +8 -2
  433. agentengine_sdk_python-0.8.0.dist-info/RECORD +0 -578
  434. ksadk/a2a/card_builder.py +0 -64
  435. ksadk/a2a/client.py +0 -309
  436. ksadk/events/parser.py +0 -191
  437. ksadk/harness/runner.py +0 -211
  438. ksadk/runners/codex_runner.py +0 -132
  439. ksadk/runners/utils/langfuse.py +0 -230
  440. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  441. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +0 -303
  442. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +0 -1
  443. ksadk/server/static/assets/arc-CFKwSk_B.js +0 -1
  444. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +0 -1
  445. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-Dej8jX8c.js +0 -36
  446. ksadk/server/static/assets/blockDiagram-GPEHLZMM-1F64jqvy.js +0 -132
  447. ksadk/server/static/assets/c4Diagram-AAUBKEIU-9q7AUAKb.js +0 -10
  448. ksadk/server/static/assets/channel-iUGv2N24.js +0 -1
  449. ksadk/server/static/assets/chunk-2J33WTMH-6qgwJm7Q.js +0 -1
  450. ksadk/server/static/assets/chunk-55IACEB6-BK8paA20.js +0 -1
  451. ksadk/server/static/assets/chunk-727SXJPM-B-JEhy7h.js +0 -206
  452. ksadk/server/static/assets/chunk-AQP2D5EJ-DYBvMHAa.js +0 -231
  453. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +0 -1
  454. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +0 -1
  455. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +0 -1
  456. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  457. ksadk/server/static/assets/dagre-BM42HDAG-C7TguAWo.js +0 -4
  458. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  459. ksadk/server/static/assets/diagram-2AECGRRQ-Dd17_kws.js +0 -43
  460. ksadk/server/static/assets/diagram-5GNKFQAL-DVIClIil.js +0 -10
  461. ksadk/server/static/assets/diagram-KO2AKTUF-Df_3gYQa.js +0 -3
  462. ksadk/server/static/assets/diagram-LMA3HP47-BhLk6ZtA.js +0 -24
  463. ksadk/server/static/assets/diagram-OG6HWLK6-D4GNGvuu.js +0 -24
  464. ksadk/server/static/assets/dist-DyvYLMW9.js +0 -1
  465. ksadk/server/static/assets/erDiagram-TEJ5UH35-CnfRcY2M.js +0 -85
  466. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +0 -1
  467. ksadk/server/static/assets/flowDiagram-I6XJVG4X-DGaJjGNJ.js +0 -162
  468. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-DpCoB2g9.js +0 -292
  469. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +0 -1
  470. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-9IKVFBVT.js +0 -106
  471. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  472. ksadk/server/static/assets/index-QSwCHuB8.js +0 -177
  473. ksadk/server/static/assets/index-jOPmTOZH.css +0 -2
  474. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +0 -1
  475. ksadk/server/static/assets/infoDiagram-5YYISTIA-CYIIsb8y.js +0 -2
  476. ksadk/server/static/assets/katex-DATssjp1.js +0 -265
  477. ksadk/server/static/assets/mermaid-parser.core-mGAcEwcq.js +0 -161
  478. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +0 -1
  479. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +0 -1
  480. ksadk/server/static/assets/pieDiagram-4H26LBE5-By-ra07M.js +0 -30
  481. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +0 -1
  482. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DpW90iu3.js +0 -84
  483. ksadk/server/static/assets/stateDiagram-AJRCARHV-DGpd9yFG.js +0 -1
  484. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +0 -1
  485. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +0 -1
  486. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +0 -1
  487. ksadk/server/static/assets/vennDiagram-CIIHVFJN-l3Z7-wbP.js +0 -34
  488. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +0 -1
  489. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-BR54GPmr.js +0 -78
  490. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-SkiH8GsK.js +0 -7
  491. ksadk/tracing/exporters/langfuse_exporter.py +0 -460
  492. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  493. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  494. {agentengine_sdk_python-0.8.0.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -16,12 +16,10 @@ from fastapi.responses import FileResponse, Response
16
16
 
17
17
  from ksadk.conversations.attachments import compact_attachment_result_for_session
18
18
  from ksadk.conversations.model_context import normalize_model_metadata
19
- from ksadk.runners.base_runner import BaseRunner
20
19
  from ksadk.runtime_state import load_state as load_runtime_state
21
20
  from ksadk.server.factory import (
22
21
  RuntimeAppState,
23
22
  bind_runtime_state,
24
- get_runner,
25
23
  get_state,
26
24
  )
27
25
  from ksadk.server.terminal_sessions import (
@@ -102,11 +100,8 @@ _NATIVE_TUI_FRAMEWORKS = {"hermes", "openclaw"}
102
100
 
103
101
 
104
102
  def _current_framework() -> str:
105
- runner = get_state().runner
106
- if not runner:
107
- return ""
108
- detection_type = getattr(getattr(runner, "detection_result", None), "type", None)
109
- return str(getattr(detection_type, "value", detection_type) or "").strip().lower()
103
+ context = get_state().launch_context
104
+ return str(context.runtime_type if context is not None else "").strip().lower()
110
105
 
111
106
 
112
107
  def _build_native_terminal_capability(framework: str) -> dict[str, Any]:
@@ -145,32 +140,6 @@ def _register_integrated_routers(app: FastAPI, state: RuntimeAppState) -> None:
145
140
  )
146
141
 
147
142
 
148
- def set_runner(r: BaseRunner, *, loaded: bool = False):
149
- """Bind a runner and record whether its agent has already been loaded."""
150
- state = get_state()
151
- state.runner = r
152
- state.runner_loaded = loaded
153
- from ksadk.server.factory import wire_default_agui_for_runner
154
-
155
- wire_default_agui_for_runner(state, r)
156
-
157
-
158
- def _ensure_runner_loaded() -> BaseRunner:
159
- return get_runner()
160
-
161
-
162
- def _resolve_active_runner() -> BaseRunner:
163
- return get_runner()
164
-
165
-
166
- def _prepare_runner_for_model(active_runner: BaseRunner, model: Optional[str]) -> None:
167
- try:
168
- active_runner.prepare_for_request(model)
169
- except Exception as exc:
170
- logger.warning("Runner 模型切换失败: %s", exc)
171
- raise HTTPException(status_code=500, detail=str(exc) or "Runner 模型切换失败") from exc
172
-
173
-
174
143
  def _resolve_current_model() -> tuple[Optional[str], Optional[str]]:
175
144
  candidates = (
176
145
  ("OPENAI_MODEL_NAME", os.getenv("OPENAI_MODEL_NAME")),
@@ -194,11 +163,11 @@ def _build_bootstrap_model_payload() -> Optional[dict[str, Any]]:
194
163
  return payload
195
164
 
196
165
 
197
- def _runner_project_dir() -> Path:
198
- runner = get_state().runner
199
- if runner and getattr(runner, "project_dir", None):
166
+ def _runtime_project_dir() -> Path:
167
+ context = get_state().launch_context
168
+ if context is not None:
200
169
  try:
201
- return Path(str(runner.project_dir)).resolve()
170
+ return Path(str(context.project_dir)).resolve()
202
171
  except Exception:
203
172
  pass
204
173
  return Path(".").resolve()
@@ -223,7 +192,7 @@ def _ui_state_with_env_fallback(state: dict[str, Any]) -> dict[str, Any]:
223
192
 
224
193
 
225
194
  def _resolve_agent_ui_spec() -> dict[str, Any]:
226
- project_dir = _runner_project_dir()
195
+ project_dir = _runtime_project_dir()
227
196
  state = _ui_state_with_env_fallback(load_runtime_state(project_dir))
228
197
  framework = _current_framework()
229
198
  auto_custom_bundle_dir = _default_custom_ui_bundle_dir(project_dir)
@@ -696,18 +665,18 @@ async def _workspace_runtime_request(
696
665
 
697
666
  @health_meta_router.get("/health")
698
667
  async def health_check():
699
- runner = get_state().runner
700
- framework = "unknown"
701
- agent_name = "unknown"
702
- if runner and hasattr(runner, "detection_result"):
703
- framework = runner.detection_result.type.value # langgraph, langchain, adk
704
- agent_name = runner.detection_result.name
668
+ context = get_state().launch_context
669
+ framework = context.runtime_type if context is not None else "unknown"
670
+ detection = context.detection if context is not None else None
671
+ agent_name = str(getattr(detection, "name", "") or "unknown")
705
672
  return {"status": "ok", "framework": framework, "agent": agent_name}
706
673
 
707
674
 
708
675
  @health_meta_router.get("/list-apps")
709
676
  async def list_apps(relative_path: str = "./"):
710
677
  """Return available apps. For KsADK single-agent mode, returns the current agent."""
711
- runner = get_state().runner
712
- name = runner.detection_result.name if runner else "default_agent"
678
+ del relative_path
679
+ context = get_state().launch_context
680
+ detection = context.detection if context is not None else None
681
+ name = str(getattr(detection, "name", "") or "default_agent")
713
682
  return [name]
@@ -17,10 +17,14 @@ from ksadk.conversations.run_kinds import (
17
17
  RUN_MODE_FOREGROUND,
18
18
  RUN_TRIGGER_CHECKPOINT_RESUME,
19
19
  )
20
+ from ksadk.conversations.runtime_payloads import build_responses_payload
21
+ from ksadk.conversations.runtime_streaming import stream_runtime_responses_conversation_turn
22
+ from ksadk.runtime.conversation_execution import invoke_runtime_conversation_once
23
+ from ksadk.server.factory import get_runtime_execution
20
24
 
21
25
  from . import dependencies as deps
22
26
  from .checkpoint_resolution import _find_session_checkpoint
23
- from .common import _action_response, _prepare_runner_for_model, _resolve_active_runner
27
+ from .common import _action_response
24
28
  from .models import (
25
29
  _MAX_PREVIEW_TOOL_RECEIPTS,
26
30
  _RUN_TERMINAL_STATUSES,
@@ -108,6 +112,7 @@ async def get_checkpoint_resume_preview_action(request: GetCheckpointResumePrevi
108
112
 
109
113
  @control_router.post("/agentengine/api/v1/ResumeRun")
110
114
  async def resume_run_action(request: ResumeRunActionRequest):
115
+ executor, launch_context = get_runtime_execution()
111
116
  service = deps.resolve_session_service()
112
117
  session = await _require_action_session(
113
118
  service,
@@ -174,7 +179,6 @@ async def resume_run_action(request: ResumeRunActionRequest):
174
179
  "resume_instruction_enabled": bool(getattr(request, "ResumeInstructionEnabled", False)),
175
180
  "resume_instruction": str(getattr(request, "ResumeInstruction", "") or "").strip(),
176
181
  }
177
- active_runner = _resolve_active_runner()
178
182
  user_id = session.user_id or "user"
179
183
  custom_metadata, _metadata_runtime_controls = _split_custom_metadata(request.Metadata)
180
184
  resume_request_metadata = {
@@ -201,8 +205,9 @@ async def resume_run_action(request: ResumeRunActionRequest):
201
205
  run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
202
206
  )
203
207
  return deps.detached_streaming_response(
204
- deps.conversation().stream_responses_conversation_turn(
205
- runner=active_runner,
208
+ stream_runtime_responses_conversation_turn(
209
+ executor=executor,
210
+ launch_context=launch_context,
206
211
  agent_id=request.AgentId,
207
212
  user_id=user_id,
208
213
  messages=[],
@@ -215,7 +220,6 @@ async def resume_run_action(request: ResumeRunActionRequest):
215
220
  include_agentengine_metadata=True,
216
221
  resume_input=resume_input,
217
222
  invocation_id=resume_invocation_id,
218
- prepare_runner=_prepare_runner_for_model,
219
223
  session_service_provider=deps.resolve_session_service,
220
224
  run_mode=RUN_MODE_BACKGROUND,
221
225
  ),
@@ -226,8 +230,9 @@ async def resume_run_action(request: ResumeRunActionRequest):
226
230
  )
227
231
 
228
232
  response_id = f"resp_{uuid.uuid4().hex}"
229
- resolved_session_id, result = await deps.conversation().invoke_conversation_once(
230
- runner=active_runner,
233
+ resolved_session_id, result = await invoke_runtime_conversation_once(
234
+ executor=executor,
235
+ launch_context=launch_context,
231
236
  agent_id=request.AgentId,
232
237
  user_id=user_id,
233
238
  messages=[],
@@ -240,11 +245,10 @@ async def resume_run_action(request: ResumeRunActionRequest):
240
245
  resume_input=resume_input,
241
246
  response_id=response_id,
242
247
  invocation_id=str(resume_input["resume_attempt_id"]),
243
- prepare_runner=_prepare_runner_for_model,
244
248
  session_service_provider=deps.resolve_session_service,
245
249
  run_mode=RUN_MODE_FOREGROUND,
246
250
  )
247
- payload = deps.conversation().build_responses_payload(
251
+ payload = build_responses_payload(
248
252
  output_text=result["output_text"],
249
253
  model=request.Model,
250
254
  session_id=resolved_session_id,
@@ -0,0 +1,258 @@
1
+ # -*- coding: utf-8 -*-
2
+ """RunAgent / Responses 入口的 kernel 路径(Phase 1 Task 8 Step 3-5)。
3
+
4
+ 只在 ``kernel_route_active()`` 时启用(灰度 opt-in);旧 HTTP 行为保持兼容:
5
+ - accepted -> 202、duplicate -> 200、rejected -> 400、unsupported -> 409、
6
+ queue_full -> 429、persistence_uncertain -> 503(RECEIPT_HTTP_STATUS)。
7
+ - 旧响应 shape 不变;非流式在 receipt accepted 后才开始消费 stream。
8
+ - SSE 的 reconnect cursor 源自同一 Session seq(SessionEventSubscription)。
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+ import logging
15
+ from typing import Any
16
+
17
+ from fastapi.responses import JSONResponse, StreamingResponse
18
+
19
+ from ksadk.kernel import ingress
20
+ from ksadk.kernel.contracts import AgentControlReceipt
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ def _envelope_text(payload: dict[str, Any]) -> str:
26
+ return str(payload.get("delta") or payload.get("text") or "")
27
+
28
+
29
+ async def _kernel_submit(
30
+ *,
31
+ mapper: str,
32
+ session_id: str,
33
+ idempotency_key: str,
34
+ content: Any,
35
+ correlation_ref: str | None,
36
+ source_kind: str,
37
+ runtime_options: dict[str, Any] | None = None,
38
+ ) -> tuple[AgentControlReceipt, ingress.TrustedRuntimeContext]:
39
+ trusted = ingress.trusted_context(
40
+ source_kind=source_kind,
41
+ source_ref=idempotency_key,
42
+ session_id=session_id,
43
+ # A foreground compatibility request admits a mutation and then reads
44
+ # the same session's canonical stream. It remains session-bound, but
45
+ # needs explicit authority for both operations.
46
+ operations=("enqueue", "subscribe_events"),
47
+ )
48
+ correlation_kwarg = {
49
+ "map_run_request": "invocation_id",
50
+ "map_responses_request": "response_id",
51
+ "map_agui_request": "run_id",
52
+ "map_a2a_task": "task_id",
53
+ "map_studio_request": "run_id",
54
+ }[mapper]
55
+ command = getattr(ingress, mapper)(
56
+ trusted=trusted,
57
+ session_id=session_id,
58
+ idempotency_key=idempotency_key,
59
+ content=content,
60
+ **({correlation_kwarg: correlation_ref} if correlation_ref else {}),
61
+ **({"runtime_options": runtime_options} if runtime_options else {}),
62
+ )
63
+ receipt = await ingress.submit_command(command, permit=trusted.permit)
64
+ return receipt, trusted
65
+
66
+
67
+ def _kernel_error_response(receipt: AgentControlReceipt) -> JSONResponse:
68
+ return JSONResponse(
69
+ status_code=ingress.receipt_http_status(receipt),
70
+ content={
71
+ "error": ingress.receipt_error_payload(receipt),
72
+ },
73
+ headers=ingress.receipt_response_headers(receipt),
74
+ )
75
+
76
+
77
+ def _sse_chunk(payload: dict[str, Any], *, event: str | None, seq: int) -> str:
78
+ prefix = f"event: {event}\n" if event else ""
79
+ return f"id: {seq}\n{prefix}data: {json.dumps(payload, ensure_ascii=False)}\n\n"
80
+
81
+
82
+ def kernel_stream_response(
83
+ *,
84
+ receipt: AgentControlReceipt,
85
+ trusted: ingress.TrustedRuntimeContext,
86
+ session_id: str,
87
+ ) -> StreamingResponse:
88
+ """统一 cursor:从 receipt.accepted_seq 之后读 Session 事件。"""
89
+
90
+ after_seq = int(receipt.accepted_seq or 0)
91
+
92
+ async def generator():
93
+ async for seq, projected in ingress.subscribe_projected(
94
+ session_id,
95
+ trusted=trusted,
96
+ after_seq=after_seq,
97
+ projector=_new_responses_projector(),
98
+ ):
99
+ if projected is None:
100
+ continue
101
+ kind, payload = projected
102
+ yield _sse_chunk(payload, event=kind, seq=seq)
103
+ if kind == "response.output_item.done" and (
104
+ (payload.get("item") or {}).get("type") == "mcp_approval_request"
105
+ ):
106
+ yield _sse_chunk(
107
+ {"type": "response.incomplete"},
108
+ event="response.incomplete",
109
+ seq=seq,
110
+ )
111
+ return
112
+ # A foreground response stream is scoped to one admitted run.
113
+ # SessionEventStore subscriptions are deliberately long-lived for
114
+ # replay/SSE clients, so do not leave this HTTP response open after
115
+ # the terminal fact has been projected.
116
+ if kind in {"response.completed", "response.failed", "response.canceled"}:
117
+ return
118
+
119
+ return StreamingResponse(generator(), media_type="text/event-stream")
120
+
121
+
122
+ def _responses_projector(envelope: Any) -> tuple[str, dict[str, Any]] | None:
123
+ """Session envelope -> 旧 Responses SSE shape(cursor 仍用 envelope.seq)。"""
124
+
125
+ payload = envelope.payload or {}
126
+ event_type = envelope.event_type
127
+ if event_type == "interaction.requested":
128
+ request = payload.get("request") or {}
129
+ presentation = request.get("presentation") or {}
130
+ description = presentation.get("description") or ""
131
+ try:
132
+ visible = json.loads(description) if description else {}
133
+ except (TypeError, json.JSONDecodeError):
134
+ visible = {}
135
+ arguments = visible.get("arguments") if isinstance(visible, dict) else {}
136
+ return "response.output_item.done", {
137
+ "type": "response.output_item.done",
138
+ "item": {
139
+ "id": str(payload.get("interaction_id") or ""),
140
+ "type": "mcp_approval_request",
141
+ "name": str(presentation.get("title") or payload.get("kind") or "approval"),
142
+ "arguments": json.dumps(arguments or {}, ensure_ascii=False),
143
+ },
144
+ }
145
+ if event_type == "run.completed":
146
+ text = str(payload.get("output_text") or "")
147
+ return "response.completed", {
148
+ "type": "response.completed",
149
+ "output_text": text,
150
+ "delta": text,
151
+ }
152
+ if event_type == "run.failed":
153
+ return "response.failed", {
154
+ "type": "response.failed",
155
+ "error": payload.get("error") or {"code": "runtime_failed"},
156
+ }
157
+ if event_type in {"run.canceled", "run.interrupted"}:
158
+ return "response.canceled", {
159
+ "type": "response.canceled",
160
+ "reason": payload.get("reason") or event_type,
161
+ }
162
+ text = _envelope_text(payload)
163
+ if text:
164
+ return "response.output_text.delta", {
165
+ "type": "response.output_text.delta",
166
+ "delta": text,
167
+ }
168
+ return None
169
+
170
+
171
+ def _new_responses_projector():
172
+ """Create a session-scoped canonical RuntimeEvent -> Responses projector.
173
+
174
+ ``run.completed.output_refs`` deliberately point at canonical items instead
175
+ of duplicating answer text. A projector therefore keeps only the small
176
+ item snapshot needed for this one HTTP/SSE response and resolves those
177
+ refs when the terminal fact arrives.
178
+ """
179
+
180
+ item_text: dict[str, str] = {}
181
+
182
+ def project(envelope: Any) -> tuple[str, dict[str, Any]] | None:
183
+ payload = envelope.payload or {}
184
+ event_type = envelope.event_type
185
+ if event_type == "item.updated":
186
+ item_id = str(payload.get("item_id") or "")
187
+ update = payload.get("update") or {}
188
+ text = str(update.get("text") or "")
189
+ if item_id and text:
190
+ item_text[item_id] = (
191
+ text if payload.get("op") == "replace" else item_text.get(item_id, "") + text
192
+ )
193
+ return None
194
+ if event_type == "item.completed":
195
+ item_id = str(payload.get("item_id") or "")
196
+ parts = (payload.get("snapshot") or {}).get("parts") or []
197
+ if item_id and isinstance(parts, list):
198
+ item_text[item_id] = "".join(
199
+ str(part.get("text") or "") for part in parts if isinstance(part, dict)
200
+ )
201
+ return None
202
+ if event_type == "run.completed":
203
+ refs = payload.get("output_refs") or []
204
+ output = "".join(
205
+ item_text.get(str(ref.get("item_id") or ""), "")
206
+ for ref in refs
207
+ if isinstance(ref, dict)
208
+ )
209
+ projected_payload = dict(payload)
210
+ projected_payload["output_text"] = output or str(payload.get("output_text") or "")
211
+ return _responses_projector(
212
+ type("Envelope", (), {"event_type": event_type, "payload": projected_payload})()
213
+ )
214
+ return _responses_projector(envelope)
215
+
216
+ return project
217
+
218
+
219
+ async def kernel_conversation_turn(
220
+ *,
221
+ receipt: AgentControlReceipt,
222
+ trusted: ingress.TrustedRuntimeContext,
223
+ session_id: str,
224
+ build_payload,
225
+ ):
226
+ """非流式 kernel 路径:receipt accepted 后订阅聚合 output_text。"""
227
+
228
+ if receipt.status not in ("accepted", "duplicate"):
229
+ return _kernel_error_response(receipt)
230
+ output_text = ""
231
+ async for _seq, projected in ingress.subscribe_projected(
232
+ session_id,
233
+ trusted=trusted,
234
+ after_seq=int(receipt.accepted_seq or 0),
235
+ projector=_new_responses_projector(),
236
+ ):
237
+ if projected and projected[0] == "response.completed":
238
+ output_text = str(projected[1].get("output_text") or output_text)
239
+ break
240
+ if projected and projected[0] in {"response.failed", "response.canceled"}:
241
+ return JSONResponse(
242
+ status_code=502,
243
+ content={"error": projected[1]},
244
+ )
245
+ elif projected:
246
+ output_text += str(projected[1].get("delta") or "")
247
+ payload = build_payload(output_text)
248
+ return JSONResponse(
249
+ status_code=ingress.receipt_http_status(receipt),
250
+ content=payload,
251
+ headers=ingress.receipt_response_headers(receipt),
252
+ )
253
+
254
+
255
+ __all__ = [
256
+ "kernel_conversation_turn",
257
+ "kernel_stream_response",
258
+ ]
@@ -16,7 +16,6 @@ from ksadk.tracing import get_memory_exporter
16
16
  from . import dependencies as deps
17
17
  from .common import (
18
18
  _action_response,
19
- _ensure_runner_loaded,
20
19
  _ensure_session,
21
20
  _hydrate_session,
22
21
  _resolve_ui_static_response,
@@ -393,40 +392,18 @@ async def delete_session(app_name: str, user_id: str, session_id: str):
393
392
  "/apps/{app_name}/users/{user_id}/sessions/{session_id}/save_memory"
394
393
  )
395
394
  async def save_session_to_memory(app_name: str, user_id: str, session_id: str):
396
- """将指定 session 保存到长期记忆
397
-
398
- 当配置了 KSADK_LTM_BACKEND 时,将 session 中的用户消息
399
- 持久化到长期记忆后端,供后续 session 通过 load_memory 工具检索。
400
- """
401
- active_runner = _ensure_runner_loaded()
402
-
403
- # 检查 runner 是否支持长期记忆
404
- from ksadk.runners.adk_runner import ADKRunner as _ADKRunner
405
-
406
- if not isinstance(active_runner, _ADKRunner):
407
- raise HTTPException(
408
- status_code=400, detail="Long-term memory is only supported with ADK runner"
409
- )
410
-
411
- if not active_runner._long_term_memory:
412
- raise HTTPException(
413
- status_code=400,
414
- detail="Long-term memory not configured. Set KSADK_LTM_BACKEND environment variable.",
415
- )
416
-
417
- # 查找 ADK 内部 session ID
418
- internal_session_id = active_runner._session_map.get(session_id, session_id)
419
-
420
- success = await active_runner.save_session_to_long_term_memory(
421
- session_id=internal_session_id,
422
- user_id=user_id,
395
+ """Fail closed until long-term memory is exposed as a Runtime capability."""
396
+
397
+ del app_name, user_id, session_id
398
+ raise HTTPException(
399
+ status_code=501,
400
+ detail={
401
+ "code": "RUNTIME_NOT_SUPPORTED",
402
+ "message": "当前 RuntimeAdapter 未声明长期记忆写入能力",
403
+ "hint": "请通过 Runtime Catalog 检查长期记忆能力后重试",
404
+ },
423
405
  )
424
406
 
425
- if success:
426
- return {"status": "saved", "session_id": session_id}
427
- else:
428
- raise HTTPException(status_code=500, detail="Failed to save session to long-term memory")
429
-
430
407
 
431
408
  @sessions_adk_compat_router.get(
432
409
  "/apps/{app_name}/users/{user_id}/sessions/{session_id}/events/{event_id}/graph"
@@ -11,7 +11,7 @@ from pydantic import BaseModel, Field, field_validator
11
11
 
12
12
  from ksadk.conversations.run_kinds import RUN_MODE_UNKNOWN, RUN_TRIGGER_UNKNOWN
13
13
  from ksadk.conversations.run_status import RUN_STATUS_ACTIVE, RUN_STATUS_TERMINAL
14
- from ksadk.runners.base_runner import BaseRunner
14
+ from ksadk.runtime.launch import RuntimeLaunchContext
15
15
  from ksadk.sessions import SessionEvent
16
16
 
17
17
  _RUN_TERMINAL_STATUSES = RUN_STATUS_TERMINAL
@@ -258,11 +258,11 @@ def _resolve_responses_session_and_user(request: ResponsesRequest) -> tuple[str
258
258
  return resolved_session_id, resolved_user_id
259
259
 
260
260
 
261
- def _runtime_agent_id(active_runner: BaseRunner) -> str:
261
+ def _runtime_agent_id(launch_context: RuntimeLaunchContext) -> str:
262
262
  runtime_id = _clean_optional_string(os.getenv("AGENT_RUNTIME_ID"))
263
263
  if runtime_id:
264
264
  return runtime_id
265
- return str(getattr(active_runner.detection_result, "name", "") or "agent")
265
+ return str(getattr(launch_context.detection, "name", "") or "agent")
266
266
 
267
267
 
268
268
  def _metadata_invocation_id(metadata: Mapping[str, Any] | None) -> str | None:
@@ -425,9 +425,17 @@ def _latest_session_run_metadata(
425
425
  if not _is_run_lifecycle_event(event) or _event_run_id(event) != invocation_id:
426
426
  continue
427
427
  metadata = event.metadata or {}
428
- run_mode = str(metadata.get("run_mode") or RUN_MODE_UNKNOWN)
429
- run_trigger = str(metadata.get("run_trigger") or RUN_TRIGGER_UNKNOWN)
430
- break
428
+ candidate_mode = str(metadata.get("run_mode") or RUN_MODE_UNKNOWN)
429
+ candidate_trigger = str(metadata.get("run_trigger") or RUN_TRIGGER_UNKNOWN)
430
+ # Canonical RuntimeEvents and their legacy ``run_status`` projection
431
+ # coexist in the session log. RuntimeEvents intentionally carry only
432
+ # the transport-neutral marker, while the projection owns run kind
433
+ # metadata. Keep scanning past an unclassified RuntimeEvent so the UI
434
+ # does not downgrade a known background/foreground run to ``unknown``.
435
+ if candidate_mode != RUN_MODE_UNKNOWN or candidate_trigger != RUN_TRIGGER_UNKNOWN:
436
+ run_mode = candidate_mode
437
+ run_trigger = candidate_trigger
438
+ break
431
439
  return invocation_id, status, run_mode, run_trigger
432
440
 
433
441