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,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)
@@ -253,6 +306,14 @@ async def build_run_input(
253
306
  existing_events=existing_events,
254
307
  )
255
308
  effective_resume_input = tool_resume_input or normalized_resume_input
309
+ if tool_resume_input is not None:
310
+ # ToolGateway approvals complete after an otherwise normal tool
311
+ # call. Only LangGraph needs this private marker to restart a
312
+ # terminal graph semantically; runtime_input strips it elsewhere.
313
+ effective_resume_input = {
314
+ **tool_resume_input,
315
+ "_ksadk_gateway_approval_resume": True,
316
+ }
256
317
  del existing_events
257
318
  event_history = await service.get_events(resolved_session_id)
258
319
  history = build_history_from_events(event_history)
@@ -279,6 +340,23 @@ async def build_run_input(
279
340
  resume_input=effective_resume_input,
280
341
  run_mode=caller_run_mode,
281
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,
282
360
  )
283
361
 
284
362
  normalized_messages = _normalized_conversation_messages(messages)
@@ -341,6 +419,17 @@ async def build_run_input(
341
419
  user_input=user_input or user_display_input,
342
420
  )
343
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
+ )
344
433
  checkpoint = await _compact_conversation_history_with_governance(
345
434
  governance_state,
346
435
  session_id=resolved_session_id,
@@ -349,6 +438,9 @@ async def build_run_input(
349
438
  model=model,
350
439
  model_metadata=resolved_model_metadata,
351
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,
352
444
  )
353
445
  event_history = await service.get_events(resolved_session_id)
354
446
  history = build_history_from_events(event_history)
@@ -364,10 +456,32 @@ async def build_run_input(
364
456
  request_responses_history,
365
457
  responses_history,
366
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)
367
479
 
368
- return PreparedConversationTurn(
480
+ prepared = PreparedConversationTurn(
369
481
  session_id=resolved_session_id,
370
482
  invocation_id=resolved_invocation_id,
483
+ user_id=resolved_user_id,
484
+ agent_id=agent_id,
371
485
  user_input=user_input,
372
486
  user_display_input=user_display_input or user_input,
373
487
  history=history,
@@ -397,7 +511,171 @@ async def build_run_input(
397
511
  ),
398
512
  run_mode=caller_run_mode,
399
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,
400
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
401
679
 
402
680
 
403
681
  async def _refresh_history(
@@ -15,6 +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.v1_compat import EventTypeV1 as EventType
18
19
  from ksadk.sessions import SessionEvent
19
20
  from ksadk.tools.gateway import (
20
21
  build_tool_receipt_idempotency_key,
@@ -24,11 +25,7 @@ from ksadk.tools.gateway import (
24
25
  def _has_pending_approval(events: Sequence[SessionEvent]) -> bool:
25
26
  pending = 0
26
27
  for event in events:
27
- event_type = canonical_event_type(
28
- event.event_type,
29
- author=event.author,
30
- role=str((event.content or {}).get("role") or ""),
31
- )
28
+ event_type = _approval_lifecycle_event_type(event)
32
29
  if event_type == "approval_request":
33
30
  pending += 1
34
31
  elif event_type == "approval_response" and pending > 0:
@@ -37,23 +34,17 @@ def _has_pending_approval(events: Sequence[SessionEvent]) -> bool:
37
34
 
38
35
 
39
36
  def _approval_request_id_from_event(event: SessionEvent) -> str:
40
- metadata = event.metadata or {}
41
- interrupt_info = metadata.get("interrupt_info")
42
- if isinstance(interrupt_info, Mapping):
43
- value = interrupt_info.get("approval_request_id") or interrupt_info.get("id")
44
- if value:
45
- return str(value)
37
+ interrupt_info = _approval_interrupt_info_from_event(event)
38
+ value = interrupt_info.get("approval_request_id") or interrupt_info.get("id")
39
+ if value:
40
+ return str(value)
46
41
  return str(event.id or "")
47
42
 
48
43
 
49
44
  def _pending_approval_events(events: Sequence[SessionEvent]) -> list[SessionEvent]:
50
45
  pending: list[SessionEvent] = []
51
46
  for event in events:
52
- event_type = canonical_event_type(
53
- event.event_type,
54
- author=event.author,
55
- role=str((event.content or {}).get("role") or ""),
56
- )
47
+ event_type = _approval_lifecycle_event_type(event)
57
48
  if event_type == "approval_request":
58
49
  pending.append(event)
59
50
  continue
@@ -79,17 +70,71 @@ def _pending_approval_events(events: Sequence[SessionEvent]) -> list[SessionEven
79
70
 
80
71
  def _approval_request_events(events: Sequence[SessionEvent]) -> list[SessionEvent]:
81
72
  return [
82
- event
83
- for event in events
84
- if canonical_event_type(
85
- event.event_type,
86
- author=event.author,
87
- role=str((event.content or {}).get("role") or ""),
88
- )
89
- == "approval_request"
73
+ event for event in events if _approval_lifecycle_event_type(event) == "approval_request"
90
74
  ]
91
75
 
92
76
 
77
+ def _approval_lifecycle_event_type(event: SessionEvent) -> str:
78
+ """Classify approvals stored as either legacy session or RuntimeEvent rows."""
79
+
80
+ if event.event_type == EventType.APPROVAL_REQUESTED:
81
+ return "approval_request"
82
+ if event.event_type == EventType.APPROVAL_RESOLVED:
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"
89
+ return canonical_event_type(
90
+ event.event_type,
91
+ author=event.author,
92
+ role=str((event.content or {}).get("role") or ""),
93
+ )
94
+
95
+
96
+ def _approval_interrupt_info_from_event(event: SessionEvent) -> dict[str, Any]:
97
+ """Read the approval payload without downgrading canonical RuntimeEvents.
98
+
99
+ RuntimeExecutor persists ``approval.requested`` as a RuntimeEvent envelope,
100
+ whereas legacy runners write an ``approval_request`` SessionEvent. Resume
101
+ accepts both forms so the durable runtime record remains the source of truth.
102
+ """
103
+
104
+ metadata = event.metadata or {}
105
+ legacy_detail = metadata.get("interrupt_info")
106
+ if isinstance(legacy_detail, Mapping):
107
+ return dict(legacy_detail)
108
+
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
124
+ payload = content.get("payload")
125
+ if not isinstance(payload, Mapping):
126
+ return {}
127
+ raw_detail = payload.get("detail")
128
+ detail = dict(raw_detail) if isinstance(raw_detail, Mapping) else {}
129
+ approval_id = payload.get("approval_id") or payload.get("call_id")
130
+ if approval_id:
131
+ detail.setdefault("approval_request_id", approval_id)
132
+ detail.setdefault("id", approval_id)
133
+ if payload.get("call_id"):
134
+ detail.setdefault("run_id", payload.get("call_id"))
135
+ return detail
136
+
137
+
93
138
  def _approval_resume_run_mode(
94
139
  events: Sequence[SessionEvent],
95
140
  resume_input: Mapping[str, Any],
@@ -167,11 +212,7 @@ def _approval_decision_from_resume(resume_input: Mapping[str, Any]) -> dict[str,
167
212
  def _consecutive_approval_denials_from_events(events: Sequence[SessionEvent]) -> int:
168
213
  denials = 0
169
214
  for event in reversed(events):
170
- event_type = canonical_event_type(
171
- event.event_type,
172
- author=event.author,
173
- role=str((event.content or {}).get("role") or ""),
174
- )
215
+ event_type = _approval_lifecycle_event_type(event)
175
216
  if event_type != "approval_response":
176
217
  continue
177
218
  resume_input = (event.metadata or {}).get("resume_input")
@@ -210,9 +251,7 @@ def _normalize_approval_resume_input(
210
251
  if matched_event is None:
211
252
  return normalized
212
253
 
213
- interrupt_info = (matched_event.metadata or {}).get("interrupt_info")
214
- if not isinstance(interrupt_info, Mapping):
215
- return normalized
254
+ interrupt_info = _approval_interrupt_info_from_event(matched_event)
216
255
  if not (interrupt_info.get("tool_name") or normalized.get("tool_name")):
217
256
  return normalized
218
257