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
@@ -4,30 +4,47 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Iterable
6
6
 
7
-
8
- FASTAPI_REQUIREMENT = "fastapi>=0.100.0,<1.0.0"
7
+ FASTAPI_REQUIREMENT = "fastapi>=0.136.0,<0.137.0"
8
+ STARLETTE_REQUIREMENT = "starlette>=1.0,<1.4"
9
9
 
10
10
  ADK_REQUIREMENTS = (
11
- "google-adk>=1.34.0,<2.0.0",
11
+ # goal-00: 与 ksadk 自身 adk extra 对齐,允许 1.34.x 与 2.x
12
+ "google-adk>=1.34.0,<3.0.0",
12
13
  "litellm>=1.0.0",
13
14
  )
14
15
 
15
16
  LANGCHAIN_ECOSYSTEM_REQUIREMENTS = (
16
- "langchain>=1.3.0,<2.0.0",
17
- "langchain-openai>=1.2.0,<2.0.0",
18
- "langchain-core>=1.4.0,<2.0.0",
17
+ "langchain>=1.3.14,<2.0.0",
18
+ "langchain-openai>=1.4.0,<2.0.0",
19
+ "langchain-core>=1.5.0,<2.0.0",
19
20
  "langgraph>=1.2.0,<1.3.0",
20
21
  )
21
22
 
22
- DEEPAGENTS_REQUIREMENTS = (
23
- "deepagents>=0.6.2,<1.0.0",
24
- )
23
+ DEEPAGENTS_REQUIREMENTS = ("deepagents>=0.6.2,<1.0.0",)
24
+
25
+ # codex runtime:openai-codex SDK(自带 codex CLI 二进制,见 PyPI cli-bin wheel)
26
+ CODEX_REQUIREMENTS = ("openai-codex==0.144.4",)
27
+
28
+
29
+ def code_requirements_for_framework(framework: str) -> list[str]:
30
+ """Dependencies safe to install into a portable Code artifact.
31
+
32
+ Codex carries a platform-selected executable package. ManagedRuntime code
33
+ bundles must remain system independent, so Codex is deliberately excluded
34
+ from this dependency policy.
35
+ """
36
+ normalized = (framework or "").strip().lower()
37
+ if normalized == "codex":
38
+ return []
39
+ return requirements_for_framework(normalized)
25
40
 
26
41
 
27
42
  def requirements_for_framework(framework: str) -> list[str]:
28
43
  normalized = (framework or "").strip().lower()
29
44
  if normalized == "adk":
30
45
  return list(ADK_REQUIREMENTS)
46
+ if normalized == "codex":
47
+ return list(CODEX_REQUIREMENTS)
31
48
  if normalized in {"langchain", "langgraph", "deepagents"}:
32
49
  requirements = list(LANGCHAIN_ECOSYSTEM_REQUIREMENTS)
33
50
  if normalized == "deepagents":
@@ -41,11 +58,13 @@ def minimal_requirements_for_framework(framework: str) -> list[str]:
41
58
  normalized = (framework or "").strip().lower()
42
59
  if normalized == "adk":
43
60
  return list(ADK_REQUIREMENTS)
61
+ if normalized == "codex":
62
+ return list(CODEX_REQUIREMENTS)
44
63
  if normalized in {"langchain", "langgraph", "deepagents"}:
45
64
  requirements = [
46
- "langchain>=1.3.0,<2.0.0",
47
- "langchain-openai>=1.2.0,<2.0.0",
48
- "langchain-core>=1.4.0,<2.0.0",
65
+ "langchain>=1.3.14,<2.0.0",
66
+ "langchain-openai>=1.4.0,<2.0.0",
67
+ "langchain-core>=1.5.0,<2.0.0",
49
68
  ]
50
69
  if normalized in {"langgraph", "deepagents"}:
51
70
  requirements.append("langgraph>=1.2.0,<1.3.0")
@@ -5,13 +5,12 @@ KS3 上传模块 - 金山云对象存储上传
5
5
  import os
6
6
  import socket
7
7
  import time
8
- from pathlib import Path
9
8
  from concurrent.futures import ThreadPoolExecutor, as_completed
9
+ from pathlib import Path
10
10
  from typing import Optional
11
- import click
12
-
13
- from ks3.upload import UploadTask
14
11
 
12
+ import click
13
+ from ks3.upload import UploadTask # type: ignore[import-untyped]
15
14
 
16
15
  from ksadk.common.constants import get_ks3_endpoints
17
16
 
@@ -28,9 +27,9 @@ class KS3Uploader:
28
27
  UPLOAD_TIMEOUT_PER_MB_SECONDS = 4.0
29
28
  UPLOAD_TIMEOUT_MAX_SECONDS = 3600
30
29
 
31
- def __init__(self, region: str = "cn-beijing-6", bucket: str = None):
30
+ def __init__(self, region: str = "cn-beijing-6", bucket: Optional[str] = None):
32
31
  """初始化 KS3 上传器
33
-
32
+
34
33
  Args:
35
34
  region: KS3 区域 (默认 cn-beijing-6)
36
35
  bucket: bucket 名称 (可选)
@@ -39,12 +38,12 @@ class KS3Uploader:
39
38
  - 如果环境变量也未设置,默认使用 agentengine-{region}
40
39
  """
41
40
  self.region = region
42
-
41
+
43
42
  # 确定 bucket 名称 (优先级: 参数 > 环境变量 > 默认值)
44
43
  if bucket:
45
44
  self.bucket_name = bucket
46
- elif os.getenv("KS3_BUCKET"):
47
- self.bucket_name = os.getenv("KS3_BUCKET")
45
+ elif env_bucket := os.getenv("KS3_BUCKET"):
46
+ self.bucket_name = env_bucket
48
47
  else:
49
48
  # Bucket 名称格式: agentengine-{account_id}-{region}
50
49
  account_id = os.getenv("KSYUN_ACCOUNT_ID")
@@ -68,7 +67,7 @@ class KS3Uploader:
68
67
  " 或设置 KS3_BUCKET 显式指定 bucket 名称"
69
68
  )
70
69
  self.bucket_name = f"agentengine-{account_id}-{region}"
71
-
70
+
72
71
  self.custom_domain = None # 可选的自定义域名
73
72
 
74
73
  def get_endpoint(self) -> str:
@@ -100,8 +99,12 @@ class KS3Uploader:
100
99
  pass
101
100
 
102
101
  size_mb = file_path.stat().st_size / (1024 * 1024)
103
- calculated = self.UPLOAD_TIMEOUT_BASE_SECONDS + int(size_mb * self.UPLOAD_TIMEOUT_PER_MB_SECONDS)
104
- return min(self.UPLOAD_TIMEOUT_MAX_SECONDS, max(self.UPLOAD_CONNECT_TIMEOUT_SECONDS, calculated))
102
+ calculated = self.UPLOAD_TIMEOUT_BASE_SECONDS + int(
103
+ size_mb * self.UPLOAD_TIMEOUT_PER_MB_SECONDS
104
+ )
105
+ return min(
106
+ self.UPLOAD_TIMEOUT_MAX_SECONDS, max(self.UPLOAD_CONNECT_TIMEOUT_SECONDS, calculated)
107
+ )
105
108
 
106
109
  def _probe_endpoint_latency(self, host: str) -> Optional[float]:
107
110
  started_at = time.monotonic()
@@ -137,12 +140,16 @@ class KS3Uploader:
137
140
  if mode == "internal":
138
141
  add_candidate(internal_endpoint, "内网")
139
142
  add_candidate(public_endpoint, "公网")
140
- return candidates, f"强制优先内网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
143
+ return candidates, (
144
+ f"强制优先内网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
145
+ )
141
146
 
142
147
  if mode == "public":
143
148
  add_candidate(public_endpoint, "公网")
144
149
  add_candidate(internal_endpoint, "内网")
145
- return candidates, f"强制优先公网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
150
+ return candidates, (
151
+ f"强制优先公网 {candidates[0]['host']}" if candidates else "未找到可用 KS3 endpoint"
152
+ )
146
153
 
147
154
  add_candidate(internal_endpoint, "内网")
148
155
  add_candidate(public_endpoint, "公网")
@@ -192,12 +199,24 @@ class KS3Uploader:
192
199
  bucket_exists = False
193
200
  else:
194
201
  if "AccessDenied" in error_str or "403" in error_str:
195
- click.secho(f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称冲突或无权限访问 (403)。", fg="yellow")
196
- click.secho(" 注意: KS3 Bucket 名称在全网范围内是全局唯一的!", fg="yellow")
202
+ click.secho(
203
+ f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称冲突或无权限访问 (403)。",
204
+ fg="yellow",
205
+ )
206
+ click.secho(
207
+ " 注意: KS3 Bucket 名称在全网范围内是全局唯一的!", fg="yellow"
208
+ )
197
209
  click.secho(" 该名称已被其他用户占用,您无法使用。", fg="yellow")
198
210
  click.secho(" 👉 解决方案:", fg="cyan")
199
- click.secho(" 1. (推荐) 在 .env 中设置 KSYUN_ACCOUNT_ID 为您的账户 ID (自动生成唯一名称)。", fg="cyan")
200
- click.secho(" 2. 或者,在 .env 中设置 KS3_BUCKET 为一个没人用过的唯一名称。", fg="cyan")
211
+ click.secho(
212
+ " 1. (推荐) 在 .env 中设置 KSYUN_ACCOUNT_ID 为您的账户 ID "
213
+ "(自动生成唯一名称)。",
214
+ fg="cyan",
215
+ )
216
+ click.secho(
217
+ " 2. 或者,在 .env 中设置 KS3_BUCKET 为一个没人用过的唯一名称。",
218
+ fg="cyan",
219
+ )
201
220
  raise
202
221
 
203
222
  if not bucket_exists:
@@ -206,10 +225,20 @@ class KS3Uploader:
206
225
  click.secho(f" ✓ Bucket 创建成功: {self.bucket_name}", fg="green")
207
226
  except Exception as create_err:
208
227
  create_err_str = str(create_err)
209
- if "Conflict" in create_err_str or "409" in create_err_str or "BucketAlreadyExists" in create_err_str:
210
- click.secho(f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称已被其他用户占用。", fg="yellow")
228
+ if (
229
+ "Conflict" in create_err_str
230
+ or "409" in create_err_str
231
+ or "BucketAlreadyExists" in create_err_str
232
+ ):
233
+ click.secho(
234
+ f" ⚠️ 提示: Bucket '{self.bucket_name}' 名称已被其他用户占用。",
235
+ fg="yellow",
236
+ )
211
237
  click.secho(" 注意: KS3 Bucket 名称是全局唯一的。", fg="yellow")
212
- click.secho(" 👉 解决方法: 修改 .env 中的 KS3_BUCKET,换一个更复杂的名字再试。", fg="cyan")
238
+ click.secho(
239
+ " 👉 解决方法: 修改 .env 中的 KS3_BUCKET,换一个更复杂的名字再试。",
240
+ fg="cyan",
241
+ )
213
242
  raise
214
243
 
215
244
  return bucket
@@ -229,7 +258,7 @@ class KS3Uploader:
229
258
  return record_dir / f"{safe_key}.ks3resume"
230
259
 
231
260
  def _upload_via_host(self, file_path: Path, object_key: str, host: str) -> bool:
232
- from ks3.connection import Connection
261
+ from ks3.connection import Connection # type: ignore[import-untyped]
233
262
 
234
263
  ak = os.environ.get("KSYUN_ACCESS_KEY") or os.environ.get("KS3_ACCESS_KEY")
235
264
  sk = os.environ.get("KSYUN_SECRET_KEY") or os.environ.get("KS3_SECRET_KEY")
@@ -299,7 +328,9 @@ class KS3Uploader:
299
328
  return None
300
329
 
301
330
  click.echo(f" KS3 Endpoint 策略: {selection_summary}")
302
- click.echo(f" 上传文件: {file_path.name} ({file_path.stat().st_size / (1024 * 1024):.2f} MB)")
331
+ click.echo(
332
+ f" 上传文件: {file_path.name} ({file_path.stat().st_size / (1024 * 1024):.2f} MB)"
333
+ )
303
334
  click.echo(f" 上传超时: {self._upload_timeout_seconds(file_path)} 秒")
304
335
 
305
336
  # 临时禁用系统代理 (ClashX 等会导致 KS3 上传走代理而失败)
@@ -369,17 +400,17 @@ class KS3Uploader:
369
400
  async def upload_with_url(self, file_path: Path, presigned_url: str) -> bool:
370
401
  """使用预签名 URL 上传文件 (不依赖本地 AK/SK)"""
371
402
  import httpx
372
-
373
- click.echo(f" 上传中 (使用预签名 URL)...")
374
-
403
+
404
+ click.echo(" 上传中 (使用预签名 URL)...")
405
+
375
406
  try:
376
407
  async with httpx.AsyncClient() as client:
377
- with open(file_path, 'rb') as f:
408
+ with open(file_path, "rb") as f:
378
409
  response = await client.put(
379
- presigned_url,
410
+ presigned_url,
380
411
  content=f.read(),
381
412
  headers={"Content-Type": "application/octet-stream"},
382
- timeout=300.0
413
+ timeout=300.0,
383
414
  )
384
415
  response.raise_for_status()
385
416
  click.secho(" ✓ 上传成功", fg="green")
@@ -0,0 +1,173 @@
1
+ """System-independent manifest bundles for platform-managed runtimes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import zipfile
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ import yaml
12
+
13
+ from ksadk.builders.base import BaseBuilder, BuildResult
14
+
15
+ RUNTIME_MANIFEST_SCHEMA = "runtime-manifest/v1"
16
+ _MANIFEST_KEYS = (
17
+ "name",
18
+ "version",
19
+ "framework",
20
+ "artifact_type",
21
+ "runtime",
22
+ "model",
23
+ "models",
24
+ "prompt",
25
+ "skills",
26
+ "mcp_servers",
27
+ "sandbox",
28
+ "approval_mode",
29
+ )
30
+
31
+
32
+ class _RuntimeManifestDumper(yaml.SafeDumper):
33
+ """Keep multi-line prompts readable while preserving deterministic bytes."""
34
+
35
+
36
+ def _represent_manifest_string(dumper: yaml.SafeDumper, value: str):
37
+ style = "|" if "\n" in value else None
38
+ return dumper.represent_scalar("tag:yaml.org,2002:str", value, style=style)
39
+
40
+
41
+ _RuntimeManifestDumper.add_representer(str, _represent_manifest_string)
42
+
43
+
44
+ def serialize_managed_runtime_manifest(manifest: dict[str, Any]) -> bytes:
45
+ """Serialize the canonical ManagedRuntime manifest used by every client."""
46
+
47
+ return yaml.dump(
48
+ manifest,
49
+ Dumper=_RuntimeManifestDumper,
50
+ allow_unicode=True,
51
+ sort_keys=False,
52
+ default_flow_style=False,
53
+ ).encode("utf-8")
54
+
55
+
56
+ class ManagedRuntimeBuilder(BaseBuilder):
57
+ """Build a deterministic YAML-only deployment artifact.
58
+
59
+ Runtime dependencies and local credentials intentionally never enter this
60
+ artifact. The managed runtime image supplies executable dependencies while
61
+ AgentEngine injects deployment-time credentials.
62
+ """
63
+
64
+ def __init__(
65
+ self,
66
+ project_dir: Path,
67
+ config: dict[str, Any] | None = None,
68
+ *,
69
+ runtime_version: str | None = None,
70
+ ) -> None:
71
+ super().__init__(project_dir, config)
72
+ self.runtime_version = str(runtime_version or "").strip()
73
+ self.build_dir = self.project_dir / ".agentengine" / "managed_runtime"
74
+
75
+ def build(self) -> BuildResult:
76
+ # An explicitly supplied snapshot is authoritative. Studio can keep
77
+ # more than one Agent manifest in a workspace, so falling back to the
78
+ # root agentengine.yaml here would silently build the wrong Agent.
79
+ config = dict(self.config) if self.config else self._load_config()
80
+ error = self._validate_config(config)
81
+ if error:
82
+ return BuildResult(success=False, error_message=error)
83
+
84
+ runtime = dict(config.get("runtime") or {})
85
+ version = self.runtime_version or str(runtime.get("version") or "").strip()
86
+ if not version:
87
+ return BuildResult(
88
+ success=False,
89
+ error_message=(
90
+ "ManagedRuntime 构建需要已解析的 runtime.version;"
91
+ "请显式配置版本或连接 AgentEngine 获取服务端默认版本"
92
+ ),
93
+ )
94
+
95
+ runtime_name = str(runtime.get("name") or config.get("framework") or "").strip().lower()
96
+ runtime = {"name": runtime_name, "version": version}
97
+ manifest = self._normalized_manifest(config, runtime)
98
+ manifest_bytes = serialize_managed_runtime_manifest(manifest)
99
+ manifest_sha256 = hashlib.sha256(manifest_bytes).hexdigest()
100
+ lock = {
101
+ "schema_version": RUNTIME_MANIFEST_SCHEMA,
102
+ "runtime": runtime,
103
+ "manifest_sha256": manifest_sha256,
104
+ }
105
+ lock_bytes = (
106
+ json.dumps(lock, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
107
+ ).encode("utf-8")
108
+
109
+ self.build_dir.mkdir(parents=True, exist_ok=True)
110
+ name = str(config.get("name") or self.project_dir.name).strip() or self.project_dir.name
111
+ project_version = str(config.get("version") or "1.0.0").strip() or "1.0.0"
112
+ artifact_path = self.build_dir / f"{name}-{project_version}-runtime.zip"
113
+ self._write_bundle(
114
+ artifact_path,
115
+ {
116
+ "agentengine.yaml": manifest_bytes,
117
+ "runtime-lock.json": lock_bytes,
118
+ },
119
+ )
120
+ return BuildResult(
121
+ success=True,
122
+ artifact_path=artifact_path,
123
+ artifact_size=artifact_path.stat().st_size,
124
+ metadata={
125
+ "agent_name": name,
126
+ "framework": str(config.get("framework") or ""),
127
+ "artifact_type": "ManagedRuntime",
128
+ "runtime_name": runtime_name,
129
+ "runtime_version": version,
130
+ "manifest_sha256": manifest_sha256,
131
+ },
132
+ )
133
+
134
+ @staticmethod
135
+ def _validate_config(config: dict[str, Any]) -> str | None:
136
+ framework = str(config.get("framework") or "").strip().lower()
137
+ artifact_type = str(config.get("artifact_type") or "").strip().lower()
138
+ runtime = config.get("runtime")
139
+ if framework != "codex":
140
+ return "当前 ManagedRuntime v1 仅支持 framework: codex"
141
+ if artifact_type != "managedruntime":
142
+ return "ManagedRuntime 项目必须配置 artifact_type: ManagedRuntime"
143
+ if not isinstance(runtime, dict):
144
+ return "ManagedRuntime 项目必须配置 runtime.name"
145
+ runtime_name = str(runtime.get("name") or "").strip().lower()
146
+ if runtime_name != "codex":
147
+ return "当前 ManagedRuntime v1 仅支持 runtime.name: codex"
148
+ return None
149
+
150
+ @staticmethod
151
+ def _normalized_manifest(
152
+ config: dict[str, Any],
153
+ runtime: dict[str, str],
154
+ ) -> dict[str, Any]:
155
+ normalized: dict[str, Any] = {}
156
+ for key in _MANIFEST_KEYS:
157
+ if key == "runtime":
158
+ normalized[key] = runtime
159
+ elif key == "artifact_type":
160
+ normalized[key] = "ManagedRuntime"
161
+ elif key in config:
162
+ normalized[key] = config[key]
163
+ return normalized
164
+
165
+ @staticmethod
166
+ def _write_bundle(path: Path, files: dict[str, bytes]) -> None:
167
+ with zipfile.ZipFile(path, "w", compression=zipfile.ZIP_DEFLATED) as archive:
168
+ for name in sorted(files):
169
+ info = zipfile.ZipInfo(name)
170
+ info.date_time = (1980, 1, 1, 0, 0, 0)
171
+ info.compress_type = zipfile.ZIP_DEFLATED
172
+ info.external_attr = 0o100644 << 16
173
+ archive.writestr(info, files[name])