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
@@ -4,30 +4,46 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Iterable
6
6
 
7
-
8
7
  FASTAPI_REQUIREMENT = "fastapi>=0.100.0,<1.0.0"
9
8
 
10
9
  ADK_REQUIREMENTS = (
11
- "google-adk>=1.34.0,<2.0.0",
10
+ # goal-00: 与 ksadk 自身 adk extra 对齐,允许 1.34.x 与 2.x
11
+ "google-adk>=1.34.0,<3.0.0",
12
12
  "litellm>=1.0.0",
13
13
  )
14
14
 
15
15
  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",
16
+ "langchain>=1.3.14,<2.0.0",
17
+ "langchain-openai>=1.4.0,<2.0.0",
18
+ "langchain-core>=1.5.0,<2.0.0",
19
19
  "langgraph>=1.2.0,<1.3.0",
20
20
  )
21
21
 
22
- DEEPAGENTS_REQUIREMENTS = (
23
- "deepagents>=0.6.2,<1.0.0",
24
- )
22
+ DEEPAGENTS_REQUIREMENTS = ("deepagents>=0.6.2,<1.0.0",)
23
+
24
+ # codex runtime:openai-codex SDK(自带 codex CLI 二进制,见 PyPI cli-bin wheel)
25
+ CODEX_REQUIREMENTS = ("openai-codex==0.144.4",)
26
+
27
+
28
+ def code_requirements_for_framework(framework: str) -> list[str]:
29
+ """Dependencies safe to install into a portable Code artifact.
30
+
31
+ Codex carries a platform-selected executable package. ManagedRuntime code
32
+ bundles must remain system independent, so Codex is deliberately excluded
33
+ from this dependency policy.
34
+ """
35
+ normalized = (framework or "").strip().lower()
36
+ if normalized == "codex":
37
+ return []
38
+ return requirements_for_framework(normalized)
25
39
 
26
40
 
27
41
  def requirements_for_framework(framework: str) -> list[str]:
28
42
  normalized = (framework or "").strip().lower()
29
43
  if normalized == "adk":
30
44
  return list(ADK_REQUIREMENTS)
45
+ if normalized == "codex":
46
+ return list(CODEX_REQUIREMENTS)
31
47
  if normalized in {"langchain", "langgraph", "deepagents"}:
32
48
  requirements = list(LANGCHAIN_ECOSYSTEM_REQUIREMENTS)
33
49
  if normalized == "deepagents":
@@ -41,11 +57,13 @@ def minimal_requirements_for_framework(framework: str) -> list[str]:
41
57
  normalized = (framework or "").strip().lower()
42
58
  if normalized == "adk":
43
59
  return list(ADK_REQUIREMENTS)
60
+ if normalized == "codex":
61
+ return list(CODEX_REQUIREMENTS)
44
62
  if normalized in {"langchain", "langgraph", "deepagents"}:
45
63
  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",
64
+ "langchain>=1.3.14,<2.0.0",
65
+ "langchain-openai>=1.4.0,<2.0.0",
66
+ "langchain-core>=1.5.0,<2.0.0",
49
67
  ]
50
68
  if normalized in {"langgraph", "deepagents"}:
51
69
  requirements.append("langgraph>=1.2.0,<1.3.0")
@@ -5,14 +5,13 @@ 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
11
 
12
+ import click
13
13
  from ks3.upload import UploadTask
14
14
 
15
-
16
15
  from ksadk.common.constants import get_ks3_endpoints
17
16
 
18
17
  # KS3 Region 映射表 已移动到 ksadk.common.constants
@@ -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
@@ -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,145 @@
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
+ "prompt",
24
+ )
25
+
26
+
27
+ class ManagedRuntimeBuilder(BaseBuilder):
28
+ """Build a deterministic YAML-only deployment artifact.
29
+
30
+ Runtime dependencies and local credentials intentionally never enter this
31
+ artifact. The managed runtime image supplies executable dependencies while
32
+ AgentEngine injects deployment-time credentials.
33
+ """
34
+
35
+ def __init__(
36
+ self,
37
+ project_dir: Path,
38
+ config: dict[str, Any] | None = None,
39
+ *,
40
+ runtime_version: str | None = None,
41
+ ) -> None:
42
+ super().__init__(project_dir, config)
43
+ self.runtime_version = str(runtime_version or "").strip()
44
+ self.build_dir = self.project_dir / ".agentengine" / "managed_runtime"
45
+
46
+ def build(self) -> BuildResult:
47
+ config = self._load_config()
48
+ error = self._validate_config(config)
49
+ if error:
50
+ return BuildResult(success=False, error_message=error)
51
+
52
+ runtime = dict(config.get("runtime") or {})
53
+ version = self.runtime_version or str(runtime.get("version") or "").strip()
54
+ if not version:
55
+ return BuildResult(
56
+ success=False,
57
+ error_message=(
58
+ "ManagedRuntime 构建需要已解析的 runtime.version;"
59
+ "请显式配置版本或连接 AgentEngine 获取服务端默认版本"
60
+ ),
61
+ )
62
+
63
+ runtime_name = str(runtime.get("name") or config.get("framework") or "").strip().lower()
64
+ runtime = {"name": runtime_name, "version": version}
65
+ manifest = self._normalized_manifest(config, runtime)
66
+ manifest_bytes = yaml.safe_dump(
67
+ manifest,
68
+ allow_unicode=True,
69
+ sort_keys=False,
70
+ ).encode("utf-8")
71
+ manifest_sha256 = hashlib.sha256(manifest_bytes).hexdigest()
72
+ lock = {
73
+ "schema_version": RUNTIME_MANIFEST_SCHEMA,
74
+ "runtime": runtime,
75
+ "manifest_sha256": manifest_sha256,
76
+ }
77
+ lock_bytes = (
78
+ json.dumps(lock, ensure_ascii=False, indent=2, sort_keys=True) + "\n"
79
+ ).encode("utf-8")
80
+
81
+ self.build_dir.mkdir(parents=True, exist_ok=True)
82
+ name = str(config.get("name") or self.project_dir.name).strip() or self.project_dir.name
83
+ project_version = str(config.get("version") or "1.0.0").strip() or "1.0.0"
84
+ artifact_path = self.build_dir / f"{name}-{project_version}-runtime.zip"
85
+ self._write_bundle(
86
+ artifact_path,
87
+ {
88
+ "agentengine.yaml": manifest_bytes,
89
+ "runtime-lock.json": lock_bytes,
90
+ },
91
+ )
92
+ return BuildResult(
93
+ success=True,
94
+ artifact_path=artifact_path,
95
+ artifact_size=artifact_path.stat().st_size,
96
+ metadata={
97
+ "agent_name": name,
98
+ "framework": str(config.get("framework") or ""),
99
+ "artifact_type": "ManagedRuntime",
100
+ "runtime_name": runtime_name,
101
+ "runtime_version": version,
102
+ "manifest_sha256": manifest_sha256,
103
+ },
104
+ )
105
+
106
+ @staticmethod
107
+ def _validate_config(config: dict[str, Any]) -> str | None:
108
+ framework = str(config.get("framework") or "").strip().lower()
109
+ artifact_type = str(config.get("artifact_type") or "").strip().lower()
110
+ runtime = config.get("runtime")
111
+ if framework != "codex":
112
+ return "当前 ManagedRuntime v1 仅支持 framework: codex"
113
+ if artifact_type != "managedruntime":
114
+ return "ManagedRuntime 项目必须配置 artifact_type: ManagedRuntime"
115
+ if not isinstance(runtime, dict):
116
+ return "ManagedRuntime 项目必须配置 runtime.name"
117
+ runtime_name = str(runtime.get("name") or "").strip().lower()
118
+ if runtime_name != "codex":
119
+ return "当前 ManagedRuntime v1 仅支持 runtime.name: codex"
120
+ return None
121
+
122
+ @staticmethod
123
+ def _normalized_manifest(
124
+ config: dict[str, Any],
125
+ runtime: dict[str, str],
126
+ ) -> dict[str, Any]:
127
+ normalized: dict[str, Any] = {}
128
+ for key in _MANIFEST_KEYS:
129
+ if key == "runtime":
130
+ normalized[key] = runtime
131
+ elif key == "artifact_type":
132
+ normalized[key] = "ManagedRuntime"
133
+ elif key in config:
134
+ normalized[key] = config[key]
135
+ return normalized
136
+
137
+ @staticmethod
138
+ def _write_bundle(path: Path, files: dict[str, bytes]) -> None:
139
+ with zipfile.ZipFile(path, "w", compression=zipfile.ZIP_DEFLATED) as archive:
140
+ for name in sorted(files):
141
+ info = zipfile.ZipInfo(name)
142
+ info.date_time = (1980, 1, 1, 0, 0, 0)
143
+ info.compress_type = zipfile.ZIP_DEFLATED
144
+ info.external_attr = 0o100644 << 16
145
+ archive.writestr(info, files[name])