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
@@ -1,264 +1,28 @@
1
- """RuntimeEvent v1 schema (goal-02 / G0.2 冻结稿)。
1
+ """Public canonical RuntimeEvent schema version 2.
2
2
 
3
- 事件只定义一次:Runtime 产生 → server 持久化 → gateway 透传 → UI/协议 adapter 消费。
4
- 本模块只负责**定义层**(类型 + 序列化/反序列化 + 事件族清单);不改 runtime.py 发事件
5
- (那是后续阶段)。
6
-
7
- 设计约束(友商证伪,G0.2 冻结):
8
-
9
- - **additive + ``SCHEMA_VERSION``**:只增字段/事件类型,不改既有字段语义。
10
- - **相位字段** ``phase``:区分 ``commentary``(过程解说)vs ``final_answer``(最终答案),
11
- 仅 text/reasoning 类事件使用。
12
- - **工具审批一等事件**(``approval.*``),不是普通 text;审批回包走独立命令/恢复通道,
13
- 事件流上的 ``approval.resolved`` 仅作回放/审计(非 duplex stream)。
3
+ The schema-v1 wire model intentionally lives only in :mod:`ksadk.events.v1_compat`.
14
4
  """
15
5
 
16
- from __future__ import annotations
17
-
18
- import time
19
- import uuid
20
- from enum import Enum
21
- from typing import Any, Literal, Optional
22
-
23
- from pydantic import BaseModel, Field
24
-
25
- #: additive 演进锚点。冻结为 1;只增不改。
26
- SCHEMA_VERSION: Literal[1] = 1
27
-
28
-
29
- class EventPhase(str, Enum):
30
- """相位:text/reasoning 类事件区分过程解说与最终答案。"""
31
-
32
- COMMENTARY = "commentary"
33
- FINAL_ANSWER = "final_answer"
34
-
35
-
36
- # ---------------------------------------------------------------------------
37
- # 事件族(event_type 常量,v1 冻结)。新增事件类型只能 additive 追加。
38
- # ---------------------------------------------------------------------------
39
-
40
-
41
- class EventType:
42
- """v1 事件族清单(冻结)。按族分组;每族注释标明 payload 关键字段。"""
43
-
44
- # text(相位:commentary/final_answer)。payload: text, message_id
45
- TEXT_DELTA = "text.delta"
46
- TEXT_COMPLETED = "text.completed"
47
- # reasoning(相位恒 commentary)。payload: text, summary
48
- REASONING_DELTA = "reasoning.delta"
49
- REASONING_COMPLETED = "reasoning.completed"
50
- # tool。begin: call_id, name, args;end: call_id, name, result, error, duration_ms
51
- TOOL_CALL_BEGIN = "tool.call.begin"
52
- TOOL_CALL_END = "tool.call.end"
53
- # artifact。payload: name, version, uri, mime
54
- ARTIFACT_CREATED = "artifact.created"
55
- ARTIFACT_UPDATED = "artifact.updated"
56
- # approval(一等)。requested: approval_id, call_id, kind, detail;
57
- # resolved: approval_id, call_id, decision(回放/审计)
58
- APPROVAL_REQUESTED = "approval.requested"
59
- APPROVAL_RESOLVED = "approval.resolved"
60
- # run 生命周期。payload: status;progress?: progress;failed: error;canceled: cancel_result
61
- RUN_STARTED = "run.started"
62
- RUN_PROGRESS = "run.progress"
63
- RUN_INTERRUPTED = "run.interrupted"
64
- RUN_COMPLETED = "run.completed"
65
- RUN_FAILED = "run.failed"
66
- RUN_CANCELED = "run.canceled"
67
- # checkpoint。payload: checkpoint_id, granularity(delta|snapshot), resume_target?
68
- CHECKPOINT_CREATED = "checkpoint.created"
69
- CHECKPOINT_RESUMED = "checkpoint.resumed"
70
- # usage。payload: input_tokens, output_tokens, total_tokens, cached_tokens, reasoning_tokens
71
- USAGE_REPORTED = "usage.reported"
72
- # A2UI。payload: surface_id, block_id?, catalog?, data?
73
- A2UI_SURFACE_BEGIN = "a2ui.surface.begin"
74
- A2UI_SURFACE_UPDATE = "a2ui.surface.update"
75
- A2UI_SURFACE_END = "a2ui.surface.end"
76
- A2UI_INTERACTION = "a2ui.interaction"
77
- A2UI_ACTION = "a2ui.action"
78
- # remote A2A。payload: task_id, origin(remote agent url/space), status?, artifact?
79
- A2A_TASK_CREATED = "a2a.task.created"
80
- A2A_TASK_STATUS = "a2a.task.status"
81
- A2A_TASK_ARTIFACT = "a2a.task.artifact"
82
-
83
-
84
- #: 全部 v1 事件类型(供校验/枚举)。
85
- ALL_EVENT_TYPES: frozenset[str] = frozenset(
86
- {
87
- EventType.TEXT_DELTA,
88
- EventType.TEXT_COMPLETED,
89
- EventType.REASONING_DELTA,
90
- EventType.REASONING_COMPLETED,
91
- EventType.TOOL_CALL_BEGIN,
92
- EventType.TOOL_CALL_END,
93
- EventType.ARTIFACT_CREATED,
94
- EventType.ARTIFACT_UPDATED,
95
- EventType.APPROVAL_REQUESTED,
96
- EventType.APPROVAL_RESOLVED,
97
- EventType.RUN_STARTED,
98
- EventType.RUN_PROGRESS,
99
- EventType.RUN_INTERRUPTED,
100
- EventType.RUN_COMPLETED,
101
- EventType.RUN_FAILED,
102
- EventType.RUN_CANCELED,
103
- EventType.CHECKPOINT_CREATED,
104
- EventType.CHECKPOINT_RESUMED,
105
- EventType.USAGE_REPORTED,
106
- EventType.A2UI_SURFACE_BEGIN,
107
- EventType.A2UI_SURFACE_UPDATE,
108
- EventType.A2UI_SURFACE_END,
109
- EventType.A2UI_INTERACTION,
110
- EventType.A2UI_ACTION,
111
- EventType.A2A_TASK_CREATED,
112
- EventType.A2A_TASK_STATUS,
113
- EventType.A2A_TASK_ARTIFACT,
114
- }
115
- )
116
-
117
- #: 各 event_type 的 payload 必填键(conformance 用;additive —— 只允许增键)。
118
- #: 信封字段是硬冻结;payload 必填键是 v1 最低契约,后续版本只能加可选键。
119
- EVENT_PAYLOAD_REQUIRED_KEYS: dict[str, frozenset[str]] = {
120
- EventType.TEXT_DELTA: frozenset({"text"}),
121
- EventType.TEXT_COMPLETED: frozenset({"text"}),
122
- EventType.REASONING_DELTA: frozenset({"text"}),
123
- EventType.REASONING_COMPLETED: frozenset({"text"}),
124
- EventType.TOOL_CALL_BEGIN: frozenset({"call_id", "name"}),
125
- EventType.TOOL_CALL_END: frozenset({"call_id", "name"}),
126
- EventType.ARTIFACT_CREATED: frozenset({"name", "version"}),
127
- EventType.ARTIFACT_UPDATED: frozenset({"name", "version"}),
128
- EventType.APPROVAL_REQUESTED: frozenset({"approval_id", "call_id", "kind"}),
129
- EventType.APPROVAL_RESOLVED: frozenset({"approval_id", "call_id", "decision"}),
130
- EventType.RUN_STARTED: frozenset({"status"}),
131
- EventType.RUN_PROGRESS: frozenset({"status"}),
132
- EventType.RUN_INTERRUPTED: frozenset({"status"}),
133
- EventType.RUN_COMPLETED: frozenset({"status"}),
134
- EventType.RUN_FAILED: frozenset({"status", "error"}),
135
- EventType.RUN_CANCELED: frozenset({"status"}),
136
- EventType.CHECKPOINT_CREATED: frozenset({"checkpoint_id", "granularity"}),
137
- EventType.CHECKPOINT_RESUMED: frozenset({"checkpoint_id"}),
138
- EventType.USAGE_REPORTED: frozenset({"input_tokens", "output_tokens", "total_tokens"}),
139
- EventType.A2UI_SURFACE_BEGIN: frozenset({"surface_id"}),
140
- EventType.A2UI_SURFACE_UPDATE: frozenset({"surface_id"}),
141
- EventType.A2UI_SURFACE_END: frozenset({"surface_id"}),
142
- EventType.A2UI_INTERACTION: frozenset({"surface_id"}),
143
- EventType.A2UI_ACTION: frozenset({"surface_id"}),
144
- EventType.A2A_TASK_CREATED: frozenset({"task_id", "origin"}),
145
- EventType.A2A_TASK_STATUS: frozenset({"task_id", "origin", "status"}),
146
- EventType.A2A_TASK_ARTIFACT: frozenset({"task_id", "origin"}),
147
- }
148
-
149
- #: 仅 text/reasoning 类事件使用相位字段。
150
- _PHASE_AWARE_TYPES: frozenset[str] = frozenset(
151
- {
152
- EventType.TEXT_DELTA,
153
- EventType.TEXT_COMPLETED,
154
- EventType.REASONING_DELTA,
155
- EventType.REASONING_COMPLETED,
156
- }
157
- )
158
-
159
-
160
- class RuntimeEvent(BaseModel):
161
- """RuntimeEvent v1 信封。
162
-
163
- 字段全部硬冻结(additive 演进只允许新增可选字段)。``payload`` 按 event_type
164
- 承载,最低必填键见 :data:`EVENT_PAYLOAD_REQUIRED_KEYS`。
165
- """
166
-
167
- schema_version: Literal[1] = SCHEMA_VERSION
168
- event_id: str
169
- event_type: str
170
- timestamp: float
171
- agent_id: str
172
- user_id: str
173
- session_id: str
174
- invocation_id: str
175
- seq_id: int
176
- phase: Optional[Literal["commentary", "final_answer"]] = None
177
- payload: dict[str, Any] = Field(default_factory=dict)
178
-
179
- # ---- 构造 ----
180
-
181
- @classmethod
182
- def create(
183
- cls,
184
- event_type: str,
185
- *,
186
- agent_id: str,
187
- user_id: str,
188
- session_id: str,
189
- invocation_id: str,
190
- seq_id: int,
191
- payload: Optional[dict[str, Any]] = None,
192
- phase: Optional[str] = None,
193
- event_id: Optional[str] = None,
194
- timestamp: Optional[float] = None,
195
- ) -> "RuntimeEvent":
196
- """便捷构造:自动补 event_id / timestamp,并按 event_type 校验相位与 payload。"""
197
- event = cls(
198
- event_id=event_id or f"evt_{uuid.uuid4().hex}",
199
- event_type=event_type,
200
- timestamp=time.time() if timestamp is None else timestamp,
201
- agent_id=agent_id,
202
- user_id=user_id,
203
- session_id=session_id,
204
- invocation_id=invocation_id,
205
- seq_id=seq_id,
206
- phase=phase, # type: ignore[arg-type]
207
- payload=payload or {},
208
- )
209
- event.validate_conformance()
210
- return event
211
-
212
- # ---- 序列化 ----
213
-
214
- def to_dict(self) -> dict[str, Any]:
215
- """序列化为 dict(含全部信封字段 + payload)。"""
216
- return self.model_dump(mode="json", exclude_none=True)
217
-
218
- def to_json(self) -> str:
219
- """序列化为 JSON 字符串。"""
220
- return self.model_dump_json(exclude_none=True)
221
-
222
- @classmethod
223
- def from_dict(cls, data: dict[str, Any]) -> "RuntimeEvent":
224
- """从 dict 反序列化。与 :meth:`create` 一致过 conformance:
225
- 未知 event_type / 相位滥用 / 缺必填键抛 ``ValueError``,不得混入系统。"""
226
- event = cls.model_validate(data)
227
- event.validate_conformance()
228
- return event
229
-
230
- @classmethod
231
- def from_json(cls, raw: str) -> "RuntimeEvent":
232
- """从 JSON 字符串反序列化(同 :meth:`from_dict` 过 conformance)。"""
233
- event = cls.model_validate_json(raw)
234
- event.validate_conformance()
235
- return event
6
+ from ksadk.events.canonical import * # noqa: F403
7
+ from ksadk.events.canonical import __all__
8
+ from ksadk.events.v1_compat import EventTypeV1
236
9
 
237
- # ---- conformance ----
238
10
 
239
- def validate_conformance(self) -> None:
240
- """按 v1 契约校验:事件类型已知、相位仅用于 text/reasoning、payload 必填键齐全。
11
+ class _MergedEventType(EventTypeV1):
12
+ """EventTypeV1 plus the v1 members added by the observability branch
13
+ (user.message / turn.* / step.* / model.call.*) so that merged callers
14
+ keep working on top of the canonical v2 event core."""
241
15
 
242
- additive 演进:允许 payload 含额外键(不作 strict 拒绝),只校验最低必填键。
243
- 未知 event_type / 缺必填键 / 相位滥用抛 :class:`ValueError`。
244
- """
245
- if self.event_type not in ALL_EVENT_TYPES:
246
- raise ValueError(f"unknown event_type: {self.event_type!r}(v1 事件族之外)")
247
- if self.phase is not None and self.event_type not in _PHASE_AWARE_TYPES:
248
- raise ValueError(
249
- f"phase 仅用于 text/reasoning 事件,{self.event_type!r} 不应带 phase={self.phase!r}"
250
- )
251
- required = EVENT_PAYLOAD_REQUIRED_KEYS.get(self.event_type, frozenset())
252
- missing = required - set(self.payload.keys())
253
- if missing:
254
- raise ValueError(f"event_type {self.event_type!r} payload 缺必填键: {sorted(missing)}")
16
+ USER_MESSAGE = "user.message"
17
+ TURN_STARTED = "turn.started"
18
+ TURN_COMPLETED = "turn.completed"
19
+ STEP_STARTED = "step.started"
20
+ STEP_COMPLETED = "step.completed"
21
+ MODEL_CALL_BEGIN = "model.call.begin"
22
+ MODEL_CALL_FIRST_TOKEN = "model.call.first_token"
23
+ MODEL_CALL_END = "model.call.end"
255
24
 
256
25
 
257
- __all__ = [
258
- "ALL_EVENT_TYPES",
259
- "EVENT_PAYLOAD_REQUIRED_KEYS",
260
- "EventPhase",
261
- "EventType",
262
- "RuntimeEvent",
263
- "SCHEMA_VERSION",
264
- ]
26
+ # Alias kept for callers integrated before the canonical v2 refactor
27
+ # (studio observability/evaluation imports on merged branches).
28
+ EventType = _MergedEventType
@@ -0,0 +1,324 @@
1
+ """Generic single-log SessionEvent store port(Phase 1 Task 2)。
2
+
3
+ 把 control/runtime/workflow 等 family 的 ``SessionEventEnvelope/v1`` 收敛进
4
+ 同一个 session event log,复用 Session backend 的原子 per-session seq。
5
+ 写入权限是 typed guard(``AdmissionWriteGuard | ActivationWriteGuard``),
6
+ 禁止无 guard append;发布(订阅可见性)只发生在 backend 事务 commit 之后,
7
+ 订阅先 replay ``seq > after_seq`` 再切 live,用同一 cursor 去重。
8
+
9
+ 物理 ``SessionEvent.id`` 是 ``(session_id, event_id)`` 的确定性编码,
10
+ 与 ``ksadk.events.canonical_store.canonical_storage_id`` 算法一致,
11
+ 让 durable 主键在分配 session cursor 之前先约束幂等域。
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import asyncio
17
+ import hashlib
18
+ import json
19
+ from collections.abc import AsyncIterator, Awaitable, Callable
20
+ from datetime import datetime, timezone
21
+ from typing import Any, Protocol
22
+
23
+ from ksadk.events.canonical import parse_runtime_event
24
+ from ksadk.kernel.contracts import (
25
+ ActivationWriteGuard,
26
+ AdmissionWriteGuard,
27
+ SessionEventEnvelope,
28
+ SessionEventWriteGuard,
29
+ )
30
+ from ksadk.sessions.base import BaseSessionService, SessionEvent
31
+
32
+ _ENVELOPE_MARKER = "ksadk_session_event_envelope"
33
+ _ENVELOPE_CONTENT_KEY = "session_event"
34
+ _RUNTIME_CONTENT_KEY = "runtime_event"
35
+ _RUNTIME_FAMILY = "runtime"
36
+ _RUNTIME_FAMILY_VERSION = 2
37
+ _ADMISSION_CONTROL_EVENT_TYPES = frozenset(
38
+ {"control.command_accepted", "control.command_rejected"}
39
+ )
40
+
41
+
42
+ def session_event_storage_id(session_id: str, event_id: str) -> str:
43
+ """Deterministic physical id for one envelope fact (same digest as canonical)."""
44
+
45
+ if not session_id.strip() or not event_id.strip():
46
+ raise ValueError("session_id and event_id must be nonempty")
47
+ encoded = json.dumps([session_id, event_id], ensure_ascii=False, separators=(",", ":")).encode(
48
+ "utf-8"
49
+ )
50
+ return f"cev_{hashlib.sha256(encoded).hexdigest()[:40]}"
51
+
52
+
53
+ def _timestamp_to_float(value: str) -> float:
54
+ parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
55
+ if parsed.tzinfo is None:
56
+ parsed = parsed.replace(tzinfo=timezone.utc)
57
+ return parsed.timestamp()
58
+
59
+
60
+ class SessionEventStore(Protocol):
61
+ """Generic envelope port. Append without a typed guard is forbidden."""
62
+
63
+ async def append(
64
+ self, envelope: SessionEventEnvelope, *, guard: SessionEventWriteGuard
65
+ ) -> SessionEventEnvelope: ...
66
+
67
+ async def read(
68
+ self, session_id: str, after_seq: int, limit: int
69
+ ) -> list[SessionEventEnvelope]: ...
70
+
71
+ def subscribe(
72
+ self, session_id: str, after_seq: int
73
+ ) -> AsyncIterator[SessionEventEnvelope]: ...
74
+
75
+
76
+ def validate_write_guard(
77
+ envelope: SessionEventEnvelope, guard: SessionEventWriteGuard
78
+ ) -> SessionEventWriteGuard:
79
+ """Typed write permission: no bare booleans, no nullable fences.
80
+
81
+ AdmissionWriteGuard 只允许 admission 产生的 ``control.command_accepted`` /
82
+ ``control.command_rejected``。ActivationWriteGuard 在 Phase 1 允许
83
+ worker/control/runtime facts;activation_id/fencing_token 与 lease 的
84
+ 事务内比较由 Task 3 的 AgentKernelStore 承接。
85
+ """
86
+
87
+ if isinstance(guard, bool) or not isinstance(guard, (AdmissionWriteGuard, ActivationWriteGuard)):
88
+ raise TypeError(
89
+ "append requires a typed SessionEventWriteGuard "
90
+ "(AdmissionWriteGuard | ActivationWriteGuard)"
91
+ )
92
+ if isinstance(guard, AdmissionWriteGuard):
93
+ if envelope.family != "control" or envelope.event_type not in _ADMISSION_CONTROL_EVENT_TYPES:
94
+ raise PermissionError(
95
+ "AdmissionWriteGuard may only append control.command_accepted or "
96
+ "control.command_rejected facts"
97
+ )
98
+ return guard
99
+
100
+
101
+ def envelope_to_session_event(envelope: SessionEventEnvelope) -> SessionEvent:
102
+ """Pack one envelope into the existing SessionEvent carrier."""
103
+
104
+ content: dict[str, Any] = {_ENVELOPE_CONTENT_KEY: envelope.model_dump(mode="json")}
105
+ binding = "session_event.seq"
106
+ if envelope.family == _RUNTIME_FAMILY and envelope.family_version == _RUNTIME_FAMILY_VERSION:
107
+ binding = "runtime_event.seq"
108
+ content[_RUNTIME_CONTENT_KEY] = dict(envelope.payload)
109
+ metadata: dict[str, Any] = {
110
+ _ENVELOPE_MARKER: True,
111
+ "schema_version": 1,
112
+ "family": envelope.family,
113
+ "family_version": envelope.family_version,
114
+ "canonical_event_id": str(envelope.event_id),
115
+ }
116
+ if envelope.run_id is not None:
117
+ metadata["run_id"] = envelope.run_id
118
+ return SessionEvent(
119
+ id=session_event_storage_id(envelope.session_id, str(envelope.event_id)),
120
+ session_id=envelope.session_id,
121
+ author=envelope.actor_ref or envelope.family,
122
+ event_type=envelope.event_type,
123
+ content=content,
124
+ timestamp=_timestamp_to_float(envelope.timestamp),
125
+ invocation_id=envelope.run_id,
126
+ metadata=metadata,
127
+ seq_binding=binding, # type: ignore[arg-type]
128
+ )
129
+
130
+
131
+ def session_event_to_envelope(event: SessionEvent) -> SessionEventEnvelope | None:
132
+ """Restore an envelope using the physical session cursor as ``seq``."""
133
+
134
+ metadata = event.metadata or {}
135
+ if not metadata.get(_ENVELOPE_MARKER):
136
+ return None
137
+ dump = dict((event.content or {}).get(_ENVELOPE_CONTENT_KEY) or {})
138
+ if not isinstance(dump, dict):
139
+ raise ValueError("canonical SessionEvent is missing session_event content")
140
+ if metadata.get("family") == _RUNTIME_FAMILY:
141
+ runtime_payload = (event.content or {}).get(_RUNTIME_CONTENT_KEY)
142
+ if not isinstance(runtime_payload, dict):
143
+ raise ValueError("runtime family SessionEvent is missing runtime_event content")
144
+ if runtime_payload.get("seq") != event.seq_id:
145
+ raise ValueError("runtime payload seq does not match physical seq")
146
+ dump["payload"] = dict(runtime_payload)
147
+ if str(dump.get("event_id")) != str(metadata.get("canonical_event_id")):
148
+ raise ValueError("canonical SessionEvent event id metadata does not match content")
149
+ dump["seq"] = event.seq_id
150
+ return SessionEventEnvelope.model_validate(dump)
151
+
152
+
153
+ class SessionServiceEventStore:
154
+ """``SessionEventStore`` adapter over one ``BaseSessionService`` backend.
155
+
156
+ ``fence_validator`` 是可选的 ActivationWriteGuard 事务内 CAS seam:
157
+ 提供时(典型为 ``AgentKernelStore.validate_write_fence``),每个
158
+ activation 写都在持久化之前比较当前 lease 的 fencing token,被
159
+ takeover 的旧 owner 得到 :class:`~ksadk.kernel.errors.StaleFenceError`。
160
+ validator 只看 guard,不向 envelope/payload 写入任何 fence 字段。
161
+ """
162
+
163
+ def __init__(
164
+ self,
165
+ session_service: BaseSessionService,
166
+ *,
167
+ fence_validator: Callable[
168
+ [SessionEventEnvelope, ActivationWriteGuard], Awaitable[None]
169
+ ]
170
+ | None = None,
171
+ ) -> None:
172
+ self._service = session_service
173
+ self._fence_validator = fence_validator
174
+
175
+ @property
176
+ def session_service(self) -> BaseSessionService:
177
+ return self._service
178
+
179
+ async def append(
180
+ self, envelope: SessionEventEnvelope, *, guard: SessionEventWriteGuard
181
+ ) -> SessionEventEnvelope:
182
+ validate_write_guard(envelope, guard)
183
+ if (
184
+ isinstance(guard, ActivationWriteGuard)
185
+ and self._fence_validator is not None
186
+ ):
187
+ await self._fence_validator(envelope, guard)
188
+ if not envelope.session_id.strip():
189
+ raise ValueError("session_id must be nonempty")
190
+ self._require_storage_capabilities(envelope)
191
+ existing = await self._find_envelope(envelope)
192
+ if existing is not None:
193
+ self._assert_same_fact(existing, envelope)
194
+ return existing
195
+ packed = envelope_to_session_event(envelope)
196
+ try:
197
+ stored = await self._service.append_event(envelope.session_id, packed)
198
+ except Exception:
199
+ # Deterministic physical id turns concurrent appends into an
200
+ # insert-winner/insert-loser race on durable backends.
201
+ existing = await self._find_envelope(envelope)
202
+ if existing is None:
203
+ raise
204
+ self._assert_same_fact(existing, envelope)
205
+ return existing
206
+ persisted = session_event_to_envelope(stored)
207
+ if persisted is None: # pragma: no cover - packed by this module
208
+ raise RuntimeError("SessionEventEnvelope lost its storage marker")
209
+ return persisted
210
+
211
+ async def read(
212
+ self, session_id: str, after_seq: int, limit: int
213
+ ) -> list[SessionEventEnvelope]:
214
+ if limit < 1:
215
+ raise ValueError("limit must be positive")
216
+ raw = await self._service.get_events(
217
+ session_id,
218
+ after_seq_id=int(after_seq),
219
+ limit=limit,
220
+ )
221
+ rows = sorted(raw, key=lambda event: event.seq_id)
222
+ envelopes = []
223
+ for row in rows:
224
+ envelope = session_event_to_envelope(row)
225
+ if envelope is None:
226
+ continue
227
+ _validate_runtime_payload(envelope)
228
+ envelopes.append(envelope)
229
+ return envelopes[:limit]
230
+
231
+ async def subscribe(
232
+ self,
233
+ session_id: str,
234
+ after_seq: int,
235
+ *,
236
+ poll_interval: float = 0.25,
237
+ timeout: float = 5 * 60,
238
+ should_stop: Callable[[], Awaitable[bool]] | None = None,
239
+ ) -> AsyncIterator[SessionEventEnvelope]:
240
+ """Replay ``seq > after_seq`` first, then follow live with the same cursor.
241
+
242
+ 只读取已 commit 的事实行(backend append 返回值),因此 publish 天然
243
+ 发生在 transaction commit 之后;replay→live 切换窗口由同一 cursor 去重。
244
+ """
245
+
246
+ cursor = int(after_seq or 0)
247
+ deadline = asyncio.get_running_loop().time() + timeout
248
+ while True:
249
+ rows = await self._service.get_events(session_id, after_seq_id=cursor)
250
+ rows.sort(key=lambda event: event.seq_id)
251
+ for row in rows:
252
+ cursor = row.seq_id
253
+ envelope = session_event_to_envelope(row)
254
+ if envelope is not None:
255
+ _validate_runtime_payload(envelope)
256
+ yield envelope
257
+ if asyncio.get_running_loop().time() >= deadline:
258
+ return
259
+ if should_stop is not None and await should_stop():
260
+ # 客户端断开:及时收口,而不是继续轮询到 timeout。
261
+ return
262
+ await asyncio.sleep(poll_interval)
263
+
264
+ async def _find_envelope(
265
+ self, envelope: SessionEventEnvelope
266
+ ) -> SessionEventEnvelope | None:
267
+ storage_id = session_event_storage_id(envelope.session_id, str(envelope.event_id))
268
+ stored = await self._service.get_event_by_id(envelope.session_id, storage_id)
269
+ return session_event_to_envelope(stored) if stored is not None else None
270
+
271
+ @staticmethod
272
+ def _assert_same_fact(
273
+ existing: SessionEventEnvelope, candidate: SessionEventEnvelope
274
+ ) -> None:
275
+ # ``seq`` is the store-assigned delivery cursor, not producer identity;
276
+ # the runtime payload's placeholder ``seq`` participates in the same rule.
277
+ def _comparable(envelope: SessionEventEnvelope) -> dict[str, Any]:
278
+ dump = envelope.model_dump(mode="json", exclude={"seq"})
279
+ payload = dict(dump.get("payload") or {})
280
+ payload.pop("seq", None)
281
+ dump["payload"] = payload
282
+ return dump
283
+
284
+ if _comparable(existing) != _comparable(candidate):
285
+ raise ValueError(f"SessionEvent id collision for {candidate.event_id!r}")
286
+
287
+ def _require_storage_capabilities(self, envelope: SessionEventEnvelope) -> None:
288
+ capabilities = self._service.storage_capabilities
289
+ required_binding = (
290
+ "runtime_event.seq"
291
+ if envelope.family == _RUNTIME_FAMILY
292
+ and envelope.family_version == _RUNTIME_FAMILY_VERSION
293
+ else "session_event.seq"
294
+ )
295
+ if required_binding not in capabilities.atomic_seq_bindings or (
296
+ not capabilities.indexed_event_lookup
297
+ ):
298
+ raise RuntimeError(
299
+ "session backend must support atomic "
300
+ f"{required_binding} binding and indexed physical event lookup"
301
+ )
302
+
303
+
304
+ def _validate_runtime_payload(envelope: SessionEventEnvelope) -> None:
305
+ """family=runtime/v2 时 payload 必须通过现有 RuntimeEvent/v2 校验。"""
306
+
307
+ if envelope.family != _RUNTIME_FAMILY or envelope.family_version != _RUNTIME_FAMILY_VERSION:
308
+ return
309
+ try:
310
+ parse_runtime_event(dict(envelope.payload))
311
+ except Exception as error: # noqa: BLE001 - surface as contract violation
312
+ raise ValueError(
313
+ f"runtime family payload failed RuntimeEvent/v2 validation: {error}"
314
+ ) from error
315
+
316
+
317
+ __all__ = [
318
+ "SessionEventStore",
319
+ "SessionServiceEventStore",
320
+ "validate_write_guard",
321
+ "envelope_to_session_event",
322
+ "session_event_to_envelope",
323
+ "session_event_storage_id",
324
+ ]