agentengine-sdk-python 0.6.9__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 (384) hide show
  1. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/METADATA +41 -23
  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 +252 -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 +533 -726
  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 +173 -90
  54. ksadk/cli/cmd_invoke.py +388 -159
  55. ksadk/cli/cmd_launch.py +64 -28
  56. ksadk/cli/cmd_mcp.py +103 -64
  57. ksadk/cli/cmd_model.py +14 -5
  58. ksadk/cli/cmd_openclaw.py +488 -228
  59. ksadk/cli/cmd_replay.py +71 -0
  60. ksadk/cli/cmd_run.py +44 -14
  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 +38 -16
  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 +501 -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 +656 -0
  97. ksadk/conversations/model_context.py +22 -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 -5187
  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 +52 -39
  120. ksadk/deployment/manager.py +63 -65
  121. ksadk/deployment/providers/serverless.py +326 -209
  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 +267 -0
  156. ksadk/memory/adk/short_term_memory.py +33 -27
  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 +1248 -164
  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 -530
  183. ksadk/runners/langgraph_runner.py +490 -95
  184. ksadk/runners/patch_langchain.py +16 -16
  185. ksadk/runners/remote_runner.py +264 -38
  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 -3743
  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-C0meuOdi.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-bj2rZnP5.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-2u1ltDIj.js → architectureDiagram-3BPJPVTR-Dej8jX8c.js} +1 -1
  229. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-D6fvdK20.js → blockDiagram-GPEHLZMM-1F64jqvy.js} +1 -1
  230. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-BK82L5n5.js → c4Diagram-AAUBKEIU-9q7AUAKb.js} +1 -1
  231. ksadk/server/static/assets/channel-iUGv2N24.js +1 -0
  232. ksadk/server/static/assets/{chunk-2J33WTMH-DLVdkeyQ.js → chunk-2J33WTMH-6qgwJm7Q.js} +1 -1
  233. ksadk/server/static/assets/{chunk-4BX2VUAB-BbwsYcbW.js → chunk-4BX2VUAB-CsWIQRhc.js} +1 -1
  234. ksadk/server/static/assets/{chunk-55IACEB6-DOairxzw.js → chunk-55IACEB6-BK8paA20.js} +1 -1
  235. ksadk/server/static/assets/{chunk-727SXJPM-hCO487gs.js → chunk-727SXJPM-B-JEhy7h.js} +1 -1
  236. ksadk/server/static/assets/{chunk-AQP2D5EJ-XU8vDOuG.js → chunk-AQP2D5EJ-DYBvMHAa.js} +1 -1
  237. ksadk/server/static/assets/{chunk-FMBD7UC4-PrapyfMu.js → chunk-FMBD7UC4-BGhvzDYt.js} +1 -1
  238. ksadk/server/static/assets/{chunk-ND2GUHAM-CboKhTZ3.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-_N8bJ-EU.js → cose-bilkent-S5V4N54A-CX3yotHq.js} +1 -1
  243. ksadk/server/static/assets/{dagre-BM42HDAG-FoDlo5J2.js → dagre-BM42HDAG-C7TguAWo.js} +1 -1
  244. ksadk/server/static/assets/{diagram-2AECGRRQ-BBp6ebBw.js → diagram-2AECGRRQ-Dd17_kws.js} +1 -1
  245. ksadk/server/static/assets/{diagram-5GNKFQAL-CqOvG1PR.js → diagram-5GNKFQAL-DVIClIil.js} +1 -1
  246. ksadk/server/static/assets/{diagram-KO2AKTUF-O9T3t6ba.js → diagram-KO2AKTUF-Df_3gYQa.js} +1 -1
  247. ksadk/server/static/assets/{diagram-LMA3HP47-CGG8ekBO.js → diagram-LMA3HP47-BhLk6ZtA.js} +1 -1
  248. ksadk/server/static/assets/{diagram-OG6HWLK6-4BmH1EEg.js → diagram-OG6HWLK6-D4GNGvuu.js} +1 -1
  249. ksadk/server/static/assets/{dist-CiZHB6ZW.js → dist-6CVKuTAe.js} +1 -1
  250. ksadk/server/static/assets/{dist-BMKM66B4.js → dist-BUHRxvDG.js} +1 -1
  251. ksadk/server/static/assets/{dist-CZ6C3x8B.js → dist-BZ9n9AjO.js} +1 -1
  252. ksadk/server/static/assets/{dist-DbaH3p5h.js → dist-BibcG1V9.js} +1 -1
  253. ksadk/server/static/assets/{dist-BVzcWa6D.js → dist-Bs-jQcRX.js} +1 -1
  254. ksadk/server/static/assets/{dist-D99wf6_X.js → dist-C2xjE7cO.js} +1 -1
  255. ksadk/server/static/assets/{dist-DLMjL01k.js → dist-C7-3jInC.js} +1 -1
  256. ksadk/server/static/assets/{dist-DI-oVAXw.js → dist-C99THtIA.js} +1 -1
  257. ksadk/server/static/assets/{dist-BkJjNih3.js → dist-CGcp2ex8.js} +1 -1
  258. ksadk/server/static/assets/{dist-D5JGcxBx.js → dist-CVQRZjPu.js} +1 -1
  259. ksadk/server/static/assets/{dist-CWiTDN_V.js → dist-Cf23NY4L.js} +1 -1
  260. ksadk/server/static/assets/{dist-DLeM1OCK.js → dist-CgF3fj15.js} +1 -1
  261. ksadk/server/static/assets/{dist-BmuTWcm7.js → dist-Cwt7koer.js} +1 -1
  262. ksadk/server/static/assets/{dist-C2DKRFVK.js → dist-D82mtD2s.js} +1 -1
  263. ksadk/server/static/assets/{dist-B67uF2uK.js → dist-DF06ORQo.js} +1 -1
  264. ksadk/server/static/assets/{dist-Cwhk4lwI.js → dist-DHn6nBzr.js} +1 -1
  265. ksadk/server/static/assets/{dist-S4klkK5W.js → dist-Djgl2wVZ.js} +1 -1
  266. ksadk/server/static/assets/{dist-DCpZrjaK.js → dist-DlzCRy0S.js} +1 -1
  267. ksadk/server/static/assets/{dist-Cp1_jKwf.js → dist-DqNnNFrw.js} +1 -1
  268. ksadk/server/static/assets/{dist-6kSZvCZh.js → dist-DyvYLMW9.js} +1 -1
  269. ksadk/server/static/assets/{dist-DM0rEQPk.js → dist-eoW6tZXA.js} +1 -1
  270. ksadk/server/static/assets/{dist-Bk1l05Ni.js → dist-ivOya1LD.js} +1 -1
  271. ksadk/server/static/assets/{erDiagram-TEJ5UH35-oJhaci7S.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-DtTmUan-.js → flowDiagram-I6XJVG4X-DGaJjGNJ.js} +1 -1
  274. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BSsb_eij.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-BR5s6Pws.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-DYPc5cvh.js → infoDiagram-5YYISTIA-CYIIsb8y.js} +1 -1
  281. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-MoBdALDg.js → ishikawaDiagram-YF4QCWOH-DLOHGvWw.js} +1 -1
  282. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-DgLiQT8l.js → journeyDiagram-JHISSGLW-BIzKeejT.js} +1 -1
  283. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-CsFx112F.js → kanban-definition-UN3LZRKU-BWHoFSw2.js} +1 -1
  284. ksadk/server/static/assets/{katex-DRsiwpM2.js → katex-DATssjp1.js} +1 -1
  285. ksadk/server/static/assets/{linear-TNRQ5Orv.js → linear-CvMBw9cA.js} +1 -1
  286. ksadk/server/static/assets/{mermaid-parser.core-D2eMVOgo.js → mermaid-parser.core-mGAcEwcq.js} +2 -2
  287. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-BtByYFhL.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-DPnuCB8c.js → pieDiagram-4H26LBE5-By-ra07M.js} +1 -1
  291. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-miFpCPv4.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-mjB_yYkW.js → requirementDiagram-4Y6WPE33-DpW90iu3.js} +1 -1
  294. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-D7hSlZZZ.js → sankeyDiagram-5OEKKPKP-DpGa6EAV.js} +1 -1
  295. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-D9Cx6hC3.js → sequenceDiagram-3UESZ5HK-NTKNGGe5.js} +1 -1
  296. ksadk/server/static/assets/{stateDiagram-AJRCARHV-D_zrg47o.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-CwSec0Wa.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-agCVobiF.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-TmrlhWNt.js → wardleyDiagram-YWT4CUSO-BR54GPmr.js} +1 -1
  304. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-DV71V-ah.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 +86 -40
  308. ksadk/sessions/base.py +31 -11
  309. ksadk/sessions/continuity.py +28 -5
  310. ksadk/sessions/in_memory.py +46 -2
  311. ksadk/sessions/local_service.py +148 -17
  312. ksadk/sessions/postgres_service.py +216 -35
  313. ksadk/sessions/resilience.py +52 -0
  314. ksadk/sessions/resilient.py +388 -0
  315. ksadk/skills/models.py +17 -5
  316. ksadk/skills/package_store.py +5 -2
  317. ksadk/skills/runtime/agent.py +20 -5
  318. ksadk/skills/runtime/artifacts.py +1 -5
  319. ksadk/skills/runtime/backends/e2b.py +10 -4
  320. ksadk/skills/runtime/backends/local.py +15 -3
  321. ksadk/skills/runtime/base.py +1 -2
  322. ksadk/skills/runtime/executor.py +10 -3
  323. ksadk/skills/runtime/factory.py +4 -2
  324. ksadk/skills/runtime/loader.py +1 -2
  325. ksadk/skills/runtime/registry.py +15 -10
  326. ksadk/skills/runtime/request.py +3 -1
  327. ksadk/skills/service_client.py +38 -17
  328. ksadk/skills/tool_defs.py +15 -10
  329. ksadk/terminal_exec_policy.py +3 -4
  330. ksadk/tools/gateway.py +92 -15
  331. ksadk/tools/result_budget.py +12 -4
  332. ksadk/toolsets/__init__.py +136 -36
  333. ksadk/toolsets/platform.py +21 -5
  334. ksadk/toolsets/sandbox.py +82 -16
  335. ksadk/toolsets/skills.py +200 -39
  336. ksadk/toolsets/web.py +123 -26
  337. ksadk/toolsets/workspace.py +264 -114
  338. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  339. ksadk/tracing/exporters/langfuse_exporter.py +91 -76
  340. ksadk/tracing/setup.py +132 -53
  341. ksadk/tracing/span_utils.py +5 -2
  342. ksadk/tui/__init__.py +22 -7
  343. ksadk/tui/loop.py +1925 -0
  344. ksadk/tui/stream_render.py +69 -0
  345. ksadk/ui_config.py +5 -3
  346. ksadk/version.py +1 -1
  347. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  348. agentengine_sdk_python-0.6.9.dist-info/RECORD +0 -487
  349. ksadk/server/static/assets/CodeBlock-BbI4HPtJ.js +0 -9
  350. ksadk/server/static/assets/MathMessageMarkdown-DMLQYoLp.js +0 -8
  351. ksadk/server/static/assets/MermaidBlock-DCR8WZ17.js +0 -303
  352. ksadk/server/static/assets/NativeTerminalPanel-CKUvWhUz.js +0 -1
  353. ksadk/server/static/assets/architecture-7EHR7CIX-Cr6Xz1_c.js +0 -1
  354. ksadk/server/static/assets/channel-BSSOwFIb.js +0 -1
  355. ksadk/server/static/assets/chunk-QZHKN3VN-XXpdiwUL.js +0 -1
  356. ksadk/server/static/assets/classDiagram-4FO5ZUOK-C5HvGiyK.js +0 -1
  357. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-C5HvGiyK.js +0 -1
  358. ksadk/server/static/assets/eventmodeling-FCH6USID-CIgwHJLL.js +0 -1
  359. ksadk/server/static/assets/gitGraph-WXDBUCRP-BVAJ7uo0.js +0 -1
  360. ksadk/server/static/assets/index-BH7-pC0B.js +0 -165
  361. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  362. ksadk/server/static/assets/info-J43DQDTF-MT80V4ge.js +0 -1
  363. ksadk/server/static/assets/packet-YPE3B663-BLKhbXZB.js +0 -1
  364. ksadk/server/static/assets/pie-LRSECV5Y-DFOikjSY.js +0 -1
  365. ksadk/server/static/assets/radar-GUYGQ44K-095b1Ikw.js +0 -1
  366. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-J9kCb0nC.js +0 -1
  367. ksadk/server/static/assets/treeView-BLDUP644-yinfJEY6.js +0 -1
  368. ksadk/server/static/assets/treemap-LRROVOQU-DosUqN1Q.js +0 -1
  369. ksadk/server/static/assets/wardley-L42UT6IY-Bvp7-5uH.js +0 -1
  370. ksadk/tui/app.py +0 -400
  371. ksadk/tui/clipboard.py +0 -100
  372. ksadk/tui/widgets/__init__.py +0 -22
  373. ksadk/tui/widgets/assistant.py +0 -89
  374. ksadk/tui/widgets/base.py +0 -54
  375. ksadk/tui/widgets/chat_input.py +0 -246
  376. ksadk/tui/widgets/history.py +0 -156
  377. ksadk/tui/widgets/system.py +0 -87
  378. ksadk/tui/widgets/thinking.py +0 -110
  379. ksadk/tui/widgets/tool_call.py +0 -161
  380. ksadk/tui/widgets/user.py +0 -37
  381. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/WHEEL +0 -0
  382. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/entry_points.txt +0 -0
  383. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/licenses/LICENSE +0 -0
  384. {agentengine_sdk_python-0.6.9.dist-info → agentengine_sdk_python-0.8.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,201 @@
1
+ """Runtime-local storage for opaque A2A input-required recovery state."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import hashlib
7
+ import json
8
+ import os
9
+ import sqlite3
10
+ from abc import ABC, abstractmethod
11
+ from dataclasses import dataclass
12
+ from pathlib import Path
13
+ from typing import Literal, TypeAlias
14
+
15
+ from ksadk.runtime.adapter import ResumePayload, ResumeTarget, RunHandle
16
+
17
+ A2AResumePayloadKind: TypeAlias = Literal[
18
+ "tool_result",
19
+ "approval_decision",
20
+ "hitl_answer",
21
+ "free_text",
22
+ ]
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class A2AResumeState:
27
+ """Private Runtime state needed to resume one protocol Task."""
28
+
29
+ handle: RunHandle
30
+ target: ResumeTarget
31
+ payload_kind: A2AResumePayloadKind
32
+ call_id: str | None = None
33
+
34
+
35
+ class A2AResumeStateStore(ABC):
36
+ """Persists recovery state outside public A2A Task metadata."""
37
+
38
+ @abstractmethod
39
+ async def initialize(self) -> None:
40
+ raise NotImplementedError
41
+
42
+ @abstractmethod
43
+ async def put(self, key: str, state: A2AResumeState) -> None:
44
+ raise NotImplementedError
45
+
46
+ @abstractmethod
47
+ async def get(self, key: str) -> A2AResumeState | None:
48
+ raise NotImplementedError
49
+
50
+ @abstractmethod
51
+ async def delete(self, key: str) -> None:
52
+ raise NotImplementedError
53
+
54
+
55
+ class InMemoryA2AResumeStateStore(A2AResumeStateStore):
56
+ """Local-development store; it intentionally does not survive a restart."""
57
+
58
+ def __init__(self) -> None:
59
+ self._states: dict[str, A2AResumeState] = {}
60
+
61
+ async def initialize(self) -> None:
62
+ return None
63
+
64
+ async def put(self, key: str, state: A2AResumeState) -> None:
65
+ self._states[key] = state
66
+
67
+ async def get(self, key: str) -> A2AResumeState | None:
68
+ return self._states.get(key)
69
+
70
+ async def delete(self, key: str) -> None:
71
+ self._states.pop(key, None)
72
+
73
+
74
+ class SQLiteA2AResumeStateStore(A2AResumeStateStore):
75
+ """Crash-safe Runtime-local store for single-replica/persistent-volume deployments."""
76
+
77
+ def __init__(self, path: str | os.PathLike[str]) -> None:
78
+ self._path = Path(path)
79
+ self._initialized = False
80
+ self._init_lock = asyncio.Lock()
81
+
82
+ @property
83
+ def path(self) -> Path:
84
+ return self._path
85
+
86
+ async def initialize(self) -> None:
87
+ if self._initialized:
88
+ return
89
+ async with self._init_lock:
90
+ if self._initialized:
91
+ return
92
+ await asyncio.to_thread(self._initialize_sync)
93
+ self._initialized = True
94
+
95
+ async def put(self, key: str, state: A2AResumeState) -> None:
96
+ await self.initialize()
97
+ payload = json.dumps(
98
+ {
99
+ "handle": state.handle.model_dump(mode="json"),
100
+ "target": state.target.model_dump(mode="json"),
101
+ "payload_kind": state.payload_kind,
102
+ "call_id": state.call_id,
103
+ },
104
+ separators=(",", ":"),
105
+ sort_keys=True,
106
+ )
107
+ await asyncio.to_thread(self._put_sync, key, payload)
108
+
109
+ async def get(self, key: str) -> A2AResumeState | None:
110
+ await self.initialize()
111
+ payload = await asyncio.to_thread(self._get_sync, key)
112
+ if payload is None:
113
+ return None
114
+ try:
115
+ raw = json.loads(payload)
116
+ return A2AResumeState(
117
+ handle=RunHandle.model_validate(raw["handle"]),
118
+ target=ResumeTarget.model_validate(raw["target"]),
119
+ payload_kind=ResumePayload.model_validate(
120
+ {"kind": raw["payload_kind"]}
121
+ ).kind,
122
+ call_id=str(raw["call_id"]) if raw.get("call_id") is not None else None,
123
+ )
124
+ except (KeyError, TypeError, ValueError, json.JSONDecodeError) as exc:
125
+ raise RuntimeError("A2A resume state is invalid") from exc
126
+
127
+ async def delete(self, key: str) -> None:
128
+ await self.initialize()
129
+ await asyncio.to_thread(self._delete_sync, key)
130
+
131
+ def _initialize_sync(self) -> None:
132
+ self._path.parent.mkdir(parents=True, exist_ok=True)
133
+ connection = sqlite3.connect(self._path, timeout=5)
134
+ try:
135
+ connection.execute("PRAGMA journal_mode=WAL")
136
+ connection.execute("PRAGMA synchronous=FULL")
137
+ connection.execute(
138
+ """
139
+ CREATE TABLE IF NOT EXISTS ksadk_a2a_resume_states (
140
+ resume_key_sha256 TEXT PRIMARY KEY,
141
+ state_json TEXT NOT NULL,
142
+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
143
+ )
144
+ """
145
+ )
146
+ connection.commit()
147
+ finally:
148
+ connection.close()
149
+ os.chmod(self._path, 0o600)
150
+
151
+ @staticmethod
152
+ def _hash(key: str) -> str:
153
+ return hashlib.sha256(key.encode("utf-8")).hexdigest()
154
+
155
+ def _put_sync(self, key: str, payload: str) -> None:
156
+ connection = sqlite3.connect(self._path, timeout=5)
157
+ try:
158
+ connection.execute(
159
+ """
160
+ INSERT INTO ksadk_a2a_resume_states(resume_key_sha256, state_json)
161
+ VALUES (?, ?)
162
+ ON CONFLICT(resume_key_sha256) DO UPDATE SET
163
+ state_json = excluded.state_json,
164
+ updated_at = CURRENT_TIMESTAMP
165
+ """,
166
+ (self._hash(key), payload),
167
+ )
168
+ connection.commit()
169
+ finally:
170
+ connection.close()
171
+
172
+ def _get_sync(self, key: str) -> str | None:
173
+ connection = sqlite3.connect(self._path, timeout=5)
174
+ try:
175
+ row = connection.execute(
176
+ "SELECT state_json FROM ksadk_a2a_resume_states WHERE resume_key_sha256 = ?",
177
+ (self._hash(key),),
178
+ ).fetchone()
179
+ return str(row[0]) if row is not None else None
180
+ finally:
181
+ connection.close()
182
+
183
+ def _delete_sync(self, key: str) -> None:
184
+ connection = sqlite3.connect(self._path, timeout=5)
185
+ try:
186
+ connection.execute(
187
+ "DELETE FROM ksadk_a2a_resume_states WHERE resume_key_sha256 = ?",
188
+ (self._hash(key),),
189
+ )
190
+ connection.commit()
191
+ finally:
192
+ connection.close()
193
+
194
+
195
+ __all__ = [
196
+ "A2AResumeState",
197
+ "A2AResumePayloadKind",
198
+ "A2AResumeStateStore",
199
+ "InMemoryA2AResumeStateStore",
200
+ "SQLiteA2AResumeStateStore",
201
+ ]
ksadk/a2a/routes.py ADDED
@@ -0,0 +1,105 @@
1
+ """A2A 协议路由装配 — create_runtime_app 的 A2A seam (goal-05 §8)。
2
+
3
+ 契约 §8:
4
+
5
+ ```python
6
+ def create_runtime_app(config):
7
+ app = create_base_data_plane_app(config)
8
+ if config.a2a.enabled:
9
+ add_a2a_protocol_routes(app, config.a2a)
10
+ return app
11
+ ```
12
+
13
+ A2A route、TaskStore、task adapter 和 card 构造**只有一份实现**,普通 runtime app
14
+ 与 HarnessApp 共用;A2A 是数据面 route group,不承载注册副作用。``A2AConfig``
15
+ 保留给本地开发和协议一致性测试;AgentEngine 产品 Runtime 必须通过
16
+ ``AgentEngineA2ABootstrap`` 装配 durable storage、trusted ingress 和 egress guard。
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ from dataclasses import dataclass, field
22
+ from typing import Any, Optional, Sequence
23
+
24
+ from a2a.server.routes import add_a2a_routes_to_fastapi
25
+ from a2a.server.tasks import TaskStore
26
+ from a2a.types import AgentSkill
27
+ from fastapi import FastAPI
28
+ from sqlalchemy.ext.asyncio import AsyncEngine
29
+
30
+ from ksadk.a2a.card import build_agent_card
31
+ from ksadk.a2a.server import A2AProtocolServer
32
+ from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
33
+ from ksadk.a2a.task_store import A2A_TASK_TABLE, A2AOwnerContextBuilder, build_a2a_task_store
34
+
35
+
36
+ @dataclass
37
+ class A2AConfig:
38
+ """本地/一致性测试使用的 A2A 协议装配配置(数据面 route group)。"""
39
+
40
+ enabled: bool = False
41
+ base_url: str = "http://127.0.0.1:8000"
42
+ agent_name: str = "agent"
43
+ description: str = ""
44
+ version: str = "1.0.0"
45
+ skills: Sequence[str | AgentSkill] = field(default_factory=tuple)
46
+ streaming: bool = True
47
+ prefer_stream: bool = True
48
+ # 本地调试可显式开放 reasoning artifact;托管 Runtime 默认关闭,避免把
49
+ # 模型内部推理写入公开 A2A Task。
50
+ include_reasoning: bool = False
51
+ # durable task store:dsn(如 sqlite+aiosqlite:///.agentengine/a2a_tasks.db 或
52
+ # postgresql+asyncpg://...)或外部传入 engine/task_store。
53
+ task_store_dsn: Optional[str] = None
54
+ task_table: str = A2A_TASK_TABLE
55
+ create_table: bool = True
56
+
57
+
58
+ def add_a2a_protocol_routes(
59
+ app: FastAPI,
60
+ runner: Any,
61
+ config: A2AConfig,
62
+ *,
63
+ task_adapter: A2ARuntimeTaskAdapter,
64
+ task_store: Optional[TaskStore] = None,
65
+ engine: Optional[AsyncEngine] = None,
66
+ context_builder: A2AOwnerContextBuilder | None = None,
67
+ ) -> A2AProtocolServer:
68
+ """把 A2A 协议路由(JSONRPC + HTTP+JSON + AgentCard)装配到 app。
69
+
70
+ 返回构建好的 :class:`A2AProtocolServer`(便于调用方取 request_handler /
71
+ task_store 做后续 subscribe/cancel 或测试)。
72
+ """
73
+ card = build_agent_card(
74
+ name=config.agent_name,
75
+ base_url=config.base_url,
76
+ description=config.description,
77
+ version=config.version,
78
+ skills=config.skills,
79
+ streaming=config.streaming,
80
+ )
81
+ store = task_store or build_a2a_task_store(
82
+ dsn=config.task_store_dsn,
83
+ engine=engine,
84
+ table_name=config.task_table,
85
+ create_table=config.create_table,
86
+ )
87
+ server = A2AProtocolServer(
88
+ runner,
89
+ agent_card=card,
90
+ task_store=store,
91
+ task_adapter=task_adapter,
92
+ context_builder=context_builder,
93
+ prefer_stream=config.prefer_stream,
94
+ include_reasoning=config.include_reasoning,
95
+ )
96
+ add_a2a_routes_to_fastapi(
97
+ app,
98
+ agent_card_routes=server.agent_card_routes(),
99
+ jsonrpc_routes=server.jsonrpc_routes(),
100
+ rest_routes=server.rest_routes(),
101
+ )
102
+ return server
103
+
104
+
105
+ __all__ = ["A2AConfig", "add_a2a_protocol_routes"]
ksadk/a2a/server.py CHANGED
@@ -1,79 +1,126 @@
1
- """High-level server helpers for exposing a KsADK runner over A2A."""
1
+ """A2AProtocolServer — 托管 Agent 的 A2A 协议数据面 (goal-05)。
2
+
3
+ 契约 §3.2:``A2AProtocolServer`` = latest SDK route factories + AgentCard +
4
+ request handler + durable task store。装配进 create_runtime_app(§8),
5
+ **不再是独立 Starlette app**(旧 demo 的 ``A2AStarletteApplication`` 已废弃)。
6
+
7
+ 路由由 ``ksadk.a2a.routes.add_a2a_protocol_routes`` 统一装配,一份实现,
8
+ 普通 runtime app 与 HarnessApp 共用。
9
+ """
2
10
 
3
11
  from __future__ import annotations
4
12
 
5
- from collections.abc import Sequence
6
- from typing import Any
13
+ from typing import Any, cast
7
14
 
8
- from a2a.server.apps import A2AStarletteApplication
15
+ from a2a.server.agent_execution import RequestContext, SimpleRequestContextBuilder
16
+ from a2a.server.context import ServerCallContext
9
17
  from a2a.server.request_handlers import DefaultRequestHandler
10
- from a2a.server.tasks import InMemoryTaskStore
11
- from starlette.applications import Starlette
18
+ from a2a.server.routes import (
19
+ create_agent_card_routes,
20
+ create_jsonrpc_routes,
21
+ create_rest_routes,
22
+ )
23
+ from a2a.server.tasks import TaskStore
24
+ from a2a.types import AgentCard, SendMessageRequest, Task
25
+
26
+ from ksadk.a2a.card import JSONRPC_PATH, REST_PATH_PREFIX
27
+ from ksadk.a2a.executor import A2ARuntimeExecutor
28
+ from ksadk.a2a.task_adapter import A2ARuntimeTaskAdapter
29
+ from ksadk.a2a.task_store import A2AOwnerContextBuilder
30
+
12
31
 
13
- from ksadk.a2a.card_builder import AgentCardBuilder
14
- from ksadk.a2a.executor import KsAgentExecutor
32
+ class _DurableRequestContextBuilder(SimpleRequestContextBuilder):
33
+ """Recover the persisted context when a follow-up only carries task_id."""
34
+
35
+ def __init__(self, task_store: TaskStore) -> None:
36
+ super().__init__(should_populate_referred_tasks=False, task_store=task_store)
37
+ self._durable_task_store = task_store
38
+
39
+ async def build(
40
+ self,
41
+ context: ServerCallContext,
42
+ params: SendMessageRequest | None = None,
43
+ task_id: str | None = None,
44
+ context_id: str | None = None,
45
+ task: Task | None = None,
46
+ ) -> RequestContext:
47
+ if task_id and (task is None or not context_id):
48
+ persisted = await self._durable_task_store.get(task_id, context)
49
+ if persisted is not None:
50
+ task = persisted
51
+ context_id = context_id or persisted.context_id
52
+ return await super().build(
53
+ context=context,
54
+ params=params,
55
+ task_id=task_id,
56
+ context_id=context_id,
57
+ task=task,
58
+ )
15
59
 
16
60
 
17
- class KsA2AServer:
18
- """Expose a KsADK runner as an A2A-compatible ASGI app."""
61
+ class A2AProtocolServer:
62
+ """把一个 ksadk runner 暴露为 A2A 协议数据面。
63
+
64
+ 参数:
65
+ runner: 当前 runtime 的 runner。
66
+ agent_card: 符合 wire 1.0 的 AgentCard(``ksadk.a2a.card.build_agent_card``)。
67
+ task_store: durable ``DatabaseTaskStore``(``ksadk.a2a.task_store``)。
68
+ task_adapter: 可选 ``A2ARuntimeTaskAdapter``(提供则 cancel 走 RuntimeAdapter.cancel)。
69
+ prefer_stream: 是否优先用 runner.stream(默认 True)。
70
+ include_reasoning: 是否把 reasoning 输出为 ``adk_thought`` artifact。
71
+ """
19
72
 
20
73
  def __init__(
21
74
  self,
22
75
  runner: Any,
23
- app_name: str,
24
- url: str,
25
- description: str = "",
26
- skills: Sequence[str] | None = None,
27
- version: str = "1.0.0",
76
+ *,
77
+ agent_card: AgentCard,
78
+ task_store: TaskStore,
79
+ task_adapter: A2ARuntimeTaskAdapter,
80
+ context_builder: A2AOwnerContextBuilder | None = None,
81
+ prefer_stream: bool = True,
82
+ include_reasoning: bool = False,
28
83
  ) -> None:
29
84
  self.runner = runner
30
- self.app_name = app_name
31
- self.url = url
32
- self.description = description
33
- self.skills = list(skills or [])
34
- self.version = version
35
-
36
- self.agent_card = AgentCardBuilder(
37
- name=app_name,
38
- url=url,
39
- description=description,
40
- skills=self.skills,
41
- version=version,
42
- ).build()
43
- self.executor = KsAgentExecutor(runner=runner)
44
- self.task_store = InMemoryTaskStore()
85
+ self.agent_card = agent_card
86
+ self.task_store = task_store
87
+ self.task_adapter = task_adapter
88
+ self.context_builder = context_builder or A2AOwnerContextBuilder()
89
+ self.executor = A2ARuntimeExecutor(
90
+ runner,
91
+ task_adapter=task_adapter,
92
+ prefer_stream=prefer_stream,
93
+ include_reasoning=include_reasoning,
94
+ )
45
95
  self.request_handler = DefaultRequestHandler(
46
96
  agent_executor=self.executor,
47
- task_store=self.task_store,
97
+ task_store=task_store,
98
+ agent_card=agent_card,
99
+ request_context_builder=_DurableRequestContextBuilder(task_store),
48
100
  )
49
- self.application = A2AStarletteApplication(
50
- agent_card=self.agent_card,
51
- http_handler=self.request_handler,
101
+
102
+ def agent_card_routes(self) -> list[Any]:
103
+ return cast(list[Any], create_agent_card_routes(self.agent_card))
104
+
105
+ def jsonrpc_routes(self) -> list[Any]:
106
+ return cast(
107
+ list[Any],
108
+ create_jsonrpc_routes(
109
+ self.request_handler,
110
+ rpc_url=JSONRPC_PATH,
111
+ context_builder=self.context_builder,
112
+ ),
52
113
  )
53
114
 
54
- def build(self, **kwargs: Any) -> Starlette:
55
- """Build the Starlette application with the standard A2A routes."""
56
- return self.application.build(**kwargs)
57
-
58
- def add_routes_to_app(self, app: Starlette) -> None:
59
- """Attach the A2A routes to an existing Starlette application."""
60
- self.application.add_routes_to_app(app)
61
-
62
-
63
- def to_a2a(
64
- runner: Any,
65
- app_name: str,
66
- url: str,
67
- description: str = "",
68
- skills: Sequence[str] | None = None,
69
- version: str = "1.0.0",
70
- ) -> KsA2AServer:
71
- """Convenience helper for building a KsA2AServer."""
72
- return KsA2AServer(
73
- runner=runner,
74
- app_name=app_name,
75
- url=url,
76
- description=description,
77
- skills=skills,
78
- version=version,
79
- )
115
+ def rest_routes(self) -> list[Any]:
116
+ return cast(
117
+ list[Any],
118
+ create_rest_routes(
119
+ self.request_handler,
120
+ path_prefix=REST_PATH_PREFIX,
121
+ context_builder=self.context_builder,
122
+ ),
123
+ )
124
+
125
+
126
+ __all__ = ["A2AProtocolServer"]