agentengine-sdk-python 0.8.1__py3-none-any.whl → 0.8.3__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 (476) hide show
  1. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/METADATA +25 -12
  2. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/RECORD +421 -232
  3. ksadk/_build_provenance.json +1 -0
  4. ksadk/a2a/_space_client_events.py +381 -0
  5. ksadk/a2a/event_adapter.py +156 -64
  6. ksadk/a2a/executor.py +179 -63
  7. ksadk/a2a/space_client.py +6 -333
  8. ksadk/a2ui/core.py +222 -53
  9. ksadk/agui/_agent_helpers.py +247 -0
  10. ksadk/agui/a2ui_projection.py +12 -5
  11. ksadk/agui/agent.py +443 -259
  12. ksadk/api/client.py +528 -27
  13. ksadk/builders/code_builder.py +284 -8
  14. ksadk/builders/container_builder.py +8 -1
  15. ksadk/builders/managed_runtime_builder.py +42 -35
  16. ksadk/cli/__init__.py +23 -0
  17. ksadk/cli/cmd_dashboard.py +15 -1
  18. ksadk/cli/cmd_deploy.py +10 -2
  19. ksadk/cli/cmd_eval.py +66 -9
  20. ksadk/cli/cmd_evalset.py +284 -0
  21. ksadk/cli/cmd_files.py +5 -1
  22. ksadk/cli/cmd_hermes.py +1 -126
  23. ksadk/cli/cmd_invoke.py +28 -38
  24. ksadk/cli/cmd_managed_runtime.py +95 -0
  25. ksadk/cli/cmd_observe.py +85 -0
  26. ksadk/cli/cmd_openclaw.py +1 -435
  27. ksadk/cli/cmd_plugin.py +657 -0
  28. ksadk/cli/cmd_replay.py +28 -4
  29. ksadk/cli/cmd_studio.py +99 -8
  30. ksadk/cli/cmd_web.py +10 -2
  31. ksadk/cli/hermes_env.py +151 -0
  32. ksadk/cli/invoke_payload.py +49 -0
  33. ksadk/cli/openclaw_env.py +458 -0
  34. ksadk/codex/client.py +180 -30
  35. ksadk/codex/runtime.py +475 -331
  36. ksadk/configs/env_registry.py +94 -12
  37. ksadk/configs/env_registry_pcm.py +181 -0
  38. ksadk/configs/env_var_spec.py +18 -0
  39. ksadk/configs/global_config.py +5 -0
  40. ksadk/configs/settings.py +9 -0
  41. ksadk/context_engine/__init__.py +98 -0
  42. ksadk/context_engine/assembler.py +176 -0
  43. ksadk/context_engine/baseline.py +419 -0
  44. ksadk/context_engine/cache_observability.py +228 -0
  45. ksadk/context_engine/capabilities.py +443 -0
  46. ksadk/context_engine/contributors.py +409 -0
  47. ksadk/context_engine/hosted_pipeline.py +417 -0
  48. ksadk/context_engine/models.py +117 -0
  49. ksadk/context_engine/planner.py +698 -0
  50. ksadk/context_engine/policies.py +319 -0
  51. ksadk/context_engine/projection.py +31 -0
  52. ksadk/context_engine/shadow_plan.py +266 -0
  53. ksadk/context_engine/tokenizer.py +164 -0
  54. ksadk/conversations/__init__.py +19 -0
  55. ksadk/conversations/context.py +230 -30
  56. ksadk/conversations/contracts.py +266 -0
  57. ksadk/conversations/message_projection.py +308 -26
  58. ksadk/conversations/model_context.py +49 -3
  59. ksadk/conversations/projector.py +616 -0
  60. ksadk/conversations/reducer.py +98 -0
  61. ksadk/conversations/runtime_compaction.py +207 -5
  62. ksadk/conversations/runtime_input.py +184 -2
  63. ksadk/conversations/runtime_invocation.py +81 -3
  64. ksadk/conversations/runtime_observability.py +141 -0
  65. ksadk/conversations/runtime_payloads.py +42 -0
  66. ksadk/conversations/runtime_preparation.py +272 -2
  67. ksadk/conversations/runtime_resume.py +20 -1
  68. ksadk/conversations/runtime_stream_events.py +94 -9
  69. ksadk/conversations/semantic_summary.py +311 -1
  70. ksadk/conversations/session_lock.py +51 -0
  71. ksadk/deployment/env_forward.py +72 -0
  72. ksadk/deployment/managed_runtime.py +5 -0
  73. ksadk/deployment/providers/serverless.py +143 -69
  74. ksadk/evaluation/__init__.py +32 -0
  75. ksadk/evaluation/a2a_adapter.py +9 -1
  76. ksadk/evaluation/adapters.py +18 -5
  77. ksadk/evaluation/agent_eval_client.py +395 -0
  78. ksadk/evaluation/cloud_binding.py +80 -0
  79. ksadk/evaluation/cloud_converter.py +194 -0
  80. ksadk/evaluation/cloud_service.py +199 -0
  81. ksadk/evaluation/contracts.py +73 -4
  82. ksadk/evaluation/evaluators.py +183 -17
  83. ksadk/evaluation/evidence.py +258 -0
  84. ksadk/evaluation/executor.py +31 -6
  85. ksadk/evaluation/local_adapter.py +550 -0
  86. ksadk/evaluation/service_env.py +27 -0
  87. ksadk/evaluation/studio_build_adapter.py +253 -0
  88. ksadk/evaluation/target.py +15 -6
  89. ksadk/events/__init__.py +13 -13
  90. ksadk/events/_v1_compat/__init__.py +1 -0
  91. ksadk/events/_v1_compat/models.py +299 -0
  92. ksadk/events/_v1_compat/parser.py +247 -0
  93. ksadk/events/_v1_compat/projection.py +755 -0
  94. ksadk/events/adapters/__init__.py +34 -0
  95. ksadk/events/adapters/_a2a_snapshot.py +622 -0
  96. ksadk/events/adapters/_a2a_support.py +275 -0
  97. ksadk/events/adapters/_codex_interactions.py +375 -0
  98. ksadk/events/adapters/_codex_items.py +801 -0
  99. ksadk/events/adapters/_codex_validators.py +311 -0
  100. ksadk/events/adapters/_langgraph_support.py +785 -0
  101. ksadk/events/adapters/a2a.py +841 -0
  102. ksadk/events/adapters/adk.py +503 -0
  103. ksadk/events/adapters/codex.py +907 -0
  104. ksadk/events/adapters/langgraph.py +745 -0
  105. ksadk/events/canonical.py +440 -0
  106. ksadk/events/canonical_replay.py +497 -0
  107. ksadk/events/canonical_store.py +468 -0
  108. ksadk/events/cold_recovery.py +257 -0
  109. ksadk/events/content.py +89 -0
  110. ksadk/events/identity.py +86 -0
  111. ksadk/events/pipeline.py +455 -0
  112. ksadk/events/projections.py +66 -0
  113. ksadk/events/reducer.py +661 -0
  114. ksadk/events/replay.py +3 -36
  115. ksadk/events/runtime_event.py +20 -265
  116. ksadk/events/session_event.py +324 -0
  117. ksadk/events/store.py +3 -316
  118. ksadk/events/v1_compat.py +41 -0
  119. ksadk/harness/__init__.py +45 -35
  120. ksadk/harness/runtime.py +220 -58
  121. ksadk/identity/resolver.py +4 -3
  122. ksadk/interaction/__init__.py +28 -0
  123. ksadk/interaction/contracts.py +136 -0
  124. ksadk/interaction/ledger.py +189 -0
  125. ksadk/interaction/provider.py +122 -0
  126. ksadk/interaction/providers/__init__.py +52 -0
  127. ksadk/interaction/providers/adk.py +40 -0
  128. ksadk/interaction/providers/codex.py +94 -0
  129. ksadk/interaction/providers/langgraph.py +58 -0
  130. ksadk/kernel/__init__.py +117 -0
  131. ksadk/kernel/authorization.py +258 -0
  132. ksadk/kernel/bootstrap.py +1074 -0
  133. ksadk/kernel/contract_fingerprints.py +62 -0
  134. ksadk/kernel/contracts.py +370 -0
  135. ksadk/kernel/control.py +220 -0
  136. ksadk/kernel/errors.py +79 -0
  137. ksadk/kernel/ingress.py +1123 -0
  138. ksadk/kernel/mapping.py +111 -0
  139. ksadk/kernel/memory_store.py +1134 -0
  140. ksadk/kernel/postgres_store.py +1757 -0
  141. ksadk/kernel/recovery.py +452 -0
  142. ksadk/kernel/runtime_identity.py +103 -0
  143. ksadk/kernel/sql/001_agent_kernel.sql +120 -0
  144. ksadk/kernel/sqlite_store.py +1411 -0
  145. ksadk/kernel/state.py +145 -0
  146. ksadk/kernel/store.py +232 -0
  147. ksadk/kernel/worker.py +964 -0
  148. ksadk/knowledge_base/client.py +7 -0
  149. ksadk/knowledge_base/service.py +32 -5
  150. ksadk/memory/__init__.py +61 -0
  151. ksadk/memory/adk/backends/base_ltm_backend.py +96 -1
  152. ksadk/memory/adk/backends/http_ltm_backend.py +14 -5
  153. ksadk/memory/adk/backends/inmemory_ltm_backend.py +136 -3
  154. ksadk/memory/adk/backends/sdk_ltm_backend.py +384 -2
  155. ksadk/memory/adk/backends/sqlite_ltm_backend.py +95 -0
  156. ksadk/memory/coordinator.py +461 -0
  157. ksadk/memory/events.py +202 -0
  158. ksadk/memory/extraction.py +228 -0
  159. ksadk/memory/ltm_backend_factory.py +16 -3
  160. ksadk/memory/models.py +316 -0
  161. ksadk/memory/policy.py +215 -0
  162. ksadk/memory/provider.py +47 -0
  163. ksadk/memory/provider_adapter.py +159 -0
  164. ksadk/memory/provider_resolver.py +71 -0
  165. ksadk/memory/providers/__init__.py +5 -0
  166. ksadk/memory/providers/local_sqlite.py +497 -0
  167. ksadk/memory/resolved_policy.py +145 -0
  168. ksadk/memory/service.py +188 -6
  169. ksadk/model_proxy/bootstrap.py +16 -9
  170. ksadk/model_proxy/detect.py +202 -9
  171. ksadk/model_proxy/namespace.py +39 -15
  172. ksadk/model_proxy/server.py +24 -5
  173. ksadk/model_proxy/transform.py +60 -2
  174. ksadk/observability/__init__.py +25 -0
  175. ksadk/observability/session_log.py +420 -0
  176. ksadk/observability/trajectory.py +105 -0
  177. ksadk/plugins/__init__.py +167 -0
  178. ksadk/plugins/bridges/__init__.py +45 -0
  179. ksadk/plugins/bridges/codex.py +552 -0
  180. ksadk/plugins/bridges/dsh.py +1116 -0
  181. ksadk/plugins/builtins.py +747 -0
  182. ksadk/plugins/bundle.py +246 -0
  183. ksadk/plugins/bundle_security.py +167 -0
  184. ksadk/plugins/composition.py +529 -0
  185. ksadk/plugins/context_contributor.py +437 -0
  186. ksadk/plugins/contracts.py +451 -0
  187. ksadk/plugins/dsh_toolchain.py +935 -0
  188. ksadk/plugins/ecosystem_bridge.py +1105 -0
  189. ksadk/plugins/ecosystem_probe.py +191 -0
  190. ksadk/plugins/host.py +724 -0
  191. ksadk/plugins/providers/__init__.py +85 -0
  192. ksadk/plugins/providers/bundles/ksadk-codex/cordis.patch.yml +3 -0
  193. ksadk/plugins/providers/bundles/ksadk-codex/index.mjs +18 -0
  194. ksadk/plugins/providers/bundles/ksadk-codex/package.json +19 -0
  195. ksadk/plugins/providers/bundles/ksadk-harness/cordis.patch.yml +3 -0
  196. ksadk/plugins/providers/bundles/ksadk-harness/index.mjs +19 -0
  197. ksadk/plugins/providers/bundles/ksadk-harness/package.json +19 -0
  198. ksadk/plugins/providers/codex.py +722 -0
  199. ksadk/plugins/providers/codex_dsh.py +83 -0
  200. ksadk/plugins/providers/dsh.py +951 -0
  201. ksadk/plugins/providers/dsh_descriptor_host.py +226 -0
  202. ksadk/plugins/providers/harness.py +627 -0
  203. ksadk/plugins/providers/harness_dsh.py +91 -0
  204. ksadk/plugins/providers/legacy.py +215 -0
  205. ksadk/plugins/providers/legacy_catalog.py +100 -0
  206. ksadk/plugins/providers/shipped_dsh.py +370 -0
  207. ksadk/plugins/resolver.py +331 -0
  208. ksadk/plugins/subagent_providers/__init__.py +12 -0
  209. ksadk/plugins/subagent_providers/codex.py +443 -0
  210. ksadk/plugins/subagents.py +333 -0
  211. ksadk/prompts/__init__.py +71 -0
  212. ksadk/prompts/compiler.py +215 -0
  213. ksadk/prompts/models.py +82 -0
  214. ksadk/prompts/projection.py +89 -0
  215. ksadk/prompts/resolved.py +137 -0
  216. ksadk/prompts/sources.py +233 -0
  217. ksadk/runners/_langgraph_runner_streams.py +822 -0
  218. ksadk/runners/adk_runner.py +5 -5
  219. ksadk/runners/base_runner.py +16 -0
  220. ksadk/runners/factory.py +1 -2
  221. ksadk/runners/langgraph_runner.py +198 -437
  222. ksadk/runtime/_runner_adapter/__init__.py +1 -0
  223. ksadk/runtime/_runner_adapter/stream_mapping.py +797 -0
  224. ksadk/runtime/adapter.py +119 -2
  225. ksadk/runtime/conversation_execution.py +316 -182
  226. ksadk/runtime/executor.py +144 -3
  227. ksadk/runtime/factory.py +268 -8
  228. ksadk/runtime/framework_adapters.py +18 -0
  229. ksadk/runtime/hosted_finalizer.py +268 -0
  230. ksadk/runtime/launch.py +14 -1
  231. ksadk/runtime/preprocessing.py +25 -3
  232. ksadk/runtime/runner_adapter.py +293 -508
  233. ksadk/runtime/usage.py +33 -0
  234. ksadk/sandbox/__init__.py +2 -1
  235. ksadk/sandbox/backends/e2b.py +35 -2
  236. ksadk/sandbox/factory.py +72 -0
  237. ksadk/scheduler/__init__.py +18 -0
  238. ksadk/scheduler/calendar.py +102 -0
  239. ksadk/scheduler/contracts.py +254 -0
  240. ksadk/scheduler/dispatcher.py +129 -0
  241. ksadk/scheduler/engine.py +416 -0
  242. ksadk/scheduler/sqlite_store.py +563 -0
  243. ksadk/server/composition.py +8 -0
  244. ksadk/server/factory.py +69 -6
  245. ksadk/server/routes/kernel_ingress.py +258 -0
  246. ksadk/server/routes/openai_compat.py +88 -8
  247. ksadk/server/routes/projection.py +35 -20
  248. ksadk/server/routes/run.py +94 -0
  249. ksadk/server/routes/sessions.py +2 -0
  250. ksadk/server/routes/streaming.py +5 -2
  251. ksadk/server/static/assets/{ArtifactsPanel-CakCqxEN.js → ArtifactsPanel-10GPXIJ6.js} +1 -1
  252. ksadk/server/static/assets/{CodeBlock-CynLknyO.js → CodeBlock-BXk1l-G1.js} +4 -4
  253. ksadk/server/static/assets/MathMessageMarkdown-BorAY7qD.css +1 -0
  254. ksadk/server/static/assets/{MathMessageMarkdown-3sQdOysS.js → MathMessageMarkdown-D9uB55Oh.js} +4 -4
  255. ksadk/server/static/assets/MermaidBlock--OEYoXIJ.js +312 -0
  256. ksadk/server/static/assets/NativeTerminalPanel-DrEe1syq.js +1 -0
  257. ksadk/server/static/assets/abnfDiagram-VCTEODGH-eeTFJLvo.js +1 -0
  258. ksadk/server/static/assets/arc-S3ZNbIAd.js +1 -0
  259. ksadk/server/static/assets/architecture-7GRP2DOG-Dk9nRQ6-.js +1 -0
  260. ksadk/server/static/assets/architectureDiagram-5GKGNRK7-CRjgEJDX.js +36 -0
  261. ksadk/server/static/assets/blockDiagram-NRAW4CY4-C7bsBoNH.js +129 -0
  262. ksadk/server/static/assets/c4Diagram-UCG6FXSJ-BX3c33Ob.js +38 -0
  263. ksadk/server/static/assets/channel-s354Yo6o.js +1 -0
  264. ksadk/server/static/assets/chunk-2Q5K7J3B-CDpPpKR5.js +1 -0
  265. ksadk/server/static/assets/{chunk-FMBD7UC4-B_fH2YuH.js → chunk-5VM5RSS4-bZ7ws-8m.js} +1 -1
  266. ksadk/server/static/assets/{chunk-ND2GUHAM-D6rFLaVV.js → chunk-F27PBJKO-D2r0pvhY.js} +1 -1
  267. ksadk/server/static/assets/chunk-G27WJ6UU-CZwF3oUP.js +231 -0
  268. ksadk/server/static/assets/{chunk-4BX2VUAB-B9drTgOW.js → chunk-JWPE2WC7-DigFYCML.js} +1 -1
  269. ksadk/server/static/assets/chunk-LCL6LL3I-CnorGV5q.js +206 -0
  270. ksadk/server/static/assets/chunk-POPQ4Y6H-CexntQA-.js +1 -0
  271. ksadk/server/static/assets/chunk-RHFEMEQ7-CHTC7UxA.js +168 -0
  272. ksadk/server/static/assets/chunk-SVP7TREG-BC1EWt_-.js +88 -0
  273. ksadk/server/static/assets/chunk-XXDRQBXY-BTG24xN0.js +1 -0
  274. ksadk/server/static/assets/classDiagram-DTDB5LWJ-Dd0nucl9.js +1 -0
  275. ksadk/server/static/assets/classDiagram-v2-JRS7N3AN-Dd0nucl9.js +1 -0
  276. ksadk/server/static/assets/{cose-bilkent-S5V4N54A-ChNs_Mdk.js → cose-bilkent-JH36ORCC-CkonRdAS.js} +1 -1
  277. ksadk/server/static/assets/cynefin-OW5HDTMX-BBlT4uMf.js +1 -0
  278. ksadk/server/static/assets/cynefinDiagram-5FMLGOSQ-DEOCBe15.js +62 -0
  279. ksadk/server/static/assets/cytoscape.esm-CyCl8rPi.js +321 -0
  280. ksadk/server/static/assets/dagre-3AP2YEHR-DBThPuLa.js +4 -0
  281. ksadk/server/static/assets/dagre-ClTPrTht.js +1 -0
  282. ksadk/server/static/assets/diagram-S7CK7UJ4-DsZHrnpJ.js +30 -0
  283. ksadk/server/static/assets/diagram-UQ7AKVKN-BJR4nhVr.js +41 -0
  284. ksadk/server/static/assets/diagram-VSXAHHWV-xzcERX0a.js +3 -0
  285. ksadk/server/static/assets/diagram-VX7I27RA-tn2xM1xu.js +24 -0
  286. ksadk/server/static/assets/diagram-Z3DM3KII-BZPGBkw5.js +24 -0
  287. ksadk/server/static/assets/{dist-gLnrGsoU.js → dist-4zN1_tq5.js} +1 -1
  288. ksadk/server/static/assets/{dist-C1sz5Eo3.js → dist-8VWI-2bZ.js} +1 -1
  289. ksadk/server/static/assets/{dist-BjOdlDjj.js → dist-B-46q3Hk.js} +1 -1
  290. ksadk/server/static/assets/{dist-o2OVmKvt.js → dist-B0gdk4rl.js} +1 -1
  291. ksadk/server/static/assets/{dist-4N2NMVYg.js → dist-B1oWRmrH.js} +1 -1
  292. ksadk/server/static/assets/{dist-CmZHzlwZ.js → dist-BI1qQH4n.js} +1 -1
  293. ksadk/server/static/assets/{dist-X4TnqwOK.js → dist-BJLUwH6W.js} +1 -1
  294. ksadk/server/static/assets/{dist-B5oS1zcj.js → dist-Bbwqa8TG.js} +1 -1
  295. ksadk/server/static/assets/{dist-j6Dxmf_j.js → dist-Btyo4vX4.js} +1 -1
  296. ksadk/server/static/assets/{dist-DQU9EWw-.js → dist-C71CsujO.js} +1 -1
  297. ksadk/server/static/assets/{dist-BIlKoW0k.js → dist-CXpH_Rdd.js} +1 -1
  298. ksadk/server/static/assets/{dist-DJN_6Y39.js → dist-Cq4OL6nO.js} +1 -1
  299. ksadk/server/static/assets/{dist-Dli7qW-B.js → dist-D1V3f1B4.js} +1 -1
  300. ksadk/server/static/assets/{dist-fhOuWds5.js → dist-DJmCPRVB.js} +1 -1
  301. ksadk/server/static/assets/{dist-CWV4lDr1.js → dist-DQAB0qn_.js} +2 -2
  302. ksadk/server/static/assets/{dist-D6MpCZtz.js → dist-DUwKa_l6.js} +1 -1
  303. ksadk/server/static/assets/dist-DdRBIceA.js +1 -0
  304. ksadk/server/static/assets/{dist-DWKByxWV.js → dist-DfGFrb0v.js} +1 -1
  305. ksadk/server/static/assets/{dist-DsHPdk3W.js → dist-DjhwGUgZ.js} +1 -1
  306. ksadk/server/static/assets/{dist-B-jNR6Vn.js → dist-DyqV4fL4.js} +1 -1
  307. ksadk/server/static/assets/{dist-BB3-OwTQ.js → dist-M67Hwu0n.js} +1 -1
  308. ksadk/server/static/assets/{dist-_pHPTyZ-.js → dist-u8tVH5Ak.js} +1 -1
  309. ksadk/server/static/assets/ebnfDiagram-PWID7BFC-DVfMsLge.js +1 -0
  310. ksadk/server/static/assets/erDiagram-SSCWMZ5O-CWEZSYaw.js +99 -0
  311. ksadk/server/static/assets/eventmodeling-NTZA5JFV-Dr5okd8V.js +1 -0
  312. ksadk/server/static/assets/flowDiagram-A5DVABFB-VEO-cVcO.js +1 -0
  313. ksadk/server/static/assets/ganttDiagram-EL5Y4UJY-TWIxoyYL.js +292 -0
  314. ksadk/server/static/assets/gitGraph-4MIJSDKK-CKiKY9Cf.js +1 -0
  315. ksadk/server/static/assets/gitGraphDiagram-WWUBYQGX-DDh2hd2S.js +106 -0
  316. ksadk/server/static/assets/index-B2k_urY8.js +241 -0
  317. ksadk/server/static/assets/index-ILPt6IWF.css +2 -0
  318. ksadk/server/static/assets/info-A6RAGUB7-ubA4Nm_p.js +1 -0
  319. ksadk/server/static/assets/infoDiagram-RXCK75RN-CgoyWiDR.js +2 -0
  320. ksadk/server/static/assets/{ishikawaDiagram-YF4QCWOH-K0OOfVna.js → ishikawaDiagram-5VMMS53U-CyRIu_om.js} +6 -6
  321. ksadk/server/static/assets/{journeyDiagram-JHISSGLW-8LeOJaZp.js → journeyDiagram-EYS64GPL-DN5JXHzN.js} +6 -6
  322. ksadk/server/static/assets/{kanban-definition-UN3LZRKU-C6uCgZrW.js → kanban-definition-3QL26DDD-CNP3ui66.js} +10 -10
  323. ksadk/server/static/assets/katex-DWEzQy1d.js +257 -0
  324. ksadk/server/static/assets/{linear-hdBcYzM8.js → linear-C-qHp7d2.js} +1 -1
  325. ksadk/server/static/assets/mermaid-parser.core-Cl-K943T.js +166 -0
  326. ksadk/server/static/assets/{mindmap-definition-RKZ34NQL-Bjy_2v4_.js → mindmap-definition-FBJOCRG2-D5DB5mYm.js} +29 -29
  327. ksadk/server/static/assets/packet-AYTQ26CC-C7R3NUlK.js +1 -0
  328. ksadk/server/static/assets/pegDiagram-XKGWAZYB-BQVc9ia_.js +1 -0
  329. ksadk/server/static/assets/pie-WAS4IAKB-BIT6qjr3.js +1 -0
  330. ksadk/server/static/assets/pieDiagram-E7YTZNPT-B6UCAvtY.js +39 -0
  331. ksadk/server/static/assets/{quadrantDiagram-W4KKPZXB-BmkRbwCg.js → quadrantDiagram-AXDQQJYC-mIr2d3eb.js} +6 -6
  332. ksadk/server/static/assets/radar-RG4KPBEZ-l5noef9X.js +1 -0
  333. ksadk/server/static/assets/railroad-74A4TZTK-Baea6ZvM.js +1 -0
  334. ksadk/server/static/assets/railroad-abnf-HS5TGJTU-OKn8zZnU.js +1 -0
  335. ksadk/server/static/assets/railroad-ebnf-LZEXJU2U-DdKAKC4l.js +1 -0
  336. ksadk/server/static/assets/railroad-peg-WCYAUIDC-Bds8udlG.js +1 -0
  337. ksadk/server/static/assets/railroadDiagram-O6MQD6OU-Dt3FFDmK.js +1 -0
  338. ksadk/server/static/assets/requirementDiagram-EFPCY7ZU-Cz_vQtgF.js +84 -0
  339. ksadk/server/static/assets/{sankeyDiagram-5OEKKPKP-l6iXmU65.js → sankeyDiagram-P5KCCOFB-wlO1TsH5.js} +7 -7
  340. ksadk/server/static/assets/{sequenceDiagram-3UESZ5HK-Cq6UBeQB.js → sequenceDiagram-WJ2MYXX4-CHRbElYq.js} +10 -10
  341. ksadk/server/static/assets/sizeCapture-X5ZJPWSS-DXX54iyO.js +1 -0
  342. ksadk/server/static/assets/stateDiagram-HBIQ2CUA-Dp_lw9II.js +1 -0
  343. ksadk/server/static/assets/stateDiagram-v2-4QOOHH4V-5b-8o2iS.js +1 -0
  344. ksadk/server/static/assets/swimlanes-XN3QIQJK-D8O5UlLG.js +1 -0
  345. ksadk/server/static/assets/swimlanesDiagram-VK2B7HYN-uf6WPRA4.js +8 -0
  346. ksadk/server/static/assets/{timeline-definition-PNZ67QCA-DEz24vV0.js → timeline-definition-24CTP7MA-8mfKcxvG.js} +7 -7
  347. ksadk/server/static/assets/treeView-Q6P3EWNA-CK5CSrSO.js +1 -0
  348. ksadk/server/static/assets/treemap-WGGIJYW6-Ch2BKgAM.js +1 -0
  349. ksadk/server/static/assets/vennDiagram-4TSXK5OY-EnNl0DE7.js +34 -0
  350. ksadk/server/static/assets/wardley-WFR3VGLG-YW3Q0ml_.js +1 -0
  351. ksadk/server/static/assets/wardleyDiagram-VM6X3IG4-DBu5fbYr.js +78 -0
  352. ksadk/server/static/assets/xychartDiagram-S5SC5T6Z-BSVXs4IY.js +7 -0
  353. ksadk/server/static/index.html +2 -2
  354. ksadk/sessions/__init__.py +26 -9
  355. ksadk/sessions/_local_service_sync.py +688 -0
  356. ksadk/sessions/_local_tables.py +21 -0
  357. ksadk/sessions/_postgres_schema.py +305 -0
  358. ksadk/sessions/_postgres_tables.py +15 -0
  359. ksadk/sessions/base.py +80 -1
  360. ksadk/sessions/in_memory.py +53 -2
  361. ksadk/sessions/local_service.py +63 -604
  362. ksadk/sessions/postgres_service.py +58 -148
  363. ksadk/sessions/resilient.py +35 -1
  364. ksadk/skills/service_client.py +48 -0
  365. ksadk/studio/agent_lifecycle.py +26 -20
  366. ksadk/studio/api.py +1063 -69
  367. ksadk/studio/api_catalog_routes.py +5 -0
  368. ksadk/studio/api_contracts.py +148 -6
  369. ksadk/studio/api_memory_routes.py +82 -0
  370. ksadk/studio/api_plugin_routes.py +480 -0
  371. ksadk/studio/attachment_store.py +187 -0
  372. ksadk/studio/authoring.py +259 -28
  373. ksadk/studio/authoring_coordinator.py +809 -67
  374. ksadk/studio/builder.py +197 -40
  375. ksadk/studio/capabilities.py +17 -0
  376. ksadk/studio/cloud.py +1920 -95
  377. ksadk/studio/codex_agent_service.py +137 -15
  378. ksadk/studio/codex_authoring.py +469 -0
  379. ksadk/studio/codex_builder.py +177 -25
  380. ksadk/studio/codex_manifest.py +71 -22
  381. ksadk/studio/codex_run.py +59 -4
  382. ksadk/studio/compatibility_report.py +445 -0
  383. ksadk/studio/compiler.py +7 -1
  384. ksadk/studio/contracts.py +234 -4
  385. ksadk/studio/dsh_provider_registration.py +768 -0
  386. ksadk/studio/event_store.py +79 -101
  387. ksadk/studio/framework_run.py +264 -3
  388. ksadk/studio/hosted_kernel.py +317 -0
  389. ksadk/studio/manifest_resolver.py +131 -0
  390. ksadk/studio/model_client.py +95 -9
  391. ksadk/studio/model_profile_service.py +1 -1
  392. ksadk/studio/operations.py +47 -5
  393. ksadk/studio/otel_trace.py +348 -42
  394. ksadk/studio/pcm_memory.py +85 -0
  395. ksadk/studio/plugin_composition.py +301 -0
  396. ksadk/studio/plugin_kernel_adapter.py +128 -0
  397. ksadk/studio/plugin_runtime.py +652 -0
  398. ksadk/studio/repository.py +23 -2
  399. ksadk/studio/resource_catalog.py +49 -1
  400. ksadk/studio/run_service.py +1266 -202
  401. ksadk/studio/runtime_source.py +51 -17
  402. ksadk/studio/scheduler_runtime.py +374 -0
  403. ksadk/studio/scheduler_service.py +211 -0
  404. ksadk/studio/service.py +1815 -117
  405. ksadk/studio/shared_web.py +199 -50
  406. ksadk/studio/soul.py +52 -0
  407. ksadk/studio/static/assets/index-DXs1Eq4M.css +1 -0
  408. ksadk/studio/static/assets/index-DeDqwTsD.js +283 -0
  409. ksadk/studio/static/index.html +2 -2
  410. ksadk/studio/templates.py +100 -8
  411. ksadk/studio/validator.py +20 -1
  412. ksadk/studio/workspace.py +31 -32
  413. ksadk/tracing/setup.py +304 -3
  414. ksadk/version.py +1 -1
  415. ksadk_runtime_common/schemas/runtime_event_v1.json +37 -0
  416. ksadk_runtime_common/schemas/runtime_event_v2.json +271 -0
  417. ksadk_runtime_common/workspace_files/path_utils.py +41 -0
  418. ksadk/events/parser.py +0 -191
  419. ksadk/server/static/assets/MathMessageMarkdown-DeYh8QPr.css +0 -1
  420. ksadk/server/static/assets/MermaidBlock-NERD_ef7.js +0 -303
  421. ksadk/server/static/assets/NativeTerminalPanel-CiHWf82q.js +0 -1
  422. ksadk/server/static/assets/arc-DrgjcKhl.js +0 -1
  423. ksadk/server/static/assets/architecture-7EHR7CIX-CpZLRCcY.js +0 -1
  424. ksadk/server/static/assets/architectureDiagram-3BPJPVTR-BXoVRbQ6.js +0 -36
  425. ksadk/server/static/assets/blockDiagram-GPEHLZMM-BnaB3Ywv.js +0 -132
  426. ksadk/server/static/assets/c4Diagram-AAUBKEIU-Dw4weZcp.js +0 -10
  427. ksadk/server/static/assets/channel-Dt3rQTFI.js +0 -1
  428. ksadk/server/static/assets/chunk-2J33WTMH-ChjpLK7j.js +0 -1
  429. ksadk/server/static/assets/chunk-55IACEB6-CK4ROATy.js +0 -1
  430. ksadk/server/static/assets/chunk-727SXJPM-B9KtTTgw.js +0 -206
  431. ksadk/server/static/assets/chunk-AQP2D5EJ-1O1mki3m.js +0 -231
  432. ksadk/server/static/assets/chunk-QZHKN3VN-iXEZtKQc.js +0 -1
  433. ksadk/server/static/assets/classDiagram-4FO5ZUOK-DIveV17Q.js +0 -1
  434. ksadk/server/static/assets/classDiagram-v2-Q7XG4LA2-DIveV17Q.js +0 -1
  435. ksadk/server/static/assets/cytoscape.esm-DelgaX4f.js +0 -321
  436. ksadk/server/static/assets/dagre-BM42HDAG-D0QXg_MQ.js +0 -4
  437. ksadk/server/static/assets/dagre-Bx709z4p.js +0 -1
  438. ksadk/server/static/assets/diagram-2AECGRRQ-DBDDKwBQ.js +0 -43
  439. ksadk/server/static/assets/diagram-5GNKFQAL-BkwDOxmO.js +0 -10
  440. ksadk/server/static/assets/diagram-KO2AKTUF-Bv8waYvY.js +0 -3
  441. ksadk/server/static/assets/diagram-LMA3HP47-e1VECDdu.js +0 -24
  442. ksadk/server/static/assets/diagram-OG6HWLK6-Ds9adfRl.js +0 -24
  443. ksadk/server/static/assets/dist-B5J2uhNk.js +0 -1
  444. ksadk/server/static/assets/erDiagram-TEJ5UH35-BPItFKH6.js +0 -85
  445. ksadk/server/static/assets/eventmodeling-FCH6USID-DYFSxbqr.js +0 -1
  446. ksadk/server/static/assets/flowDiagram-I6XJVG4X-BbYB9w5Y.js +0 -162
  447. ksadk/server/static/assets/ganttDiagram-6RSMTGT7-TQXa0KXv.js +0 -292
  448. ksadk/server/static/assets/gitGraph-WXDBUCRP-DyNYp6BN.js +0 -1
  449. ksadk/server/static/assets/gitGraphDiagram-PVQCEYII-bKblCnpa.js +0 -106
  450. ksadk/server/static/assets/graphlib-B8gBHxth.js +0 -1
  451. ksadk/server/static/assets/index-R52pJJvg.js +0 -177
  452. ksadk/server/static/assets/index-jJr3_955.css +0 -2
  453. ksadk/server/static/assets/info-J43DQDTF-WUx7qTde.js +0 -1
  454. ksadk/server/static/assets/infoDiagram-5YYISTIA-BGVT7J_i.js +0 -2
  455. ksadk/server/static/assets/katex-CYWseY5E.js +0 -265
  456. ksadk/server/static/assets/mermaid-parser.core-BWrDjSZM.js +0 -161
  457. ksadk/server/static/assets/packet-YPE3B663-BN13y_xl.js +0 -1
  458. ksadk/server/static/assets/pie-LRSECV5Y-ftSLXhhc.js +0 -1
  459. ksadk/server/static/assets/pieDiagram-4H26LBE5-GmmqNiVH.js +0 -30
  460. ksadk/server/static/assets/radar-GUYGQ44K-jaICkIeO.js +0 -1
  461. ksadk/server/static/assets/requirementDiagram-4Y6WPE33-DSWFqL7c.js +0 -84
  462. ksadk/server/static/assets/stateDiagram-AJRCARHV-qzTQpg3Y.js +0 -1
  463. ksadk/server/static/assets/stateDiagram-v2-BHNVJYJU-BYCoYGAN.js +0 -1
  464. ksadk/server/static/assets/treeView-BLDUP644-Cpib_vlz.js +0 -1
  465. ksadk/server/static/assets/treemap-LRROVOQU-DQxfmVHK.js +0 -1
  466. ksadk/server/static/assets/vennDiagram-CIIHVFJN-CMCixki2.js +0 -34
  467. ksadk/server/static/assets/wardley-L42UT6IY-BQYHnnkU.js +0 -1
  468. ksadk/server/static/assets/wardleyDiagram-YWT4CUSO-CVzB8F9K.js +0 -78
  469. ksadk/server/static/assets/xychartDiagram-2RQKCTM6-BFBqBLc1.js +0 -7
  470. ksadk/studio/evaluation.py +0 -192
  471. ksadk/studio/static/assets/index-CaEN0eTR.css +0 -1
  472. ksadk/studio/static/assets/index-DI2eY_NH.js +0 -252
  473. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/WHEEL +0 -0
  474. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/entry_points.txt +0 -0
  475. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/licenses/LICENSE +0 -0
  476. {agentengine_sdk_python-0.8.1.dist-info → agentengine_sdk_python-0.8.3.dist-info}/top_level.txt +0 -0
ksadk/cli/cmd_openclaw.py CHANGED
@@ -81,7 +81,7 @@ from ksadk.cli.ui import (
81
81
  from ksadk.configs.env_registry import is_sensitive_env_var
82
82
  from ksadk.conversations.model_context import normalize_model_metadata
83
83
  from ksadk.deployment.agent_access import get_latest_agent_access
84
- from ksadk.model_policy import build_runtime_model_policy_env
84
+ from ksadk.cli.openclaw_env import _build_openclaw_env_vars, _normalize_openclaw_gateway_auth_env
85
85
  from ksadk.openclaw_gateway import (
86
86
  OpenClawGatewayClient,
87
87
  OpenClawGatewayError,
@@ -97,15 +97,6 @@ DEFAULT_OPENCLAW_REPO = "openclaw"
97
97
  DEFAULT_OPENCLAW_VERSION = "2026.6.1"
98
98
  DEFAULT_OPENCLAW_REGISTRY = "ghcr.io/kingsoftcloud"
99
99
  DEFAULT_OPENCLAW_NAME = "openclaw-gateway"
100
- DEFAULT_TRUSTED_PROXY_USER_HEADER = "x-forwarded-user"
101
- DEFAULT_TRUSTED_PROXY_CIDRS = [
102
- "127.0.0.1",
103
- "::1",
104
- "10.0.0.0/8",
105
- "172.16.0.0/12",
106
- "192.168.0.0/16",
107
- "35.0.0.0/8",
108
- ]
109
100
  _GLOBAL_ENV_CACHE: Optional[Dict[str, str]] = None
110
101
  OPENCLAW_SECURITY_PROFILES = ("relaxed", "strict", "strictest")
111
102
  OPENCLAW_CHANNELS = ("weixin", "feishu", "wps-xiezuo")
@@ -386,33 +377,6 @@ def _openclaw_registry_env() -> dict[str, str]:
386
377
  return env
387
378
 
388
379
 
389
- def _resolve_model_base_url(cli_value: Optional[str]) -> Optional[str]:
390
- """解析模型 Base URL,缺失时回退到 settings.model.api_base(KSPMAS 自动探测)。"""
391
- if cli_value and str(cli_value).strip():
392
- return str(cli_value).strip()
393
-
394
- from_env = _resolve_env(
395
- "OPENCLAW_MODEL_BASE_URL",
396
- "OPENAI_BASE_URL",
397
- "OPENAI_API_BASE",
398
- "LLM_API_BASE",
399
- "MODEL_API_BASE",
400
- )
401
- if from_env:
402
- return from_env
403
-
404
- try:
405
- from ksadk.configs.settings import settings
406
-
407
- api_base = settings.model.api_base
408
- if api_base and str(api_base).strip():
409
- return str(api_base).strip()
410
- except Exception:
411
- pass
412
-
413
- return None
414
-
415
-
416
380
  def _summarize_openclaw_account(agents: list[Dict[str, Any]]) -> str:
417
381
  """汇总列表所属账号,优先使用响应字段,缺失时回退当前 CLI 上下文。"""
418
382
  accounts = sorted(
@@ -455,88 +419,6 @@ def _print_openclaw_list_summary(table: RichTable, summary_text: str) -> None:
455
419
  console.print(f"[muted]{summary_text}[/]")
456
420
 
457
421
 
458
- def _normalize_ui_locale(raw: Optional[str]) -> str:
459
- """标准化 UI 语言代码,默认 zh-CN。"""
460
- text = str(raw or "").strip()
461
- if not text:
462
- return "zh-CN"
463
-
464
- base = text.split(".", 1)[0].replace("_", "-").strip()
465
- low = base.lower()
466
-
467
- if low in {"c", "c-utf-8", "c.utf-8", "posix"}:
468
- return "zh-CN"
469
- if (
470
- low.startswith("zh-tw")
471
- or low.startswith("zh-hk")
472
- or low.startswith("zh-mo")
473
- or low.startswith("zh-hant")
474
- ):
475
- return "zh-TW"
476
- if low.startswith("zh"):
477
- return "zh-CN"
478
- if low.startswith("pt"):
479
- return "pt-BR"
480
- if low.startswith("de"):
481
- return "de"
482
- if low.startswith("en"):
483
- return "en"
484
-
485
- return "zh-CN"
486
-
487
-
488
- def _is_truthy(raw: Optional[str]) -> bool:
489
- text = str(raw or "").strip().lower()
490
- return text in {"1", "true", "yes", "on"}
491
-
492
-
493
- def _resolve_exec_profile_overrides(security_profile: Optional[str]) -> Dict[str, str]:
494
- """根据 CLI 安全预设返回 OpenClaw 运行时环境变量覆盖项。"""
495
- profile = str(security_profile or "").strip().lower()
496
- if not profile:
497
- return {}
498
-
499
- common = {
500
- "OPENCLAW_EXEC_HOST": "gateway",
501
- "OPENCLAW_EXEC_AUTO_ALLOW_SKILLS": "false",
502
- "OPENCLAW_ELEVATED_ENABLED": "false",
503
- }
504
- if profile == "relaxed":
505
- return {
506
- **common,
507
- "OPENCLAW_EXEC_STRICT_MODE": "false",
508
- "OPENCLAW_EXEC_UNSAFE_MODE": "true",
509
- "OPENCLAW_EXEC_SECURITY": "full",
510
- "OPENCLAW_EXEC_ASK": "off",
511
- "OPENCLAW_EXEC_ASK_FALLBACK": "full",
512
- "OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED": "false",
513
- "OPENCLAW_FS_WORKSPACE_ONLY": "false",
514
- }
515
- if profile == "strict":
516
- return {
517
- **common,
518
- "OPENCLAW_EXEC_STRICT_MODE": "true",
519
- "OPENCLAW_EXEC_UNSAFE_MODE": "false",
520
- "OPENCLAW_EXEC_SECURITY": "allowlist",
521
- "OPENCLAW_EXEC_ASK": "off",
522
- "OPENCLAW_EXEC_ASK_FALLBACK": "allowlist",
523
- "OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED": "true",
524
- "OPENCLAW_FS_WORKSPACE_ONLY": "false",
525
- }
526
- if profile == "strictest":
527
- return {
528
- **common,
529
- "OPENCLAW_EXEC_STRICT_MODE": "true",
530
- "OPENCLAW_EXEC_UNSAFE_MODE": "false",
531
- "OPENCLAW_EXEC_SECURITY": "deny",
532
- "OPENCLAW_EXEC_ASK": "off",
533
- "OPENCLAW_EXEC_ASK_FALLBACK": "deny",
534
- "OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED": "false",
535
- "OPENCLAW_FS_WORKSPACE_ONLY": "true",
536
- }
537
- raise ValueError(f"unsupported OpenClaw security profile: {security_profile}")
538
-
539
-
540
422
  def _strip_provider_prefix(provider_id: str, model_id: str) -> str:
541
423
  provider = str(provider_id or "").strip()
542
424
  model = str(model_id or "").strip()
@@ -739,322 +621,6 @@ def _filter_openclaw_provider_catalog(
739
621
  return selected
740
622
 
741
623
 
742
- def _build_openclaw_env_vars(
743
- *,
744
- model_base_url: Optional[str] = None,
745
- model_api_key: Optional[str] = None,
746
- default_model: Optional[str] = None,
747
- model_provider_id: Optional[str] = None,
748
- gateway_port: Optional[str] = None,
749
- public_port: Optional[str] = None,
750
- security_profile: Optional[str] = None,
751
- ) -> dict:
752
- """构建 OpenClaw 所需的环境变量,自动复用 OPENAI_* 环境变量"""
753
- env = {}
754
- default_provider_id = "ksyun"
755
- default_model_api = "openai-completions"
756
- default_model_base_url = "https://kspmas.ksyun.com/v1"
757
- exec_profile_overrides = _resolve_exec_profile_overrides(security_profile)
758
-
759
- # 模型配置:客户端只透传用户显式配置和可选的 API Key;
760
- # 其余默认值交给镜像 bootstrap 兜底,避免创建请求把服务端默认行为短路掉。
761
- openclaw_explicit_model = default_model or _resolve_env("OPENCLAW_DEFAULT_MODEL")
762
- generic_model_preference = _resolve_env("OPENAI_MODEL_NAME", "MODEL_NAME", "LLM_MODEL")
763
- model_preference = openclaw_explicit_model or generic_model_preference
764
- explicit_base_url = model_base_url or _resolve_env(
765
- "OPENCLAW_MODEL_BASE_URL", "OPENAI_BASE_URL", "OPENAI_API_BASE"
766
- )
767
- base_url = _resolve_model_base_url(explicit_base_url)
768
- api_key = model_api_key or _resolve_env(
769
- "OPENCLAW_MODEL_API_KEY", "OPENAI_API_KEY", "LLM_API_KEY", "MODEL_API_KEY"
770
- )
771
- model = model_preference or "glm-5.2"
772
- explicit_provider_id = model_provider_id or _resolve_env("OPENCLAW_MODEL_PROVIDER_ID")
773
- inferred_provider_id = explicit_provider_id
774
- if not inferred_provider_id and model and "/" in model:
775
- inferred_provider_id = model.split("/", 1)[0].strip()
776
- provider_id = inferred_provider_id or default_provider_id
777
- resolved_gateway_port = gateway_port or _resolve_env("OPENCLAW_GATEWAY_PORT", "PORT") or "8080"
778
- resolved_public_port = public_port or _resolve_env("OPENCLAW_PUBLIC_PORT") or "80"
779
- explicit_model_api = _resolve_env("OPENCLAW_MODEL_API")
780
- model_api = explicit_model_api or default_model_api
781
- trusted_proxy_user_header = (
782
- (
783
- _resolve_env(
784
- "OPENCLAW_TRUSTED_PROXY_USER_HEADER",
785
- "OPENCLAW_GATEWAY_TRUSTED_PROXY_USER_HEADER",
786
- )
787
- or DEFAULT_TRUSTED_PROXY_USER_HEADER
788
- )
789
- .strip()
790
- .lower()
791
- )
792
- internal_trusted_proxy_user = (
793
- _resolve_env("OPENCLAW_INTERNAL_TRUSTED_PROXY_USER") or "openclaw-backend"
794
- )
795
- internal_trusted_proxy_user_header = (
796
- (
797
- _resolve_env("OPENCLAW_INTERNAL_TRUSTED_PROXY_USER_HEADER")
798
- or trusted_proxy_user_header
799
- or DEFAULT_TRUSTED_PROXY_USER_HEADER
800
- )
801
- .strip()
802
- .lower()
803
- )
804
- trusted_proxies = _normalize_csv_list(
805
- _resolve_env("OPENCLAW_TRUSTED_PROXIES") or "",
806
- default_items=DEFAULT_TRUSTED_PROXY_CIDRS,
807
- )
808
- browser_enabled = _resolve_env("OPENCLAW_BROWSER_ENABLED")
809
- browser_no_sandbox = _resolve_env("OPENCLAW_BROWSER_NO_SANDBOX") or "true"
810
- browser_headless = _resolve_env("OPENCLAW_BROWSER_HEADLESS") or "true"
811
- browser_executable = _resolve_env(
812
- "OPENCLAW_BROWSER_EXECUTABLE_PATH", "OPENCLAW_BROWSER_EXECUTABLE"
813
- )
814
- ui_locale = _normalize_ui_locale(_resolve_env("OPENCLAW_UI_LOCALE", "LANG", "LC_ALL"))
815
- exec_strict_mode_raw = (
816
- exec_profile_overrides.get("OPENCLAW_EXEC_STRICT_MODE")
817
- or _resolve_env("OPENCLAW_EXEC_STRICT_MODE", "OPENCLAW_EXEC_SAFE_MODE")
818
- or "false"
819
- )
820
- exec_strict_mode = _is_truthy(exec_strict_mode_raw)
821
-
822
- exec_host = (
823
- exec_profile_overrides.get("OPENCLAW_EXEC_HOST")
824
- or _resolve_env("OPENCLAW_EXEC_HOST")
825
- or "gateway"
826
- )
827
- exec_security = (
828
- exec_profile_overrides.get("OPENCLAW_EXEC_SECURITY")
829
- or _resolve_env("OPENCLAW_EXEC_SECURITY")
830
- or ("allowlist" if exec_strict_mode else "full")
831
- )
832
- exec_ask = (
833
- exec_profile_overrides.get("OPENCLAW_EXEC_ASK")
834
- or _resolve_env("OPENCLAW_EXEC_ASK")
835
- or "off"
836
- )
837
- exec_ask_fallback = (
838
- exec_profile_overrides.get("OPENCLAW_EXEC_ASK_FALLBACK")
839
- or _resolve_env("OPENCLAW_EXEC_ASK_FALLBACK")
840
- or ("allowlist" if exec_strict_mode else "full")
841
- )
842
- exec_auto_allow_skills = (
843
- exec_profile_overrides.get("OPENCLAW_EXEC_AUTO_ALLOW_SKILLS")
844
- or _resolve_env("OPENCLAW_EXEC_AUTO_ALLOW_SKILLS")
845
- or "false"
846
- )
847
- elevated_enabled = (
848
- exec_profile_overrides.get("OPENCLAW_ELEVATED_ENABLED")
849
- or _resolve_env("OPENCLAW_ELEVATED_ENABLED")
850
- or "false"
851
- )
852
- exec_default_allowlist_enabled = (
853
- exec_profile_overrides.get("OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED")
854
- or _resolve_env("OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED")
855
- or ("true" if exec_strict_mode else "false")
856
- )
857
- exec_allowlist = _resolve_env("OPENCLAW_EXEC_ALLOWLIST")
858
- fs_workspace_only = (
859
- exec_profile_overrides.get("OPENCLAW_FS_WORKSPACE_ONLY")
860
- or _resolve_env("OPENCLAW_FS_WORKSPACE_ONLY")
861
- or "false"
862
- )
863
- model_api_key_secret_source = _resolve_env("OPENCLAW_MODEL_API_KEY_SECRET_SOURCE") or "file"
864
- model_api_key_secret_file_path = _resolve_env("OPENCLAW_MODEL_API_KEY_SECRET_FILE_PATH")
865
- gateway_auth_mode = _resolve_env("OPENCLAW_GATEWAY_AUTH_MODE")
866
- gateway_token = _resolve_env("OPENCLAW_GATEWAY_TOKEN")
867
- gateway_password = _resolve_env("OPENCLAW_GATEWAY_PASSWORD")
868
-
869
- env["OPENCLAW_GATEWAY_BIND"] = "lan"
870
- if gateway_auth_mode:
871
- env["OPENCLAW_GATEWAY_AUTH_MODE"] = gateway_auth_mode
872
- env["OPENCLAW_TRUSTED_PROXY_USER_HEADER"] = (
873
- trusted_proxy_user_header or DEFAULT_TRUSTED_PROXY_USER_HEADER
874
- )
875
- env["OPENCLAW_INTERNAL_TRUSTED_PROXY_USER"] = internal_trusted_proxy_user
876
- env["OPENCLAW_INTERNAL_TRUSTED_PROXY_USER_HEADER"] = (
877
- internal_trusted_proxy_user_header
878
- or trusted_proxy_user_header
879
- or DEFAULT_TRUSTED_PROXY_USER_HEADER
880
- )
881
- env["OPENCLAW_TRUSTED_PROXIES"] = trusted_proxies
882
- env["OPENCLAW_GATEWAY_PORT"] = str(resolved_gateway_port)
883
- env["OPENCLAW_PUBLIC_PORT"] = str(resolved_public_port)
884
- if browser_enabled:
885
- env["OPENCLAW_BROWSER_ENABLED"] = browser_enabled
886
- env["OPENCLAW_BROWSER_NO_SANDBOX"] = browser_no_sandbox
887
- env["OPENCLAW_BROWSER_HEADLESS"] = browser_headless
888
- if browser_executable:
889
- env["OPENCLAW_BROWSER_EXECUTABLE_PATH"] = browser_executable
890
- env["OPENCLAW_UI_LOCALE"] = ui_locale
891
- env["OPENCLAW_EXEC_HOST"] = exec_host
892
- env["OPENCLAW_EXEC_STRICT_MODE"] = "true" if exec_strict_mode else "false"
893
- env["OPENCLAW_EXEC_UNSAFE_MODE"] = "false" if exec_strict_mode else "true"
894
- env["OPENCLAW_EXEC_SECURITY"] = exec_security
895
- env["OPENCLAW_EXEC_ASK"] = exec_ask
896
- env["OPENCLAW_EXEC_ASK_FALLBACK"] = exec_ask_fallback
897
- env["OPENCLAW_EXEC_AUTO_ALLOW_SKILLS"] = exec_auto_allow_skills
898
- env["OPENCLAW_ELEVATED_ENABLED"] = elevated_enabled
899
- env["OPENCLAW_EXEC_DEFAULT_ALLOWLIST_ENABLED"] = exec_default_allowlist_enabled
900
- env["OPENCLAW_FS_WORKSPACE_ONLY"] = fs_workspace_only
901
- env["OPENCLAW_MODEL_API_KEY_SECRET_SOURCE"] = model_api_key_secret_source
902
- if exec_allowlist:
903
- env["OPENCLAW_EXEC_ALLOWLIST"] = exec_allowlist
904
- if model_api_key_secret_file_path:
905
- env["OPENCLAW_MODEL_API_KEY_SECRET_FILE_PATH"] = model_api_key_secret_file_path
906
-
907
- if explicit_provider_id and provider_id != default_provider_id:
908
- env["OPENCLAW_MODEL_PROVIDER_ID"] = provider_id
909
- elif not explicit_provider_id and provider_id and provider_id != default_provider_id:
910
- env["OPENCLAW_MODEL_PROVIDER_ID"] = provider_id
911
- if explicit_model_api and model_api != default_model_api:
912
- env["OPENCLAW_MODEL_API"] = model_api
913
- if explicit_base_url and base_url and base_url != default_model_base_url:
914
- env["OPENCLAW_MODEL_BASE_URL"] = base_url
915
- if api_key:
916
- env["OPENCLAW_MODEL_API_KEY"] = api_key
917
- normalized_model = model.strip() if model else None
918
- catalog_model_id = None
919
- resolved_model = None
920
- if normalized_model:
921
- if "/" in normalized_model:
922
- _, catalog_model_id = normalized_model.split("/", 1)
923
- resolved_model = normalized_model
924
- else:
925
- resolved_model = (
926
- f"{provider_id}/{normalized_model}" if provider_id else normalized_model
927
- )
928
- if openclaw_explicit_model:
929
- env["OPENCLAW_DEFAULT_MODEL"] = resolved_model
930
- elif generic_model_preference:
931
- env["OPENAI_MODEL_NAME"] = resolved_model
932
-
933
- # 额外的可选配置
934
- catalog = _resolve_env("OPENCLAW_MODEL_CATALOG_JSON")
935
- if catalog:
936
- env["OPENCLAW_MODEL_CATALOG_JSON"] = catalog
937
- openclaw_model_allowlist = _resolve_env("OPENCLAW_MODEL_ALLOWLIST")
938
- agentengine_model_allowlist = _resolve_env("AGENTENGINE_MODEL_ALLOWLIST")
939
- if openclaw_model_allowlist:
940
- env["OPENCLAW_MODEL_ALLOWLIST"] = openclaw_model_allowlist
941
- elif agentengine_model_allowlist:
942
- env["AGENTENGINE_MODEL_ALLOWLIST"] = agentengine_model_allowlist
943
- origins = _resolve_env("OPENCLAW_ALLOWED_ORIGINS")
944
- if origins:
945
- env["OPENCLAW_ALLOWED_ORIGINS"] = _normalize_allowed_origins(origins)
946
- else:
947
- # 统一输出 JSON 数组字符串,兼容旧版 bootstrap(仅支持 JSON.parse)。
948
- env["OPENCLAW_ALLOWED_ORIGINS"] = json.dumps(["*"])
949
- allow_insecure_auth = _resolve_env("OPENCLAW_ALLOW_INSECURE_AUTH")
950
- env["OPENCLAW_ALLOW_INSECURE_AUTH"] = allow_insecure_auth if allow_insecure_auth else "true"
951
- disable_device_auth = _resolve_env("OPENCLAW_DISABLE_DEVICE_AUTH")
952
- env["OPENCLAW_DISABLE_DEVICE_AUTH"] = disable_device_auth if disable_device_auth else "true"
953
- if gateway_token:
954
- env["OPENCLAW_GATEWAY_TOKEN"] = gateway_token
955
- if gateway_password:
956
- env["OPENCLAW_GATEWAY_PASSWORD"] = gateway_password
957
- for passthrough_key in [
958
- "OPENCLAW_CHANNEL_BOOTSTRAP_JSON",
959
- "OPENCLAW_BROWSER_SSRF_POLICY_JSON",
960
- "OPENCLAW_WEB_FETCH_ENABLED",
961
- "OPENCLAW_WEB_SEARCH_PROVIDER",
962
- "OPENCLAW_WEB_SEARCH_BASE_URL",
963
- "OPENCLAW_WEB_SEARCH_MODEL",
964
- "OPENCLAW_WEB_SEARCH_API_KEY",
965
- "OPENCLAW_WEB_SEARCH_API_KEY_SECRET_SOURCE",
966
- "OPENCLAW_WEB_SEARCH_API_KEY_SECRET_PROVIDER",
967
- "OPENCLAW_WEB_SEARCH_API_KEY_SECRET_ID",
968
- ]:
969
- passthrough_value = _resolve_env(passthrough_key)
970
- if passthrough_value:
971
- env[passthrough_key] = passthrough_value
972
-
973
- env = _normalize_openclaw_gateway_auth_env(env)
974
- return build_runtime_model_policy_env(env, runtime="openclaw")
975
-
976
-
977
- def _normalize_allowed_origins(raw: str) -> str:
978
- """标准化 OPENCLAW_ALLOWED_ORIGINS,统一输出 JSON 数组字符串。"""
979
- text = (raw or "").strip()
980
- if not text:
981
- return ""
982
-
983
- origins = []
984
- try:
985
- parsed = json.loads(text)
986
- if isinstance(parsed, list):
987
- origins = [str(x).strip() for x in parsed if str(x).strip()]
988
- except Exception:
989
- # Backward compatible: 支持逗号/分号/空白分隔字符串。
990
- parts = [p.strip() for p in text.replace(";", ",").replace(" ", ",").split(",")]
991
- origins = [p.strip() for p in parts if p.strip()]
992
-
993
- if not origins:
994
- origins = [text]
995
-
996
- deduped = list(dict.fromkeys(origins))
997
- return json.dumps(deduped, ensure_ascii=False)
998
-
999
-
1000
- def _normalize_csv_list(raw: str, *, default_items: Optional[list[str]] = None) -> str:
1001
- """标准化字符串列表为逗号分隔格式。"""
1002
- text = (raw or "").strip()
1003
- items: list[str] = []
1004
- if text:
1005
- try:
1006
- parsed = json.loads(text)
1007
- if isinstance(parsed, list):
1008
- items = [str(x).strip() for x in parsed if str(x).strip()]
1009
- except Exception:
1010
- parts = [p.strip() for p in text.replace(";", ",").replace(" ", ",").split(",")]
1011
- items = [p for p in parts if p]
1012
-
1013
- if not items:
1014
- items = [str(x).strip() for x in (default_items or []) if str(x).strip()]
1015
-
1016
- return ",".join(list(dict.fromkeys(items)))
1017
-
1018
-
1019
- def _normalize_openclaw_gateway_auth_env(env: dict[str, str]) -> dict[str, str]:
1020
- """标准化 OpenClaw gateway 鉴权模式与共享密钥配置。"""
1021
- normalized_env = dict(env or {})
1022
- raw_mode = str(normalized_env.get("OPENCLAW_GATEWAY_AUTH_MODE") or "").strip().lower()
1023
- raw_token = str(normalized_env.get("OPENCLAW_GATEWAY_TOKEN") or "").strip()
1024
- raw_password = str(normalized_env.get("OPENCLAW_GATEWAY_PASSWORD") or "").strip()
1025
-
1026
- if raw_mode and raw_mode not in {"trusted-proxy", "token", "none"}:
1027
- raise ValueError("OPENCLAW_GATEWAY_AUTH_MODE 仅支持 trusted-proxy、token 或 none")
1028
-
1029
- auth_mode = raw_mode or ("token" if raw_token or raw_password else "trusted-proxy")
1030
- if auth_mode == "token":
1031
- if raw_token and raw_password and raw_token != raw_password:
1032
- raise ValueError(
1033
- "OPENCLAW_GATEWAY_TOKEN 与 OPENCLAW_GATEWAY_PASSWORD 同时提供时必须一致"
1034
- )
1035
- shared_secret = raw_token or raw_password
1036
- if not shared_secret:
1037
- raise ValueError(
1038
- "OPENCLAW_GATEWAY_AUTH_MODE=token 时必须提供 "
1039
- "OPENCLAW_GATEWAY_TOKEN 或 OPENCLAW_GATEWAY_PASSWORD"
1040
- )
1041
- normalized_env["OPENCLAW_GATEWAY_AUTH_MODE"] = "token"
1042
- normalized_env["OPENCLAW_GATEWAY_TOKEN"] = shared_secret
1043
- normalized_env["OPENCLAW_GATEWAY_PASSWORD"] = shared_secret
1044
- return normalized_env
1045
-
1046
- if raw_token or raw_password:
1047
- raise ValueError(
1048
- "仅在 OPENCLAW_GATEWAY_AUTH_MODE=token 时支持 "
1049
- "OPENCLAW_GATEWAY_TOKEN 或 OPENCLAW_GATEWAY_PASSWORD"
1050
- )
1051
-
1052
- normalized_env["OPENCLAW_GATEWAY_AUTH_MODE"] = auth_mode
1053
- normalized_env.pop("OPENCLAW_GATEWAY_TOKEN", None)
1054
- normalized_env.pop("OPENCLAW_GATEWAY_PASSWORD", None)
1055
- return normalized_env
1056
-
1057
-
1058
624
  def _parse_extra_openclaw_env_pairs(items: tuple[str, ...] | list[str] | None) -> dict[str, str]:
1059
625
  """解析 deploy --env 传入的自定义环境变量,并对 gateway 鉴权模式做早期归一化。"""
1060
626
  parsed = parse_env_pairs(items)