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,497 @@
1
+ """Canonical replay plus the temporary mixed-schema legacy read boundary."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from collections.abc import AsyncIterator
7
+ from dataclasses import dataclass
8
+ from typing import Any, Protocol
9
+
10
+ from ksadk.events.canonical import (
11
+ InteractionRequested,
12
+ InteractionResolved,
13
+ ItemCompleted,
14
+ ItemSnapshotReplaced,
15
+ ItemStarted,
16
+ ItemUpdated,
17
+ RunCompleted,
18
+ RuntimeEvent,
19
+ )
20
+ from ksadk.events.canonical_store import RuntimeEventStore, session_event_to_runtime_event
21
+ from ksadk.events.content import ArtifactContent, TextContent
22
+ from ksadk.events.reducer import RunProjection, StreamReducer
23
+ from ksadk.events.v1_compat import (
24
+ EventTypeV1,
25
+ RuntimeEventV1,
26
+ RuntimeEventV1Parser,
27
+ RuntimeEventV1ProjectionContext,
28
+ V1ProjectionContextRequiredError,
29
+ project_to_v1,
30
+ )
31
+ from ksadk.sessions.base import Session, SessionEvent
32
+
33
+
34
+ class LegacyRunNotResumableError(RuntimeError):
35
+ status_code = 409
36
+ code = "legacy_run_not_resumable"
37
+
38
+ def __init__(self, run_id: str) -> None:
39
+ super().__init__(f"legacy run {run_id!r} cannot resume as a canonical run")
40
+ self.run_id = run_id
41
+
42
+
43
+ @dataclass(frozen=True)
44
+ class LegacySessionEventGroup:
45
+ """One indivisible public delivery group sharing a canonical session seq."""
46
+
47
+ seq: int
48
+ events: tuple[dict[str, Any], ...]
49
+
50
+
51
+ class RuntimeEventV1ContextProvider(Protocol):
52
+ """Supply protocol-specific v1 refs at the temporary legacy read boundary."""
53
+
54
+ def __call__(
55
+ self,
56
+ session: Session,
57
+ event: RuntimeEvent,
58
+ projection: RunProjection,
59
+ ) -> RuntimeEventV1ProjectionContext: ...
60
+
61
+
62
+ class _LegacySessionProjector:
63
+ """Session-scoped reducer/parser state shared by hydrate and incremental tail."""
64
+
65
+ def __init__(
66
+ self,
67
+ session: Session,
68
+ context_provider: RuntimeEventV1ContextProvider | None,
69
+ ) -> None:
70
+ self.session = session
71
+ self.context_provider = context_provider
72
+ self.reducers: dict[str, StreamReducer] = {}
73
+ self.parser = RuntimeEventV1Parser()
74
+
75
+ def project(self, raw: SessionEvent) -> list[dict[str, Any]]:
76
+ canonical = session_event_to_runtime_event(raw)
77
+ if canonical is None:
78
+ return [_legacy_raw_payload(raw)]
79
+ reducer = self.reducers.setdefault(canonical.run_id, StreamReducer())
80
+ reducer.apply(canonical)
81
+ projection = reducer.snapshot()
82
+ context = _legacy_projection_context(
83
+ self.session,
84
+ canonical,
85
+ projection,
86
+ provider=self.context_provider,
87
+ )
88
+ v1_events = project_to_v1(canonical, context=context)
89
+ for event in v1_events:
90
+ self.parser.feed(event)
91
+ return _canonical_legacy_payloads(
92
+ canonical,
93
+ v1_events,
94
+ projection=projection,
95
+ )
96
+
97
+
98
+ async def replay_projection(
99
+ store: RuntimeEventStore,
100
+ session_id: str,
101
+ *,
102
+ run_id: str,
103
+ through_seq: int | None = None,
104
+ settle_open: bool = False,
105
+ ) -> RunProjection:
106
+ """Rebuild one run exclusively through the live ``StreamReducer.apply`` path.
107
+
108
+ With ``settle_open`` the projection never exposes an unfinished stream to a
109
+ cold reader: an open run at the read boundary is completed in-memory with
110
+ the same deterministic outcomes :func:`ksadk.events.cold_recovery.settle_finding`
111
+ would persist, so live readers (run still executing) and cold readers
112
+ (process gone) both observe a conformant projection without consumers
113
+ special-casing a dangling stream. The synthesized events are applied to the
114
+ in-memory reducer only; persisting them is :func:`cold_recovery.recover_session`'s
115
+ job.
116
+ """
117
+
118
+ reducer = StreamReducer()
119
+ for event in await store.list(session_id, run_id=run_id):
120
+ if through_seq is not None and event.seq > through_seq:
121
+ break
122
+ reducer.apply(event)
123
+ if settle_open and (snapshot := reducer.snapshot()).status in (None, "running"):
124
+ from ksadk.events.cold_recovery import OpenItem, RecoveryFinding, settle_finding
125
+
126
+ finding = RecoveryFinding(
127
+ run_id=run_id,
128
+ scope_id=_root_scope_for(run_id),
129
+ resumable=any(c.resumable for c in snapshot.continuations),
130
+ continuation_id=(
131
+ snapshot.continuations[-1].continuation_id
132
+ if snapshot.continuations
133
+ else None
134
+ ),
135
+ open_items=[
136
+ OpenItem(
137
+ scope_id=item.scope_id,
138
+ item_id=item.item_id,
139
+ item_kind=item.item_kind,
140
+ )
141
+ for item in snapshot.items
142
+ if item.status == "open"
143
+ ],
144
+ last_seq=snapshot.last_seq or 0,
145
+ )
146
+ # 冷读者默认不允许接管执行(resume 裁决属执行层),只做确定性结算。
147
+ for event in settle_finding(
148
+ finding, session_id, allow_resume=False, timestamp=0.0
149
+ ):
150
+ reducer.apply(event)
151
+ return reducer.snapshot()
152
+
153
+
154
+ def _root_scope_for(run_id: str) -> str:
155
+ return f"run:{run_id}"
156
+
157
+
158
+ async def list_legacy_session_events(
159
+ store: RuntimeEventStore,
160
+ session_id: str,
161
+ *,
162
+ session_service: Any | None = None,
163
+ after_seq: int = 0,
164
+ before_seq: int | None = None,
165
+ limit: int | None = None,
166
+ context_provider: RuntimeEventV1ContextProvider | None = None,
167
+ ) -> list[dict[str, Any]]:
168
+ """Merge historical rows and v2 read projections in one physical seq space.
169
+
170
+ One canonical event may project to several public rows. Rows with the same
171
+ physical seq are selected as one atomic pagination/delivery group.
172
+ """
173
+
174
+ service = session_service or store.session_service
175
+ session = await service.get_session_metadata(session_id)
176
+ if session is None:
177
+ return []
178
+ raw_events = await service.get_events(session_id, before_seq_id=before_seq)
179
+ raw_events.sort(key=lambda item: item.seq_id)
180
+ projector = _LegacySessionProjector(session, context_provider)
181
+ groups: list[tuple[int, list[dict[str, Any]]]] = []
182
+
183
+ for raw in raw_events:
184
+ projected = projector.project(raw)
185
+ if projected:
186
+ groups.append((raw.seq_id, projected))
187
+
188
+ groups = [
189
+ group
190
+ for group in groups
191
+ if group[0] > after_seq and (before_seq is None or group[0] < before_seq)
192
+ ]
193
+ if limit is not None:
194
+ if limit < 1:
195
+ raise ValueError("limit must be positive")
196
+ selected: list[tuple[int, list[dict[str, Any]]]] = []
197
+ selected_size = 0
198
+ for group in reversed(groups):
199
+ selected.append(group)
200
+ selected_size += len(group[1])
201
+ if selected_size >= limit:
202
+ break
203
+ groups = list(reversed(selected))
204
+ return [payload for _seq, group in groups for payload in group]
205
+
206
+
207
+ async def subscribe_legacy_session_events(
208
+ store: RuntimeEventStore,
209
+ session_id: str,
210
+ *,
211
+ session_service: Any | None = None,
212
+ after_seq: int = 0,
213
+ poll_interval: float = 0.25,
214
+ timeout: float = 5 * 60,
215
+ context_provider: RuntimeEventV1ContextProvider | None = None,
216
+ ) -> AsyncIterator[LegacySessionEventGroup]:
217
+ """Yield whole projection groups and advance only after each group delivery."""
218
+
219
+ service = session_service or store.session_service
220
+ session = await service.get_session_metadata(session_id)
221
+ if session is None:
222
+ return
223
+ cursor = int(after_seq or 0)
224
+ projector = _LegacySessionProjector(session, context_provider)
225
+ if cursor > 0:
226
+ prefix = await service.get_events(session_id, before_seq_id=cursor + 1)
227
+ prefix.sort(key=lambda item: item.seq_id)
228
+ for raw in prefix:
229
+ projector.project(raw)
230
+
231
+ deadline = asyncio.get_running_loop().time() + timeout
232
+ while True:
233
+ rows = await service.get_events(session_id, after_seq_id=cursor)
234
+ rows.sort(key=lambda item: item.seq_id)
235
+ for raw in rows:
236
+ projected = projector.project(raw)
237
+ if projected:
238
+ yield LegacySessionEventGroup(seq=raw.seq_id, events=tuple(projected))
239
+ cursor = raw.seq_id
240
+ if asyncio.get_running_loop().time() >= deadline:
241
+ return
242
+ await asyncio.sleep(poll_interval)
243
+
244
+
245
+ async def ensure_canonical_resume_allowed(
246
+ store: RuntimeEventStore,
247
+ session_id: str,
248
+ run_id: str,
249
+ *,
250
+ session_service: Any | None = None,
251
+ ) -> None:
252
+ """Reject v1-only run resume instead of silently producing an empty v2 run."""
253
+
254
+ if await store.list(session_id, run_id=run_id):
255
+ return
256
+ service = session_service or store.session_service
257
+ for event in await service.get_events_by_invocation_id(session_id, run_id):
258
+ if session_event_to_runtime_event(event) is None:
259
+ raise LegacyRunNotResumableError(run_id)
260
+
261
+
262
+ def _legacy_raw_payload(event: SessionEvent) -> dict[str, Any]:
263
+ payload: dict[str, Any] = {
264
+ "EventId": event.id,
265
+ "SessionId": event.session_id,
266
+ "Author": event.author,
267
+ "EventType": event.event_type,
268
+ "Content": event.content,
269
+ "Timestamp": event.timestamp,
270
+ "SeqId": event.seq_id,
271
+ "Metadata": event.metadata,
272
+ }
273
+ if event.invocation_id:
274
+ payload["InvocationId"] = event.invocation_id
275
+ if event.state_delta:
276
+ payload["StateDelta"] = event.state_delta
277
+ return payload
278
+
279
+
280
+ def _legacy_projection_context(
281
+ session: Session,
282
+ event: RuntimeEvent,
283
+ projection: RunProjection,
284
+ *,
285
+ provider: RuntimeEventV1ContextProvider | None,
286
+ ) -> RuntimeEventV1ProjectionContext:
287
+ requirement = _protocol_context_requirement(event)
288
+ if provider is None:
289
+ if requirement is not None:
290
+ raise V1ProjectionContextRequiredError(
291
+ f"{requirement} requires a RuntimeEvent v1 context provider"
292
+ )
293
+ return RuntimeEventV1ProjectionContext.from_projection(
294
+ projection,
295
+ agent_id=session.agent_id,
296
+ user_id=session.user_id,
297
+ session_id=session.id,
298
+ )
299
+
300
+ context = provider(session, event, projection)
301
+ if not isinstance(context, RuntimeEventV1ProjectionContext):
302
+ raise TypeError("RuntimeEvent v1 context provider returned an invalid context")
303
+ if (
304
+ context.agent_id != session.agent_id
305
+ or context.user_id != session.user_id
306
+ or context.session_id != session.id
307
+ or context.projection != projection
308
+ ):
309
+ raise V1ProjectionContextRequiredError(
310
+ "RuntimeEvent v1 context provider must preserve session and current projection"
311
+ )
312
+ _validate_protocol_context(event, context)
313
+ return context
314
+
315
+
316
+ def _protocol_context_requirement(event: RuntimeEvent) -> str | None:
317
+ if event.source.framework == "a2a":
318
+ return "A2A task projection"
319
+ if isinstance(event, (ItemStarted, ItemUpdated, ItemSnapshotReplaced, ItemCompleted)):
320
+ if event.item_kind == "artifact":
321
+ return "artifact projection"
322
+ if event.item_kind == "data" and event.source.protocol == "a2ui":
323
+ return "A2UI surface projection"
324
+ if (
325
+ isinstance(event, (InteractionRequested, InteractionResolved))
326
+ and event.source.protocol == "a2ui"
327
+ ):
328
+ return "A2UI interaction projection"
329
+ return None
330
+
331
+
332
+ def _validate_protocol_context(
333
+ event: RuntimeEvent,
334
+ context: RuntimeEventV1ProjectionContext,
335
+ ) -> None:
336
+ if event.source.framework == "a2a":
337
+ a2a_ref = context.a2a_tasks.get((event.run_id, event.scope_id))
338
+ if a2a_ref is None or not a2a_ref.task_id.strip() or not a2a_ref.origin.strip():
339
+ raise V1ProjectionContextRequiredError(
340
+ "A2A task projection requires a context provider task ref"
341
+ )
342
+ if isinstance(event, (ItemStarted, ItemUpdated, ItemSnapshotReplaced, ItemCompleted)):
343
+ if event.item_kind == "artifact":
344
+ for part in _artifact_parts(event):
345
+ context.artifact_version(event.scope_id, event.item_id, part.artifact_id)
346
+ if event.item_kind == "data" and event.source.protocol == "a2ui":
347
+ surface_ref = context.a2ui_surfaces.get((event.scope_id, event.item_id))
348
+ if surface_ref is None or not surface_ref.surface_id.strip():
349
+ raise V1ProjectionContextRequiredError(
350
+ "A2UI surface projection requires a context provider surface ref"
351
+ )
352
+ if (
353
+ isinstance(event, (InteractionRequested, InteractionResolved))
354
+ and event.source.protocol == "a2ui"
355
+ ):
356
+ interaction_ref = context.a2ui_interactions.get((event.scope_id, event.interaction_id))
357
+ if interaction_ref is None or not interaction_ref.surface_id.strip():
358
+ raise V1ProjectionContextRequiredError(
359
+ "A2UI interaction projection requires a context provider interaction ref"
360
+ )
361
+
362
+
363
+ def _artifact_parts(
364
+ event: ItemStarted | ItemUpdated | ItemSnapshotReplaced | ItemCompleted,
365
+ ) -> tuple[ArtifactContent, ...]:
366
+ if isinstance(event, ItemStarted):
367
+ parts = event.initial.parts if event.initial is not None else ()
368
+ elif isinstance(event, ItemUpdated):
369
+ parts = (event.update,)
370
+ else:
371
+ parts = event.snapshot.parts
372
+ return tuple(part for part in parts if isinstance(part, ArtifactContent))
373
+
374
+
375
+ def _canonical_legacy_payloads(
376
+ canonical: RuntimeEvent,
377
+ events: tuple[RuntimeEventV1, ...],
378
+ *,
379
+ projection: RunProjection,
380
+ ) -> list[dict[str, Any]]:
381
+ runtime_identities = _projected_runtime_identities(canonical, events, projection=projection)
382
+ return [
383
+ _v1_to_session_payload(event, runtime_item=runtime_identities.get(index))
384
+ for index, event in enumerate(events)
385
+ ]
386
+
387
+
388
+ def _projected_runtime_identities(
389
+ canonical: RuntimeEvent,
390
+ events: tuple[RuntimeEventV1, ...],
391
+ *,
392
+ projection: RunProjection,
393
+ ) -> dict[int, dict[str, Any]]:
394
+ identities: dict[int, dict[str, Any]] = {}
395
+ if isinstance(canonical, RunCompleted):
396
+ text_indexes = [
397
+ index
398
+ for index, event in enumerate(events)
399
+ if event.event_type in {EventTypeV1.TEXT_COMPLETED, EventTypeV1.REASONING_COMPLETED}
400
+ ]
401
+ selected_parts: list[tuple[Any, str]] = []
402
+ for ref in canonical.output_refs:
403
+ item = next(
404
+ (
405
+ candidate
406
+ for candidate in projection.items
407
+ if candidate.scope_id == ref.scope_id and candidate.item_id == ref.item_id
408
+ ),
409
+ None,
410
+ )
411
+ if item is None:
412
+ continue
413
+ parts = [part for part in item.parts if isinstance(part, TextContent)]
414
+ if ref.part_id is not None:
415
+ parts = [part for part in parts if part.part_id == ref.part_id]
416
+ selected_parts.extend((ref, part.part_id) for part in parts)
417
+ for index, (ref, output_part_id) in zip(text_indexes, selected_parts):
418
+ identities[index] = {
419
+ "RunId": canonical.run_id,
420
+ "ScopeId": ref.scope_id,
421
+ "ItemId": ref.item_id,
422
+ "PartId": output_part_id,
423
+ "Operation": "replace",
424
+ "SourceEventId": canonical.source.native_event_id or canonical.event_id,
425
+ }
426
+ for index, event in enumerate(events):
427
+ if index in identities:
428
+ continue
429
+ item_id = event.payload.get("item_id")
430
+ payload_part_id = event.payload.get("part_id")
431
+ if item_id:
432
+ identities[index] = {
433
+ "RunId": canonical.run_id,
434
+ "ScopeId": event.payload.get("scope_id"),
435
+ "ItemId": item_id,
436
+ "PartId": payload_part_id,
437
+ "Operation": event.payload.get("operation"),
438
+ "SourceEventId": event.payload.get("source_event_id") or canonical.event_id,
439
+ }
440
+ return identities
441
+
442
+
443
+ def _v1_to_session_payload(
444
+ event: RuntimeEventV1, *, runtime_item: dict[str, Any] | None
445
+ ) -> dict[str, Any]:
446
+ content: dict[str, Any]
447
+ if event.event_type in {EventTypeV1.TEXT_COMPLETED, EventTypeV1.TEXT_DELTA}:
448
+ event_type = (
449
+ "assistant_message"
450
+ if event.event_type == EventTypeV1.TEXT_COMPLETED
451
+ else "assistant_stream_delta"
452
+ )
453
+ content = {"role": "model", "parts": [{"text": event.payload.get("text", "")}]}
454
+ elif event.event_type in {EventTypeV1.REASONING_COMPLETED, EventTypeV1.REASONING_DELTA}:
455
+ event_type = "reasoning"
456
+ content = {"role": "model", "parts": [{"text": event.payload.get("text", "")}]}
457
+ elif event.event_type in {
458
+ EventTypeV1.RUN_STARTED,
459
+ EventTypeV1.RUN_PROGRESS,
460
+ EventTypeV1.RUN_INTERRUPTED,
461
+ EventTypeV1.RUN_COMPLETED,
462
+ EventTypeV1.RUN_FAILED,
463
+ EventTypeV1.RUN_CANCELED,
464
+ }:
465
+ event_type = "run_status"
466
+ content = {"status": event.payload.get("status")}
467
+ else:
468
+ event_type = event.event_type
469
+ content = dict(event.payload)
470
+ metadata: dict[str, Any] = {
471
+ "schema_version": 1,
472
+ "RuntimeEventV1": dict(event.payload),
473
+ }
474
+ if runtime_item is not None:
475
+ metadata["RuntimeItem"] = runtime_item
476
+ return {
477
+ "EventId": event.event_id,
478
+ "SessionId": event.session_id,
479
+ "Author": event.agent_id,
480
+ "EventType": event_type,
481
+ "Content": content,
482
+ "Timestamp": event.timestamp,
483
+ "SeqId": event.seq_id,
484
+ "InvocationId": event.invocation_id,
485
+ "Metadata": metadata,
486
+ }
487
+
488
+
489
+ __all__ = [
490
+ "LegacyRunNotResumableError",
491
+ "LegacySessionEventGroup",
492
+ "RuntimeEventV1ContextProvider",
493
+ "ensure_canonical_resume_allowed",
494
+ "list_legacy_session_events",
495
+ "replay_projection",
496
+ "subscribe_legacy_session_events",
497
+ ]