agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.0__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 (371) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +36 -20
  2. agentengine_sdk_python-0.8.0.dist-info/RECORD +578 -0
  3. ksadk/a2a/__init__.py +178 -11
  4. ksadk/a2a/bootstrap.py +334 -0
  5. ksadk/a2a/card.py +120 -0
  6. ksadk/a2a/context_store.py +203 -0
  7. ksadk/a2a/control_plane.py +818 -0
  8. ksadk/a2a/credential.py +99 -0
  9. ksadk/a2a/event_adapter.py +149 -0
  10. ksadk/a2a/executor.py +406 -89
  11. ksadk/a2a/external_transport.py +516 -0
  12. ksadk/a2a/identity.py +304 -0
  13. ksadk/a2a/ids.py +22 -0
  14. ksadk/a2a/langgraph.py +285 -0
  15. ksadk/a2a/resume_store.py +201 -0
  16. ksadk/a2a/routes.py +105 -0
  17. ksadk/a2a/server.py +107 -60
  18. ksadk/a2a/space_client.py +1101 -0
  19. ksadk/a2a/task_adapter.py +423 -0
  20. ksadk/a2a/task_event_dispatcher.py +167 -0
  21. ksadk/a2a/task_event_outbox.py +326 -0
  22. ksadk/a2a/task_store.py +206 -0
  23. ksadk/a2ui/__init__.py +27 -0
  24. ksadk/a2ui/core.py +186 -0
  25. ksadk/a2ui/models.py +166 -0
  26. ksadk/a2ui/renderer.py +198 -0
  27. ksadk/agui/__init__.py +9 -0
  28. ksadk/agui/a2ui_projection.py +92 -0
  29. ksadk/agui/agent.py +857 -0
  30. ksadk/agui/config.py +86 -0
  31. ksadk/agui/routes.py +55 -0
  32. ksadk/api/client.py +233 -191
  33. ksadk/builders/__init__.py +2 -0
  34. ksadk/builders/base.py +16 -14
  35. ksadk/builders/code_builder.py +318 -236
  36. ksadk/builders/container_builder.py +187 -167
  37. ksadk/builders/framework_requirements.py +29 -11
  38. ksadk/builders/ks3_uploader.py +58 -27
  39. ksadk/builders/managed_runtime_builder.py +145 -0
  40. ksadk/builders/mcp_builder.py +91 -92
  41. ksadk/builders/requirements_utils.py +1 -5
  42. ksadk/cli/__init__.py +89 -171
  43. ksadk/cli/cmd_a2a.py +254 -70
  44. ksadk/cli/cmd_agent.py +19 -5
  45. ksadk/cli/cmd_build.py +158 -29
  46. ksadk/cli/cmd_completion.py +47 -35
  47. ksadk/cli/cmd_config.py +267 -198
  48. ksadk/cli/cmd_create.py +500 -720
  49. ksadk/cli/cmd_dashboard.py +120 -45
  50. ksadk/cli/cmd_deploy.py +117 -58
  51. ksadk/cli/cmd_destroy.py +44 -14
  52. ksadk/cli/cmd_files.py +63 -24
  53. ksadk/cli/cmd_hermes.py +168 -89
  54. ksadk/cli/cmd_invoke.py +184 -122
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +98 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +483 -227
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +33 -10
  61. ksadk/cli/cmd_status.py +80 -31
  62. ksadk/cli/cmd_version.py +20 -13
  63. ksadk/cli/cmd_web.py +89 -13
  64. ksadk/cli/deploy_utils.py +20 -20
  65. ksadk/cli/dry_run.py +5 -3
  66. ksadk/cli/error_utils.py +37 -12
  67. ksadk/cli/global_options.py +1 -2
  68. ksadk/cli/local_runtime.py +1 -2
  69. ksadk/cli/model_catalog.py +6 -2
  70. ksadk/cli/network_options.py +34 -14
  71. ksadk/cli/resource_common.py +6 -2
  72. ksadk/cli/storage.py +0 -1
  73. ksadk/cli/ui.py +5 -3
  74. ksadk/cli/workflow_common.py +51 -17
  75. ksadk/codex/__init__.py +12 -0
  76. ksadk/codex/client.py +408 -0
  77. ksadk/codex/phase.py +143 -0
  78. ksadk/codex/runtime.py +449 -0
  79. ksadk/common/aicp_env.py +0 -1
  80. ksadk/common/auth.py +2 -2
  81. ksadk/common/constants.py +1 -3
  82. ksadk/common/llm_utils.py +17 -13
  83. ksadk/compat/__init__.py +5 -0
  84. ksadk/compat/adk_compat.py +200 -0
  85. ksadk/compat/copilotkit_a2ui.py +330 -0
  86. ksadk/configs/__init__.py +12 -12
  87. ksadk/configs/env_registry.py +500 -100
  88. ksadk/configs/global_config.py +2 -1
  89. ksadk/configs/settings.py +151 -124
  90. ksadk/conversations/__init__.py +7 -5
  91. ksadk/conversations/attachment_storage.py +16 -11
  92. ksadk/conversations/attachments.py +44 -36
  93. ksadk/conversations/compaction_pipeline.py +12 -12
  94. ksadk/conversations/compaction_prompt.py +9 -5
  95. ksadk/conversations/context.py +221 -6
  96. ksadk/conversations/message_projection.py +438 -51
  97. ksadk/conversations/model_context.py +12 -6
  98. ksadk/conversations/model_options.py +0 -1
  99. ksadk/conversations/normalize.py +20 -16
  100. ksadk/conversations/reasoning_markup.py +1 -1
  101. ksadk/conversations/runtime.py +339 -5255
  102. ksadk/conversations/runtime_compaction.py +333 -0
  103. ksadk/conversations/runtime_constants.py +27 -0
  104. ksadk/conversations/runtime_governance.py +185 -0
  105. ksadk/conversations/runtime_input.py +652 -0
  106. ksadk/conversations/runtime_invocation.py +395 -0
  107. ksadk/conversations/runtime_metadata.py +475 -0
  108. ksadk/conversations/runtime_observability.py +355 -0
  109. ksadk/conversations/runtime_payloads.py +272 -0
  110. ksadk/conversations/runtime_persistence.py +440 -0
  111. ksadk/conversations/runtime_preparation.py +418 -0
  112. ksadk/conversations/runtime_resume.py +816 -0
  113. ksadk/conversations/runtime_stream_events.py +902 -0
  114. ksadk/conversations/runtime_streaming.py +547 -0
  115. ksadk/conversations/semantic_summary.py +17 -5
  116. ksadk/conversations/session_title.py +6 -3
  117. ksadk/deployment/__init__.py +15 -16
  118. ksadk/deployment/agent_access.py +12 -23
  119. ksadk/deployment/base.py +51 -38
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +309 -202
  122. ksadk/deployment/registry.py +38 -32
  123. ksadk/deployment/state.py +11 -11
  124. ksadk/deployment/ui_config.py +1 -1
  125. ksadk/detection/__init__.py +1 -1
  126. ksadk/detection/detector.py +146 -83
  127. ksadk/detection/mcp_detector.py +9 -6
  128. ksadk/events/__init__.py +25 -0
  129. ksadk/events/parser.py +191 -0
  130. ksadk/events/replay.py +37 -0
  131. ksadk/events/runtime_event.py +264 -0
  132. ksadk/events/store.py +317 -0
  133. ksadk/harness/__init__.py +34 -0
  134. ksadk/harness/app.py +278 -0
  135. ksadk/harness/config.py +181 -0
  136. ksadk/harness/reasoner.py +105 -0
  137. ksadk/harness/runner.py +211 -0
  138. ksadk/harness/sandbox.py +141 -0
  139. ksadk/harness/tools.py +222 -0
  140. ksadk/hermes_terminal.py +23 -12
  141. ksadk/identity/resolver.py +15 -9
  142. ksadk/ids.py +32 -0
  143. ksadk/knowledge_base/adk_tool.py +1 -1
  144. ksadk/knowledge_base/client.py +23 -29
  145. ksadk/managed_runtime.py +188 -0
  146. ksadk/markdown.py +5 -2
  147. ksadk/mcp_runtime/__init__.py +9 -6
  148. ksadk/memory/__init__.py +1 -1
  149. ksadk/memory/adk/__init__.py +2 -0
  150. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  151. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  152. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  153. ksadk/memory/adk/backends/sdk_ltm_backend.py +26 -33
  154. ksadk/memory/adk/long_term_memory.py +31 -35
  155. ksadk/memory/adk/resilient_session_service.py +4 -5
  156. ksadk/memory/adk/short_term_memory.py +12 -21
  157. ksadk/memory/adk_tool.py +3 -2
  158. ksadk/memory/backends/base.py +19 -19
  159. ksadk/memory/backends/memory.py +24 -25
  160. ksadk/memory/backends/redis.py +31 -30
  161. ksadk/memory/langchain_tool.py +2 -1
  162. ksadk/memory/manager.py +52 -47
  163. ksadk/memory/service.py +10 -8
  164. ksadk/model_policy.py +15 -7
  165. ksadk/model_proxy/__init__.py +51 -0
  166. ksadk/model_proxy/bootstrap.py +80 -0
  167. ksadk/model_proxy/cache.py +165 -0
  168. ksadk/model_proxy/config.py +45 -0
  169. ksadk/model_proxy/demo_webui.py +115 -0
  170. ksadk/model_proxy/detect.py +145 -0
  171. ksadk/model_proxy/gate.py +68 -0
  172. ksadk/model_proxy/namespace.py +173 -0
  173. ksadk/model_proxy/protocol_proxy.py +22 -0
  174. ksadk/model_proxy/server.py +300 -0
  175. ksadk/model_proxy/transform.py +691 -0
  176. ksadk/openclaw_gateway.py +29 -14
  177. ksadk/runners/adk_runner.py +345 -120
  178. ksadk/runners/base_runner.py +46 -29
  179. ksadk/runners/codex_runner.py +132 -0
  180. ksadk/runners/deepagents_runner.py +0 -1
  181. ksadk/runners/factory.py +17 -5
  182. ksadk/runners/langchain_runner.py +29 -742
  183. ksadk/runners/langgraph_runner.py +352 -90
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +134 -33
  186. ksadk/runners/usage_accumulator.py +1 -0
  187. ksadk/runners/utils/langfuse.py +3 -3
  188. ksadk/runners/utils/loader.py +7 -7
  189. ksadk/runtime/__init__.py +41 -0
  190. ksadk/runtime/adapter.py +345 -0
  191. ksadk/runtime/framework_adapters.py +124 -0
  192. ksadk/runtime/preprocessing.py +118 -0
  193. ksadk/runtime/runner_adapter.py +873 -0
  194. ksadk/runtime_context.py +18 -3
  195. ksadk/runtime_state.py +0 -1
  196. ksadk/sandbox/__init__.py +4 -1
  197. ksadk/sandbox/backends/__init__.py +4 -1
  198. ksadk/sandbox/backends/e2b.py +13 -5
  199. ksadk/sandbox/backends/local_process.py +11 -3
  200. ksadk/sandbox/base.py +10 -15
  201. ksadk/sandbox/factory.py +14 -4
  202. ksadk/sandbox/registry.py +57 -6
  203. ksadk/server/api_models.py +15 -5
  204. ksadk/server/app.py +455 -3885
  205. ksadk/server/composition.py +21 -0
  206. ksadk/server/factory.py +624 -0
  207. ksadk/server/routes/__init__.py +1 -0
  208. ksadk/server/routes/checkpoint_resolution.py +116 -0
  209. ksadk/server/routes/common.py +713 -0
  210. ksadk/server/routes/control.py +327 -0
  211. ksadk/server/routes/dependencies.py +98 -0
  212. ksadk/server/routes/misc.py +448 -0
  213. ksadk/server/routes/models.py +443 -0
  214. ksadk/server/routes/openai_compat.py +207 -0
  215. ksadk/server/routes/projection.py +795 -0
  216. ksadk/server/routes/routers.py +52 -0
  217. ksadk/server/routes/run.py +726 -0
  218. ksadk/server/routes/sessions.py +649 -0
  219. ksadk/server/routes/streaming.py +223 -0
  220. ksadk/server/routes/workspace.py +381 -0
  221. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-Cjnqt-8W.js} +1 -1
  222. ksadk/server/static/assets/CodeBlock-BqyqZfuB.js +9 -0
  223. ksadk/server/static/assets/MathMessageMarkdown-BpH7jiFM.js +8 -0
  224. ksadk/server/static/assets/MermaidBlock-DWuxETaJ.js +303 -0
  225. ksadk/server/static/assets/NativeTerminalPanel-MDTopWMO.js +1 -0
  226. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-CFKwSk_B.js} +1 -1
  227. ksadk/server/static/assets/architecture-7EHR7CIX-CynqOWjZ.js +1 -0
  228. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D98vPd-E.js} +1 -1
  239. ksadk/server/static/assets/chunk-QZHKN3VN-YQIEXeF6.js +1 -0
  240. ksadk/server/static/assets/classDiagram-4FO5ZUOK-CDAUuoXK.js +1 -0
  241. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-CDAUuoXK.js +1 -0
  242. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-D-xOD048.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-CnfRcY2M.js} +1 -1
  272. ksadk/server/static/assets/eventmodeling-FCH6USID-ChYO-ijM.js +1 -0
  273. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-DpCoB2g9.js} +1 -1
  275. ksadk/server/static/assets/gitGraph-WXDBUCRP-BN_0Fk-j.js +1 -0
  276. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-9IKVFBVT.js} +1 -1
  277. ksadk/server/static/assets/index-QSwCHuB8.js +177 -0
  278. ksadk/server/static/assets/index-jOPmTOZH.css +2 -0
  279. ksadk/server/static/assets/info-J43DQDTF-Cp6o3vId.js +1 -0
  280. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-CSAQxEAe.js} +1 -1
  288. ksadk/server/static/assets/packet-YPE3B663-wQzct3cT.js +1 -0
  289. ksadk/server/static/assets/pie-LRSECV5Y-BgTQiv-9.js +1 -0
  290. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-CxIR4JXI.js} +1 -1
  292. ksadk/server/static/assets/radar-GUYGQ44K-BIq5fXsn.js +1 -0
  293. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-DGpd9yFG.js} +1 -1
  297. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-B3o579IQ.js +1 -0
  298. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-jqoYs3jQ.js} +1 -1
  299. ksadk/server/static/assets/treeView-BLDUP644-Dqi-E0EM.js +1 -0
  300. ksadk/server/static/assets/treemap-LRROVOQU-ClQP9CJ9.js +1 -0
  301. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-l3Z7-wbP.js} +1 -1
  302. ksadk/server/static/assets/wardley-L42UT6IY-8XLvnNIs.js +1 -0
  303. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-SkiH8GsK.js} +1 -1
  305. ksadk/server/static/index.html +2 -2
  306. ksadk/server/terminal_sessions.py +111 -58
  307. ksadk/sessions/__init__.py +69 -19
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +2 -3
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +143 -25
  313. ksadk/sessions/resilient.py +36 -8
  314. ksadk/skills/models.py +17 -5
  315. ksadk/skills/package_store.py +5 -2
  316. ksadk/skills/runtime/agent.py +20 -5
  317. ksadk/skills/runtime/artifacts.py +1 -5
  318. ksadk/skills/runtime/backends/e2b.py +10 -4
  319. ksadk/skills/runtime/backends/local.py +15 -3
  320. ksadk/skills/runtime/base.py +1 -2
  321. ksadk/skills/runtime/executor.py +10 -3
  322. ksadk/skills/runtime/factory.py +4 -2
  323. ksadk/skills/runtime/loader.py +1 -2
  324. ksadk/skills/runtime/registry.py +15 -10
  325. ksadk/skills/runtime/request.py +3 -1
  326. ksadk/skills/service_client.py +38 -17
  327. ksadk/skills/tool_defs.py +15 -10
  328. ksadk/terminal_exec_policy.py +3 -4
  329. ksadk/tools/gateway.py +92 -15
  330. ksadk/tools/result_budget.py +12 -4
  331. ksadk/toolsets/__init__.py +134 -36
  332. ksadk/toolsets/platform.py +21 -5
  333. ksadk/toolsets/sandbox.py +82 -16
  334. ksadk/toolsets/skills.py +200 -39
  335. ksadk/toolsets/web.py +123 -26
  336. ksadk/toolsets/workspace.py +212 -101
  337. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  338. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  339. ksadk/tracing/setup.py +69 -53
  340. ksadk/tracing/span_utils.py +5 -2
  341. ksadk/tui/loop.py +78 -30
  342. ksadk/tui/stream_render.py +1 -0
  343. ksadk/ui_config.py +5 -3
  344. ksadk/version.py +1 -1
  345. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  346. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  347. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  348. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  349. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  350. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  351. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  352. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  353. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  354. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  355. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  356. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  357. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  358. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  359. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  360. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  361. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  362. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  363. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  364. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  365. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  366. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  367. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  368. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  369. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  370. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  371. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,327 @@
1
+ """Cancel, resume, preview, and run-event subscription routes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import json
7
+ import time
8
+ import uuid
9
+ from collections.abc import AsyncIterator, Mapping
10
+ from typing import Any, Optional
11
+
12
+ from fastapi import HTTPException, Query
13
+ from fastapi.responses import StreamingResponse
14
+
15
+ from ksadk.conversations.run_kinds import (
16
+ RUN_MODE_BACKGROUND,
17
+ RUN_MODE_FOREGROUND,
18
+ RUN_TRIGGER_CHECKPOINT_RESUME,
19
+ )
20
+
21
+ from . import dependencies as deps
22
+ from .checkpoint_resolution import _find_session_checkpoint
23
+ from .common import _action_response, _prepare_runner_for_model, _resolve_active_runner
24
+ from .models import (
25
+ _MAX_PREVIEW_TOOL_RECEIPTS,
26
+ _RUN_TERMINAL_STATUSES,
27
+ GetCheckpointResumePreviewActionRequest,
28
+ ResumeRunActionRequest,
29
+ _run_agent_response_metadata,
30
+ _split_custom_metadata,
31
+ )
32
+ from .projection import (
33
+ _SIDE_EFFECT_TOOL_NAMES,
34
+ _build_checkpoint_resume_preview,
35
+ _checkpoint_resume_disabled_detail,
36
+ _event_to_action_payload,
37
+ _iter_session_event_pages,
38
+ _latest_invocation_status,
39
+ _oldest_unconsumed_session_events,
40
+ _require_action_session,
41
+ _session_contains_invocation,
42
+ _tool_receipt_event_to_action_payload,
43
+ )
44
+ from .routers import control_router, run_router
45
+ from .streaming import (
46
+ _detached_resume_key_from_input,
47
+ _reject_if_detached_resume_active,
48
+ )
49
+
50
+
51
+ @control_router.post("/agentengine/api/v1/GetCheckpointResumePreview")
52
+ async def get_checkpoint_resume_preview_action(request: GetCheckpointResumePreviewActionRequest):
53
+ service = deps.resolve_session_service()
54
+ await _require_action_session(
55
+ service,
56
+ session_id=request.SessionId,
57
+ agent_id=request.AgentId,
58
+ user_id=request.UserId,
59
+ )
60
+
61
+ checkpoint = await _find_session_checkpoint(
62
+ service=service,
63
+ session_id=request.SessionId,
64
+ run_id=str(request.RunId),
65
+ checkpoint_id=str(request.CheckpointId),
66
+ )
67
+ if checkpoint is None:
68
+ raise HTTPException(status_code=404, detail="Checkpoint not found")
69
+
70
+ checkpoint_seq_id = int(checkpoint.get("SeqId") or 0)
71
+ checkpoint_run_id = str(checkpoint.get("RunId") or "")
72
+ receipts: list[dict[str, Any]] = []
73
+ receipt_total = 0
74
+ side_effect_receipt_count = 0
75
+ failed_receipt_count = 0
76
+ async for page in _iter_session_event_pages(
77
+ service,
78
+ request.SessionId,
79
+ before_seq_id=checkpoint_seq_id + 1 if checkpoint_seq_id else None,
80
+ ):
81
+ for event in page:
82
+ receipt = _tool_receipt_event_to_action_payload(event)
83
+ if receipt is None:
84
+ continue
85
+ if checkpoint_run_id and receipt["RunId"] and receipt["RunId"] != checkpoint_run_id:
86
+ continue
87
+ receipt_total += 1
88
+ if receipt["ToolName"] in _SIDE_EFFECT_TOOL_NAMES:
89
+ side_effect_receipt_count += 1
90
+ if receipt["Status"] == "failed":
91
+ failed_receipt_count += 1
92
+ if len(receipts) < _MAX_PREVIEW_TOOL_RECEIPTS:
93
+ receipts.append(receipt)
94
+
95
+ return _action_response(
96
+ "GetCheckpointResumePreview",
97
+ {
98
+ "Preview": _build_checkpoint_resume_preview(
99
+ checkpoint=checkpoint,
100
+ receipts=receipts,
101
+ receipt_total=receipt_total,
102
+ side_effect_receipt_count=side_effect_receipt_count,
103
+ failed_receipt_count=failed_receipt_count,
104
+ )
105
+ },
106
+ )
107
+
108
+
109
+ @control_router.post("/agentengine/api/v1/ResumeRun")
110
+ async def resume_run_action(request: ResumeRunActionRequest):
111
+ service = deps.resolve_session_service()
112
+ session = await _require_action_session(
113
+ service,
114
+ session_id=request.SessionId,
115
+ agent_id=request.AgentId,
116
+ user_id=request.UserId,
117
+ )
118
+
119
+ checkpoint = await _find_session_checkpoint(
120
+ service=service,
121
+ session_id=request.SessionId,
122
+ run_id=str(request.RunId),
123
+ checkpoint_id=str(request.CheckpointId),
124
+ )
125
+ if checkpoint is None:
126
+ raise HTTPException(status_code=404, detail="Checkpoint not found")
127
+ disabled_detail = _checkpoint_resume_disabled_detail(checkpoint)
128
+ if disabled_detail is not None:
129
+ if disabled_detail.get("is_terminal"):
130
+ resume_attempt_id = str(request.ResumeAttemptId or f"resume_{uuid.uuid4().hex}")
131
+ invocation_id = str(request.InvocationId or resume_attempt_id)
132
+ await deps.conversation().append_run_resume_event(
133
+ session_id=request.SessionId,
134
+ author=request.AgentId,
135
+ run_id=str(request.RunId),
136
+ checkpoint_id=str(request.CheckpointId),
137
+ resume_attempt_id=resume_attempt_id,
138
+ framework=checkpoint["Framework"],
139
+ framework_ref=checkpoint["FrameworkRef"],
140
+ invocation_id=invocation_id,
141
+ session_service_provider=deps.resolve_session_service,
142
+ )
143
+ await deps.conversation().append_run_status_event(
144
+ session_id=request.SessionId,
145
+ author=request.AgentId,
146
+ status="completed",
147
+ invocation_id=invocation_id,
148
+ detail="resume_noop_terminal_checkpoint",
149
+ session_service_provider=deps.resolve_session_service,
150
+ run_mode=RUN_MODE_BACKGROUND,
151
+ run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
152
+ )
153
+ return _action_response(
154
+ "ResumeRun",
155
+ {
156
+ "status": "noop",
157
+ "Reason": disabled_detail["reason"],
158
+ "CheckpointId": disabled_detail["checkpoint_id"],
159
+ "RunId": disabled_detail["run_id"],
160
+ "ResumeAttemptId": resume_attempt_id,
161
+ },
162
+ )
163
+ raise HTTPException(status_code=409, detail=disabled_detail)
164
+
165
+ resume_input = {
166
+ "type": "agentengine.resume_checkpoint",
167
+ "run_id": str(request.RunId),
168
+ "checkpoint_id": str(request.CheckpointId),
169
+ "resume_attempt_id": str(request.ResumeAttemptId or f"resume_{uuid.uuid4().hex}"),
170
+ "framework": checkpoint["Framework"],
171
+ "framework_ref": checkpoint["FrameworkRef"],
172
+ "metadata": dict(checkpoint.get("Metadata") or {}),
173
+ "checkpoint_metadata": dict(checkpoint.get("Metadata") or {}),
174
+ "resume_instruction_enabled": bool(getattr(request, "ResumeInstructionEnabled", False)),
175
+ "resume_instruction": str(getattr(request, "ResumeInstruction", "") or "").strip(),
176
+ }
177
+ active_runner = _resolve_active_runner()
178
+ user_id = session.user_id or "user"
179
+ custom_metadata, _metadata_runtime_controls = _split_custom_metadata(request.Metadata)
180
+ resume_request_metadata = {
181
+ "responses_conversation": True,
182
+ }
183
+
184
+ if request.Stream:
185
+ resume_invocation_id = str(request.InvocationId or resume_input["resume_attempt_id"])
186
+ resume_key = _detached_resume_key_from_input(request.SessionId, resume_input)
187
+ _reject_if_detached_resume_active(resume_key)
188
+ # 与 RunAgent Background 同款:返回 SSE 前同步落 resuming 起始事件。
189
+ # detached turn 的首个事件要等流被消费才写;UI 拿到响应头会立刻调
190
+ # SubscribeRunEvents,其 _session_contains_invocation 校验若抢在首次写入前
191
+ # 会误判 409 "InvocationId does not belong to SessionId"。
192
+ # append_run_status_event 按 (invocation_id, status) 幂等,turn 内的补写会去重。
193
+ await deps.conversation().append_run_status_event(
194
+ session_id=request.SessionId,
195
+ author=request.AgentId,
196
+ status="resuming",
197
+ invocation_id=resume_invocation_id,
198
+ detail="checkpoint_resume",
199
+ session_service_provider=deps.resolve_session_service,
200
+ run_mode=RUN_MODE_BACKGROUND,
201
+ run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
202
+ )
203
+ return deps.detached_streaming_response(
204
+ deps.conversation().stream_responses_conversation_turn(
205
+ runner=active_runner,
206
+ agent_id=request.AgentId,
207
+ user_id=user_id,
208
+ messages=[],
209
+ session_id=request.SessionId,
210
+ model=request.Model,
211
+ model_metadata=request.ModelMetadata,
212
+ model_options=request.ModelOptions,
213
+ request_metadata=resume_request_metadata,
214
+ custom_metadata=custom_metadata,
215
+ include_agentengine_metadata=True,
216
+ resume_input=resume_input,
217
+ invocation_id=resume_invocation_id,
218
+ prepare_runner=_prepare_runner_for_model,
219
+ session_service_provider=deps.resolve_session_service,
220
+ run_mode=RUN_MODE_BACKGROUND,
221
+ ),
222
+ invocation_id=resume_invocation_id,
223
+ resume_key=resume_key,
224
+ run_mode=RUN_MODE_BACKGROUND,
225
+ run_trigger=RUN_TRIGGER_CHECKPOINT_RESUME,
226
+ )
227
+
228
+ response_id = f"resp_{uuid.uuid4().hex}"
229
+ resolved_session_id, result = await deps.conversation().invoke_conversation_once(
230
+ runner=active_runner,
231
+ agent_id=request.AgentId,
232
+ user_id=user_id,
233
+ messages=[],
234
+ session_id=request.SessionId,
235
+ model=request.Model,
236
+ model_metadata=request.ModelMetadata,
237
+ model_options=request.ModelOptions,
238
+ request_metadata=resume_request_metadata,
239
+ custom_metadata=custom_metadata,
240
+ resume_input=resume_input,
241
+ response_id=response_id,
242
+ invocation_id=str(resume_input["resume_attempt_id"]),
243
+ prepare_runner=_prepare_runner_for_model,
244
+ session_service_provider=deps.resolve_session_service,
245
+ run_mode=RUN_MODE_FOREGROUND,
246
+ )
247
+ payload = deps.conversation().build_responses_payload(
248
+ output_text=result["output_text"],
249
+ model=request.Model,
250
+ session_id=resolved_session_id,
251
+ response_id=response_id,
252
+ metadata=_run_agent_response_metadata(custom_metadata, result),
253
+ usage=result.get("usage") if isinstance(result.get("usage"), Mapping) else None,
254
+ )
255
+ return _action_response("ResumeRun", payload)
256
+
257
+
258
+ @run_router.get("/agentengine/api/v1/SubscribeRunEvents", include_in_schema=False)
259
+ async def subscribe_run_events_action(
260
+ SessionId: str = Query(...),
261
+ InvocationId: str = Query(...),
262
+ AfterSeqId: int = Query(0),
263
+ AgentId: Optional[str] = Query(None),
264
+ UserId: Optional[str] = Query(None),
265
+ ):
266
+ session_id = str(SessionId or "").strip()
267
+ invocation_id = str(InvocationId or "").strip()
268
+ if not session_id or not invocation_id:
269
+ raise HTTPException(status_code=400, detail="SessionId and InvocationId are required")
270
+ service = deps.resolve_session_service()
271
+ await _require_action_session(
272
+ service,
273
+ session_id=session_id,
274
+ agent_id=AgentId,
275
+ user_id=UserId,
276
+ )
277
+ if not await _session_contains_invocation(service, session_id, invocation_id):
278
+ raise HTTPException(
279
+ status_code=409,
280
+ detail="InvocationId does not belong to SessionId",
281
+ )
282
+
283
+ async def event_generator() -> AsyncIterator[str]:
284
+ last_seq_id = int(AfterSeqId or 0)
285
+ deadline = time.monotonic() + 5 * 60
286
+ last_heartbeat_at = time.monotonic()
287
+ last_terminal_check_at = 0.0
288
+ while True:
289
+ events = await _oldest_unconsumed_session_events(
290
+ service,
291
+ session_id,
292
+ after_seq_id=last_seq_id,
293
+ )
294
+ for event in events:
295
+ last_seq_id = max(last_seq_id, event.seq_id)
296
+ if event.invocation_id != invocation_id:
297
+ continue
298
+ payload = _event_to_action_payload(event)
299
+ yield f"data: {json.dumps(payload, ensure_ascii=False)}\n\n"
300
+ last_heartbeat_at = time.monotonic()
301
+ if (
302
+ event.event_type == "run_status"
303
+ and str((event.content or {}).get("status") or "").strip().lower()
304
+ in _RUN_TERMINAL_STATUSES
305
+ ):
306
+ yield "data: [DONE]\n\n"
307
+ return
308
+
309
+ now = time.monotonic()
310
+ if not events and now - last_terminal_check_at >= deps.heartbeat_interval():
311
+ latest_status = await _latest_invocation_status(
312
+ service,
313
+ session_id,
314
+ invocation_id,
315
+ )
316
+ last_terminal_check_at = now
317
+ if latest_status in _RUN_TERMINAL_STATUSES:
318
+ yield "data: [DONE]\n\n"
319
+ return
320
+ if now - last_heartbeat_at >= deps.heartbeat_interval():
321
+ yield ": heartbeat\n\n"
322
+ last_heartbeat_at = now
323
+ if now > deadline:
324
+ return
325
+ await asyncio.sleep(0.25)
326
+
327
+ return StreamingResponse(event_generator(), media_type="text/event-stream")
@@ -0,0 +1,98 @@
1
+ """Explicit compatibility dependencies shared by extracted route modules.
2
+
3
+ The default app keeps a few historically monkeypatchable exports. Providers are
4
+ callbacks so route modules observe those replacements without importing the app
5
+ module back into the domain layer.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import contextvars
11
+ from contextlib import contextmanager
12
+ from dataclasses import dataclass
13
+ from typing import Any, Callable, Iterator
14
+
15
+
16
+ @dataclass(frozen=True)
17
+ class ServerRouteDependencies:
18
+ resolve_session_service: Callable[[], Any]
19
+ describe_session_backend: Callable[[], dict[str, Any]]
20
+ resolve_agent_ui_spec: Callable[[], dict[str, Any]]
21
+ conversation: Callable[[], Any]
22
+ detached_streaming_response: Callable[..., Any]
23
+ detached_stream_class: Callable[[], type[Any]]
24
+ heartbeat_interval: Callable[[], float]
25
+ runtime_app: Callable[[], Any]
26
+
27
+
28
+ _dependencies: ServerRouteDependencies | None = None
29
+ _session_service_override: contextvars.ContextVar[Any | None] = contextvars.ContextVar(
30
+ "ksadk_route_session_service", default=None
31
+ )
32
+ _session_backend_override: contextvars.ContextVar[dict[str, Any] | None] = contextvars.ContextVar(
33
+ "ksadk_route_session_backend", default=None
34
+ )
35
+
36
+
37
+ def configure(dependencies: ServerRouteDependencies) -> None:
38
+ global _dependencies
39
+ _dependencies = dependencies
40
+
41
+
42
+ def current() -> ServerRouteDependencies:
43
+ if _dependencies is None:
44
+ raise RuntimeError("server route dependencies are not configured")
45
+ return _dependencies
46
+
47
+
48
+ def resolve_session_service() -> Any:
49
+ override = _session_service_override.get()
50
+ if override is not None:
51
+ return override
52
+ return current().resolve_session_service()
53
+
54
+
55
+ @contextmanager
56
+ def bind_session_service(service: Any, *, backend: dict[str, Any] | None = None) -> Iterator[None]:
57
+ """Bind an app-owned session service for one request context."""
58
+ from ksadk.sessions import bind_session_service as bind_runtime_session_service
59
+
60
+ service_token = _session_service_override.set(service)
61
+ backend_token = _session_backend_override.set(backend)
62
+ try:
63
+ with bind_runtime_session_service(service):
64
+ yield
65
+ finally:
66
+ _session_backend_override.reset(backend_token)
67
+ _session_service_override.reset(service_token)
68
+
69
+
70
+ def describe_session_backend() -> dict[str, Any]:
71
+ override = _session_backend_override.get()
72
+ if override is not None:
73
+ return dict(override)
74
+ return current().describe_session_backend()
75
+
76
+
77
+ def resolve_agent_ui_spec() -> dict[str, Any]:
78
+ return current().resolve_agent_ui_spec()
79
+
80
+
81
+ def conversation() -> Any:
82
+ return current().conversation()
83
+
84
+
85
+ def detached_streaming_response(*args: Any, **kwargs: Any) -> Any:
86
+ return current().detached_streaming_response(*args, **kwargs)
87
+
88
+
89
+ def detached_stream_class() -> type[Any]:
90
+ return current().detached_stream_class()
91
+
92
+
93
+ def heartbeat_interval() -> float:
94
+ return current().heartbeat_interval()
95
+
96
+
97
+ def runtime_app() -> Any:
98
+ return current().runtime_app()