agentengine-sdk-python 0.8.1__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 (411) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/METADATA +22 -2
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/RECORD +356 -222
  3. ksadk/a2a/_space_client_events.py +381 -0
  4. ksadk/a2a/event_adapter.py +156 -64
  5. ksadk/a2a/executor.py +179 -63
  6. ksadk/a2a/space_client.py +6 -333
  7. ksadk/a2ui/core.py +222 -53
  8. ksadk/agui/_agent_helpers.py +243 -0
  9. ksadk/agui/a2ui_projection.py +12 -5
  10. ksadk/agui/agent.py +443 -259
  11. ksadk/api/client.py +525 -27
  12. ksadk/builders/code_builder.py +284 -8
  13. ksadk/builders/container_builder.py +8 -1
  14. ksadk/builders/managed_runtime_builder.py +39 -35
  15. ksadk/cli/__init__.py +17 -0
  16. ksadk/cli/cmd_dashboard.py +15 -1
  17. ksadk/cli/cmd_deploy.py +10 -2
  18. ksadk/cli/cmd_eval.py +66 -9
  19. ksadk/cli/cmd_evalset.py +284 -0
  20. ksadk/cli/cmd_files.py +5 -1
  21. ksadk/cli/cmd_hermes.py +1 -126
  22. ksadk/cli/cmd_invoke.py +28 -38
  23. ksadk/cli/cmd_managed_runtime.py +95 -0
  24. ksadk/cli/cmd_observe.py +85 -0
  25. ksadk/cli/cmd_openclaw.py +1 -435
  26. ksadk/cli/cmd_replay.py +28 -4
  27. ksadk/cli/cmd_studio.py +99 -8
  28. ksadk/cli/cmd_web.py +10 -2
  29. ksadk/cli/hermes_env.py +151 -0
  30. ksadk/cli/invoke_payload.py +49 -0
  31. ksadk/cli/openclaw_env.py +458 -0
  32. ksadk/codex/client.py +180 -30
  33. ksadk/codex/runtime.py +428 -326
  34. ksadk/configs/env_registry.py +66 -12
  35. ksadk/configs/env_registry_pcm.py +181 -0
  36. ksadk/configs/env_var_spec.py +18 -0
  37. ksadk/configs/global_config.py +5 -0
  38. ksadk/context_engine/__init__.py +98 -0
  39. ksadk/context_engine/assembler.py +176 -0
  40. ksadk/context_engine/baseline.py +419 -0
  41. ksadk/context_engine/cache_observability.py +228 -0
  42. ksadk/context_engine/capabilities.py +443 -0
  43. ksadk/context_engine/contributors.py +344 -0
  44. ksadk/context_engine/hosted_pipeline.py +417 -0
  45. ksadk/context_engine/models.py +117 -0
  46. ksadk/context_engine/planner.py +698 -0
  47. ksadk/context_engine/policies.py +319 -0
  48. ksadk/context_engine/projection.py +31 -0
  49. ksadk/context_engine/shadow_plan.py +266 -0
  50. ksadk/context_engine/tokenizer.py +164 -0
  51. ksadk/conversations/context.py +126 -6
  52. ksadk/conversations/message_projection.py +292 -28
  53. ksadk/conversations/model_context.py +49 -3
  54. ksadk/conversations/runtime_compaction.py +207 -5
  55. ksadk/conversations/runtime_input.py +184 -2
  56. ksadk/conversations/runtime_invocation.py +81 -3
  57. ksadk/conversations/runtime_observability.py +141 -0
  58. ksadk/conversations/runtime_payloads.py +42 -0
  59. ksadk/conversations/runtime_preparation.py +272 -2
  60. ksadk/conversations/runtime_resume.py +20 -1
  61. ksadk/conversations/runtime_stream_events.py +94 -9
  62. ksadk/conversations/semantic_summary.py +311 -1
  63. ksadk/conversations/session_lock.py +51 -0
  64. ksadk/deployment/env_forward.py +72 -0
  65. ksadk/deployment/managed_runtime.py +5 -0
  66. ksadk/deployment/providers/serverless.py +143 -69
  67. ksadk/evaluation/__init__.py +32 -0
  68. ksadk/evaluation/a2a_adapter.py +9 -1
  69. ksadk/evaluation/adapters.py +18 -5
  70. ksadk/evaluation/agent_eval_client.py +395 -0
  71. ksadk/evaluation/cloud_binding.py +80 -0
  72. ksadk/evaluation/cloud_converter.py +194 -0
  73. ksadk/evaluation/cloud_service.py +199 -0
  74. ksadk/evaluation/contracts.py +73 -4
  75. ksadk/evaluation/evaluators.py +183 -17
  76. ksadk/evaluation/evidence.py +258 -0
  77. ksadk/evaluation/executor.py +31 -6
  78. ksadk/evaluation/local_adapter.py +550 -0
  79. ksadk/evaluation/service_env.py +27 -0
  80. ksadk/evaluation/studio_build_adapter.py +253 -0
  81. ksadk/evaluation/target.py +15 -6
  82. ksadk/events/__init__.py +13 -13
  83. ksadk/events/_v1_compat/__init__.py +1 -0
  84. ksadk/events/_v1_compat/models.py +299 -0
  85. ksadk/events/_v1_compat/parser.py +247 -0
  86. ksadk/events/_v1_compat/projection.py +753 -0
  87. ksadk/events/adapters/__init__.py +34 -0
  88. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  89. ksadk/events/adapters/_a2a_support.py +275 -0
  90. ksadk/events/adapters/_codex_interactions.py +375 -0
  91. ksadk/events/adapters/_codex_items.py +801 -0
  92. ksadk/events/adapters/_codex_validators.py +311 -0
  93. ksadk/events/adapters/_langgraph_support.py +785 -0
  94. ksadk/events/adapters/a2a.py +841 -0
  95. ksadk/events/adapters/adk.py +503 -0
  96. ksadk/events/adapters/codex.py +717 -0
  97. ksadk/events/adapters/langgraph.py +745 -0
  98. ksadk/events/canonical.py +440 -0
  99. ksadk/events/canonical_replay.py +497 -0
  100. ksadk/events/canonical_store.py +468 -0
  101. ksadk/events/cold_recovery.py +257 -0
  102. ksadk/events/content.py +89 -0
  103. ksadk/events/identity.py +86 -0
  104. ksadk/events/pipeline.py +455 -0
  105. ksadk/events/projections.py +66 -0
  106. ksadk/events/reducer.py +661 -0
  107. ksadk/events/replay.py +3 -36
  108. ksadk/events/runtime_event.py +20 -265
  109. ksadk/events/session_event.py +324 -0
  110. ksadk/events/store.py +3 -316
  111. ksadk/events/v1_compat.py +41 -0
  112. ksadk/harness/runtime.py +160 -57
  113. ksadk/identity/resolver.py +4 -3
  114. ksadk/interaction/__init__.py +28 -0
  115. ksadk/interaction/contracts.py +136 -0
  116. ksadk/interaction/ledger.py +189 -0
  117. ksadk/interaction/provider.py +122 -0
  118. ksadk/interaction/providers/__init__.py +52 -0
  119. ksadk/interaction/providers/adk.py +40 -0
  120. ksadk/interaction/providers/codex.py +94 -0
  121. ksadk/interaction/providers/langgraph.py +58 -0
  122. ksadk/kernel/__init__.py +117 -0
  123. ksadk/kernel/authorization.py +258 -0
  124. ksadk/kernel/bootstrap.py +1074 -0
  125. ksadk/kernel/contract_fingerprints.py +61 -0
  126. ksadk/kernel/contracts.py +362 -0
  127. ksadk/kernel/control.py +219 -0
  128. ksadk/kernel/errors.py +79 -0
  129. ksadk/kernel/ingress.py +1102 -0
  130. ksadk/kernel/mapping.py +111 -0
  131. ksadk/kernel/memory_store.py +1133 -0
  132. ksadk/kernel/postgres_store.py +1756 -0
  133. ksadk/kernel/recovery.py +452 -0
  134. ksadk/kernel/runtime_identity.py +103 -0
  135. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  136. ksadk/kernel/sqlite_store.py +1410 -0
  137. ksadk/kernel/state.py +145 -0
  138. ksadk/kernel/store.py +232 -0
  139. ksadk/kernel/worker.py +953 -0
  140. ksadk/knowledge_base/client.py +7 -0
  141. ksadk/knowledge_base/service.py +32 -5
  142. ksadk/memory/__init__.py +61 -0
  143. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  144. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  145. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  146. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  147. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  148. ksadk/memory/coordinator.py +461 -0
  149. ksadk/memory/events.py +202 -0
  150. ksadk/memory/extraction.py +228 -0
  151. ksadk/memory/ltm_backend_factory.py +16 -3
  152. ksadk/memory/models.py +316 -0
  153. ksadk/memory/policy.py +215 -0
  154. ksadk/memory/provider.py +47 -0
  155. ksadk/memory/provider_adapter.py +159 -0
  156. ksadk/memory/provider_resolver.py +71 -0
  157. ksadk/memory/providers/__init__.py +5 -0
  158. ksadk/memory/providers/local_sqlite.py +490 -0
  159. ksadk/memory/resolved_policy.py +145 -0
  160. ksadk/memory/service.py +188 -6
  161. ksadk/model_proxy/bootstrap.py +16 -9
  162. ksadk/model_proxy/detect.py +202 -9
  163. ksadk/model_proxy/namespace.py +39 -15
  164. ksadk/model_proxy/server.py +24 -5
  165. ksadk/model_proxy/transform.py +60 -2
  166. ksadk/observability/__init__.py +25 -0
  167. ksadk/observability/session_log.py +420 -0
  168. ksadk/observability/trajectory.py +105 -0
  169. ksadk/prompts/__init__.py +71 -0
  170. ksadk/prompts/compiler.py +215 -0
  171. ksadk/prompts/models.py +82 -0
  172. ksadk/prompts/projection.py +89 -0
  173. ksadk/prompts/resolved.py +137 -0
  174. ksadk/prompts/sources.py +233 -0
  175. ksadk/runners/_langgraph_runner_streams.py +822 -0
  176. ksadk/runners/adk_runner.py +5 -5
  177. ksadk/runners/base_runner.py +16 -0
  178. ksadk/runners/factory.py +1 -2
  179. ksadk/runners/langgraph_runner.py +198 -437
  180. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  181. ksadk/runtime/_runner_adapter/stream_mapping.py +788 -0
  182. ksadk/runtime/adapter.py +118 -2
  183. ksadk/runtime/conversation_execution.py +316 -182
  184. ksadk/runtime/executor.py +144 -3
  185. ksadk/runtime/factory.py +193 -7
  186. ksadk/runtime/hosted_finalizer.py +268 -0
  187. ksadk/runtime/launch.py +14 -1
  188. ksadk/runtime/preprocessing.py +25 -3
  189. ksadk/runtime/runner_adapter.py +288 -508
  190. ksadk/runtime/usage.py +33 -0
  191. ksadk/sandbox/backends/e2b.py +35 -2
  192. ksadk/server/composition.py +8 -0
  193. ksadk/server/factory.py +69 -6
  194. ksadk/server/routes/kernel_ingress.py +258 -0
  195. ksadk/server/routes/openai_compat.py +88 -8
  196. ksadk/server/routes/projection.py +35 -20
  197. ksadk/server/routes/run.py +94 -0
  198. ksadk/server/routes/sessions.py +2 -0
  199. ksadk/server/routes/streaming.py +5 -2
  200. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-DSU1sWD_.js} +1 -1
  201. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-DOH6MVcn.js} +4 -4
  202. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-BL8my1R2.js} +4 -4
  203. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  204. ksadk/server/static/assets/MermaidBlock-Dz4IP-Tx.js +312 -0
  205. ksadk/server/static/assets/NativeTerminalPanel-DUrK0JpZ.js +1 -0
  206. ksadk/server/static/assets/abnfDiagram-VCTEODGH-g20pFzNV.js +1 -0
  207. ksadk/server/static/assets/arc-C4FzinUA.js +1 -0
  208. ksadk/server/static/assets/architecture-7GRP2DOG-DjKratdf.js +1 -0
  209. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-DpIqL5h4.js +36 -0
  210. ksadk/server/static/assets/blockDiagram-NRAW4CY4-BjkljTNz.js +129 -0
  211. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-Dk_ieq2X.js +38 -0
  212. ksadk/server/static/assets/channel-4cQHKtx1.js +1 -0
  213. ksadk/server/static/assets/chunk-2Q5K7J3B-DmgWkESh.js +1 -0
  214. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-BVHAchFb.js} +1 -1
  215. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-C-ipQzuS.js} +1 -1
  216. ksadk/server/static/assets/chunk-G27WJ6UU-C2EyJbIK.js +231 -0
  217. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-vYvVJb_M.js} +1 -1
  218. ksadk/server/static/assets/chunk-LCL6LL3I-BcI6ysPT.js +206 -0
  219. ksadk/server/static/assets/chunk-POPQ4Y6H-C030x_Z1.js +1 -0
  220. ksadk/server/static/assets/chunk-RHFEMEQ7-yyGpsz4n.js +168 -0
  221. ksadk/server/static/assets/chunk-SVP7TREG-BLTlmMU7.js +88 -0
  222. ksadk/server/static/assets/chunk-XXDRQBXY-C_32ArgP.js +1 -0
  223. ksadk/server/static/assets/classDiagram-DTDB5LWJ-DLFd9Xi0.js +1 -0
  224. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-DLFd9Xi0.js +1 -0
  225. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-9YQYwdl0.js} +1 -1
  226. ksadk/server/static/assets/cynefin-OW5HDTMX-DjEM48Qp.js +1 -0
  227. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-ErLF5N13.js +62 -0
  228. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  229. ksadk/server/static/assets/dagre-3AP2YEHR-DFiQF-6f.js +4 -0
  230. ksadk/server/static/assets/dagre-BuhGnRI1.js +1 -0
  231. ksadk/server/static/assets/diagram-S7CK7UJ4-Bt1v8-GC.js +30 -0
  232. ksadk/server/static/assets/diagram-UQ7AKVKN-DSCxJdBK.js +41 -0
  233. ksadk/server/static/assets/diagram-VSXAHHWV-DHfYwp_9.js +3 -0
  234. ksadk/server/static/assets/diagram-VX7I27RA-DdzD-4Le.js +24 -0
  235. ksadk/server/static/assets/diagram-Z3DM3KII-Du-nAJ9F.js +24 -0
  236. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-8hqcx0sU.js} +1 -1
  237. ksadk/server/static/assets/dist-B7seoj3d.js +1 -0
  238. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-BE7bu-DL.js} +1 -1
  239. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-BVDffZ0U.js} +1 -1
  240. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-BX8z72IC.js} +1 -1
  241. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-Bf2M8m3N.js} +1 -1
  242. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-BjU6y-A2.js} +1 -1
  243. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-BytlxIDT.js} +1 -1
  244. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-CSh_DE14.js} +1 -1
  245. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-CXYYBw3_.js} +1 -1
  246. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-C_wsv-Qd.js} +1 -1
  247. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-ClxGviKw.js} +1 -1
  248. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-CttYUqzS.js} +1 -1
  249. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DNp6rLRA.js} +1 -1
  250. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-DUX-id_F.js} +1 -1
  251. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-DmldrHd_.js} +1 -1
  252. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DnfXs8Vn.js} +2 -2
  253. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Dq9gLD7L.js} +1 -1
  254. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-W-TIVntx.js} +1 -1
  255. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-dDdADKFA.js} +1 -1
  256. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-dydu68Fl.js} +1 -1
  257. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-ngtN0DJB.js} +1 -1
  258. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-Da9C9NO1.js +1 -0
  259. ksadk/server/static/assets/erDiagram-SSCWMZ5O-EAGqqR79.js +99 -0
  260. ksadk/server/static/assets/eventmodeling-NTZA5JFV-CMgMaJrC.js +1 -0
  261. ksadk/server/static/assets/flowDiagram-A5DVABFB-BBKL0x3P.js +1 -0
  262. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-DqJsKb59.js +292 -0
  263. ksadk/server/static/assets/gitGraph-4MIJSDKK-Dw63mrhw.js +1 -0
  264. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-B6g4dtDi.js +106 -0
  265. ksadk/server/static/assets/index-8ipRcQ-M.js +240 -0
  266. ksadk/server/static/assets/index-ByFCqjlh.css +2 -0
  267. ksadk/server/static/assets/info-A6RAGUB7-B6iAblII.js +1 -0
  268. ksadk/server/static/assets/infoDiagram-RXCK75RN-Djm_nbd5.js +2 -0
  269. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-DWya9SG2.js} +6 -6
  270. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DutxhSNI.js} +6 -6
  271. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-DJdOF8Fm.js} +10 -10
  272. ksadk/server/static/assets/katex-vFWytM5c.js +257 -0
  273. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-BHjG8b-J.js} +1 -1
  274. ksadk/server/static/assets/mermaid-parser.core-KGSy4jWT.js +166 -0
  275. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-9-HC88D4.js} +29 -29
  276. ksadk/server/static/assets/packet-AYTQ26CC-BOYAipuq.js +1 -0
  277. ksadk/server/static/assets/pegDiagram-XKGWAZYB-DrEZd4fD.js +1 -0
  278. ksadk/server/static/assets/pie-WAS4IAKB-Ctq0Kbku.js +1 -0
  279. ksadk/server/static/assets/pieDiagram-E7YTZNPT-DpjqOFFp.js +39 -0
  280. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-BiNhgOXX.js} +6 -6
  281. ksadk/server/static/assets/radar-RG4KPBEZ-DN0-ul_0.js +1 -0
  282. ksadk/server/static/assets/railroad-74A4TZTK-C6cC_to0.js +1 -0
  283. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-BimjIuRc.js +1 -0
  284. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-CvY65ABq.js +1 -0
  285. ksadk/server/static/assets/railroad-peg-WCYAUIDC-D72Iq_Tv.js +1 -0
  286. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-_Y3Ojg6G.js +1 -0
  287. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-DeCFdg9K.js +84 -0
  288. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-CPH75rhw.js} +7 -7
  289. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-OEpQQdr4.js} +10 -10
  290. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-heUErzhI.js +1 -0
  291. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-DvA3jSMB.js +1 -0
  292. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-BgQY03nz.js +1 -0
  293. ksadk/server/static/assets/swimlanes-XN3QIQJK-CR-dfN_t.js +1 -0
  294. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-DLVw3q5Q.js +8 -0
  295. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-DAVJf1TX.js} +7 -7
  296. ksadk/server/static/assets/treeView-Q6P3EWNA-BMpO0wsB.js +1 -0
  297. ksadk/server/static/assets/treemap-WGGIJYW6-Et0aqzU3.js +1 -0
  298. ksadk/server/static/assets/vennDiagram-4TSXK5OY-DwM8eDkh.js +34 -0
  299. ksadk/server/static/assets/wardley-WFR3VGLG-CbY0mhpl.js +1 -0
  300. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DZL-Zz2t.js +78 -0
  301. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-Dy6Yh_hu.js +7 -0
  302. ksadk/server/static/index.html +2 -2
  303. ksadk/sessions/__init__.py +26 -9
  304. ksadk/sessions/_local_service_sync.py +688 -0
  305. ksadk/sessions/_local_tables.py +21 -0
  306. ksadk/sessions/_postgres_schema.py +305 -0
  307. ksadk/sessions/_postgres_tables.py +15 -0
  308. ksadk/sessions/base.py +80 -1
  309. ksadk/sessions/in_memory.py +53 -2
  310. ksadk/sessions/local_service.py +63 -604
  311. ksadk/sessions/postgres_service.py +58 -148
  312. ksadk/sessions/resilient.py +35 -1
  313. ksadk/studio/api.py +577 -25
  314. ksadk/studio/api_contracts.py +114 -5
  315. ksadk/studio/api_memory_routes.py +82 -0
  316. ksadk/studio/authoring.py +252 -27
  317. ksadk/studio/authoring_coordinator.py +799 -67
  318. ksadk/studio/builder.py +88 -11
  319. ksadk/studio/capabilities.py +17 -0
  320. ksadk/studio/cloud.py +1916 -95
  321. ksadk/studio/codex_agent_service.py +125 -14
  322. ksadk/studio/codex_authoring.py +469 -0
  323. ksadk/studio/codex_builder.py +138 -25
  324. ksadk/studio/codex_manifest.py +51 -22
  325. ksadk/studio/codex_run.py +46 -3
  326. ksadk/studio/compiler.py +1 -0
  327. ksadk/studio/contracts.py +114 -3
  328. ksadk/studio/event_store.py +25 -95
  329. ksadk/studio/framework_run.py +231 -3
  330. ksadk/studio/hosted_kernel.py +317 -0
  331. ksadk/studio/manifest_resolver.py +131 -0
  332. ksadk/studio/model_client.py +95 -9
  333. ksadk/studio/model_profile_service.py +1 -1
  334. ksadk/studio/operations.py +37 -5
  335. ksadk/studio/otel_trace.py +348 -42
  336. ksadk/studio/pcm_memory.py +85 -0
  337. ksadk/studio/repository.py +23 -2
  338. ksadk/studio/resource_catalog.py +43 -0
  339. ksadk/studio/run_service.py +563 -137
  340. ksadk/studio/runtime_source.py +42 -16
  341. ksadk/studio/service.py +1180 -72
  342. ksadk/studio/shared_web.py +32 -22
  343. ksadk/studio/static/assets/index-BLpcdrgW.css +1 -0
  344. ksadk/studio/static/assets/index-CYekR2Xv.js +260 -0
  345. ksadk/studio/static/index.html +2 -2
  346. ksadk/studio/templates.py +100 -8
  347. ksadk/studio/validator.py +19 -0
  348. ksadk/studio/workspace.py +30 -32
  349. ksadk/tracing/setup.py +304 -3
  350. ksadk/version.py +1 -1
  351. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  352. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  353. ksadk/events/parser.py +0 -191
  354. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  355. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  356. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  357. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  358. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  359. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  360. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  361. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  362. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  363. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  364. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  365. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  366. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  367. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  368. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  369. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  370. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  371. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  372. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  373. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  374. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  375. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  376. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  377. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  378. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  379. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  380. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  381. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  382. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  383. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  384. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  385. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  386. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  387. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  388. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  389. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  390. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  391. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  392. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  393. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  394. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  395. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  396. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  397. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  398. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  399. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  400. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  401. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  402. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  403. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  404. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  405. ksadk/studio/evaluation.py +0 -192
  406. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  407. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  408. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/WHEEL +0 -0
  409. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/entry_points.txt +0 -0
  410. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/licenses/LICENSE +0 -0
  411. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.2.dist-info}/top_level.txt +0 -0
@@ -1,13 +1,19 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import logging
3
4
  import os
4
5
  from typing import Any, Callable, Dict, Mapping, Optional, Sequence
5
6
 
7
+ from ksadk.context_engine.shadow_plan import (
8
+ build_shadow_context_plan_dict,
9
+ minimal_shadow_context_plan_dict,
10
+ )
6
11
  from ksadk.conversations.attachments import compact_attachment_result_for_session
7
12
  from ksadk.conversations.context import (
8
13
  build_history_from_events,
9
14
  build_request_history,
10
15
  build_responses_history_from_messages,
16
+ canonical_event_type,
11
17
  project_responses_history,
12
18
  )
13
19
  from ksadk.conversations.model_options import normalize_model_options
@@ -66,7 +72,9 @@ from ksadk.conversations.runtime_resume import (
66
72
  )
67
73
  from ksadk.ids import new_run_id
68
74
  from ksadk.model_policy import model_policy_options_for_model
69
- from ksadk.sessions import resolve_session_service
75
+ from ksadk.sessions import SessionEvent, resolve_session_service
76
+
77
+ logger = logging.getLogger(__name__)
70
78
 
71
79
 
72
80
  async def build_run_input(
@@ -87,6 +95,21 @@ async def build_run_input(
87
95
  governance_state: RuntimeGovernanceState | None = None,
88
96
  session_service_provider: Callable[[], Any] | None = None,
89
97
  run_mode: str = RUN_MODE_FOREGROUND,
98
+ runner: Any | None = None,
99
+ runtime_type: str | None = None,
100
+ agent_system: str = "",
101
+ agent_task: str = "",
102
+ prompt_integration_mode: str = "",
103
+ context_engine_rollout: str | None = None,
104
+ memory_recall_enabled: bool | None = None,
105
+ memory_write_rollout: str | None = None,
106
+ memory_enabled: bool | None = None,
107
+ memory_write_mode: str = "candidate",
108
+ flush_before_compaction: bool = True,
109
+ provider_ref: str = "local-default",
110
+ deployment_mode: str = "local",
111
+ agent_max_input_tokens: int | None = None,
112
+ agent_reserve_output_tokens: int | None = None,
90
113
  ) -> PreparedConversationTurn:
91
114
  """构建一次 turn 的标准运行输入,并在进入模型前做上下文投影/压缩。
92
115
 
@@ -124,6 +147,26 @@ async def build_run_input(
124
147
  }
125
148
  normalized_instructions = str(instructions or "").strip()
126
149
 
150
+ # PR A:当 agent_system/agent_task 非空时,编译真实 CompiledPrompt(含 stable section)。
151
+ # 仅用于 hash/trace/future projection,不改 Runner 输入(payload["instructions"] 不变)。
152
+ # platform_policy_source 默认 EnvPlatformPolicySource(env 未设→不产 platform_safety)。
153
+ compiled_prompt: dict[str, Any] | None = None
154
+ if (agent_system or "").strip() or (agent_task or "").strip():
155
+ from ksadk.prompts.resolved import (
156
+ ResolvedPromptSources,
157
+ compile_resolved_prompt_dict,
158
+ get_default_platform_policy_source,
159
+ )
160
+
161
+ compiled_prompt = compile_resolved_prompt_dict(
162
+ ResolvedPromptSources(
163
+ agent_system=agent_system,
164
+ agent_task=agent_task,
165
+ request_instructions=normalized_instructions,
166
+ platform_policy_source=get_default_platform_policy_source(),
167
+ )
168
+ )
169
+
127
170
  if resume_input is not None:
128
171
  if not session_id:
129
172
  raise ValueError("Responses resume input requires session_id")
@@ -184,6 +227,16 @@ async def build_run_input(
184
227
  resume_input=normalized_resume_input,
185
228
  run_mode=caller_run_mode,
186
229
  run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
230
+ shadow_context_plan=minimal_shadow_context_plan_dict(
231
+ runner=runner, runtime_type=runtime_type, deployment_mode=deployment_mode
232
+ ),
233
+ compiled_prompt=None,
234
+ memory_write_rollout=memory_write_rollout,
235
+ memory_enabled=memory_enabled,
236
+ memory_recall_enabled=memory_recall_enabled,
237
+ memory_write_mode=memory_write_mode,
238
+ flush_before_compaction=flush_before_compaction,
239
+ provider_ref=provider_ref,
187
240
  )
188
241
 
189
242
  is_approval_resume = _is_approval_resume_input(normalized_resume_input)
@@ -287,6 +340,23 @@ async def build_run_input(
287
340
  resume_input=effective_resume_input,
288
341
  run_mode=caller_run_mode,
289
342
  run_trigger=RUN_TRIGGER_APPROVAL_RESUME,
343
+ shadow_context_plan=build_shadow_context_plan_dict(
344
+ instructions=normalized_instructions,
345
+ history=history,
346
+ user_input=resume_text,
347
+ request_metadata=normalized_request_metadata,
348
+ runner=runner,
349
+ runtime_type=runtime_type,
350
+ model_metadata=resolved_model_metadata,
351
+ deployment_mode=deployment_mode,
352
+ ),
353
+ compiled_prompt=None,
354
+ memory_write_rollout=memory_write_rollout,
355
+ memory_enabled=memory_enabled,
356
+ memory_recall_enabled=memory_recall_enabled,
357
+ memory_write_mode=memory_write_mode,
358
+ flush_before_compaction=flush_before_compaction,
359
+ provider_ref=provider_ref,
290
360
  )
291
361
 
292
362
  normalized_messages = _normalized_conversation_messages(messages)
@@ -349,6 +419,17 @@ async def build_run_input(
349
419
  user_input=user_input or user_display_input,
350
420
  )
351
421
 
422
+ # compaction_owner 硬门控(方案 §6.2):从 capability 取 owner,非 ksadk 时不走双阈值
423
+ from ksadk.context_engine.capabilities import (
424
+ capabilities_for_runner,
425
+ capabilities_for_runtime_type,
426
+ )
427
+
428
+ _caps = (
429
+ capabilities_for_runner(runner)
430
+ if runner is not None
431
+ else capabilities_for_runtime_type(runtime_type)
432
+ )
352
433
  checkpoint = await _compact_conversation_history_with_governance(
353
434
  governance_state,
354
435
  session_id=resolved_session_id,
@@ -357,6 +438,9 @@ async def build_run_input(
357
438
  model=model,
358
439
  model_metadata=resolved_model_metadata,
359
440
  session_service_provider=provider,
441
+ # PR D1:双阈值门控透传。ksadk_hosted → soft/hard proactive compact;否则旧单阈值。
442
+ prompt_integration_mode=prompt_integration_mode,
443
+ compaction_owner=_caps.compaction_owner,
360
444
  )
361
445
  event_history = await service.get_events(resolved_session_id)
362
446
  history = build_history_from_events(event_history)
@@ -372,10 +456,32 @@ async def build_run_input(
372
456
  request_responses_history,
373
457
  responses_history,
374
458
  )
459
+ # The current user event is persisted before context construction so an
460
+ # interrupted turn remains auditable. That event belongs to
461
+ # ``current_input`` though, not to prior history. Keep the legacy
462
+ # ``prepared.history`` contract unchanged for non-hosted paths, while the
463
+ # KsADK-owned planner receives only events from earlier invocations. Using
464
+ # invocation_id (instead of text equality) also handles users deliberately
465
+ # repeating the same message across turns.
466
+ hosted_history = _merge_request_history_with_session_history(
467
+ request_history,
468
+ build_history_from_events(
469
+ [event for event in event_history if event.invocation_id != resolved_invocation_id]
470
+ ),
471
+ )
472
+ # PR D2:取最新 checkpoint 的 WorkingState(仅 ksadk_hosted 路径重注入)。
473
+ # 非 ksadk_hosted → working_state=None(零注入,Runner 输入与旧逻辑一致)。
474
+ # PTL retry 后 _refresh_history 也会重读 events,但此处 build_run_input 首次构建时取一次即可;
475
+ # PTL 路径若产生新 checkpoint,retry 用 prepared 已有 working_state(保守:不中途换)。
476
+ working_state: dict[str, Any] | None = None
477
+ if prompt_integration_mode == "ksadk_hosted":
478
+ working_state = _latest_checkpoint_working_state(event_history)
375
479
 
376
- return PreparedConversationTurn(
480
+ prepared = PreparedConversationTurn(
377
481
  session_id=resolved_session_id,
378
482
  invocation_id=resolved_invocation_id,
483
+ user_id=resolved_user_id,
484
+ agent_id=agent_id,
379
485
  user_input=user_input,
380
486
  user_display_input=user_display_input or user_input,
381
487
  history=history,
@@ -405,7 +511,171 @@ async def build_run_input(
405
511
  ),
406
512
  run_mode=caller_run_mode,
407
513
  run_trigger=caller_run_trigger,
514
+ shadow_context_plan=build_shadow_context_plan_dict(
515
+ instructions=normalized_instructions,
516
+ history=hosted_history if prompt_integration_mode == "ksadk_hosted" else history,
517
+ user_input=user_input,
518
+ request_metadata=normalized_request_metadata,
519
+ runner=runner,
520
+ runtime_type=runtime_type,
521
+ model_metadata=resolved_model_metadata,
522
+ prompt_shadow=compiled_prompt,
523
+ prompt_integration_mode=prompt_integration_mode,
524
+ deployment_mode=deployment_mode,
525
+ ),
526
+ compiled_prompt=compiled_prompt,
527
+ prompt_integration_mode=prompt_integration_mode,
528
+ working_state=working_state,
529
+ memory_write_rollout=memory_write_rollout,
530
+ memory_enabled=memory_enabled,
531
+ memory_recall_enabled=memory_recall_enabled,
532
+ memory_write_mode=memory_write_mode,
533
+ flush_before_compaction=flush_before_compaction,
534
+ provider_ref=provider_ref,
535
+ )
536
+ # PR E:ksadk_hosted + V2 开关时运行真实 hosted 链路,回填 context_plan/assembled_input。
537
+ # 失败回退空字段(prepared 字段语义完整),不阻断主链路。
538
+ await _maybe_fill_hosted_pipeline(
539
+ prepared,
540
+ compiled_prompt=compiled_prompt,
541
+ user_input=user_input,
542
+ history=hosted_history,
543
+ working_state=working_state,
544
+ model_metadata=resolved_model_metadata,
545
+ prompt_integration_mode=prompt_integration_mode,
546
+ context_engine_rollout=context_engine_rollout,
547
+ memory_recall_enabled=memory_recall_enabled,
548
+ runtime_type=runtime_type,
549
+ session_id=resolved_session_id,
550
+ invocation_id=resolved_invocation_id,
551
+ user_id=resolved_user_id,
552
+ agent_id=agent_id,
553
+ agent_max_input_tokens=agent_max_input_tokens,
554
+ agent_reserve_output_tokens=agent_reserve_output_tokens,
555
+ )
556
+ return prepared
557
+
558
+
559
+ async def _maybe_fill_hosted_pipeline(
560
+ prepared: PreparedConversationTurn,
561
+ *,
562
+ compiled_prompt: dict[str, Any] | None,
563
+ user_input: str,
564
+ history: list[dict[str, str]],
565
+ working_state: dict[str, Any] | None,
566
+ model_metadata: dict[str, Any],
567
+ prompt_integration_mode: str,
568
+ context_engine_rollout: str | None,
569
+ memory_recall_enabled: bool | None,
570
+ agent_max_input_tokens: int | None = None,
571
+ agent_reserve_output_tokens: int | None = None,
572
+ runtime_type: str | None,
573
+ session_id: str,
574
+ invocation_id: str,
575
+ user_id: str,
576
+ agent_id: str,
577
+ ) -> None:
578
+ """PR E:在 ksadk_hosted + V2 时运行 hosted 链路并回填 plan/assembly。
579
+
580
+ 门控三重:``KSADK_CONTEXT_ENGINE_V2_ENABLED`` × ``prompt_integration_mode=="ksadk_hosted"``
581
+ × 已编译出含 prompt_content 的 CompiledPrompt(agent_system/agent_task 非空)。任一不满足
582
+ → 不回填(走旧 PR B 分支,字节级一致)。
583
+
584
+ 仅对 ``prompt_owner=ksadk`` 的 runtime(langgraph 系)启用;native_runtime(codex)不进入,
585
+ 保证 Managed Codex 不被接管(方案 §6.2 / PCM-RUNNER-003)。
586
+ """
587
+ from ksadk.context_engine.capabilities import (
588
+ assert_capability_not_circuit_open,
589
+ capabilities_for_runtime_type,
408
590
  )
591
+ from ksadk.context_engine.hosted_pipeline import (
592
+ default_hosted_contributors,
593
+ hosted_pipeline_enabled,
594
+ run_hosted_pipeline,
595
+ )
596
+
597
+ if (
598
+ not hosted_pipeline_enabled(rollout=context_engine_rollout)
599
+ or prompt_integration_mode != "ksadk_hosted"
600
+ ):
601
+ return
602
+ if (
603
+ not isinstance(compiled_prompt, dict)
604
+ or not str(compiled_prompt.get("prompt_content") or "").strip()
605
+ ):
606
+ return
607
+ caps = capabilities_for_runtime_type(runtime_type)
608
+ if caps.prompt_owner != "ksadk":
609
+ return
610
+ # 门禁:该 Runner 若已因 capability mismatch 熔断,回退旧路径(方案 §6.1)。不抛给主链路。
611
+ try:
612
+ assert_capability_not_circuit_open(runtime_type=runtime_type, label="hosted_pipeline")
613
+ except Exception: # noqa: BLE001
614
+ logger.info("hosted pipeline skipped for session=%s: capability circuit open", session_id)
615
+ return
616
+ # PR E:注入默认 Contributors(MemoryRecall 等)进真实链路(方案 §8.7)。
617
+ contributors = default_hosted_contributors(
618
+ user_id=user_id,
619
+ agent_id=agent_id,
620
+ memory_recall_enabled=memory_recall_enabled,
621
+ )
622
+ try:
623
+ result = await run_hosted_pipeline(
624
+ compiled_prompt=compiled_prompt,
625
+ user_input=user_input,
626
+ history=history,
627
+ working_state=working_state,
628
+ model_metadata=model_metadata,
629
+ contributors=contributors,
630
+ # 与 shadow_plan 口径一致:ksadk_hosted + prompt_owner=ksadk + langgraph → ksadk_hosted
631
+ integration_mode=(
632
+ "ksadk_hosted"
633
+ if prompt_integration_mode == "ksadk_hosted"
634
+ and caps.prompt_owner == "ksadk"
635
+ and runtime_type == "langgraph"
636
+ else caps.integration_mode
637
+ ),
638
+ accounting_accuracy=caps.token_accounting,
639
+ session_id=session_id,
640
+ invocation_id=invocation_id,
641
+ user_id=user_id,
642
+ agent_id=agent_id,
643
+ agent_max_input_tokens=agent_max_input_tokens,
644
+ agent_reserve_output_tokens=agent_reserve_output_tokens,
645
+ )
646
+ except Exception: # noqa: BLE001
647
+ logger.warning(
648
+ "hosted pipeline failed for session=%s; falling back to PR B path",
649
+ session_id,
650
+ )
651
+ return
652
+ if result is None:
653
+ return
654
+ prepared.context_plan = result.plan
655
+ prepared.assembled_input = {
656
+ "format": result.assembled.format,
657
+ "system": result.assembled.system,
658
+ "messages": list(result.assembled.messages),
659
+ "estimated_tokens": result.assembled.estimated_tokens,
660
+ "warnings": list(result.assembled.warnings),
661
+ }
662
+
663
+
664
+ def _latest_checkpoint_working_state(events: Sequence[SessionEvent]) -> dict[str, Any] | None:
665
+ """取最新 context_checkpoint 事件的 working_state(PR D2)。
666
+
667
+ checkpoint metadata 由 compact_conversation_history 写入(仅 ksadk_hosted)。
668
+ 无 checkpoint 或无 working_state 键时返回 None。
669
+ """
670
+ for event in reversed(list(events)):
671
+ if canonical_event_type(event.event_type) != "context_checkpoint":
672
+ continue
673
+ meta = event.metadata or {}
674
+ ws = meta.get("working_state")
675
+ if isinstance(ws, dict):
676
+ return ws
677
+ return None
678
+ return None
409
679
 
410
680
 
411
681
  async def _refresh_history(
@@ -15,7 +15,7 @@ from ksadk.conversations.run_kinds import (
15
15
  validate_run_mode,
16
16
  )
17
17
  from ksadk.conversations.runtime_persistence import append_conversation_event
18
- from ksadk.events.runtime_event import EventType
18
+ from ksadk.events.v1_compat import EventTypeV1 as EventType
19
19
  from ksadk.sessions import SessionEvent
20
20
  from ksadk.tools.gateway import (
21
21
  build_tool_receipt_idempotency_key,
@@ -81,6 +81,11 @@ def _approval_lifecycle_event_type(event: SessionEvent) -> str:
81
81
  return "approval_request"
82
82
  if event.event_type == EventType.APPROVAL_RESOLVED:
83
83
  return "approval_response"
84
+ # canonical schema-v2:审批请求/应答是 interaction.* 事件。
85
+ if event.event_type == "interaction.requested":
86
+ return "approval_request"
87
+ if event.event_type in {"interaction.resolved", "approval.resolved"}:
88
+ return "approval_response"
84
89
  return canonical_event_type(
85
90
  event.event_type,
86
91
  author=event.author,
@@ -102,6 +107,20 @@ def _approval_interrupt_info_from_event(event: SessionEvent) -> dict[str, Any]:
102
107
  return dict(legacy_detail)
103
108
 
104
109
  content = event.content or {}
110
+ # canonical schema-v2 envelope:content["runtime_event"]["request"]["detail"]
111
+ canonical_payload = content.get("runtime_event")
112
+ if isinstance(canonical_payload, Mapping):
113
+ request = canonical_payload.get("request")
114
+ if isinstance(request, Mapping):
115
+ raw_detail = request.get("detail")
116
+ detail = dict(raw_detail) if isinstance(raw_detail, Mapping) else {}
117
+ approval_id = request.get("call_id") or canonical_payload.get("interaction_id")
118
+ if approval_id:
119
+ detail.setdefault("approval_request_id", approval_id)
120
+ detail.setdefault("id", approval_id)
121
+ if request.get("call_id"):
122
+ detail.setdefault("run_id", request.get("call_id"))
123
+ return detail
105
124
  payload = content.get("payload")
106
125
  if not isinstance(payload, Mapping):
107
126
  return {}
@@ -4,6 +4,7 @@ import asyncio
4
4
  import time
5
5
  from typing import Any, AsyncIterator, Callable, Dict, Mapping, Optional, Sequence
6
6
 
7
+ from ksadk.conversations.context import budget_tool_result_for_event
7
8
  from ksadk.conversations.run_kinds import (
8
9
  RUN_MODE_FOREGROUND,
9
10
  trigger_from_resume_input,
@@ -38,10 +39,13 @@ from ksadk.conversations.runtime_observability import (
38
39
  _extract_deferred_tool_names,
39
40
  _get_conversation_tracer,
40
41
  _normalize_usage_payload,
42
+ _set_context_plan_attributes,
41
43
  _set_conversation_input_attributes,
42
44
  _set_conversation_output_attributes,
43
45
  _set_conversation_span_attributes,
44
46
  _set_conversation_usage_attributes,
47
+ _set_prompt_cache_attributes,
48
+ _set_prompt_source_attributes,
45
49
  _set_span_attribute,
46
50
  _span_current_context,
47
51
  _span_feedback_metadata,
@@ -79,6 +83,35 @@ from ksadk.tools.gateway import (
79
83
  )
80
84
 
81
85
 
86
+ def _record_baseline_turn(
87
+ *,
88
+ prepared: Any,
89
+ model: str | None,
90
+ usage: Any,
91
+ ptl: bool,
92
+ attempts: int,
93
+ turn_start_monotonic: float | None,
94
+ ) -> None:
95
+ """env-gated 旁路采集:未启用时 no-op,启用时记录一条 turn 基线。不进决策路径。"""
96
+ from ksadk.context_engine.baseline import record_baseline_turn
97
+
98
+ latency_ms = None
99
+ if turn_start_monotonic is not None:
100
+ latency_ms = int((time.monotonic() - turn_start_monotonic) * 1000)
101
+ record_baseline_turn(
102
+ getattr(prepared, "shadow_context_plan", None),
103
+ session_id=getattr(prepared, "session_id", ""),
104
+ invocation_id=getattr(prepared, "invocation_id", ""),
105
+ model=str(model or ""),
106
+ usage=usage if isinstance(usage, Mapping) else None,
107
+ compaction_triggered=bool(getattr(prepared, "compaction_triggered", False)),
108
+ compaction_trigger=str(getattr(prepared, "compaction_trigger", "") or ""),
109
+ prompt_too_long=ptl,
110
+ retry_attempts=attempts,
111
+ turn_latency_ms=latency_ms,
112
+ )
113
+
114
+
82
115
  async def _iter_conversation_turn_events(
83
116
  *,
84
117
  runner: Any,
@@ -100,6 +133,9 @@ async def _iter_conversation_turn_events(
100
133
  invocation_id: Optional[str] = None,
101
134
  session_service_provider: Callable[[], Any] | None = None,
102
135
  run_mode: str = RUN_MODE_FOREGROUND,
136
+ agent_system: str = "",
137
+ agent_task: str = "",
138
+ prompt_integration_mode: str = "",
103
139
  ) -> AsyncIterator[dict[str, Any]]:
104
140
  """Internal semantic event stream shared by protocol serializers."""
105
141
  provider = session_service_provider or resolve_session_service
@@ -117,6 +153,8 @@ async def _iter_conversation_turn_events(
117
153
  model=model,
118
154
  model_metadata=model_metadata,
119
155
  session_service_provider=provider,
156
+ # PR D1:双阈值门控透传(仅 preview 用,不改会话)。
157
+ prompt_integration_mode=prompt_integration_mode,
120
158
  )
121
159
  else:
122
160
  compaction_preview = CompactionPlan(
@@ -155,6 +193,11 @@ async def _iter_conversation_turn_events(
155
193
  governance_state=governance,
156
194
  session_service_provider=provider,
157
195
  run_mode=entry_run_mode,
196
+ runner=runner,
197
+ runtime_type=_runner_type_name(runner),
198
+ agent_system=agent_system,
199
+ agent_task=agent_task,
200
+ prompt_integration_mode=prompt_integration_mode,
158
201
  )
159
202
  # prepared 之后的 run_status 写入复用 prepared 的 mode/trigger
160
203
  run_mode = prepared.run_mode
@@ -180,6 +223,7 @@ async def _iter_conversation_turn_events(
180
223
  user_id=user_id,
181
224
  user_input=prepared.user_input,
182
225
  )
226
+ prepared.memory_recall_events = ambient_contexts.get("memory_recall_events", [])
183
227
  runtime_context = PlatformInvocationContext(
184
228
  agent_id=agent_id,
185
229
  user_id=user_id,
@@ -200,9 +244,7 @@ async def _iter_conversation_turn_events(
200
244
  model_options=prepared.model_options,
201
245
  kb_context=ambient_contexts.get("kb_context"),
202
246
  memory_context=ambient_contexts.get("memory_context"),
203
- tool_approval_mode=str(
204
- prepared.request_metadata.get("tool_approval_mode") or ""
205
- ),
247
+ tool_approval_mode=str(prepared.request_metadata.get("tool_approval_mode") or ""),
206
248
  )
207
249
  if prepared.compaction_triggered:
208
250
  yield {
@@ -254,7 +296,11 @@ async def _iter_conversation_turn_events(
254
296
  response_id=response_id,
255
297
  )
256
298
  _set_conversation_input_attributes(span, prepared.user_input or prepared.user_display_input)
299
+ _set_context_plan_attributes(span, prepared.shadow_context_plan)
257
300
  trace_metadata = _span_feedback_metadata(span)
301
+ _baseline_turn_start = time.monotonic()
302
+ _baseline_ptl = False
303
+ _baseline_attempts = 0
258
304
  yield {
259
305
  "type": "started",
260
306
  "session_id": prepared.session_id,
@@ -558,12 +604,24 @@ async def _iter_conversation_turn_events(
558
604
  tool_call_id = str(
559
605
  chunk.get("call_id") or chunk.get("run_id") or tool_run_id
560
606
  ).strip()
607
+ # PR C:tool_result 单项预算(仅 ksadk_hosted 门控)。
608
+ # bound 进 content.parts[0].text(下一轮 history → 模型输入的那条), # noqa: E501
609
+ # metadata.tool_output 保留原值(UI/Responses 读取方不受影响)。
610
+ # enabled=False → (str(output), {}) 与旧逻辑字节级一致。
611
+ _tool_output_raw = chunk.get("tool_output", "")
612
+ _budget_enabled = prepared.prompt_integration_mode == "ksadk_hosted"
613
+ _budgeted_text, _budget_extras = budget_tool_result_for_event(
614
+ tool_name=tool_name,
615
+ tool_output=_tool_output_raw,
616
+ tool_call_id=tool_call_id,
617
+ enabled=_budget_enabled,
618
+ )
561
619
  checkpoint_metadata = _latest_checkpoint_metadata_for_run(
562
620
  await provider().get_events(prepared.session_id),
563
621
  tool_run_id,
564
622
  )
565
623
  approval_interrupt_info = approval_interrupt_info_from_result(
566
- chunk.get("tool_output", ""),
624
+ _tool_output_raw,
567
625
  fallback_tool_name=tool_name,
568
626
  tool_args=tool_args,
569
627
  run_id=tool_run_id,
@@ -602,17 +660,18 @@ async def _iter_conversation_turn_events(
602
660
  session_id=prepared.session_id,
603
661
  author=runner_name,
604
662
  role="user",
605
- text=str(chunk.get("tool_output", "")),
663
+ text=_budgeted_text,
606
664
  invocation_id=prepared.invocation_id,
607
665
  event_type="tool_result",
608
666
  metadata={
609
667
  "tool_name": tool_name,
610
- "tool_output": chunk.get("tool_output", ""),
668
+ "tool_output": _tool_output_raw,
611
669
  "run_id": tool_run_id,
612
670
  "tool_call_id": tool_call_id,
613
671
  "observability": _tool_observability_metadata(
614
- tool_name, chunk.get("tool_output", "")
672
+ tool_name, _tool_output_raw
615
673
  ),
674
+ **_budget_extras,
616
675
  "tool_receipt": _tool_receipt_metadata(
617
676
  session_id=prepared.session_id,
618
677
  run_id=tool_run_id,
@@ -624,8 +683,8 @@ async def _iter_conversation_turn_events(
624
683
  framework_ref=checkpoint_metadata.get("framework_ref"),
625
684
  status=(
626
685
  "failed"
627
- if isinstance(chunk.get("tool_output"), Mapping)
628
- and chunk.get("tool_output", {}).get("ok") is False
686
+ if isinstance(_tool_output_raw, Mapping)
687
+ and _tool_output_raw.get("ok") is False
629
688
  else "completed"
630
689
  ),
631
690
  ),
@@ -723,6 +782,8 @@ async def _iter_conversation_turn_events(
723
782
  return
724
783
  except Exception as exc:
725
784
  if attempt == 0 and not emitted_anything and _is_prompt_too_long_error(exc):
785
+ _baseline_ptl = True
786
+ _baseline_attempts = attempt + 1
726
787
  yield {"type": "compaction", "phase": "start", "trigger": "prompt_too_long"}
727
788
  try:
728
789
  checkpoint = await _compact_conversation_history_with_governance(
@@ -736,6 +797,15 @@ async def _iter_conversation_turn_events(
736
797
  trigger="prompt_too_long",
737
798
  keep_tail_groups=PTL_RETRY_KEEP_TAIL_GROUPS,
738
799
  session_service_provider=provider,
800
+ # PR D1:PTL 路径仍 force=True;透传 ownership 便于未来按门控调策略。
801
+ prompt_integration_mode=getattr(
802
+ prepared, "prompt_integration_mode", ""
803
+ ),
804
+ compaction_owner=str(
805
+ (getattr(prepared, "shadow_context_plan", None) or {}).get(
806
+ "compaction_owner", ""
807
+ )
808
+ ),
739
809
  )
740
810
  except RuntimeCircuitOpen as circuit_exc:
741
811
  await append_run_status_event(
@@ -887,6 +957,21 @@ async def _iter_conversation_turn_events(
887
957
  run_trigger=run_trigger,
888
958
  )
889
959
  _set_conversation_usage_attributes(span, assistant_metadata.get("usage"))
960
+ _set_prompt_cache_attributes(
961
+ span,
962
+ session_id=prepared.session_id,
963
+ plan=prepared.shadow_context_plan,
964
+ usage=assistant_metadata.get("usage"),
965
+ )
966
+ _set_prompt_source_attributes(span, getattr(prepared, "compiled_prompt", None))
967
+ _record_baseline_turn(
968
+ prepared=prepared,
969
+ model=model,
970
+ usage=assistant_metadata.get("usage"),
971
+ ptl=_baseline_ptl,
972
+ attempts=_baseline_attempts,
973
+ turn_start_monotonic=_baseline_turn_start,
974
+ )
890
975
  _finish_span()
891
976
  yield {
892
977
  "type": "completed",