agentengine-sdk-python 0.7.0__py3-none-any.whl → 0.8.1__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 (450) hide show
  1. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/METADATA +52 -20
  2. agentengine_sdk_python-0.8.1.dist-info/RECORD +644 -0
  3. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/WHEEL +1 -1
  4. ksadk/a2a/__init__.py +180 -11
  5. ksadk/a2a/bootstrap.py +332 -0
  6. ksadk/a2a/card.py +15 -0
  7. ksadk/a2a/context_store.py +203 -0
  8. ksadk/a2a/control_plane.py +1056 -0
  9. ksadk/a2a/credential.py +99 -0
  10. ksadk/a2a/event_adapter.py +149 -0
  11. ksadk/a2a/executor.py +361 -137
  12. ksadk/a2a/external_transport.py +516 -0
  13. ksadk/a2a/identity.py +304 -0
  14. ksadk/a2a/ids.py +22 -0
  15. ksadk/a2a/langgraph.py +285 -0
  16. ksadk/a2a/resume_store.py +201 -0
  17. ksadk/a2a/routes.py +112 -0
  18. ksadk/a2a/server.py +102 -62
  19. ksadk/a2a/service_env.py +33 -0
  20. ksadk/a2a/space_client.py +1122 -0
  21. ksadk/a2a/task_adapter.py +423 -0
  22. ksadk/a2a/task_event_dispatcher.py +167 -0
  23. ksadk/a2a/task_event_outbox.py +326 -0
  24. ksadk/a2a/task_store.py +206 -0
  25. ksadk/a2a_card.py +101 -0
  26. ksadk/a2ui/__init__.py +27 -0
  27. ksadk/a2ui/core.py +186 -0
  28. ksadk/a2ui/models.py +166 -0
  29. ksadk/a2ui/renderer.py +198 -0
  30. ksadk/agui/__init__.py +9 -0
  31. ksadk/agui/a2ui_projection.py +92 -0
  32. ksadk/agui/agent.py +872 -0
  33. ksadk/agui/config.py +92 -0
  34. ksadk/agui/routes.py +47 -0
  35. ksadk/api/client.py +238 -204
  36. ksadk/api/environment.py +27 -0
  37. ksadk/builders/__init__.py +2 -0
  38. ksadk/builders/base.py +16 -14
  39. ksadk/builders/code_builder.py +375 -270
  40. ksadk/builders/container_builder.py +240 -200
  41. ksadk/builders/framework_requirements.py +31 -12
  42. ksadk/builders/ks3_uploader.py +60 -29
  43. ksadk/builders/managed_runtime_builder.py +173 -0
  44. ksadk/builders/mcp_builder.py +91 -92
  45. ksadk/builders/requirements_utils.py +1 -5
  46. ksadk/cli/__init__.py +97 -171
  47. ksadk/cli/cmd_a2a.py +255 -84
  48. ksadk/cli/cmd_agent.py +19 -5
  49. ksadk/cli/cmd_build.py +158 -29
  50. ksadk/cli/cmd_completion.py +47 -35
  51. ksadk/cli/cmd_config.py +267 -198
  52. ksadk/cli/cmd_create.py +507 -740
  53. ksadk/cli/cmd_dashboard.py +120 -45
  54. ksadk/cli/cmd_deploy.py +135 -59
  55. ksadk/cli/cmd_destroy.py +44 -14
  56. ksadk/cli/cmd_eval.py +386 -0
  57. ksadk/cli/cmd_files.py +63 -24
  58. ksadk/cli/cmd_hermes.py +313 -135
  59. ksadk/cli/cmd_invoke.py +184 -122
  60. ksadk/cli/cmd_launch.py +76 -28
  61. ksadk/cli/cmd_mcp.py +98 -64
  62. ksadk/cli/cmd_model.py +14 -5
  63. ksadk/cli/cmd_openclaw.py +564 -268
  64. ksadk/cli/cmd_replay.py +71 -0
  65. ksadk/cli/cmd_run.py +58 -73
  66. ksadk/cli/cmd_status.py +80 -31
  67. ksadk/cli/cmd_studio.py +110 -0
  68. ksadk/cli/cmd_version.py +20 -13
  69. ksadk/cli/cmd_web.py +95 -18
  70. ksadk/cli/deploy_utils.py +20 -20
  71. ksadk/cli/dry_run.py +7 -4
  72. ksadk/cli/env_options.py +83 -0
  73. ksadk/cli/error_utils.py +37 -12
  74. ksadk/cli/global_options.py +4 -3
  75. ksadk/cli/local_runtime.py +1 -2
  76. ksadk/cli/model_catalog.py +6 -2
  77. ksadk/cli/network_options.py +41 -19
  78. ksadk/cli/resource_common.py +6 -2
  79. ksadk/cli/runtime_bootstrap.py +51 -0
  80. ksadk/cli/storage.py +0 -1
  81. ksadk/cli/ui.py +11 -3
  82. ksadk/cli/workflow_common.py +52 -18
  83. ksadk/codex/__init__.py +12 -0
  84. ksadk/codex/client.py +1042 -0
  85. ksadk/codex/phase.py +143 -0
  86. ksadk/codex/runtime.py +940 -0
  87. ksadk/common/aicp_env.py +0 -1
  88. ksadk/common/auth.py +2 -2
  89. ksadk/common/constants.py +1 -3
  90. ksadk/common/kop_client.py +232 -0
  91. ksadk/common/llm_utils.py +17 -13
  92. ksadk/compat/__init__.py +5 -0
  93. ksadk/compat/adk_compat.py +200 -0
  94. ksadk/compat/copilotkit_a2ui.py +330 -0
  95. ksadk/configs/__init__.py +12 -14
  96. ksadk/configs/env_registry.py +661 -116
  97. ksadk/configs/global_config.py +3 -2
  98. ksadk/configs/settings.py +133 -209
  99. ksadk/conversations/__init__.py +85 -92
  100. ksadk/conversations/attachment_storage.py +16 -11
  101. ksadk/conversations/attachments.py +44 -36
  102. ksadk/conversations/compaction_pipeline.py +12 -12
  103. ksadk/conversations/compaction_prompt.py +9 -5
  104. ksadk/conversations/context.py +221 -6
  105. ksadk/conversations/message_projection.py +438 -51
  106. ksadk/conversations/model_context.py +12 -6
  107. ksadk/conversations/model_options.py +0 -1
  108. ksadk/conversations/normalize.py +20 -16
  109. ksadk/conversations/reasoning_markup.py +1 -1
  110. ksadk/conversations/runtime.py +339 -5255
  111. ksadk/conversations/runtime_compaction.py +333 -0
  112. ksadk/conversations/runtime_constants.py +27 -0
  113. ksadk/conversations/runtime_governance.py +185 -0
  114. ksadk/conversations/runtime_input.py +660 -0
  115. ksadk/conversations/runtime_invocation.py +395 -0
  116. ksadk/conversations/runtime_metadata.py +475 -0
  117. ksadk/conversations/runtime_observability.py +367 -0
  118. ksadk/conversations/runtime_payloads.py +272 -0
  119. ksadk/conversations/runtime_persistence.py +440 -0
  120. ksadk/conversations/runtime_preparation.py +426 -0
  121. ksadk/conversations/runtime_resume.py +836 -0
  122. ksadk/conversations/runtime_stream_events.py +902 -0
  123. ksadk/conversations/runtime_streaming.py +700 -0
  124. ksadk/conversations/semantic_summary.py +17 -5
  125. ksadk/conversations/session_title.py +6 -3
  126. ksadk/deployment/__init__.py +15 -16
  127. ksadk/deployment/agent_access.py +12 -23
  128. ksadk/deployment/base.py +51 -38
  129. ksadk/deployment/managed_runtime.py +33 -0
  130. ksadk/deployment/manager.py +85 -71
  131. ksadk/deployment/providers/serverless.py +379 -210
  132. ksadk/deployment/registry.py +38 -32
  133. ksadk/deployment/state.py +11 -11
  134. ksadk/deployment/ui_config.py +1 -1
  135. ksadk/detection/__init__.py +1 -1
  136. ksadk/detection/detector.py +146 -83
  137. ksadk/detection/mcp_detector.py +9 -6
  138. ksadk/evaluation/__init__.py +84 -0
  139. ksadk/evaluation/a2a_adapter.py +444 -0
  140. ksadk/evaluation/adapters.py +54 -0
  141. ksadk/evaluation/contracts.py +409 -0
  142. ksadk/evaluation/evalset.py +351 -0
  143. ksadk/evaluation/evaluators.py +461 -0
  144. ksadk/evaluation/executor.py +118 -0
  145. ksadk/evaluation/storage.py +68 -0
  146. ksadk/evaluation/target.py +73 -0
  147. ksadk/events/__init__.py +25 -0
  148. ksadk/events/parser.py +191 -0
  149. ksadk/events/replay.py +37 -0
  150. ksadk/events/runtime_event.py +273 -0
  151. ksadk/events/store.py +317 -0
  152. ksadk/harness/__init__.py +35 -0
  153. ksadk/harness/app.py +269 -0
  154. ksadk/harness/config.py +181 -0
  155. ksadk/harness/reasoner.py +105 -0
  156. ksadk/harness/runtime.py +364 -0
  157. ksadk/harness/sandbox.py +141 -0
  158. ksadk/harness/tools.py +222 -0
  159. ksadk/hermes_terminal.py +28 -12
  160. ksadk/identity/resolver.py +15 -9
  161. ksadk/ids.py +32 -0
  162. ksadk/knowledge_base/adk_tool.py +1 -1
  163. ksadk/knowledge_base/client.py +38 -33
  164. ksadk/managed_a2a_card.py +160 -0
  165. ksadk/managed_runtime.py +195 -0
  166. ksadk/markdown.py +5 -2
  167. ksadk/mcp_runtime/__init__.py +9 -6
  168. ksadk/memory/__init__.py +1 -1
  169. ksadk/memory/adk/__init__.py +2 -0
  170. ksadk/memory/adk/backends/base_ltm_backend.py +2 -6
  171. ksadk/memory/adk/backends/http_ltm_backend.py +13 -21
  172. ksadk/memory/adk/backends/inmemory_ltm_backend.py +7 -13
  173. ksadk/memory/adk/backends/sdk_ltm_backend.py +36 -36
  174. ksadk/memory/adk/long_term_memory.py +34 -37
  175. ksadk/memory/adk/resilient_session_service.py +4 -5
  176. ksadk/memory/adk/short_term_memory.py +12 -21
  177. ksadk/memory/adk_tool.py +3 -2
  178. ksadk/memory/backends/base.py +19 -19
  179. ksadk/memory/backends/memory.py +24 -25
  180. ksadk/memory/backends/redis.py +31 -30
  181. ksadk/memory/langchain_tool.py +2 -1
  182. ksadk/memory/manager.py +52 -47
  183. ksadk/memory/service.py +16 -6
  184. ksadk/memory/tool.py +4 -0
  185. ksadk/model_policy.py +15 -7
  186. ksadk/model_proxy/__init__.py +51 -0
  187. ksadk/model_proxy/bootstrap.py +80 -0
  188. ksadk/model_proxy/cache.py +165 -0
  189. ksadk/model_proxy/config.py +66 -0
  190. ksadk/model_proxy/demo_webui.py +115 -0
  191. ksadk/model_proxy/detect.py +145 -0
  192. ksadk/model_proxy/gate.py +68 -0
  193. ksadk/model_proxy/namespace.py +201 -0
  194. ksadk/model_proxy/protocol_proxy.py +22 -0
  195. ksadk/model_proxy/server.py +443 -0
  196. ksadk/model_proxy/transform.py +735 -0
  197. ksadk/openclaw_gateway.py +29 -14
  198. ksadk/runners/adk_runner.py +354 -146
  199. ksadk/runners/base_runner.py +71 -29
  200. ksadk/runners/deepagents_runner.py +0 -1
  201. ksadk/runners/factory.py +18 -5
  202. ksadk/runners/langchain_runner.py +29 -742
  203. ksadk/runners/langgraph_runner.py +417 -97
  204. ksadk/runners/patch_langchain.py +16 -16
  205. ksadk/runners/remote_runner.py +134 -33
  206. ksadk/runners/usage_accumulator.py +1 -0
  207. ksadk/runners/utils/__init__.py +0 -10
  208. ksadk/runners/utils/loader.py +23 -7
  209. ksadk/runtime/__init__.py +67 -0
  210. ksadk/runtime/adapter.py +412 -0
  211. ksadk/runtime/conversation_execution.py +553 -0
  212. ksadk/runtime/executor.py +251 -0
  213. ksadk/runtime/factory.py +156 -0
  214. ksadk/runtime/framework_adapters.py +118 -0
  215. ksadk/runtime/launch.py +48 -0
  216. ksadk/runtime/preprocessing.py +131 -0
  217. ksadk/runtime/runner_adapter.py +1032 -0
  218. ksadk/runtime/runner_loading.py +36 -0
  219. ksadk/runtime_context.py +18 -3
  220. ksadk/runtime_state.py +0 -1
  221. ksadk/sandbox/__init__.py +4 -1
  222. ksadk/sandbox/backends/__init__.py +4 -1
  223. ksadk/sandbox/backends/e2b.py +13 -5
  224. ksadk/sandbox/backends/local_process.py +11 -3
  225. ksadk/sandbox/base.py +10 -15
  226. ksadk/sandbox/factory.py +14 -4
  227. ksadk/sandbox/registry.py +57 -6
  228. ksadk/server/__init__.py +39 -4
  229. ksadk/server/api_models.py +15 -5
  230. ksadk/server/app.py +24 -3928
  231. ksadk/server/composition.py +47 -0
  232. ksadk/server/factory.py +622 -0
  233. ksadk/server/routes/__init__.py +1 -0
  234. ksadk/server/routes/checkpoint_resolution.py +116 -0
  235. ksadk/server/routes/common.py +682 -0
  236. ksadk/server/routes/control.py +331 -0
  237. ksadk/server/routes/dependencies.py +98 -0
  238. ksadk/server/routes/misc.py +425 -0
  239. ksadk/server/routes/models.py +451 -0
  240. ksadk/server/routes/openai_compat.py +229 -0
  241. ksadk/server/routes/projection.py +848 -0
  242. ksadk/server/routes/routers.py +52 -0
  243. ksadk/server/routes/run.py +519 -0
  244. ksadk/server/routes/sessions.py +644 -0
  245. ksadk/server/routes/streaming.py +265 -0
  246. ksadk/server/routes/workspace.py +414 -0
  247. ksadk/server/static/assets/{ArtifactsPanel-D-SSn2ee.js → ArtifactsPanel-CakCqxEN.js} +1 -1
  248. ksadk/server/static/assets/CodeBlock-CynLknyO.js +9 -0
  249. ksadk/server/static/assets/MathMessageMarkdown-3sQdOysS.js +8 -0
  250. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +303 -0
  251. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +1 -0
  252. ksadk/server/static/assets/{arc-BA13sHc9.js → arc-DrgjcKhl.js} +1 -1
  253. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +1 -0
  254. ksadk/server/static/assets/{architectureDiagram-3BPJPVTR-DzJzgVoL.js → architectureDiagram-3BPJPVTR-BXoVRbQ6.js} +1 -1
  255. ksadk/server/static/assets/{blockDiagram-GPEHLZMM-UTdVcZhn.js → blockDiagram-GPEHLZMM-BnaB3Ywv.js} +1 -1
  256. ksadk/server/static/assets/{c4Diagram-AAUBKEIU-Dix0GD4m.js → c4Diagram-AAUBKEIU-Dw4weZcp.js} +1 -1
  257. ksadk/server/static/assets/channel-Dt3rQTFI.js +1 -0
  258. ksadk/server/static/assets/{chunk-2J33WTMH-C2JxuZ42.js → chunk-2J33WTMH-ChjpLK7j.js} +1 -1
  259. ksadk/server/static/assets/{chunk-4BX2VUAB-Be57QPgD.js → chunk-4BX2VUAB-B9drTgOW.js} +1 -1
  260. ksadk/server/static/assets/{chunk-55IACEB6-WjSuy4nv.js → chunk-55IACEB6-CK4ROATy.js} +1 -1
  261. ksadk/server/static/assets/{chunk-727SXJPM-BOovP-b5.js → chunk-727SXJPM-B9KtTTgw.js} +1 -1
  262. ksadk/server/static/assets/{chunk-AQP2D5EJ-DOmZNmWj.js → chunk-AQP2D5EJ-1O1mki3m.js} +1 -1
  263. ksadk/server/static/assets/{chunk-FMBD7UC4-DzwlodkU.js → chunk-FMBD7UC4-B_fH2YuH.js} +1 -1
  264. ksadk/server/static/assets/{chunk-ND2GUHAM-DMqAikEU.js → chunk-ND2GUHAM-D6rFLaVV.js} +1 -1
  265. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +1 -0
  266. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +1 -0
  267. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +1 -0
  268. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-Zhy2GBnP.js → cose-bilkent-S5V4N54A-ChNs_Mdk.js} +1 -1
  269. ksadk/server/static/assets/{dagre-BM42HDAG-CbKrtIUz.js → dagre-BM42HDAG-D0QXg_MQ.js} +1 -1
  270. ksadk/server/static/assets/{diagram-2AECGRRQ-BRApgQRK.js → diagram-2AECGRRQ-DBDDKwBQ.js} +1 -1
  271. ksadk/server/static/assets/{diagram-5GNKFQAL-D0xbnDiK.js → diagram-5GNKFQAL-BkwDOxmO.js} +1 -1
  272. ksadk/server/static/assets/{diagram-KO2AKTUF-CVugVI9L.js → diagram-KO2AKTUF-Bv8waYvY.js} +1 -1
  273. ksadk/server/static/assets/{diagram-LMA3HP47-DozUGgee.js → diagram-LMA3HP47-e1VECDdu.js} +1 -1
  274. ksadk/server/static/assets/{diagram-OG6HWLK6-ZOYsKlru.js → diagram-OG6HWLK6-Ds9adfRl.js} +1 -1
  275. ksadk/server/static/assets/{dist-DpKtt4Bo.js → dist-4N2NMVYg.js} +1 -1
  276. ksadk/server/static/assets/{dist-CkEKJFtk.js → dist-B-jNR6Vn.js} +1 -1
  277. ksadk/server/static/assets/{dist-D57wnGWd.js → dist-B5J2uhNk.js} +1 -1
  278. ksadk/server/static/assets/{dist-8_SfK1IP.js → dist-B5oS1zcj.js} +1 -1
  279. ksadk/server/static/assets/{dist-DMezvBGJ.js → dist-BB3-OwTQ.js} +1 -1
  280. ksadk/server/static/assets/{dist-2hInLS_J.js → dist-BIlKoW0k.js} +1 -1
  281. ksadk/server/static/assets/{dist-BrCcQ47T.js → dist-BjOdlDjj.js} +1 -1
  282. ksadk/server/static/assets/{dist-BmlMPsCc.js → dist-C1sz5Eo3.js} +1 -1
  283. ksadk/server/static/assets/{dist-B0NP_Z0z.js → dist-CWV4lDr1.js} +1 -1
  284. ksadk/server/static/assets/{dist-D-xOD048.js → dist-CmZHzlwZ.js} +1 -1
  285. ksadk/server/static/assets/{dist-DL_NKc_z.js → dist-D6MpCZtz.js} +1 -1
  286. ksadk/server/static/assets/{dist-DyOkZmze.js → dist-DJN_6Y39.js} +1 -1
  287. ksadk/server/static/assets/{dist-DmFaq_Iy.js → dist-DQU9EWw-.js} +1 -1
  288. ksadk/server/static/assets/{dist-gX6GOLKq.js → dist-DWKByxWV.js} +1 -1
  289. ksadk/server/static/assets/{dist-DyWsb78Q.js → dist-Dli7qW-B.js} +1 -1
  290. ksadk/server/static/assets/{dist-BIJVDMuB.js → dist-DsHPdk3W.js} +1 -1
  291. ksadk/server/static/assets/{dist-Dp0k7bWI.js → dist-X4TnqwOK.js} +1 -1
  292. ksadk/server/static/assets/{dist-8EEyGgDx.js → dist-_pHPTyZ-.js} +1 -1
  293. ksadk/server/static/assets/{dist-CPBtqRTW.js → dist-fhOuWds5.js} +1 -1
  294. ksadk/server/static/assets/{dist-D-JMdWPQ.js → dist-gLnrGsoU.js} +1 -1
  295. ksadk/server/static/assets/{dist-BssVmjIo.js → dist-j6Dxmf_j.js} +1 -1
  296. ksadk/server/static/assets/{dist-C3HIIaN5.js → dist-o2OVmKvt.js} +1 -1
  297. ksadk/server/static/assets/{erDiagram-TEJ5UH35-Bk-9bgE5.js → erDiagram-TEJ5UH35-BPItFKH6.js} +1 -1
  298. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +1 -0
  299. ksadk/server/static/assets/{flowDiagram-I6XJVG4X-Dn9kZVuZ.js → flowDiagram-I6XJVG4X-BbYB9w5Y.js} +1 -1
  300. ksadk/server/static/assets/{ganttDiagram-6RSMTGT7-BGxXlJqm.js → ganttDiagram-6RSMTGT7-TQXa0KXv.js} +1 -1
  301. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +1 -0
  302. ksadk/server/static/assets/{gitGraphDiagram-PVQCEYII-C7Q0X-wi.js → gitGraphDiagram-PVQCEYII-bKblCnpa.js} +1 -1
  303. ksadk/server/static/assets/index-R52pJJvg.js +177 -0
  304. ksadk/server/static/assets/index-jJr3_955.css +2 -0
  305. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +1 -0
  306. ksadk/server/static/assets/{infoDiagram-5YYISTIA-BO_CSqq5.js → infoDiagram-5YYISTIA-BGVT7J_i.js} +1 -1
  307. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-eYLPLd46.js → ishikawaDiagram-YF4QCWOH-K0OOfVna.js} +1 -1
  308. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-De9geSb0.js → journeyDiagram-JHISSGLW-8LeOJaZp.js} +1 -1
  309. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-Cs80kQto.js → kanban-definition-UN3LZRKU-C6uCgZrW.js} +1 -1
  310. ksadk/server/static/assets/{katex-DSrCFD8n.js → katex-CYWseY5E.js} +1 -1
  311. ksadk/server/static/assets/{linear-CN9sbKTF.js → linear-hdBcYzM8.js} +1 -1
  312. ksadk/server/static/assets/{mermaid-parser.core-DlgSBU8l.js → mermaid-parser.core-BWrDjSZM.js} +2 -2
  313. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-9afz7Oug.js → mindmap-definition-RKZ34NQL-Bjy_2v4_.js} +1 -1
  314. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +1 -0
  315. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +1 -0
  316. ksadk/server/static/assets/{pieDiagram-4H26LBE5-DPv_VstN.js → pieDiagram-4H26LBE5-GmmqNiVH.js} +1 -1
  317. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-o77wZ1XK.js → quadrantDiagram-W4KKPZXB-BmkRbwCg.js} +1 -1
  318. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +1 -0
  319. ksadk/server/static/assets/{requirementDiagram-4Y6WPE33-BYVw81VC.js → requirementDiagram-4Y6WPE33-DSWFqL7c.js} +1 -1
  320. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-B7nZFMKT.js → sankeyDiagram-5OEKKPKP-l6iXmU65.js} +1 -1
  321. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-BGRRrFw5.js → sequenceDiagram-3UESZ5HK-Cq6UBeQB.js} +1 -1
  322. ksadk/server/static/assets/{stateDiagram-AJRCARHV-BUfHCoPs.js → stateDiagram-AJRCARHV-qzTQpg3Y.js} +1 -1
  323. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +1 -0
  324. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-FbCTGrf9.js → timeline-definition-PNZ67QCA-DEz24vV0.js} +1 -1
  325. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +1 -0
  326. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +1 -0
  327. ksadk/server/static/assets/{vennDiagram-CIIHVFJN-DWgwtPsJ.js → vennDiagram-CIIHVFJN-CMCixki2.js} +1 -1
  328. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +1 -0
  329. ksadk/server/static/assets/{wardleyDiagram-YWT4CUSO-2x8G-tTM.js → wardleyDiagram-YWT4CUSO-CVzB8F9K.js} +1 -1
  330. ksadk/server/static/assets/{xychartDiagram-2RQKCTM6-Drma3AYl.js → xychartDiagram-2RQKCTM6-BFBqBLc1.js} +1 -1
  331. ksadk/server/static/index.html +2 -2
  332. ksadk/server/terminal_sessions.py +111 -58
  333. ksadk/sessions/__init__.py +69 -19
  334. ksadk/sessions/base.py +31 -11
  335. ksadk/sessions/continuity.py +2 -3
  336. ksadk/sessions/in_memory.py +46 -2
  337. ksadk/sessions/local_service.py +148 -17
  338. ksadk/sessions/postgres_service.py +143 -25
  339. ksadk/sessions/resilient.py +36 -8
  340. ksadk/skills/models.py +17 -5
  341. ksadk/skills/package_store.py +5 -2
  342. ksadk/skills/runtime/agent.py +20 -5
  343. ksadk/skills/runtime/artifacts.py +1 -5
  344. ksadk/skills/runtime/backends/e2b.py +10 -4
  345. ksadk/skills/runtime/backends/local.py +15 -3
  346. ksadk/skills/runtime/base.py +1 -2
  347. ksadk/skills/runtime/executor.py +10 -3
  348. ksadk/skills/runtime/factory.py +4 -2
  349. ksadk/skills/runtime/loader.py +1 -2
  350. ksadk/skills/runtime/registry.py +15 -10
  351. ksadk/skills/runtime/request.py +3 -1
  352. ksadk/skills/service_client.py +47 -16
  353. ksadk/skills/tool_defs.py +15 -10
  354. ksadk/studio/__init__.py +5 -0
  355. ksadk/studio/agent_avatar_assets.py +120 -0
  356. ksadk/studio/agent_lifecycle.py +51 -0
  357. ksadk/studio/api.py +1046 -0
  358. ksadk/studio/api_catalog_routes.py +324 -0
  359. ksadk/studio/api_contracts.py +177 -0
  360. ksadk/studio/api_helpers.py +132 -0
  361. ksadk/studio/authoring.py +524 -0
  362. ksadk/studio/authoring_coordinator.py +285 -0
  363. ksadk/studio/builder.py +320 -0
  364. ksadk/studio/capabilities.py +351 -0
  365. ksadk/studio/cloud.py +278 -0
  366. ksadk/studio/codex_agent_service.py +583 -0
  367. ksadk/studio/codex_builder.py +324 -0
  368. ksadk/studio/codex_manifest.py +278 -0
  369. ksadk/studio/codex_run.py +352 -0
  370. ksadk/studio/compiler.py +189 -0
  371. ksadk/studio/contracts.py +644 -0
  372. ksadk/studio/errors.py +47 -0
  373. ksadk/studio/evaluation.py +192 -0
  374. ksadk/studio/event_store.py +284 -0
  375. ksadk/studio/framework_run.py +114 -0
  376. ksadk/studio/identifiers.py +33 -0
  377. ksadk/studio/mcp_runtime.py +229 -0
  378. ksadk/studio/model_client.py +543 -0
  379. ksadk/studio/model_profile_service.py +214 -0
  380. ksadk/studio/operations.py +243 -0
  381. ksadk/studio/otel_trace.py +754 -0
  382. ksadk/studio/pagination.py +182 -0
  383. ksadk/studio/python_tool_inspection.py +183 -0
  384. ksadk/studio/repository.py +306 -0
  385. ksadk/studio/resource_catalog.py +1217 -0
  386. ksadk/studio/run_service.py +707 -0
  387. ksadk/studio/runtime_catalog.py +74 -0
  388. ksadk/studio/runtime_source.py +339 -0
  389. ksadk/studio/service.py +1141 -0
  390. ksadk/studio/shared_web.py +994 -0
  391. ksadk/studio/skill_discovery.py +628 -0
  392. ksadk/studio/static/assets/PrismRenderer-IYN-ffww.js +3 -0
  393. ksadk/studio/static/assets/index-CaEN0eTR.css +1 -0
  394. ksadk/studio/static/assets/index-DI2eY_NH.js +252 -0
  395. ksadk/studio/static/assets/react-vendor-BNmTiJ-I.js +9 -0
  396. ksadk/studio/static/assets/rolldown-runtime-hePW80VL.js +1 -0
  397. ksadk/studio/static/index.html +15 -0
  398. ksadk/studio/templates.py +630 -0
  399. ksadk/studio/validator.py +246 -0
  400. ksadk/studio/workspace.py +137 -0
  401. ksadk/terminal_exec_policy.py +3 -4
  402. ksadk/tools/gateway.py +101 -15
  403. ksadk/tools/result_budget.py +12 -4
  404. ksadk/toolsets/__init__.py +161 -37
  405. ksadk/toolsets/a2a.py +426 -0
  406. ksadk/toolsets/platform.py +21 -5
  407. ksadk/toolsets/sandbox.py +82 -16
  408. ksadk/toolsets/skills.py +200 -39
  409. ksadk/toolsets/web.py +123 -26
  410. ksadk/toolsets/workspace.py +212 -101
  411. ksadk/tracing/__init__.py +19 -21
  412. ksadk/tracing/exporters/inmemory_exporter.py +62 -51
  413. ksadk/tracing/setup.py +135 -506
  414. ksadk/tracing/span_utils.py +0 -41
  415. ksadk/tui/loop.py +78 -30
  416. ksadk/tui/stream_render.py +1 -0
  417. ksadk/ui_config.py +5 -3
  418. ksadk/version.py +1 -1
  419. ksadk_runtime_common/memory_backend/registry.py +56 -56
  420. ksadk_runtime_common/schemas/runtime_event_v1.json +95 -0
  421. ksadk_runtime_common/workspace_files/router.py +8 -2
  422. agentengine_sdk_python-0.7.0.dist-info/RECORD +0 -482
  423. ksadk/a2a/card_builder.py +0 -64
  424. ksadk/a2a/client.py +0 -309
  425. ksadk/runners/utils/langfuse.py +0 -230
  426. ksadk/server/static/assets/CodeBlock-P16VOLYi.js +0 -9
  427. ksadk/server/static/assets/MathMessageMarkdown-CdGiQWHR.js +0 -8
  428. ksadk/server/static/assets/MermaidBlock-IOcal8cm.js +0 -303
  429. ksadk/server/static/assets/NativeTerminalPanel-DGSDWsei.js +0 -1
  430. ksadk/server/static/assets/architecture-7EHR7CIX-BvUlsA6l.js +0 -1
  431. ksadk/server/static/assets/channel-CTuydARX.js +0 -1
  432. ksadk/server/static/assets/chunk-QZHKN3VN-BnCydivS.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-BNHg45Be.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-BNHg45Be.js +0 -1
  435. ksadk/server/static/assets/eventmodeling-FCH6USID-DsAgWnlf.js +0 -1
  436. ksadk/server/static/assets/gitGraph-WXDBUCRP-BIao9Yjg.js +0 -1
  437. ksadk/server/static/assets/index-C00Lwg3L.js +0 -165
  438. ksadk/server/static/assets/index-DAURbCsP.css +0 -1
  439. ksadk/server/static/assets/info-J43DQDTF-CyipqGxU.js +0 -1
  440. ksadk/server/static/assets/packet-YPE3B663-CGkyRxlg.js +0 -1
  441. ksadk/server/static/assets/pie-LRSECV5Y-M0uWAf4n.js +0 -1
  442. ksadk/server/static/assets/radar-GUYGQ44K-Bdbm24-x.js +0 -1
  443. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-8xBN_gLM.js +0 -1
  444. ksadk/server/static/assets/treeView-BLDUP644-npMo0ak1.js +0 -1
  445. ksadk/server/static/assets/treemap-LRROVOQU-CHdzrrdo.js +0 -1
  446. ksadk/server/static/assets/wardley-L42UT6IY-BEQz7wyy.js +0 -1
  447. ksadk/tracing/exporters/langfuse_exporter.py +0 -445
  448. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/entry_points.txt +0 -0
  449. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/licenses/LICENSE +0 -0
  450. {agentengine_sdk_python-0.7.0.dist-info → agentengine_sdk_python-0.8.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,412 @@
1
+ """RuntimeAdapter 平台接口 (goal-03 / G0.3 冻结稿)。
2
+
3
+ **只做签名与语义冻结,不实现具体 adapter**(具体 adapter 是后续 A4/A6,如 ADK/LangGraph
4
+ adapter)。本模块定义三层结构与六动词签名,供 Runtime 产生端、server 持久化、A2A
5
+ 真实 cancel 等共同消费。
6
+
7
+ 结构(H2 §4.2):
8
+
9
+ - :class:`BaseRuntime`:表达 Runtime **原生能力**(现有 ``BaseRunner`` 的演进目标,不推倒)。
10
+ - :class:`RuntimeAdapter`:把原生能力映射为**平台接口**(六动词)。
11
+ - :class:`RuntimeRegistry`:按 ``runtime_type`` 注册 adapter(替代 ``runners/factory.py``
12
+ 的 if/elif 分发)。
13
+
14
+ 六动词语义契约(2026-07-21 友商代码核验,见 docstring 各处):
15
+
16
+ 1. ``stream`` 返回 :class:`~ksadk.events.runtime_event.RuntimeEvent` 事件流(对接 G0.2),
17
+ 模型 = **事件流 + 独立命令/恢复通道**:审批回包走 ``resume``/``submit``,不在事件流
18
+ 回写(非 duplex stream)——codex/ADK/LangGraph 都是这个模型。
19
+ 2. ``cancel`` 是状态机,返回 :class:`CancelResult` 枚举(不是 bool——Wegent 实测 bool
20
+ 区分不了"记 pending"和"真 interrupt")。
21
+ 3. ``resume`` 拆 :class:`ResumeTarget`(恢复目标)与 :class:`ResumePayload`(回包)两个
22
+ 参数,不混成 union(ADK 区分 invocation_id 目标 vs function response 回包;Codex 区分
23
+ resume_thread_id vs Op 回包)。
24
+ 4. ``checkpoint`` 粒度用 :class:`CheckpointCapability` 声明(不承诺所有 runtime 同等能力,
25
+ 诚实暴露 capability matrix)。
26
+ 5. ``start`` 带 session/tenant 维度(:class:`StartRequest` 的 ``user_id`` + ``session_id``),
27
+ 不只是 prompt。
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ from abc import ABC, abstractmethod
33
+ from collections.abc import Callable
34
+ from enum import Enum
35
+ from typing import Any, AsyncIterator, Literal, Optional
36
+
37
+ from pydantic import BaseModel, ConfigDict, Field
38
+
39
+ from ksadk.events.runtime_event import RuntimeEvent
40
+ from ksadk.runtime.launch import RuntimeLaunchContext, RuntimeServices
41
+
42
+ # ---------------------------------------------------------------------------
43
+ # cancel 状态机
44
+ # ---------------------------------------------------------------------------
45
+
46
+
47
+ class CancelResult(str, Enum):
48
+ """cancel 的结果状态机。
49
+
50
+ Wegent ``cancel()`` 实测:无活跃 turn 记 pending 也返回 true、成功 interrupt 也返回
51
+ true,**bool 区分不了两种结果**——因此必须用枚举显式区分。
52
+ """
53
+
54
+ INTERRUPTED_ACTIVE_TURN = "interrupted_active_turn"
55
+ """有活跃 turn,已真实 interrupt。"""
56
+
57
+ PENDING_CANCEL_RECORDED = "pending_cancel_recorded"
58
+ """无活跃 turn,已记录 pending cancel,下一个 turn 开始时被消费。"""
59
+
60
+ NOT_RUNNING = "not_running"
61
+ """目标不在运行(无可取消的活跃/pending run)。"""
62
+
63
+ FAILED = "failed"
64
+ """取消动作本身失败(如底层 runtime 报错)。"""
65
+
66
+
67
+ class PauseResult(str, Enum):
68
+ """Non-terminal pause capability result.
69
+
70
+ Pause is deliberately separate from :class:`CancelResult`: an adapter must
71
+ never claim a run is resumable after applying destructive cancel semantics.
72
+ """
73
+
74
+ PAUSED_ACTIVE_TURN = "paused_active_turn"
75
+ NOT_SUPPORTED = "not_supported"
76
+ NOT_RUNNING = "not_running"
77
+ FAILED = "failed"
78
+
79
+
80
+ # ---------------------------------------------------------------------------
81
+ # resume 目标与回包(两件拆开的的事)
82
+ # ---------------------------------------------------------------------------
83
+
84
+
85
+ class ResumeTarget(BaseModel):
86
+ """恢复目标:回到哪里。
87
+
88
+ - ``invocation_id``:精确到某次调用(ADK forward-only resume)。
89
+ - ``thread_id``:某条会话线程(Codex resume_thread_id)。
90
+ - ``checkpoint_id``:某个 checkpoint(LangGraph time-travel)。
91
+ """
92
+
93
+ kind: Literal["invocation_id", "thread_id", "checkpoint_id"]
94
+ id: str
95
+
96
+
97
+ class ResumePayload(BaseModel):
98
+ """恢复回包:带着什么输入恢复(可为空——纯粹续跑)。
99
+
100
+ - ``tool_result``:工具执行结果(function response)。
101
+ - ``approval_decision``:审批决定(对应 ``approval.requested`` 的回包,走命令通道)。
102
+ - ``hitl_answer``:human-in-the-loop 回答。
103
+ - ``free_text``:自由文本输入。
104
+ """
105
+
106
+ kind: Literal["tool_result", "approval_decision", "hitl_answer", "free_text"]
107
+ call_id: Optional[str] = None
108
+ """对应的 ``approval.requested`` / ``tool.call`` 的 id(如有)。"""
109
+ data: Any = None
110
+
111
+
112
+ # ---------------------------------------------------------------------------
113
+ # checkpoint 能力声明
114
+ # ---------------------------------------------------------------------------
115
+
116
+
117
+ class CheckpointCapability(BaseModel):
118
+ """checkpoint 粒度声明。诚实暴露,不承诺所有 runtime 同等能力。
119
+
120
+ 与现有 ``BaseRunner.describe_checkpoint_capability`` 对齐演进。
121
+ """
122
+
123
+ supported: bool
124
+ granularity: Literal["delta", "snapshot", "none"]
125
+ """delta(增量)vs snapshot(快照)vs none。"""
126
+ rollback_scope: Literal["turn", "invocation", "none"]
127
+ """可按 turn 还是 invocation 回滚。"""
128
+ fork_supported: bool
129
+ """是否支持从某 checkpoint fork 出新分支。"""
130
+ durable: bool
131
+ """是否持久化(跨进程/重启保留)。"""
132
+ shared_across_pods: bool
133
+ """是否跨 pod 共享(K8s 多副本可读同一 checkpoint)。"""
134
+ reason: str = ""
135
+
136
+
137
+ class CheckpointDescriptor(BaseModel):
138
+ """一次 checkpoint 的描述(checkpoint 动词的返回值)。"""
139
+
140
+ checkpoint_id: str
141
+ invocation_id: str
142
+ capability: CheckpointCapability
143
+ ref: dict[str, Any] = Field(default_factory=dict)
144
+ """runtime 私有引用(如 LangGraph checkpoint 的 (thread_id, checkpoint_id) 元组)。"""
145
+
146
+
147
+ # ---------------------------------------------------------------------------
148
+ # start 请求与 run 句柄
149
+ # ---------------------------------------------------------------------------
150
+
151
+
152
+ CONVERSATION_PREPROCESSING_METADATA_KEY = "conversation_request"
153
+ """StartRequest metadata key for the shared conversation preprocessing contract."""
154
+
155
+ RESUME_START_REQUEST_NATIVE_KEY = "_conversation_start_request"
156
+ """Ephemeral adapter-private key carrying current request context across attach/resume."""
157
+
158
+
159
+ class ConversationPreprocessingRequest(BaseModel):
160
+ """Transport-neutral input for the existing conversation preprocessing path.
161
+
162
+ Protocol adapters keep their wire-specific fields out of the runner payload and
163
+ place the canonical conversation inputs here. ``RunnerRuntimeAdapter`` then
164
+ reuses the same history, attachment, model-policy, platform-context, ambient
165
+ KB/memory and tracing preparation as the normal RunAgent/Responses entrypoints.
166
+
167
+ The model is additive and allows unknown fields so a newer protocol adapter can
168
+ talk to an older runtime without losing forward-compatible metadata.
169
+ """
170
+
171
+ model_config = ConfigDict(extra="allow")
172
+
173
+ messages: list[dict[str, Any]] = Field(default_factory=list)
174
+ model_metadata: dict[str, Any] = Field(default_factory=dict)
175
+ model_options: dict[str, Any] = Field(default_factory=dict)
176
+ state_delta: dict[str, Any] = Field(default_factory=dict)
177
+ instructions: Optional[str] = None
178
+ request_metadata: dict[str, Any] = Field(default_factory=dict)
179
+ custom_metadata: dict[str, Any] = Field(default_factory=dict)
180
+ account_id: Optional[str] = None
181
+ response_id: Optional[str] = None
182
+
183
+
184
+ class StartRequest(BaseModel):
185
+ """start 的输入:带 session/tenant 维度,不只是 prompt。"""
186
+
187
+ input: Any
188
+ """用户消息或结构化输入。"""
189
+ user_id: str
190
+ session_id: str
191
+ agent_id: Optional[str] = None
192
+ model: Optional[str] = None
193
+ config: dict[str, Any] = Field(default_factory=dict)
194
+ metadata: dict[str, Any] = Field(default_factory=dict)
195
+
196
+ def conversation_preprocessing(self) -> Optional[ConversationPreprocessingRequest]:
197
+ """Return the opt-in shared preprocessing request, if one was supplied."""
198
+
199
+ raw = self.metadata.get(CONVERSATION_PREPROCESSING_METADATA_KEY)
200
+ if raw is None:
201
+ return None
202
+ return ConversationPreprocessingRequest.model_validate(raw)
203
+
204
+
205
+ class RunHandle(BaseModel):
206
+ """一次 run 的不透明句柄(start 返回,后续 stream/cancel/resume/checkpoint/close 用)。"""
207
+
208
+ run_id: str
209
+ """= invocation_id。"""
210
+ session_id: str
211
+ runtime_type: str
212
+ native_ref: dict[str, Any] = Field(default_factory=dict)
213
+ """adapter 私有引用(如 ADK 的 (app_name, user_id, session_id)、Codex 的 thread_ref)。"""
214
+
215
+
216
+ # ---------------------------------------------------------------------------
217
+ # BaseRuntime:Runtime 原生能力
218
+ # ---------------------------------------------------------------------------
219
+
220
+
221
+ class BaseRuntime(ABC):
222
+ """Runtime 原生能力面(现有 ``BaseRunner`` 的演进目标,不推倒)。
223
+
224
+ ``BaseRunner`` 的 ``request_cancel`` / ``describe_checkpoint_capability`` /
225
+ ``invoke`` / ``stream`` 是原生能力的现状;``BaseRuntime`` 是其平台化抽象。
226
+ 具体 runner(ADK/LangGraph/...)以 ``BaseRuntime`` 表达原生能力,再由
227
+ :class:`RuntimeAdapter` 映射为平台六动词。
228
+ """
229
+
230
+ runtime_type: str = "unknown"
231
+
232
+ @abstractmethod
233
+ def native_capabilities(self) -> dict[str, Any]:
234
+ """原生能力声明(cancel / checkpoint / resume / session continuity 等)。"""
235
+ raise NotImplementedError
236
+
237
+
238
+ # ---------------------------------------------------------------------------
239
+ # RuntimeAdapter:平台六动词
240
+ # ---------------------------------------------------------------------------
241
+
242
+
243
+ class RuntimeAdapter(ABC):
244
+ """把 :class:`BaseRuntime` 的原生能力映射为平台接口(六动词)。
245
+
246
+ 签名冻结:以下六个方法的名字、参数、返回类型在 v1 冻结,只允许 additive 演进
247
+ (新增方法/可选参数),不允许改既有签名。
248
+ """
249
+
250
+ def __init__(self, runtime: BaseRuntime) -> None:
251
+ self._runtime = runtime
252
+
253
+ @property
254
+ def runtime(self) -> BaseRuntime:
255
+ return self._runtime
256
+
257
+ async def preflight(self) -> None:
258
+ """Validate that this adapter can accept a new run without creating one.
259
+
260
+ This is deliberately an additive lifecycle hook rather than a seventh
261
+ platform verb. HTTP streaming routes use it before committing a 200
262
+ response, so a lazy runner import or configuration failure is returned
263
+ as a normal request error instead of a detached, half-open SSE stream.
264
+ Implementations must not allocate a run handle or start model work.
265
+ """
266
+
267
+ return None
268
+
269
+ @abstractmethod
270
+ async def start(self, request: StartRequest) -> RunHandle:
271
+ """启动一次 run,返回句柄。"""
272
+ raise NotImplementedError
273
+
274
+ @abstractmethod
275
+ def stream(self, handle: RunHandle) -> AsyncIterator[RuntimeEvent]:
276
+ """订阅 run 的结构化事件流(对接 G0.2 RuntimeEvent)。
277
+
278
+ 注意:这是**事件流 + 独立命令/恢复通道**模型——审批回包/工具结果走
279
+ :meth:`resume`,不在本事件流上回写(非 duplex stream)。
280
+ """
281
+ raise NotImplementedError
282
+
283
+ @abstractmethod
284
+ async def cancel(self, handle: RunHandle) -> CancelResult:
285
+ """请求取消。返回状态机结果;成功 cancel 级联丢弃该 turn 的 pending 审批。"""
286
+ raise NotImplementedError
287
+
288
+ async def pause(self, handle: RunHandle) -> PauseResult:
289
+ """Pause an active turn without invalidating its resumable state.
290
+
291
+ This additive hook defaults to an honest unsupported result. It must
292
+ not fall back to ``cancel`` because cancellation is terminal for some
293
+ runtimes (notably Codex).
294
+ """
295
+
296
+ return PauseResult.NOT_SUPPORTED
297
+
298
+ async def submit(self, handle: RunHandle, payload: ResumePayload) -> None:
299
+ """Submit input to a live interaction without restarting the stream.
300
+
301
+ Runtimes whose HITL model ends the current stream should continue to
302
+ use :meth:`resume`; live JSON-RPC approval requests use this command
303
+ channel instead.
304
+ """
305
+
306
+ raise RuntimeError(f"{type(self).__name__} does not support live interaction input")
307
+
308
+ @abstractmethod
309
+ async def resume(
310
+ self,
311
+ handle: RunHandle,
312
+ target: ResumeTarget,
313
+ payload: Optional[ResumePayload],
314
+ ) -> RunHandle:
315
+ """恢复 run。``target`` 是恢复目标,``payload`` 是回包(可为空)。"""
316
+ raise NotImplementedError
317
+
318
+ async def attach(self, handle: RunHandle) -> RunHandle:
319
+ """Attach a persisted handle in this process before ``resume``/``stream``.
320
+
321
+ A handle restored from durable task metadata is not evidence that the
322
+ underlying runner exists in this process. Adapters which support
323
+ cross-process recovery must implement this seam using their framework's
324
+ durable checkpoint/session API. The default deliberately fails closed.
325
+ """
326
+ raise RuntimeError(
327
+ f"{type(self).__name__} does not support attaching persisted run "
328
+ f"{handle.run_id!r}; durable runtime restore is unavailable"
329
+ )
330
+
331
+ def is_handle_attached(self, handle: RunHandle) -> bool:
332
+ """Return whether ``handle`` is already attached to this adapter process."""
333
+ return False
334
+
335
+ @abstractmethod
336
+ async def checkpoint(self, handle: RunHandle) -> CheckpointDescriptor:
337
+ """在当前位置创建 checkpoint,返回描述(粒度见 capability)。"""
338
+ raise NotImplementedError
339
+
340
+ @abstractmethod
341
+ async def close(self, handle: RunHandle) -> None:
342
+ """释放 run 持有的运行期资源。"""
343
+ raise NotImplementedError
344
+
345
+
346
+ # ---------------------------------------------------------------------------
347
+ # RuntimeRegistry
348
+ # ---------------------------------------------------------------------------
349
+
350
+
351
+ RuntimeAdapterFactory = Callable[[RuntimeLaunchContext], RuntimeAdapter]
352
+
353
+
354
+ class RuntimeRegistry:
355
+ """按 ``runtime_type`` 注册/创建 :class:`RuntimeAdapter`。
356
+
357
+ 替代 ``runners/factory.py`` 的 if/elif 分发:新 runtime 通过 ``register``
358
+ 注册,不再改 factory 分支。
359
+ """
360
+
361
+ def __init__(self) -> None:
362
+ self._factories: dict[str, RuntimeAdapterFactory] = {}
363
+
364
+ def register(self, runtime_type: str, factory: RuntimeAdapterFactory) -> None:
365
+ if not isinstance(runtime_type, str) or not runtime_type.strip():
366
+ raise ValueError("runtime type must be a non-empty string")
367
+ key = runtime_type.strip().lower()
368
+ if key in self._factories:
369
+ raise ValueError(f"duplicate runtime type: {runtime_type!r}")
370
+ if not callable(factory):
371
+ raise TypeError(f"runtime factory must be callable: {factory!r}")
372
+ self._factories[key] = factory
373
+
374
+ def get(self, runtime_type: str) -> RuntimeAdapterFactory:
375
+ key = runtime_type.strip().lower()
376
+ try:
377
+ return self._factories[key]
378
+ except KeyError:
379
+ raise KeyError(
380
+ f"missing runtime type: {runtime_type!r}; registered: {sorted(self._factories)}"
381
+ ) from None
382
+
383
+ def create(self, context: RuntimeLaunchContext) -> RuntimeAdapter:
384
+ """使用不可变启动上下文创建一个新的 Adapter 实例。"""
385
+
386
+ adapter = self.get(context.runtime_type)(context)
387
+ if not isinstance(adapter, RuntimeAdapter):
388
+ raise TypeError(
389
+ f"runtime factory must return RuntimeAdapter, got {type(adapter).__name__}"
390
+ )
391
+ return adapter
392
+
393
+ def registered_types(self) -> list[str]:
394
+ return sorted(self._factories)
395
+
396
+
397
+ __all__ = [
398
+ "BaseRuntime",
399
+ "CancelResult",
400
+ "PauseResult",
401
+ "CheckpointCapability",
402
+ "CheckpointDescriptor",
403
+ "ResumePayload",
404
+ "ResumeTarget",
405
+ "RunHandle",
406
+ "RuntimeAdapter",
407
+ "RuntimeAdapterFactory",
408
+ "RuntimeLaunchContext",
409
+ "RuntimeRegistry",
410
+ "RuntimeServices",
411
+ "StartRequest",
412
+ ]