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
@@ -0,0 +1,687 @@
1
+ """Conversation preparation and persistence around the canonical RuntimeExecutor."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import time
7
+ from collections.abc import AsyncIterator, Callable, Mapping, Sequence
8
+ from dataclasses import asdict
9
+ from typing import Any
10
+
11
+ from ksadk.conversations.run_kinds import RUN_MODE_FOREGROUND
12
+ from ksadk.conversations.runtime_compaction import preview_auto_compaction
13
+ from ksadk.conversations.runtime_metadata import (
14
+ _update_session_metadata_after_assistant_turn,
15
+ )
16
+ from ksadk.conversations.runtime_persistence import append_run_status_event
17
+ from ksadk.conversations.runtime_preparation import build_run_input
18
+ from ksadk.events.canonical import (
19
+ ContextCompactionCompleted,
20
+ ContextCompactionStarted,
21
+ ContinuationCreated,
22
+ ContinuationResumed,
23
+ InteractionRequested,
24
+ ItemCompleted,
25
+ ItemStarted,
26
+ ItemUpdated,
27
+ RunCanceled,
28
+ RunCompleted,
29
+ RunFailed,
30
+ RunInterrupted,
31
+ RunStarted,
32
+ RuntimeEvent,
33
+ SourceRef,
34
+ UsageReported,
35
+ )
36
+ from ksadk.events.content import TextContent, ToolCallContent, ToolResultContent
37
+ from ksadk.events.pipeline import CanonicalEventPipeline
38
+ from ksadk.events.reducer import RunProjection, StreamReducer
39
+ from ksadk.events.store import RuntimeEventStore
40
+ from ksadk.runtime.adapter import (
41
+ CONVERSATION_PREPROCESSING_METADATA_KEY,
42
+ RESUME_START_REQUEST_NATIVE_KEY,
43
+ ResumePayload,
44
+ ResumeTarget,
45
+ RunHandle,
46
+ StartRequest,
47
+ )
48
+ from ksadk.runtime.executor import RuntimeExecutor, RuntimeStartPreparation
49
+ from ksadk.runtime.factory import apply_runtime_start_request_defaults
50
+ from ksadk.runtime.launch import RuntimeLaunchContext
51
+ from ksadk.sessions import resolve_session_service
52
+
53
+ _TERMINAL_EVENTS = frozenset(
54
+ {
55
+ "run.completed",
56
+ "run.failed",
57
+ "run.canceled",
58
+ }
59
+ )
60
+
61
+ _RUN_STATUS_BY_EVENT = {
62
+ "run.started": "in_progress",
63
+ "run.interrupted": "interrupted",
64
+ "run.completed": "completed",
65
+ "run.failed": "failed",
66
+ "run.canceled": "cancelled",
67
+ }
68
+
69
+
70
+ async def iter_runtime_conversation_events(
71
+ *,
72
+ executor: RuntimeExecutor,
73
+ launch_context: RuntimeLaunchContext,
74
+ agent_id: str,
75
+ user_id: str,
76
+ messages: Sequence[dict[str, Any]],
77
+ session_id: str | None,
78
+ model: str | None,
79
+ model_metadata: Mapping[str, Any] | None = None,
80
+ model_options: Mapping[str, Any] | None = None,
81
+ state_delta: dict[str, Any] | None = None,
82
+ instructions: str | None = None,
83
+ request_metadata: Mapping[str, Any] | None = None,
84
+ custom_metadata: Mapping[str, Any] | None = None,
85
+ resume_input: Mapping[str, Any] | None = None,
86
+ response_id: str | None = None,
87
+ account_id: str | None = None,
88
+ invocation_id: str | None = None,
89
+ session_service_provider: Callable[[], Any] | None = None,
90
+ run_mode: str = RUN_MODE_FOREGROUND,
91
+ runtime_preparation: RuntimeStartPreparation | None = None,
92
+ _execution_context: dict[str, str] | None = None,
93
+ ) -> AsyncIterator[RuntimeEvent]:
94
+ """Prepare once, execute through RuntimeExecutor, and persist RuntimeEvents."""
95
+
96
+ turn_started_monotonic = time.monotonic()
97
+ provider = session_service_provider or resolve_session_service
98
+ compaction_preview = await preview_auto_compaction(
99
+ agent_id=agent_id,
100
+ user_id=user_id,
101
+ session_id=session_id,
102
+ messages=messages,
103
+ model=model,
104
+ model_metadata=model_metadata,
105
+ session_service_provider=provider,
106
+ )
107
+ prepared = await build_run_input(
108
+ agent_id=agent_id,
109
+ user_id=user_id,
110
+ session_id=session_id,
111
+ messages=messages,
112
+ model=model,
113
+ model_metadata=model_metadata,
114
+ model_options=model_options,
115
+ state_delta=state_delta,
116
+ instructions=instructions,
117
+ request_metadata=request_metadata,
118
+ custom_metadata=custom_metadata,
119
+ resume_input=resume_input,
120
+ invocation_id=invocation_id,
121
+ session_service_provider=provider,
122
+ run_mode=run_mode,
123
+ runtime_type=launch_context.runtime_type,
124
+ )
125
+ if _execution_context is not None:
126
+ _execution_context["session_id"] = prepared.session_id
127
+ canonical_messages = prepared.responses_history or [dict(item) for item in messages]
128
+ conversation_request = {
129
+ "messages": canonical_messages,
130
+ "model_metadata": prepared.model_metadata,
131
+ "model_options": prepared.model_options,
132
+ "state_delta": dict(state_delta or {}),
133
+ "instructions": prepared.instructions,
134
+ "request_metadata": prepared.request_metadata,
135
+ "custom_metadata": dict(custom_metadata or {}),
136
+ "account_id": account_id,
137
+ "response_id": response_id,
138
+ "prepared_turn": asdict(prepared),
139
+ }
140
+ native_session_metadata = await _session_native_metadata(
141
+ runtime_type=launch_context.runtime_type,
142
+ session_id=prepared.session_id,
143
+ session_service_provider=provider,
144
+ )
145
+ request = apply_runtime_start_request_defaults(
146
+ launch_context,
147
+ StartRequest(
148
+ input=prepared.user_input,
149
+ user_id=user_id,
150
+ session_id=prepared.session_id,
151
+ agent_id=agent_id,
152
+ model=model,
153
+ metadata={
154
+ "invocation_id": prepared.invocation_id,
155
+ CONVERSATION_PREPROCESSING_METADATA_KEY: conversation_request,
156
+ **native_session_metadata,
157
+ },
158
+ ),
159
+ )
160
+ checkpoint_resume = _checkpoint_resume_input(prepared.resume_input)
161
+ if checkpoint_resume is None:
162
+ handle = await executor.start(
163
+ launch_context,
164
+ request,
165
+ preparation=runtime_preparation,
166
+ )
167
+ else:
168
+ handle = await _resume_runtime_handle(
169
+ executor=executor,
170
+ launch_context=launch_context,
171
+ session_id=prepared.session_id,
172
+ resume_input=checkpoint_resume,
173
+ request=request,
174
+ )
175
+ request = request.model_copy(
176
+ update={
177
+ "metadata": {
178
+ **request.metadata,
179
+ "invocation_id": handle.run_id,
180
+ }
181
+ }
182
+ )
183
+ store = RuntimeEventStore(provider())
184
+ pipeline = CanonicalEventPipeline(store, session_id=prepared.session_id)
185
+ terminal = False
186
+ interrupted = False
187
+ completed_assistant_text = ""
188
+ usage: dict[str, int] | None = None
189
+ try:
190
+ for context_event in _compaction_runtime_events(
191
+ prepared=prepared,
192
+ preview=compaction_preview,
193
+ ):
194
+ for persisted in await pipeline.ingest(context_event):
195
+ yield persisted
196
+ async for event in executor.stream(handle):
197
+ _validate_event_scope(event, request)
198
+ for persisted in await pipeline.ingest(event):
199
+ await _project_runtime_run_status(
200
+ persisted,
201
+ session_id=prepared.session_id,
202
+ author=agent_id,
203
+ run_mode=prepared.run_mode,
204
+ run_trigger=prepared.run_trigger,
205
+ session_service_provider=provider,
206
+ )
207
+ terminal = persisted.event_type in _TERMINAL_EVENTS
208
+ interrupted = persisted.event_type == "run.interrupted"
209
+ if isinstance(persisted, RunCompleted):
210
+ completed_assistant_text = _selected_output_text(
211
+ pipeline.reducer.snapshot(), persisted
212
+ )
213
+ elif isinstance(persisted, UsageReported):
214
+ usage = {
215
+ "input_tokens": persisted.input_tokens,
216
+ "output_tokens": persisted.output_tokens,
217
+ "total_tokens": persisted.total_tokens,
218
+ "cached_tokens": persisted.cached_tokens,
219
+ "reasoning_tokens": persisted.reasoning_tokens,
220
+ }
221
+ yield persisted
222
+ if not terminal and not interrupted:
223
+ raise RuntimeError("runtime stream ended without a terminal or interrupted event")
224
+ except asyncio.CancelledError:
225
+ cancel_result = await executor.cancel(handle)
226
+ cancelled_event = RunCanceled(
227
+ schema_version=2,
228
+ event_id=f"cancel:{handle.run_id}:{cancel_result.value}",
229
+ seq=0,
230
+ timestamp=time.time(),
231
+ run_id=handle.run_id,
232
+ scope_id=handle.run_id,
233
+ source=SourceRef(
234
+ framework="ksadk", metadata={"cancel_result": cancel_result.value}
235
+ ),
236
+ status="canceled",
237
+ reason=cancel_result.value,
238
+ )
239
+ persisted_cancelled = (await pipeline.ingest(cancelled_event))[-1]
240
+ await _project_runtime_run_status(
241
+ persisted_cancelled,
242
+ session_id=prepared.session_id,
243
+ author=agent_id,
244
+ run_mode=prepared.run_mode,
245
+ run_trigger=prepared.run_trigger,
246
+ session_service_provider=provider,
247
+ )
248
+ await executor.close(handle)
249
+ raise
250
+ except BaseException:
251
+ if not interrupted:
252
+ await executor.close(handle)
253
+ raise
254
+ else:
255
+ if terminal and completed_assistant_text:
256
+ await _update_session_metadata_after_assistant_turn(
257
+ service=provider(),
258
+ session_id=prepared.session_id,
259
+ assistant_text=completed_assistant_text,
260
+ model=model,
261
+ )
262
+ if terminal:
263
+ _record_canonical_baseline_turn(
264
+ prepared=prepared,
265
+ model=model,
266
+ usage=usage,
267
+ turn_started_monotonic=turn_started_monotonic,
268
+ )
269
+ if terminal:
270
+ await executor.close(handle)
271
+
272
+
273
+ async def _session_native_metadata(
274
+ *,
275
+ runtime_type: str,
276
+ session_id: str,
277
+ session_service_provider: Callable[[], Any],
278
+ ) -> dict[str, str]:
279
+ """Resolve a provider-native continuation from the canonical Session log.
280
+
281
+ The HTTP conversation path creates a fresh adapter transport for every
282
+ terminal turn. Codex therefore needs the prior native thread id on the
283
+ next ``StartRequest``; otherwise one AgentEngine Session becomes unrelated
284
+ one-turn Codex threads.
285
+ """
286
+
287
+ if str(runtime_type or "").strip().lower() != "codex":
288
+ return {}
289
+ events = await RuntimeEventStore(session_service_provider()).list(
290
+ session_id,
291
+ limit=512,
292
+ )
293
+ for event in reversed(events):
294
+ if not isinstance(event, (ContinuationCreated, ContinuationResumed)):
295
+ continue
296
+ if event.continuation_kind != "thread_resume":
297
+ continue
298
+ ref = getattr(event, "ref", None)
299
+ thread_id = (
300
+ str(ref.get("thread_id") or "").strip()
301
+ if isinstance(ref, Mapping)
302
+ else ""
303
+ )
304
+ if not thread_id:
305
+ thread_id = str(event.source.metadata.get("thread_id") or "").strip()
306
+ if thread_id:
307
+ return {"thread_id": thread_id}
308
+ return {}
309
+
310
+
311
+ def _compaction_runtime_events(
312
+ *,
313
+ prepared: Any,
314
+ preview: Any,
315
+ ) -> list[RuntimeEvent]:
316
+ if not prepared.compaction_triggered:
317
+ return []
318
+ trigger = str(prepared.compaction_trigger or "auto")
319
+ source = SourceRef(
320
+ framework="ksadk",
321
+ metadata={
322
+ "total_chars": preview.total_chars,
323
+ "total_estimated_tokens": preview.total_estimated_tokens,
324
+ "group_count": preview.group_count,
325
+ "threshold_percentage": preview.auto_compact_threshold_percentage,
326
+ },
327
+ )
328
+ common = {
329
+ "schema_version": 2,
330
+ "seq": 0,
331
+ "timestamp": time.time(),
332
+ "run_id": prepared.invocation_id,
333
+ "scope_id": prepared.invocation_id,
334
+ "source": source,
335
+ "trigger": trigger,
336
+ }
337
+ return [
338
+ ContextCompactionStarted(
339
+ event_id=f"compaction-start:{prepared.invocation_id}",
340
+ **common,
341
+ ),
342
+ ContextCompactionCompleted(
343
+ event_id=f"compaction-completed:{prepared.invocation_id}",
344
+ compacted_until_seq=int(prepared.compacted_until_seq_id or 0),
345
+ **common,
346
+ ),
347
+ ]
348
+
349
+
350
+ def _record_canonical_baseline_turn(
351
+ *,
352
+ prepared: Any,
353
+ model: str | None,
354
+ usage: Mapping[str, int] | None,
355
+ turn_started_monotonic: float,
356
+ ) -> None:
357
+ """Keep v2 execution on the same env-gated measurement path as legacy runs."""
358
+
359
+ from ksadk.context_engine.baseline import record_baseline_turn
360
+
361
+ record_baseline_turn(
362
+ getattr(prepared, "shadow_context_plan", None),
363
+ session_id=prepared.session_id,
364
+ invocation_id=prepared.invocation_id,
365
+ model=str(model or ""),
366
+ usage=usage,
367
+ compaction_triggered=bool(getattr(prepared, "compaction_triggered", False)),
368
+ compaction_trigger=str(getattr(prepared, "compaction_trigger", "") or ""),
369
+ turn_latency_ms=int((time.monotonic() - turn_started_monotonic) * 1000),
370
+ )
371
+
372
+
373
+ async def _project_runtime_run_status(
374
+ event: RuntimeEvent,
375
+ *,
376
+ session_id: str,
377
+ author: str,
378
+ run_mode: str,
379
+ run_trigger: str,
380
+ session_service_provider: Callable[[], Any],
381
+ ) -> None:
382
+ """Project canonical lifecycle events into the session's active-run state."""
383
+
384
+ status = _RUN_STATUS_BY_EVENT.get(event.event_type)
385
+ if status is None:
386
+ return
387
+ detail = event.error.message if isinstance(event, RunFailed) else None
388
+ await append_run_status_event(
389
+ session_id=session_id,
390
+ author=author,
391
+ status=status,
392
+ invocation_id=event.run_id,
393
+ detail=str(detail) if detail else None,
394
+ metadata={
395
+ "runtime_event_id": event.event_id,
396
+ "runtime_event_type": event.event_type,
397
+ },
398
+ session_service_provider=session_service_provider,
399
+ run_mode=run_mode,
400
+ run_trigger=run_trigger,
401
+ )
402
+
403
+
404
+ def _checkpoint_resume_input(value: Any) -> dict[str, Any] | None:
405
+ if not isinstance(value, Mapping):
406
+ return None
407
+ if str(value.get("type") or "").strip() != "agentengine.resume_checkpoint":
408
+ return None
409
+ return dict(value)
410
+
411
+
412
+ async def _resume_runtime_handle(
413
+ *,
414
+ executor: RuntimeExecutor,
415
+ launch_context: RuntimeLaunchContext,
416
+ session_id: str,
417
+ resume_input: Mapping[str, Any],
418
+ request: StartRequest,
419
+ ) -> RunHandle:
420
+ run_id = str(resume_input.get("run_id") or "").strip()
421
+ checkpoint_id = str(resume_input.get("checkpoint_id") or "").strip()
422
+ if not run_id or not checkpoint_id:
423
+ raise ValueError("checkpoint resume requires run_id and checkpoint_id")
424
+
425
+ handle = executor.find_handle(launch_context.runtime_type, run_id, session_id)
426
+ if handle is None:
427
+ native_ref = _persisted_resume_native_ref(resume_input)
428
+ native_ref.update({"agent_id": request.agent_id, "user_id": request.user_id})
429
+ handle = RunHandle(
430
+ run_id=run_id,
431
+ session_id=session_id,
432
+ runtime_type=launch_context.runtime_type,
433
+ native_ref=native_ref,
434
+ )
435
+ handle.native_ref[RESUME_START_REQUEST_NATIVE_KEY] = request.model_dump(mode="python")
436
+ handle = await executor.attach(launch_context, handle)
437
+ else:
438
+ handle.native_ref[RESUME_START_REQUEST_NATIVE_KEY] = request.model_dump(mode="python")
439
+
440
+ target = _resume_target(resume_input)
441
+ instruction = str(resume_input.get("resume_instruction") or "").strip()
442
+ payload = (
443
+ ResumePayload(kind="free_text", data=instruction)
444
+ if resume_input.get("resume_instruction_enabled") and instruction
445
+ else None
446
+ )
447
+ return await executor.resume(handle, target, payload)
448
+
449
+
450
+ def _resume_target(resume_input: Mapping[str, Any]) -> ResumeTarget:
451
+ framework = str(resume_input.get("framework") or "").strip().lower()
452
+ framework_ref = resume_input.get("framework_ref")
453
+ raw_runtime_ref = framework_ref.get(framework) if isinstance(framework_ref, Mapping) else None
454
+ runtime_ref: Mapping[str, Any] = (
455
+ raw_runtime_ref if isinstance(raw_runtime_ref, Mapping) else {}
456
+ )
457
+ checkpoint_id = str(resume_input.get("checkpoint_id") or "").strip()
458
+ run_id = str(resume_input.get("run_id") or "").strip()
459
+ if framework == "langgraph":
460
+ return ResumeTarget(kind="checkpoint_id", id=checkpoint_id)
461
+ if framework == "codex":
462
+ thread_id = str(runtime_ref.get("thread_id") or runtime_ref.get("resume_thread_id") or "")
463
+ return ResumeTarget(kind="thread_id", id=thread_id or run_id)
464
+ invocation_id = str(runtime_ref.get("invocation_id") or run_id)
465
+ return ResumeTarget(kind="invocation_id", id=invocation_id)
466
+
467
+
468
+ def _persisted_resume_native_ref(resume_input: Mapping[str, Any]) -> dict[str, Any]:
469
+ framework = str(resume_input.get("framework") or "").strip().lower()
470
+ checkpoint_id = str(resume_input.get("checkpoint_id") or "").strip()
471
+ framework_ref = resume_input.get("framework_ref")
472
+ normalized_ref = dict(framework_ref) if isinstance(framework_ref, Mapping) else {}
473
+ runtime_ref = normalized_ref.get(framework)
474
+ native_ref = dict(runtime_ref) if isinstance(runtime_ref, Mapping) else {}
475
+ native_ref["framework_ref"] = normalized_ref
476
+ if checkpoint_id:
477
+ native_ref.setdefault("checkpoint_id", checkpoint_id)
478
+ native_ref.setdefault("known_checkpoint_ids", [checkpoint_id])
479
+ return native_ref
480
+
481
+
482
+ def _validate_event_scope(event: RuntimeEvent, request: StartRequest) -> None:
483
+ expected_run_id = str(request.metadata["invocation_id"])
484
+ if event.schema_version != 2 or event.run_id != expected_run_id:
485
+ raise ValueError(
486
+ "runtime event scope does not match request: "
487
+ f"expected run_id={expected_run_id!r}, got {event.run_id!r}"
488
+ )
489
+
490
+
491
+ async def iter_runtime_conversation_semantic_events(
492
+ **kwargs: Any,
493
+ ) -> AsyncIterator[dict[str, Any]]:
494
+ """Project canonical RuntimeEvents into the transport-neutral serializer input."""
495
+
496
+ reducer = StreamReducer()
497
+ approval: dict[str, Any] | None = None
498
+ execution_context: dict[str, str] = {}
499
+ async for event in iter_runtime_conversation_events(
500
+ **kwargs, _execution_context=execution_context
501
+ ):
502
+ patch = reducer.apply(event)
503
+ if not patch.applied:
504
+ continue
505
+ projection = reducer.snapshot()
506
+ if isinstance(event, RunStarted):
507
+ yield {
508
+ "type": "started",
509
+ "session_id": execution_context.get("session_id", ""),
510
+ "metadata": dict(event.source.metadata),
511
+ }
512
+ elif isinstance(event, (ContextCompactionStarted, ContextCompactionCompleted)):
513
+ semantic = {"type": "compaction", "trigger": event.trigger}
514
+ # Distinguish start vs done for SSE projection (response.compaction.start/done)
515
+ if isinstance(event, ContextCompactionStarted):
516
+ semantic["phase"] = "start"
517
+ else:
518
+ semantic["phase"] = "done"
519
+ semantic["compacted_until_seq_id"] = event.compacted_until_seq
520
+ yield semantic
521
+ elif isinstance(event, ItemUpdated) and isinstance(event.update, TextContent):
522
+ item = next(
523
+ candidate
524
+ for candidate in projection.items
525
+ if candidate.scope_id == event.scope_id and candidate.item_id == event.item_id
526
+ )
527
+ semantic_type = (
528
+ "thinking"
529
+ if item.item_kind == "reasoning" or item.phase == "commentary"
530
+ else "text"
531
+ )
532
+ semantic: dict[str, Any] = {
533
+ "type": semantic_type,
534
+ "delta": event.update.text,
535
+ "scope_id": event.scope_id,
536
+ "item_id": event.item_id,
537
+ "part_id": event.update.part_id,
538
+ "operation": event.op,
539
+ }
540
+ if event.op == "replace":
541
+ semantic["replace"] = True
542
+ yield semantic
543
+ elif isinstance(event, ItemStarted) and event.initial is not None:
544
+ for part in event.initial.parts:
545
+ if isinstance(part, ToolCallContent):
546
+ yield _tool_call_semantic(part)
547
+ elif isinstance(event, ItemCompleted):
548
+ for part in event.snapshot.parts:
549
+ if isinstance(part, ToolCallContent):
550
+ yield _tool_call_semantic(part)
551
+ elif isinstance(part, ToolResultContent):
552
+ yield {
553
+ "type": "tool_result",
554
+ "name": "",
555
+ "output": part.result,
556
+ "run_id": part.call_id,
557
+ }
558
+ elif isinstance(event, InteractionRequested):
559
+ if event.interaction_kind == "approval" and event.request.request_type == "approval":
560
+ detail = event.request.detail
561
+ approval = dict(detail) if isinstance(detail, Mapping) else {}
562
+ approval.setdefault("approval_request_id", event.interaction_id)
563
+ approval.setdefault("id", event.interaction_id)
564
+ approval.setdefault("call_id", event.request.call_id)
565
+ approval.setdefault("kind", event.request.kind)
566
+ elif isinstance(event, RunInterrupted):
567
+ yield {
568
+ "type": "interrupt",
569
+ "interrupt_info": approval
570
+ or {
571
+ "reason": event.reason,
572
+ "interaction_id": event.interaction_id,
573
+ "continuation_id": event.continuation_id,
574
+ },
575
+ "session_id": execution_context.get("session_id", ""),
576
+ }
577
+ elif isinstance(event, RunFailed):
578
+ yield {
579
+ "type": "error",
580
+ "message": event.error.message or "Agent 运行失败",
581
+ "session_id": execution_context.get("session_id", ""),
582
+ "usage": projection.usage.model_dump(),
583
+ }
584
+ elif isinstance(event, RunCanceled):
585
+ yield {
586
+ "type": "cancelled",
587
+ "session_id": execution_context.get("session_id", ""),
588
+ "usage": projection.usage.model_dump(),
589
+ }
590
+ elif isinstance(event, RunCompleted):
591
+ completion_metadata = dict(event.source.metadata)
592
+ request_metadata = kwargs.get("request_metadata")
593
+ requested_agentengine = (
594
+ request_metadata.get("agentengine")
595
+ if isinstance(request_metadata, Mapping)
596
+ else None
597
+ )
598
+ if isinstance(requested_agentengine, Mapping):
599
+ completion_metadata["agentengine"] = dict(requested_agentengine)
600
+ completion_metadata["runtime"] = {
601
+ "duration_ms": event.source.metadata.get("duration_ms"),
602
+ "runtime_type": kwargs["launch_context"].runtime_type,
603
+ }
604
+ yield {
605
+ "type": "completed",
606
+ "output_text": _selected_output_text(projection, event),
607
+ "session_id": execution_context.get("session_id", ""),
608
+ "usage": projection.usage.model_dump(),
609
+ "metadata": completion_metadata,
610
+ }
611
+
612
+
613
+ def _tool_call_semantic(part: ToolCallContent) -> dict[str, Any]:
614
+ return {
615
+ "type": "tool_call",
616
+ "name": part.name,
617
+ "args": part.arguments if isinstance(part.arguments, dict) else {},
618
+ "run_id": part.call_id,
619
+ }
620
+
621
+
622
+ def _selected_output_text(projection: RunProjection, completed: RunCompleted) -> str:
623
+ """Resolve final text exclusively through authoritative run output refs."""
624
+
625
+ chunks: list[str] = []
626
+ for ref in completed.output_refs:
627
+ item = next(
628
+ (
629
+ candidate
630
+ for candidate in projection.items
631
+ if candidate.scope_id == ref.scope_id and candidate.item_id == ref.item_id
632
+ ),
633
+ None,
634
+ )
635
+ if item is None:
636
+ continue
637
+ for part in item.parts:
638
+ if isinstance(part, TextContent) and (
639
+ ref.part_id is None or ref.part_id == part.part_id
640
+ ):
641
+ chunks.append(part.text)
642
+ return "".join(chunks)
643
+
644
+
645
+ async def invoke_runtime_conversation_once(
646
+ **kwargs: Any,
647
+ ) -> tuple[str, dict[str, Any]]:
648
+ """Collect one RuntimeExecutor turn for non-streaming protocol responses."""
649
+
650
+ session_id = str(kwargs.get("session_id") or "")
651
+ output_text = ""
652
+ usage: dict[str, Any] = {}
653
+ metadata: dict[str, Any] = {}
654
+ completed = False
655
+ async for event in iter_runtime_conversation_semantic_events(**kwargs):
656
+ event_type = event.get("type")
657
+ if event_type == "started":
658
+ session_id = str(event.get("session_id") or session_id)
659
+ elif event_type == "text":
660
+ delta = str(event.get("delta") or "")
661
+ output_text = delta if event.get("replace") else output_text + delta
662
+ elif event_type == "completed":
663
+ completed = True
664
+ session_id = str(event.get("session_id") or session_id)
665
+ output_text = str(event.get("output_text") or output_text)
666
+ usage = dict(event.get("usage") or {})
667
+ metadata = dict(event.get("metadata") or {})
668
+ elif event_type == "error":
669
+ raise RuntimeError(str(event.get("message") or "Agent 运行失败"))
670
+ elif event_type == "cancelled":
671
+ raise asyncio.CancelledError
672
+ elif event_type == "interrupt":
673
+ raise RuntimeError("runtime input is required before this run can complete")
674
+ if not completed:
675
+ raise RuntimeError("runtime did not produce a completed result")
676
+ return session_id, {
677
+ "output_text": output_text,
678
+ "usage": usage,
679
+ "metadata": metadata,
680
+ }
681
+
682
+
683
+ __all__ = [
684
+ "invoke_runtime_conversation_once",
685
+ "iter_runtime_conversation_events",
686
+ "iter_runtime_conversation_semantic_events",
687
+ ]