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
@@ -7,7 +7,7 @@ from typing import Any
7
7
 
8
8
  from fastapi import HTTPException
9
9
 
10
- from ksadk.server.factory import get_runner, get_state
10
+ from ksadk.server.factory import get_runtime_execution, get_state
11
11
  from ksadk.sessions import SessionEvent
12
12
  from ksadk.tools.gateway import tool_approval_capability
13
13
  from ksadk.toolsets import describe_agentengine_tools
@@ -23,6 +23,7 @@ from .common import (
23
23
  _build_native_terminal_capability,
24
24
  _ensure_session,
25
25
  _hydrate_session,
26
+ _resolve_agent_ui_spec,
26
27
  )
27
28
  from .models import (
28
29
  CreateSessionActionRequest,
@@ -58,45 +59,42 @@ from .streaming import _cancel_detached_streams_for_session
58
59
  @ui_bootstrap_router.post("/agentengine/api/v1/GetAgentUiBootstrap")
59
60
  async def get_agent_ui_bootstrap(request: UiBootstrapRequest):
60
61
  state = get_state()
61
- runner = state.runner
62
- if runner is not None:
63
- runner = get_runner()
64
- agent_id = request.AgentId or (_runtime_agent_id(runner) if runner else "default-agent")
65
- description = getattr(runner.detection_result, "description", "") if runner else ""
66
- framework = ""
67
- if runner:
68
- detection_type = getattr(getattr(runner, "detection_result", None), "type", None)
69
- framework = str(getattr(detection_type, "value", detection_type) or "").strip().lower()
62
+ executor, launch_context = get_runtime_execution()
63
+ detection = launch_context.detection
64
+ agent_id = request.AgentId or _runtime_agent_id(launch_context)
65
+ description = str(getattr(detection, "description", "") or "")
66
+ framework = launch_context.runtime_type.strip().lower()
70
67
  workspace_enabled = workspace_files_enabled(default=True)
71
- ui_spec = deps.resolve_agent_ui_spec()
72
- runtime_capabilities = (
73
- runner.get_runtime_capabilities()
74
- if runner and callable(getattr(runner, "get_runtime_capabilities", None))
75
- else {}
68
+ ui_spec = _resolve_agent_ui_spec()
69
+ runtime_capabilities = executor.native_capabilities(launch_context)
70
+ runtime_capability_matrix = executor.capability_matrix(launch_context)
71
+ resume_capability = (
72
+ runtime_capabilities.get("ResumeRun")
73
+ if isinstance(runtime_capabilities, Mapping)
74
+ else None
75
+ )
76
+ resume_capability = resume_capability if isinstance(resume_capability, Mapping) else {}
77
+ checkpoint_capability = (
78
+ runtime_capabilities.get("Checkpoint")
79
+ if isinstance(runtime_capabilities, Mapping)
80
+ else None
76
81
  )
82
+ checkpoint_capability = (
83
+ checkpoint_capability if isinstance(checkpoint_capability, Mapping) else {}
84
+ )
85
+ cancel_capability = (
86
+ runtime_capabilities.get("CancelRun")
87
+ if isinstance(runtime_capabilities, Mapping)
88
+ else None
89
+ )
90
+ cancel_capability = cancel_capability if isinstance(cancel_capability, Mapping) else {}
77
91
  checkpoint_resume_capability = {
78
- "Supported": bool(
79
- (runtime_capabilities.get("ResumeRun") or {}).get("Supported")
80
- if isinstance(runtime_capabilities, Mapping)
81
- else False
82
- ),
83
- "Checkpoint": (
84
- (runtime_capabilities.get("Checkpoint") or {})
85
- if isinstance(runtime_capabilities, Mapping)
86
- else {}
87
- ),
88
- "ResumeRun": (
89
- (runtime_capabilities.get("ResumeRun") or {})
90
- if isinstance(runtime_capabilities, Mapping)
91
- else {}
92
- ),
92
+ "Supported": bool(resume_capability.get("Supported")),
93
+ "Checkpoint": checkpoint_capability,
94
+ "ResumeRun": resume_capability,
93
95
  }
94
96
  checkpoint_resume_supported = bool(checkpoint_resume_capability["Supported"])
95
- cancel_run_supported = bool(
96
- (runtime_capabilities.get("CancelRun") or {}).get("Supported")
97
- if isinstance(runtime_capabilities, Mapping)
98
- else False
99
- )
97
+ cancel_run_supported = bool(cancel_capability.get("Supported"))
100
98
  responses_transport = {
101
99
  "Protocol": "responses",
102
100
  "Runtime": "ksadk",
@@ -137,7 +135,7 @@ async def get_agent_ui_bootstrap(request: UiBootstrapRequest):
137
135
  {
138
136
  "Agent": {
139
137
  "AgentId": agent_id,
140
- "Name": runner.detection_result.name if runner else agent_id,
138
+ "Name": str(getattr(detection, "name", "") or agent_id),
141
139
  "Description": description or "",
142
140
  "Framework": framework,
143
141
  },
@@ -151,6 +149,7 @@ async def get_agent_ui_bootstrap(request: UiBootstrapRequest):
151
149
  "StopRun": cancel_run_supported,
152
150
  "ResumeRun": checkpoint_resume_supported,
153
151
  "RuntimeCapabilities": runtime_capabilities,
152
+ "RuntimeCapabilityMatrix": runtime_capability_matrix,
154
153
  "CheckpointResumeCapability": checkpoint_resume_capability,
155
154
  "RunLifecycle": {
156
155
  "Enabled": True,
@@ -258,15 +257,13 @@ async def delete_session_action(request: SessionIdRequest):
258
257
 
259
258
  @sessions_router.post("/agentengine/api/v1/ListSessionEvents")
260
259
  async def list_session_events_action(request: ListSessionEventsActionRequest):
261
- runner = get_state().runner
260
+ _executor, launch_context = get_runtime_execution()
262
261
  service = deps.resolve_session_service()
263
262
  session_id = str(request.SessionId or "").strip()
264
263
  if not session_id:
265
264
  # 未传 SessionId:返回该 agent 全部会话的事件(存储层跨会话查询,真分页无截断;
266
265
  # seq 游标是会话内序号,跨会话模式下不适用,直接忽略)
267
- agent_id = str(request.AgentId or "").strip() or (
268
- _runtime_agent_id(runner) if runner else "default-agent"
269
- )
266
+ agent_id = str(request.AgentId or "").strip() or _runtime_agent_id(launch_context)
270
267
  events = await service.get_events_for_agent(
271
268
  agent_id,
272
269
  user_id=request.UserId,
@@ -4,18 +4,24 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import logging
7
+ import os
7
8
  from collections.abc import AsyncIterator, Mapping
8
9
  from typing import Any
9
10
 
10
11
  from fastapi import HTTPException
12
+ from fastapi.responses import StreamingResponse
11
13
 
14
+ from ksadk.conversations.runtime_persistence import append_run_status_event
12
15
  from ksadk.server.factory import get_state
13
16
 
14
- from . import dependencies as deps
15
17
  from .models import _RUN_TERMINAL_STATUSES
16
18
  from .projection import _latest_invocation_status
17
19
 
18
20
  logger = logging.getLogger(__name__)
21
+ SSE_HEARTBEAT_INTERVAL_SECONDS = max(
22
+ 0.01,
23
+ float(os.getenv("AGENTENGINE_SSE_HEARTBEAT_SECONDS", "15")),
24
+ )
19
25
 
20
26
  _RESERVED_UI_PATHS = {"/", "/chat", "/build", "/deploy"}
21
27
  _CUSTOM_API_PROXY_ENV_KEYS = ("KSADK_USER_BACKEND_URL", "LUOLUO_USER_BACKEND_URL")
@@ -33,6 +39,13 @@ _HOP_BY_HOP_HEADERS = {
33
39
  }
34
40
 
35
41
 
42
+ def _observe_detached_task_result(task: asyncio.Task[Any]) -> None:
43
+ """Consume a detached task exception after ``_consume`` has logged it."""
44
+ if task.cancelled():
45
+ return
46
+ task.exception()
47
+
48
+
36
49
  class _DetachedSSEStream:
37
50
  _MAX_BACKLOG_CHUNKS = 256
38
51
 
@@ -58,6 +71,7 @@ class _DetachedSSEStream:
58
71
  self._task = asyncio.create_task(self._consume())
59
72
  self._registry.streams.add(self._task)
60
73
  self._task.add_done_callback(self._registry.streams.discard)
74
+ self._task.add_done_callback(_observe_detached_task_result)
61
75
  if self.invocation_id:
62
76
  self._registry.streams_by_invocation[self.invocation_id] = self
63
77
  self._task.add_done_callback(
@@ -70,7 +84,7 @@ class _DetachedSSEStream:
70
84
  if not self.session_id or not self.invocation_id:
71
85
  return False
72
86
  status = await _latest_invocation_status(
73
- deps.resolve_session_service(),
87
+ get_state().resolve_session_service(),
74
88
  self.session_id,
75
89
  self.invocation_id,
76
90
  )
@@ -78,6 +92,7 @@ class _DetachedSSEStream:
78
92
 
79
93
  async def _consume(self) -> None:
80
94
  terminal_fallback_status: str | None = None
95
+ terminal_fallback_detail: str | None = None
81
96
  try:
82
97
  async for chunk in self._source:
83
98
  self._backlog.append(chunk)
@@ -93,8 +108,9 @@ class _DetachedSSEStream:
93
108
  except asyncio.CancelledError:
94
109
  terminal_fallback_status = "cancelled"
95
110
  raise
96
- except Exception:
111
+ except Exception as exc:
97
112
  terminal_fallback_status = "failed"
113
+ terminal_fallback_detail = f"{type(exc).__name__}: {exc}"[:2048]
98
114
  logger.exception("Detached SSE stream failed")
99
115
  raise
100
116
  finally:
@@ -108,15 +124,16 @@ class _DetachedSSEStream:
108
124
  if terminal_fallback_status and self.session_id:
109
125
  try:
110
126
  if not await self._has_terminal_run_status():
111
- await deps.conversation().append_run_status_event(
127
+ await append_run_status_event(
112
128
  session_id=self.session_id,
113
129
  author="system",
114
130
  status=terminal_fallback_status,
115
131
  invocation_id=self.invocation_id or "",
116
132
  detail=(
117
- f"background_{terminal_fallback_status}:{self.invocation_id or ''}"
133
+ terminal_fallback_detail
134
+ or f"background_{terminal_fallback_status}:{self.invocation_id or ''}"
118
135
  ),
119
- session_service_provider=deps.resolve_session_service,
136
+ session_service_provider=get_state().resolve_session_service,
120
137
  run_mode=self._run_mode,
121
138
  run_trigger=self._run_trigger,
122
139
  )
@@ -151,7 +168,7 @@ class _DetachedSSEStream:
151
168
  try:
152
169
  chunk = await asyncio.wait_for(
153
170
  queue.get(),
154
- timeout=deps.heartbeat_interval(),
171
+ timeout=SSE_HEARTBEAT_INTERVAL_SECONDS,
155
172
  )
156
173
  except asyncio.TimeoutError:
157
174
  yield ": ping\n\n"
@@ -221,3 +238,31 @@ def _reject_if_detached_resume_active(resume_key: tuple[str, str] | None) -> Non
221
238
  "run_id": resume_key[1],
222
239
  },
223
240
  )
241
+
242
+
243
+ def detached_streaming_response(
244
+ source: AsyncIterator[str],
245
+ *,
246
+ invocation_id: str | None = None,
247
+ session_id: str | None = None,
248
+ resume_key: tuple[str, str] | None = None,
249
+ run_mode: str = "unknown",
250
+ run_trigger: str = "unknown",
251
+ ) -> StreamingResponse:
252
+ """Create an app-owned detached SSE response with reconnectable backlog."""
253
+
254
+ detached = _DetachedSSEStream(
255
+ source,
256
+ invocation_id=invocation_id,
257
+ session_id=session_id,
258
+ run_mode=run_mode,
259
+ run_trigger=run_trigger,
260
+ )
261
+ registry = detached._registry
262
+ if invocation_id and resume_key:
263
+ registry.resume_keys_by_invocation[invocation_id] = resume_key
264
+ registry.active_resume_invocation_by_key[resume_key] = invocation_id
265
+ detached._task.add_done_callback(
266
+ lambda _task: _clear_detached_resume_key(registry, invocation_id, resume_key)
267
+ )
268
+ return StreamingResponse(detached.iter_for_client(), media_type="text/event-stream")
@@ -4,6 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import io
6
6
  import logging
7
+ import time
7
8
  import uuid
8
9
  import zipfile
9
10
  from pathlib import PurePosixPath
@@ -16,7 +17,8 @@ from pydantic import BaseModel
16
17
 
17
18
  from ksadk.conversations.attachment_storage import AttachmentStorageService
18
19
  from ksadk.conversations.model_context import normalize_model_metadata
19
- from ksadk.server.factory import get_state
20
+ from ksadk.runtime.adapter import CancelResult
21
+ from ksadk.server.factory import get_runtime_execution, get_state
20
22
  from ksadk_runtime_common.workspace_files.preview import (
21
23
  build_workspace_file_base_href,
22
24
  build_workspace_preview_csp,
@@ -26,7 +28,6 @@ from ksadk_runtime_common.workspace_files.preview import (
26
28
  from . import dependencies as deps
27
29
  from .common import (
28
30
  _action_response,
29
- _resolve_active_runner,
30
31
  _resolve_current_model,
31
32
  _workspace_root_dir,
32
33
  _workspace_runtime_request,
@@ -134,6 +135,7 @@ async def delete_workspace_file_action(request: WorkspaceDeleteActionRequest):
134
135
 
135
136
  @control_router.post("/agentengine/api/v1/CancelRun")
136
137
  async def cancel_run_action(request: CancelRunActionRequest):
138
+ executor, launch_context = get_runtime_execution()
137
139
  detached = get_state().stream_registry.streams_by_invocation.get(request.InvocationId)
138
140
  service = deps.resolve_session_service()
139
141
  scoped_session_id = str(request.SessionId or "").strip()
@@ -145,6 +147,15 @@ async def cancel_run_action(request: CancelRunActionRequest):
145
147
  )
146
148
  if not scoped_session_id and detached is not None:
147
149
  scoped_session_id = detached_session_id
150
+ handle = (
151
+ executor.find_handle(
152
+ launch_context.runtime_type,
153
+ request.InvocationId,
154
+ scoped_session_id,
155
+ )
156
+ if scoped_session_id
157
+ else None
158
+ )
148
159
  if scoped_session_id:
149
160
  await _require_action_session(
150
161
  service,
@@ -152,7 +163,7 @@ async def cancel_run_action(request: CancelRunActionRequest):
152
163
  agent_id=request.AgentId,
153
164
  user_id=request.UserId,
154
165
  )
155
- if detached is None and not await _session_contains_invocation(
166
+ if detached is None and handle is None and not await _session_contains_invocation(
156
167
  service,
157
168
  scoped_session_id,
158
169
  request.InvocationId,
@@ -171,33 +182,31 @@ async def cancel_run_action(request: CancelRunActionRequest):
171
182
  user_id=request.UserId,
172
183
  ):
173
184
  raise HTTPException(status_code=404, detail="Invocation not found")
174
- found = detached is not None
185
+ found = detached is not None or handle is not None
175
186
  cancel_requested = False
176
187
  if detached is not None:
177
188
  cancel_requested = detached.cancel()
178
- runner_cancel_status = "not_found" if found else "unsupported"
179
- active_runner = _resolve_active_runner()
180
- if active_runner is not None:
189
+ runtime_cancel_status = "detached_task_cancelled" if cancel_requested else "not_running"
190
+ if handle is not None and detached is None:
181
191
  try:
182
- runner_result = active_runner.request_cancel(request.InvocationId)
183
- if isinstance(runner_result, str) and runner_result:
184
- runner_cancel_status = runner_result
185
- elif runner_result is True:
186
- runner_cancel_status = "accepted"
187
- elif runner_result is False and not found:
188
- runner_cancel_status = "not_found"
189
- except Exception as exc:
190
- runner_cancel_status = "error"
192
+ runtime_result = await executor.cancel(handle)
193
+ runtime_cancel_status = runtime_result.value
194
+ except Exception as exc: # noqa: BLE001
195
+ runtime_cancel_status = CancelResult.FAILED.value
191
196
  logger.warning("CancelRun failed: %s", exc)
192
- runner_accepted = runner_cancel_status in {"accepted", "cancelling", "cancelled"}
193
- status = "cancelling" if found or runner_accepted else runner_cancel_status
197
+ runtime_accepted = runtime_cancel_status in {
198
+ "detached_task_cancelled",
199
+ CancelResult.INTERRUPTED_ACTIVE_TURN.value,
200
+ CancelResult.PENDING_CANCEL_RECORDED.value,
201
+ }
202
+ status = "cancelling" if runtime_accepted else runtime_cancel_status
194
203
  return _action_response(
195
204
  "CancelRun",
196
205
  {
197
- "Cancelled": bool(cancel_requested or runner_accepted),
206
+ "Cancelled": bool(cancel_requested or runtime_accepted),
198
207
  "Found": found,
199
208
  "Status": status,
200
- "RunnerCancelStatus": runner_cancel_status,
209
+ "RuntimeCancelStatus": runtime_cancel_status,
201
210
  },
202
211
  )
203
212
 
@@ -324,6 +333,11 @@ def _normalize_model_catalog_items(raw_models: list[Any]) -> list[dict[str, Any]
324
333
  return sorted(normalized_by_id.values(), key=lambda item: item["id"])
325
334
 
326
335
 
336
+ _MODELS_CATALOG_TTL_SECONDS = 60.0
337
+ # api_base -> (monotonic_ts, payload)。进程内短 TTL 缓存,见 _build_models_payload。
338
+ _MODELS_CATALOG_CACHE: dict[str, tuple[float, dict[str, Any]]] = {}
339
+
340
+
327
341
  async def _build_models_payload() -> dict[str, Any]:
328
342
  import os
329
343
 
@@ -344,6 +358,18 @@ async def _build_models_payload() -> dict[str, Any]:
344
358
  if not api_base:
345
359
  return _fallback_catalog()
346
360
 
361
+ # 上游 /v1/models 是一次真实外网往返(数百毫秒),会话页初始化会
362
+ # 调用本接口,不能每次都同步打上游。做短 TTL 进程内缓存:
363
+ # 命中直接返回;上游失败时优先回退到过期的缓存值,避免模型列表
364
+ # 因上游抖动整体不可用。
365
+ cache_key = api_base.rstrip("/")
366
+ cached = _MODELS_CATALOG_CACHE.get(cache_key)
367
+ now = time.monotonic()
368
+ if cached is not None and now - cached[0] < _MODELS_CATALOG_TTL_SECONDS:
369
+ payload = dict(cached[1])
370
+ payload["cached"] = True
371
+ return payload
372
+
347
373
  try:
348
374
  base_url = api_base.rstrip("/")
349
375
  if base_url.endswith("/v1"):
@@ -368,9 +394,16 @@ async def _build_models_payload() -> dict[str, Any]:
368
394
  str(item.get("id") or "").strip() != current_model for item in models
369
395
  ):
370
396
  models = _normalize_model_catalog_items([*models, current_model])
371
- return {"data": models, "current": current_model, "source": source}
397
+ payload = {"data": models, "current": current_model, "source": source}
398
+ _MODELS_CATALOG_CACHE[cache_key] = (now, payload)
399
+ return dict(payload)
372
400
  except Exception as e:
373
401
  logger.error(f"Failed to fetch models: {e}")
402
+ if cached is not None:
403
+ payload = dict(cached[1])
404
+ payload["stale"] = True
405
+ payload["error"] = str(e)
406
+ return payload
374
407
  fallback = _fallback_catalog()
375
408
  fallback["error"] = str(e)
376
409
  return fallback
@@ -1 +1 @@
1
- import{bt as e,ht as t,lt as n,n as r,t as i,ut as a,wt as o,xt as s,yt as c}from"./index-QSwCHuB8.js";var l=o(s(),1),u=c();function d(){let o=e(e=>e.visible),s=e(e=>e.content),c=e(e=>e.type),d=e(e=>e.hide),f=(0,l.useRef)(null);if(r(f),!o||!s)return null;let p=i(s);return(0,u.jsxs)(`aside`,{className:n(`flex h-full flex-shrink-0 flex-col border-l border-slate-200/30 bg-white dark:border-slate-800/40 dark:bg-slate-950`,`w-[min(42rem,50vw)]`),children:[(0,u.jsxs)(`div`,{className:`flex h-14 flex-shrink-0 items-center justify-between border-b border-slate-200/30 px-4 dark:border-slate-800/40`,children:[(0,u.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`text-sm font-semibold text-slate-900 dark:text-slate-100`,children:`Artifact`}),(0,u.jsx)(`span`,{className:`rounded-md bg-slate-100 px-1.5 py-0.5 font-mono text-[11px] text-slate-500 dark:bg-slate-900 dark:text-slate-400`,children:c})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,u.jsxs)(`button`,{type:`button`,onClick:()=>{let e=new Blob([s],{type:`text/html;charset=utf-8`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`artifact.${c===`svg`?`svg`:`html`}`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)},className:`inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-slate-600 transition hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-900`,title:`Download`,children:[(0,u.jsx)(t,{className:`h-3.5 w-3.5`}),`Download`]}),(0,u.jsx)(`button`,{type:`button`,onClick:d,className:`rounded-lg p-1.5 text-slate-500 transition hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-900 dark:hover:text-slate-100`,"aria-label":`Close Artifact`,title:`Close`,children:(0,u.jsx)(a,{className:`h-4 w-4`})})]})]}),(0,u.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,u.jsx)(`iframe`,{ref:f,srcDoc:p,sandbox:`allow-scripts allow-downloads`,title:`Artifact Preview`,className:`h-full w-full border-0 bg-white`})})]})}export{d as ArtifactsPanel};
1
+ import{St as e,Tt as t,bt as n,gt as r,lt as i,n as a,t as o,ut as s,xt as c}from"./index-8ipRcQ-M.js";var l=t(e(),1),u=n();function d(){let e=c(e=>e.visible),t=c(e=>e.content),n=c(e=>e.type),d=c(e=>e.hide),f=(0,l.useRef)(null);if(a(f),!e||!t)return null;let p=o(t);return(0,u.jsxs)(`aside`,{className:i(`flex h-full flex-shrink-0 flex-col border-l border-slate-200/30 bg-white dark:border-slate-800/40 dark:bg-slate-950`,`w-[min(42rem,50vw)]`),children:[(0,u.jsxs)(`div`,{className:`flex h-14 flex-shrink-0 items-center justify-between border-b border-slate-200/30 px-4 dark:border-slate-800/40`,children:[(0,u.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,u.jsx)(`span`,{className:`text-sm font-semibold text-slate-900 dark:text-slate-100`,children:`Artifact`}),(0,u.jsx)(`span`,{className:`rounded-md bg-slate-100 px-1.5 py-0.5 font-mono text-[11px] text-slate-500 dark:bg-slate-900 dark:text-slate-400`,children:n})]}),(0,u.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,u.jsxs)(`button`,{type:`button`,onClick:()=>{let e=new Blob([t],{type:`text/html;charset=utf-8`}),r=URL.createObjectURL(e),i=document.createElement(`a`);i.href=r,i.download=`artifact.${n===`svg`?`svg`:`html`}`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)},className:`inline-flex items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium text-slate-600 transition hover:bg-slate-100 dark:text-slate-300 dark:hover:bg-slate-900`,title:`Download`,children:[(0,u.jsx)(r,{className:`h-3.5 w-3.5`}),`Download`]}),(0,u.jsx)(`button`,{type:`button`,onClick:d,className:`rounded-lg p-1.5 text-slate-500 transition hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-900 dark:hover:text-slate-100`,"aria-label":`Close Artifact`,title:`Close`,children:(0,u.jsx)(s,{className:`h-4 w-4`})})]})]}),(0,u.jsx)(`div`,{className:`min-h-0 flex-1`,children:(0,u.jsx)(`iframe`,{ref:f,srcDoc:p,sandbox:`allow-scripts allow-downloads`,title:`Artifact Preview`,className:`h-full w-full border-0 bg-white`})})]})}export{d as ArtifactsPanel};