@downcity/city 1.1.39 → 1.1.47

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 (353) hide show
  1. package/README.md +4 -9
  2. package/bin/cli/Index.js +2 -0
  3. package/bin/cli/Index.js.map +1 -1
  4. package/bin/cli/agent/AgentChat.d.ts +2 -1
  5. package/bin/cli/agent/AgentChat.d.ts.map +1 -1
  6. package/bin/cli/agent/AgentChat.js +93 -214
  7. package/bin/cli/agent/AgentChat.js.map +1 -1
  8. package/bin/cli/agent/AgentChatTypes.d.ts +8 -12
  9. package/bin/cli/agent/AgentChatTypes.d.ts.map +1 -1
  10. package/bin/cli/agent/AgentHistory.js +2 -2
  11. package/bin/cli/agent/AgentHistory.js.map +1 -1
  12. package/bin/cli/agent/AgentManager.d.ts.map +1 -1
  13. package/bin/cli/agent/AgentManager.js +26 -27
  14. package/bin/cli/agent/AgentManager.js.map +1 -1
  15. package/bin/cli/agent/AgentManagerTypes.d.ts +2 -2
  16. package/bin/cli/agent/AgentManagerTypes.d.ts.map +1 -1
  17. package/bin/cli/agent/AgentReset.js +4 -4
  18. package/bin/cli/agent/AgentReset.js.map +1 -1
  19. package/bin/cli/agent/AgentSelection.js +6 -6
  20. package/bin/cli/agent/AgentSelection.js.map +1 -1
  21. package/bin/cli/agent/AgentSelectionTypes.d.ts +1 -1
  22. package/bin/cli/agent/AgentSelectionTypes.d.ts.map +1 -1
  23. package/bin/cli/agent/Init.js +10 -10
  24. package/bin/cli/agent/Init.js.map +1 -1
  25. package/bin/cli/agent/Restart.js +2 -2
  26. package/bin/cli/agent/Restart.js.map +1 -1
  27. package/bin/cli/agent/Run.d.ts +1 -1
  28. package/bin/cli/agent/Run.d.ts.map +1 -1
  29. package/bin/cli/agent/Run.js +37 -17
  30. package/bin/cli/agent/Run.js.map +1 -1
  31. package/bin/cli/agent/Start.js +2 -2
  32. package/bin/cli/agent/Start.js.map +1 -1
  33. package/bin/cli/agent/Stop.js +2 -2
  34. package/bin/cli/agent/Stop.js.map +1 -1
  35. package/bin/cli/control-plane/ControlPlaneProcess.js +5 -5
  36. package/bin/cli/control-plane/ControlPlaneProcess.js.map +1 -1
  37. package/bin/cli/model/ModelCreateCommand.js +1 -1
  38. package/bin/cli/model/ModelCreateCommand.js.map +1 -1
  39. package/bin/cli/model/ModelManageCommand.d.ts.map +1 -1
  40. package/bin/cli/model/ModelManageCommand.js +5 -3
  41. package/bin/cli/model/ModelManageCommand.js.map +1 -1
  42. package/bin/cli/model/ModelManager.js +3 -3
  43. package/bin/cli/model/ModelManager.js.map +1 -1
  44. package/bin/cli/model/ModelSupport.d.ts +0 -1
  45. package/bin/cli/model/ModelSupport.d.ts.map +1 -1
  46. package/bin/cli/model/ModelSupport.js +2 -11
  47. package/bin/cli/model/ModelSupport.js.map +1 -1
  48. package/bin/cli/shared/CliReporterTypes.d.ts +1 -1
  49. package/bin/cli/shared/Config.js +2 -2
  50. package/bin/cli/shared/Config.js.map +1 -1
  51. package/bin/cli/shared/Env.d.ts +1 -1
  52. package/bin/cli/shared/Env.d.ts.map +1 -1
  53. package/bin/cli/shared/Env.js +18 -149
  54. package/bin/cli/shared/Env.js.map +1 -1
  55. package/bin/cli/shared/IndexAgentCommand.d.ts.map +1 -1
  56. package/bin/cli/shared/IndexAgentCommand.js +3 -3
  57. package/bin/cli/shared/IndexAgentCommand.js.map +1 -1
  58. package/bin/cli/shared/IndexSupport.d.ts +3 -3
  59. package/bin/cli/shared/IndexSupport.d.ts.map +1 -1
  60. package/bin/cli/shared/IndexSupport.js +14 -8
  61. package/bin/cli/shared/IndexSupport.js.map +1 -1
  62. package/bin/cli/shared/ManagedPluginActionCommands.d.ts.map +1 -1
  63. package/bin/cli/shared/ManagedPluginActionCommands.js +5 -4
  64. package/bin/cli/shared/ManagedPluginActionCommands.js.map +1 -1
  65. package/bin/cli/shared/ManagedPluginRemote.d.ts.map +1 -1
  66. package/bin/cli/shared/ManagedPluginRemote.js +4 -4
  67. package/bin/cli/shared/ManagedPluginRemote.js.map +1 -1
  68. package/bin/cli/shared/PluginTargetSupport.d.ts +2 -2
  69. package/bin/cli/shared/PluginTargetSupport.d.ts.map +1 -1
  70. package/bin/cli/shared/PluginTargetSupport.js +19 -19
  71. package/bin/cli/shared/PluginTargetSupport.js.map +1 -1
  72. package/bin/cli/shared/Plugins.js +10 -10
  73. package/bin/cli/shared/Plugins.js.map +1 -1
  74. package/bin/cli/shared/PublicHostEnv.d.ts +1 -1
  75. package/bin/cli/shared/PublicHostEnv.js +2 -2
  76. package/bin/cli/shared/PublicHostEnv.js.map +1 -1
  77. package/bin/cli/shared/Terminal.d.ts +13 -0
  78. package/bin/cli/shared/Terminal.d.ts.map +1 -0
  79. package/bin/cli/shared/Terminal.js +22 -0
  80. package/bin/cli/shared/Terminal.js.map +1 -0
  81. package/bin/config/DowncitySchema.d.ts.map +1 -1
  82. package/bin/config/DowncitySchema.js +3 -111
  83. package/bin/config/DowncitySchema.js.map +1 -1
  84. package/bin/config/Paths.d.ts +0 -56
  85. package/bin/config/Paths.d.ts.map +1 -1
  86. package/bin/config/Paths.js +9 -51
  87. package/bin/config/Paths.js.map +1 -1
  88. package/bin/control/ControlGateway.js +1 -1
  89. package/bin/control/ControlGateway.js.map +1 -1
  90. package/bin/control/EnvApiRoutes.d.ts +1 -1
  91. package/bin/control/EnvApiRoutes.d.ts.map +1 -1
  92. package/bin/control/EnvApiRoutes.js +7 -79
  93. package/bin/control/EnvApiRoutes.js.map +1 -1
  94. package/bin/control/PlatformApiRoutes.d.ts +2 -2
  95. package/bin/control/PlatformApiRoutes.d.ts.map +1 -1
  96. package/bin/control/PlatformApiRoutes.js +2 -2
  97. package/bin/control/PlatformApiRoutes.js.map +1 -1
  98. package/bin/control/gateway/AgentActions.d.ts +2 -2
  99. package/bin/control/gateway/AgentActions.d.ts.map +1 -1
  100. package/bin/control/gateway/AgentActions.js +7 -7
  101. package/bin/control/gateway/AgentActions.js.map +1 -1
  102. package/bin/control/gateway/AgentCatalog.d.ts +3 -6
  103. package/bin/control/gateway/AgentCatalog.d.ts.map +1 -1
  104. package/bin/control/gateway/AgentCatalog.js +16 -18
  105. package/bin/control/gateway/AgentCatalog.js.map +1 -1
  106. package/bin/control/instant/InstantSessionRunner.d.ts.map +1 -1
  107. package/bin/control/instant/InstantSessionRunner.js +3 -1
  108. package/bin/control/instant/InstantSessionRunner.js.map +1 -1
  109. package/bin/env/ProcessEnv.d.ts +24 -0
  110. package/bin/env/ProcessEnv.d.ts.map +1 -0
  111. package/bin/env/ProcessEnv.js +41 -0
  112. package/bin/env/ProcessEnv.js.map +1 -0
  113. package/bin/http/auth/AuthEnv.d.ts +1 -1
  114. package/bin/http/auth/AuthEnv.js +1 -1
  115. package/bin/model/runtime/CreateRuntimeModel.d.ts +8 -0
  116. package/bin/model/runtime/CreateRuntimeModel.d.ts.map +1 -1
  117. package/bin/model/runtime/CreateRuntimeModel.js +43 -37
  118. package/bin/model/runtime/CreateRuntimeModel.js.map +1 -1
  119. package/bin/model/service/ModelPoolService.d.ts +1 -1
  120. package/bin/model/service/ModelPoolService.d.ts.map +1 -1
  121. package/bin/model/service/ModelPoolService.js +8 -6
  122. package/bin/model/service/ModelPoolService.js.map +1 -1
  123. package/bin/platform/store/StoreEnvRepository.d.ts +5 -49
  124. package/bin/platform/store/StoreEnvRepository.d.ts.map +1 -1
  125. package/bin/platform/store/StoreEnvRepository.js +31 -178
  126. package/bin/platform/store/StoreEnvRepository.js.map +1 -1
  127. package/bin/platform/store/StoreSchema.js +3 -44
  128. package/bin/platform/store/StoreSchema.js.map +1 -1
  129. package/bin/platform/store/index.d.ts +9 -45
  130. package/bin/platform/store/index.d.ts.map +1 -1
  131. package/bin/platform/store/index.js +12 -62
  132. package/bin/platform/store/index.js.map +1 -1
  133. package/bin/platform/store/schema.d.ts +2 -2
  134. package/bin/platform/store/schema.js +2 -2
  135. package/bin/process/daemon/Api.d.ts +1 -1
  136. package/bin/process/daemon/CliArgs.d.ts +1 -0
  137. package/bin/process/daemon/CliArgs.d.ts.map +1 -1
  138. package/bin/process/daemon/CliArgs.js +20 -1
  139. package/bin/process/daemon/CliArgs.js.map +1 -1
  140. package/bin/process/daemon/Client.d.ts +18 -2
  141. package/bin/process/daemon/Client.d.ts.map +1 -1
  142. package/bin/process/daemon/Client.js +70 -20
  143. package/bin/process/daemon/Client.js.map +1 -1
  144. package/bin/process/daemon/Manager.d.ts.map +1 -1
  145. package/bin/process/daemon/Manager.js +2 -1
  146. package/bin/process/daemon/Manager.js.map +1 -1
  147. package/bin/terminal/admin/auth-error.d.ts +34 -0
  148. package/bin/terminal/admin/auth-error.d.ts.map +1 -0
  149. package/bin/terminal/admin/auth-error.js +51 -0
  150. package/bin/terminal/admin/auth-error.js.map +1 -0
  151. package/bin/terminal/admin/commands/accounts.d.ts +6 -0
  152. package/bin/terminal/admin/commands/accounts.d.ts.map +1 -0
  153. package/bin/terminal/admin/commands/accounts.js +44 -0
  154. package/bin/terminal/admin/commands/accounts.js.map +1 -0
  155. package/bin/terminal/admin/commands/balance.d.ts +6 -0
  156. package/bin/terminal/admin/commands/balance.d.ts.map +1 -0
  157. package/bin/terminal/admin/commands/balance.js +153 -0
  158. package/bin/terminal/admin/commands/balance.js.map +1 -0
  159. package/bin/terminal/admin/commands/config.d.ts +10 -0
  160. package/bin/terminal/admin/commands/config.d.ts.map +1 -0
  161. package/bin/terminal/admin/commands/config.js +11 -0
  162. package/bin/terminal/admin/commands/config.js.map +1 -0
  163. package/bin/terminal/admin/commands/custom.d.ts +6 -0
  164. package/bin/terminal/admin/commands/custom.d.ts.map +1 -0
  165. package/bin/terminal/admin/commands/custom.js +47 -0
  166. package/bin/terminal/admin/commands/custom.js.map +1 -0
  167. package/bin/terminal/admin/commands/instruction.d.ts +9 -0
  168. package/bin/terminal/admin/commands/instruction.d.ts.map +1 -0
  169. package/bin/terminal/admin/commands/instruction.js +10 -0
  170. package/bin/terminal/admin/commands/instruction.js.map +1 -0
  171. package/bin/terminal/admin/commands/models.d.ts +14 -0
  172. package/bin/terminal/admin/commands/models.d.ts.map +1 -0
  173. package/bin/terminal/admin/commands/models.js +61 -0
  174. package/bin/terminal/admin/commands/models.js.map +1 -0
  175. package/bin/terminal/admin/commands/payment.d.ts +6 -0
  176. package/bin/terminal/admin/commands/payment.d.ts.map +1 -0
  177. package/bin/terminal/admin/commands/payment.js +59 -0
  178. package/bin/terminal/admin/commands/payment.js.map +1 -0
  179. package/bin/terminal/admin/commands/products.d.ts +6 -0
  180. package/bin/terminal/admin/commands/products.d.ts.map +1 -0
  181. package/bin/terminal/admin/commands/products.js +80 -0
  182. package/bin/terminal/admin/commands/products.js.map +1 -0
  183. package/bin/terminal/admin/commands/service-env.d.ts +11 -0
  184. package/bin/terminal/admin/commands/service-env.d.ts.map +1 -0
  185. package/bin/terminal/admin/commands/service-env.js +248 -0
  186. package/bin/terminal/admin/commands/service-env.js.map +1 -0
  187. package/bin/terminal/admin/commands/usage.d.ts +6 -0
  188. package/bin/terminal/admin/commands/usage.d.ts.map +1 -0
  189. package/bin/terminal/admin/commands/usage.js +44 -0
  190. package/bin/terminal/admin/commands/usage.js.map +1 -0
  191. package/bin/terminal/admin/loop.d.ts +6 -0
  192. package/bin/terminal/admin/loop.d.ts.map +1 -0
  193. package/bin/terminal/admin/loop.js +70 -0
  194. package/bin/terminal/admin/loop.js.map +1 -0
  195. package/bin/terminal/agent/pi-agent.d.ts +15 -0
  196. package/bin/terminal/agent/pi-agent.d.ts.map +1 -0
  197. package/bin/terminal/agent/pi-agent.js +136 -0
  198. package/bin/terminal/agent/pi-agent.js.map +1 -0
  199. package/bin/terminal/app.d.ts +13 -0
  200. package/bin/terminal/app.d.ts.map +1 -0
  201. package/bin/terminal/app.js +123 -0
  202. package/bin/terminal/app.js.map +1 -0
  203. package/bin/terminal/auth/admin.d.ts +8 -0
  204. package/bin/terminal/auth/admin.d.ts.map +1 -0
  205. package/bin/terminal/auth/admin.js +18 -0
  206. package/bin/terminal/auth/admin.js.map +1 -0
  207. package/bin/terminal/auth/mode-select.d.ts +11 -0
  208. package/bin/terminal/auth/mode-select.d.ts.map +1 -0
  209. package/bin/terminal/auth/mode-select.js +33 -0
  210. package/bin/terminal/auth/mode-select.js.map +1 -0
  211. package/bin/terminal/auth/server-switch.d.ts +22 -0
  212. package/bin/terminal/auth/server-switch.d.ts.map +1 -0
  213. package/bin/terminal/auth/server-switch.js +241 -0
  214. package/bin/terminal/auth/server-switch.js.map +1 -0
  215. package/bin/terminal/auth/user.d.ts +19 -0
  216. package/bin/terminal/auth/user.d.ts.map +1 -0
  217. package/bin/terminal/auth/user.js +261 -0
  218. package/bin/terminal/auth/user.js.map +1 -0
  219. package/bin/terminal/core/browser.d.ts +12 -0
  220. package/bin/terminal/core/browser.d.ts.map +1 -0
  221. package/bin/terminal/core/browser.js +29 -0
  222. package/bin/terminal/core/browser.js.map +1 -0
  223. package/bin/terminal/core/env.d.ts +15 -0
  224. package/bin/terminal/core/env.d.ts.map +1 -0
  225. package/bin/terminal/core/env.js +67 -0
  226. package/bin/terminal/core/env.js.map +1 -0
  227. package/bin/terminal/core/session.d.ts +97 -0
  228. package/bin/terminal/core/session.d.ts.map +1 -0
  229. package/bin/terminal/core/session.js +342 -0
  230. package/bin/terminal/core/session.js.map +1 -0
  231. package/bin/terminal/core/stripe.d.ts +26 -0
  232. package/bin/terminal/core/stripe.d.ts.map +1 -0
  233. package/bin/terminal/core/stripe.js +22 -0
  234. package/bin/terminal/core/stripe.js.map +1 -0
  235. package/bin/terminal/core/ui.d.ts +29 -0
  236. package/bin/terminal/core/ui.d.ts.map +1 -0
  237. package/bin/terminal/core/ui.js +60 -0
  238. package/bin/terminal/core/ui.js.map +1 -0
  239. package/bin/terminal/core/update.d.ts +20 -0
  240. package/bin/terminal/core/update.d.ts.map +1 -0
  241. package/bin/terminal/core/update.js +193 -0
  242. package/bin/terminal/core/update.js.map +1 -0
  243. package/bin/terminal/user/balance.d.ts +31 -0
  244. package/bin/terminal/user/balance.d.ts.map +1 -0
  245. package/bin/terminal/user/balance.js +131 -0
  246. package/bin/terminal/user/balance.js.map +1 -0
  247. package/bin/terminal/user/chat.d.ts +12 -0
  248. package/bin/terminal/user/chat.d.ts.map +1 -0
  249. package/bin/terminal/user/chat.js +70 -0
  250. package/bin/terminal/user/chat.js.map +1 -0
  251. package/bin/terminal/user/loop.d.ts +13 -0
  252. package/bin/terminal/user/loop.d.ts.map +1 -0
  253. package/bin/terminal/user/loop.js +93 -0
  254. package/bin/terminal/user/loop.js.map +1 -0
  255. package/bin/terminal/user/models.d.ts +10 -0
  256. package/bin/terminal/user/models.d.ts.map +1 -0
  257. package/bin/terminal/user/models.js +39 -0
  258. package/bin/terminal/user/models.js.map +1 -0
  259. package/bin/utils/storage.d.ts +0 -1
  260. package/bin/utils/storage.d.ts.map +1 -1
  261. package/bin/utils/storage.js +0 -6
  262. package/bin/utils/storage.js.map +1 -1
  263. package/package.json +7 -3
  264. package/public/app.js +3 -3
  265. package/src/cli/Index.ts +2 -0
  266. package/src/cli/agent/AgentChat.ts +113 -289
  267. package/src/cli/agent/AgentChatTypes.ts +8 -12
  268. package/src/cli/agent/AgentHistory.ts +2 -2
  269. package/src/cli/agent/AgentManager.ts +27 -28
  270. package/src/cli/agent/AgentManagerTypes.ts +2 -2
  271. package/src/cli/agent/AgentReset.ts +4 -4
  272. package/src/cli/agent/AgentSelection.ts +6 -6
  273. package/src/cli/agent/AgentSelectionTypes.ts +1 -1
  274. package/src/cli/agent/Init.ts +13 -13
  275. package/src/cli/agent/Restart.ts +2 -2
  276. package/src/cli/agent/Run.ts +38 -17
  277. package/src/cli/agent/Start.ts +2 -2
  278. package/src/cli/agent/Stop.ts +2 -2
  279. package/src/cli/control-plane/ControlPlaneProcess.ts +5 -5
  280. package/src/cli/model/ModelCreateCommand.ts +1 -1
  281. package/src/cli/model/ModelManageCommand.ts +5 -3
  282. package/src/cli/model/ModelManager.ts +3 -3
  283. package/src/cli/model/ModelSupport.ts +2 -10
  284. package/src/cli/shared/CliReporterTypes.ts +1 -1
  285. package/src/cli/shared/Config.ts +2 -2
  286. package/src/cli/shared/Env.ts +22 -230
  287. package/src/cli/shared/IndexAgentCommand.ts +3 -4
  288. package/src/cli/shared/IndexSupport.ts +16 -10
  289. package/src/cli/shared/ManagedPluginActionCommands.ts +4 -4
  290. package/src/cli/shared/ManagedPluginRemote.ts +4 -4
  291. package/src/cli/shared/PluginTargetSupport.ts +19 -19
  292. package/src/cli/shared/Plugins.ts +10 -10
  293. package/src/cli/shared/PublicHostEnv.ts +2 -2
  294. package/src/cli/shared/Terminal.ts +24 -0
  295. package/src/config/DowncitySchema.ts +3 -113
  296. package/src/config/Paths.ts +9 -90
  297. package/src/control/ControlGateway.ts +3 -3
  298. package/src/control/EnvApiRoutes.ts +7 -91
  299. package/src/control/PlatformApiRoutes.ts +6 -6
  300. package/src/control/gateway/AgentActions.ts +10 -10
  301. package/src/control/gateway/AgentCatalog.ts +17 -21
  302. package/src/control/instant/InstantSessionRunner.ts +3 -1
  303. package/src/env/ProcessEnv.ts +43 -0
  304. package/src/http/auth/AuthEnv.ts +1 -1
  305. package/src/model/runtime/CreateRuntimeModel.ts +54 -37
  306. package/src/model/service/ModelPoolService.ts +13 -11
  307. package/src/platform/store/StoreEnvRepository.ts +31 -234
  308. package/src/platform/store/StoreSchema.ts +3 -49
  309. package/src/platform/store/index.ts +11 -80
  310. package/src/platform/store/schema.ts +2 -2
  311. package/src/process/daemon/Api.ts +1 -1
  312. package/src/process/daemon/CliArgs.ts +24 -1
  313. package/src/process/daemon/Client.ts +90 -22
  314. package/src/process/daemon/Manager.ts +2 -1
  315. package/src/terminal/admin/auth-error.ts +62 -0
  316. package/src/terminal/admin/commands/accounts.ts +44 -0
  317. package/src/terminal/admin/commands/balance.ts +160 -0
  318. package/src/terminal/admin/commands/config.ts +13 -0
  319. package/src/terminal/admin/commands/custom.ts +46 -0
  320. package/src/terminal/admin/commands/instruction.ts +12 -0
  321. package/src/terminal/admin/commands/models.ts +64 -0
  322. package/src/terminal/admin/commands/payment.ts +94 -0
  323. package/src/terminal/admin/commands/products.ts +72 -0
  324. package/src/terminal/admin/commands/service-env.ts +256 -0
  325. package/src/terminal/admin/commands/usage.ts +44 -0
  326. package/src/terminal/admin/loop.ts +69 -0
  327. package/src/terminal/agent/pi-agent.ts +180 -0
  328. package/src/terminal/app.ts +120 -0
  329. package/src/terminal/auth/admin.ts +21 -0
  330. package/src/terminal/auth/mode-select.ts +38 -0
  331. package/src/terminal/auth/server-switch.ts +275 -0
  332. package/src/terminal/auth/user.ts +351 -0
  333. package/src/terminal/core/browser.ts +31 -0
  334. package/src/terminal/core/env.ts +71 -0
  335. package/src/terminal/core/session.ts +450 -0
  336. package/src/terminal/core/stripe.ts +37 -0
  337. package/src/terminal/core/ui.ts +84 -0
  338. package/src/terminal/core/update.ts +230 -0
  339. package/src/terminal/user/balance.ts +215 -0
  340. package/src/terminal/user/chat.ts +80 -0
  341. package/src/terminal/user/loop.ts +112 -0
  342. package/src/terminal/user/models.ts +43 -0
  343. package/src/utils/storage.ts +0 -7
  344. package/bin/process/rpc/Client.d.ts +0 -13
  345. package/bin/process/rpc/Client.d.ts.map +0 -1
  346. package/bin/process/rpc/Client.js +0 -98
  347. package/bin/process/rpc/Client.js.map +0 -1
  348. package/bin/process/rpc/Paths.d.ts +0 -14
  349. package/bin/process/rpc/Paths.d.ts.map +0 -1
  350. package/bin/process/rpc/Paths.js +0 -36
  351. package/bin/process/rpc/Paths.js.map +0 -1
  352. package/src/process/rpc/Client.ts +0 -113
  353. package/src/process/rpc/Paths.ts +0 -43
@@ -2,7 +2,7 @@
2
2
  * 平台环境变量管理路由。
3
3
  *
4
4
  * 关键点(中文)
5
- * - 提供 control plane 级与 agent 级环境变量的统一读写接口。
5
+ * - 当前只提供平台全局 env 的统一读写接口。
6
6
  * - 所有 value 在 DB 中以密文存储,这里的接口只负责明文读写与删除。
7
7
  */
8
8
 
@@ -10,14 +10,6 @@ import dotenv from "dotenv";
10
10
  import type { Hono } from "hono";
11
11
  import { PlatformStore } from "@/platform/store/index.js";
12
12
 
13
- type EnvScope = "global" | "agent";
14
-
15
- function normalizeScope(input: string | undefined): EnvScope {
16
- const value = String(input || "").trim().toLowerCase();
17
- if (value === "agent") return "agent";
18
- return "global";
19
- }
20
-
21
13
  function normalizeNonEmptyText(value: unknown, fieldName: string): string {
22
14
  const text = String(value || "").trim();
23
15
  if (!text) {
@@ -74,32 +66,9 @@ export function registerPlatformEnvRoutes(params: {
74
66
  const app = params.app;
75
67
 
76
68
  app.get("/api/ui/env", async (c) => {
77
- const scope = normalizeScope(c.req.query("scope"));
78
- const agentIdRaw = c.req.query("agent");
79
69
  const store = new PlatformStore();
80
70
  try {
81
- if (scope === "agent") {
82
- const agentId = String(agentIdRaw || "").trim();
83
- const rows = agentId
84
- ? await store.listAgentEnvEntries(agentId)
85
- : await store.listAllAgentEnvEntries();
86
- return c.json({
87
- success: true,
88
- scope,
89
- agentId: agentId || undefined,
90
- items: rows.map((item) => ({
91
- scope: "agent" as const,
92
- agentId: item.agentId,
93
- key: item.key,
94
- description: item.description,
95
- value: item.value,
96
- createdAt: item.createdAt,
97
- updatedAt: item.updatedAt,
98
- })),
99
- });
100
- }
101
-
102
- const rows = await store.listGlobalEnvEntries();
71
+ const rows = await store.listEnvEntries();
103
72
  return c.json({
104
73
  success: true,
105
74
  scope: "global",
@@ -122,35 +91,17 @@ export function registerPlatformEnvRoutes(params: {
122
91
  app.post("/api/ui/env/upsert", async (c) => {
123
92
  try {
124
93
  const body = (await c.req.json().catch(() => ({}))) as {
125
- scope?: string;
126
- agentId?: string;
127
94
  key?: string;
128
95
  description?: string;
129
96
  value?: string;
130
97
  };
131
- const scope = normalizeScope(body.scope);
132
98
  const key = normalizeNonEmptyText(body.key, "env key");
133
99
  const description = String(body.description || "").trim();
134
100
  const value = String(body.value ?? "");
135
101
  const store = new PlatformStore();
136
102
  try {
137
- if (scope === "agent") {
138
- const agentId = normalizeNonEmptyText(body.agentId, "agentId");
139
- await store.upsertAgentEnvEntry({
140
- agentId,
141
- key,
142
- description,
143
- value,
144
- });
145
- return c.json({
146
- success: true,
147
- scope,
148
- agentId,
149
- key,
150
- });
151
- }
152
-
153
- await store.upsertGlobalEnvEntry({
103
+ await store.upsertEnvEntry({
104
+ scope: "global",
154
105
  key,
155
106
  description,
156
107
  value,
@@ -171,26 +122,12 @@ export function registerPlatformEnvRoutes(params: {
171
122
  app.post("/api/ui/env/remove", async (c) => {
172
123
  try {
173
124
  const body = (await c.req.json().catch(() => ({}))) as {
174
- scope?: string;
175
- agentId?: string;
176
125
  key?: string;
177
126
  };
178
- const scope = normalizeScope(body.scope);
179
127
  const key = normalizeNonEmptyText(body.key, "env key");
180
128
  const store = new PlatformStore();
181
129
  try {
182
- if (scope === "agent") {
183
- const agentId = normalizeNonEmptyText(body.agentId, "agentId");
184
- store.removeAgentEnvEntry(agentId, key);
185
- return c.json({
186
- success: true,
187
- scope,
188
- agentId,
189
- key,
190
- });
191
- }
192
-
193
- store.removeGlobalEnvEntry(key);
130
+ store.removeEnvEntry(key);
194
131
  return c.json({
195
132
  success: true,
196
133
  scope: "global",
@@ -207,35 +144,14 @@ export function registerPlatformEnvRoutes(params: {
207
144
  app.post("/api/ui/env/import", async (c) => {
208
145
  try {
209
146
  const body = (await c.req.json().catch(() => ({}))) as {
210
- scope?: string;
211
- agentId?: string;
212
147
  raw?: string;
213
148
  };
214
- const scope = normalizeScope(body.scope);
215
149
  const entries = parseDotenvEntries(body.raw);
216
150
  const store = new PlatformStore();
217
151
  try {
218
- if (scope === "agent") {
219
- const agentId = normalizeNonEmptyText(body.agentId, "agentId");
220
- for (const entry of entries) {
221
- await store.upsertAgentEnvEntry({
222
- agentId,
223
- key: entry.key,
224
- description: "",
225
- value: entry.value,
226
- });
227
- }
228
- return c.json({
229
- success: true,
230
- scope,
231
- agentId,
232
- count: entries.length,
233
- keys: entries.map((entry) => entry.key),
234
- });
235
- }
236
-
237
152
  for (const entry of entries) {
238
- await store.upsertGlobalEnvEntry({
153
+ await store.upsertEnvEntry({
154
+ scope: "global",
239
155
  key: entry.key,
240
156
  description: "",
241
157
  value: entry.value,
@@ -34,7 +34,7 @@ export interface PlatformApiRouteHandlers {
34
34
  buildAgentsResponse(requestedAgentId: string): Promise<PlatformAgentsResponse>;
35
35
  /** 初始化 agent 项目骨架。 */
36
36
  initializeAgentProject(projectRoot: string, initialization: {
37
- agentName?: unknown;
37
+ id?: unknown;
38
38
  modelId?: unknown;
39
39
  forceOverwriteShipJson?: unknown;
40
40
  }): Promise<AgentProjectInitializationResult>;
@@ -42,7 +42,7 @@ export interface PlatformApiRouteHandlers {
42
42
  startAgentByProjectRoot(projectRoot: string, options?: {
43
43
  initializeIfNeeded?: boolean;
44
44
  initialization?: {
45
- agentName?: unknown;
45
+ id?: unknown;
46
46
  modelId?: unknown;
47
47
  localModel?: unknown;
48
48
  agentType?: unknown;
@@ -174,7 +174,7 @@ export function registerPlatformApiRoutes(params: {
174
174
  projectRoot?: unknown;
175
175
  initializeIfNeeded?: unknown;
176
176
  initialization?: {
177
- agentName?: unknown;
177
+ id?: unknown;
178
178
  modelId?: unknown;
179
179
  forceOverwriteShipJson?: unknown;
180
180
  };
@@ -197,7 +197,7 @@ export function registerPlatformApiRoutes(params: {
197
197
  try {
198
198
  const body = (await c.req.json().catch(() => ({}))) as {
199
199
  projectRoot?: unknown;
200
- agentName?: unknown;
200
+ id?: unknown;
201
201
  modelId?: unknown;
202
202
  autoStart?: unknown;
203
203
  forceOverwriteShipJson?: unknown;
@@ -207,7 +207,7 @@ export function registerPlatformApiRoutes(params: {
207
207
  return c.json({ success: false, error: "projectRoot is required" }, 400);
208
208
  }
209
209
  const initResult = await handlers.initializeAgentProject(rawProject, {
210
- agentName: body.agentName,
210
+ id: body.id,
211
211
  modelId: body.modelId,
212
212
  forceOverwriteShipJson: body.forceOverwriteShipJson,
213
213
  });
@@ -217,7 +217,7 @@ export function registerPlatformApiRoutes(params: {
217
217
  created: true,
218
218
  started: false,
219
219
  projectRoot: initResult.projectRoot,
220
- agentName: initResult.agentName,
220
+ id: initResult.id,
221
221
  message: "created",
222
222
  });
223
223
  }
@@ -50,14 +50,14 @@ function resolveExecutionInput(params: {
50
50
  };
51
51
  }
52
52
 
53
- function resolveManagedAgentNameFromProjectRoot(projectRoot: string): string {
53
+ function resolveManagedAgentIdFromProjectRoot(projectRoot: string): string {
54
54
  const normalizedRoot = path.resolve(String(projectRoot || "").trim() || ".");
55
55
  const fallback = path.basename(normalizedRoot);
56
56
  const configPath = getDowncityJsonPath(normalizedRoot);
57
57
  try {
58
- const raw = fs.readJsonSync(configPath) as { name?: unknown };
59
- const name = typeof raw.name === "string" ? raw.name.trim() : "";
60
- return name || fallback;
58
+ const raw = fs.readJsonSync(configPath) as { id?: unknown };
59
+ const agentId = typeof raw.id === "string" ? raw.id.trim() : "";
60
+ return agentId || fallback;
61
61
  } catch {
62
62
  return fallback;
63
63
  }
@@ -68,7 +68,7 @@ function resolveManagedAgentNameFromProjectRoot(projectRoot: string): string {
68
68
  */
69
69
  export async function initializePlatformAgentProject(params: {
70
70
  projectRoot: string;
71
- agentName?: unknown;
71
+ id?: unknown;
72
72
  modelId?: unknown;
73
73
  forceOverwriteShipJson?: unknown;
74
74
  }): Promise<AgentProjectInitializationResult> {
@@ -79,7 +79,7 @@ export async function initializePlatformAgentProject(params: {
79
79
  return initializeAgentProject(
80
80
  {
81
81
  projectRoot: params.projectRoot,
82
- agentName: String(params.agentName || "").trim() || undefined,
82
+ id: String(params.id || "").trim() || undefined,
83
83
  execution,
84
84
  forceOverwriteShipJson: params.forceOverwriteShipJson === true,
85
85
  },
@@ -242,7 +242,7 @@ export async function startManagedAgentByProjectRoot(params: {
242
242
  cliPath: string;
243
243
  initializeIfNeeded?: boolean;
244
244
  initialization?: {
245
- agentName?: unknown;
245
+ id?: unknown;
246
246
  modelId?: unknown;
247
247
  forceOverwriteShipJson?: unknown;
248
248
  };
@@ -281,7 +281,7 @@ export async function startManagedAgentByProjectRoot(params: {
281
281
  await initializeAgentProject(
282
282
  {
283
283
  projectRoot: normalizedRoot,
284
- agentName: String(params.initialization?.agentName || "").trim() || undefined,
284
+ id: String(params.initialization?.id || "").trim() || undefined,
285
285
  execution,
286
286
  forceOverwriteShipJson: params.initialization?.forceOverwriteShipJson === true,
287
287
  },
@@ -330,8 +330,8 @@ export async function inspectManagedAgentRestartSafety(params: {
330
330
  const targetAgent = knownAgents.find(
331
331
  (item) => path.resolve(String(item.projectRoot || "")) === normalizedRoot,
332
332
  );
333
- const agentId = String(targetAgent?.name || "").trim()
334
- || resolveManagedAgentNameFromProjectRoot(normalizedRoot);
333
+ const agentId = String(targetAgent?.agentId || "").trim()
334
+ || resolveManagedAgentIdFromProjectRoot(normalizedRoot);
335
335
 
336
336
  const sessionRootDir = getDowncitySessionRootDirPath(normalizedRoot, agentId);
337
337
  if (await fs.pathExists(sessionRootDir)) {
@@ -184,14 +184,14 @@ async function buildAgentOption(
184
184
  const running = Boolean(daemonPid && isProcessAlive(daemonPid));
185
185
  const endpoint = await resolveRuntimeEndpoint(projectRoot);
186
186
 
187
- let displayName = basename(projectRoot);
187
+ let agentId = basename(projectRoot);
188
188
  let ship: PlatformAgentShipJson | null = null;
189
189
  try {
190
190
  const shipPath = getDowncityJsonPath(projectRoot);
191
191
  if (await fs.pathExists(shipPath)) {
192
192
  ship = (await fs.readJson(shipPath)) as PlatformAgentShipJson;
193
- const name = String(ship?.name || "").trim();
194
- if (name) displayName = name;
193
+ const configuredAgentId = String(ship?.id || "").trim();
194
+ if (configuredAgentId) agentId = configuredAgentId;
195
195
  }
196
196
  } catch {
197
197
  // ignore
@@ -205,7 +205,7 @@ async function buildAgentOption(
205
205
 
206
206
  return {
207
207
  id: projectRoot,
208
- name: displayName,
208
+ agentId,
209
209
  projectRoot,
210
210
  running,
211
211
  host: running ? endpoint.host : undefined,
@@ -245,7 +245,7 @@ export async function listKnownPlatformAgents(): Promise<PlatformAgentOption[]>
245
245
  const runningA = a.running === true ? 1 : 0;
246
246
  const runningB = b.running === true ? 1 : 0;
247
247
  if (runningA !== runningB) return runningB - runningA;
248
- return a.name.localeCompare(b.name);
248
+ return a.agentId.localeCompare(b.agentId);
249
249
  });
250
250
  }
251
251
 
@@ -325,18 +325,18 @@ export async function inspectPlatformAgentDirectory(
325
325
  const knownAgents = await listKnownPlatformAgents();
326
326
  const matched = knownAgents.find((item) => item.projectRoot === normalizedRoot) || null;
327
327
 
328
- let displayName = basename(normalizedRoot);
328
+ let agentId = basename(normalizedRoot);
329
329
  let modelId = "";
330
330
  if (hasShipJson) {
331
331
  try {
332
332
  const ship = (await fs.readJson(shipPath)) as PlatformAgentShipJson;
333
- displayName = String(ship?.name || "").trim() || displayName;
333
+ agentId = String(ship?.id || "").trim() || agentId;
334
334
  modelId = String(ship?.execution?.modelId || "").trim();
335
335
  } catch {
336
336
  // ignore parse failures
337
337
  }
338
- } else if (matched?.name) {
339
- displayName = matched.name;
338
+ } else if (matched?.agentId) {
339
+ agentId = matched.agentId;
340
340
  }
341
341
 
342
342
  return {
@@ -346,21 +346,17 @@ export async function inspectPlatformAgentDirectory(
346
346
  hasProfileMd,
347
347
  knownAgent: matched !== null,
348
348
  running: matched?.running === true,
349
- displayName,
350
-
349
+ ...(agentId ? { agentId } : {}),
350
+ ...(modelId ? { modelId } : {}),
351
351
  };
352
352
  }
353
353
 
354
354
  /**
355
- * 读取平台可选的本地 GGUF 模型列表。
355
+ * 构建 Global Model 面板响应。
356
356
  *
357
357
  * 关键点(中文)
358
- * - 如果项目已存在 `downcity.json`,优先尊重 `plugins.lmp.modelsDir`。
359
- * - 若项目未初始化,则回退到默认 `~/.models`,保证首次创建 agent 时也能直接选择。
360
- */
361
-
362
- /**
363
- * 构建 Global Model 面板响应。
358
+ * - 读取当前选中 agent 的 `execution.modelId`,再去平台模型池里补全 provider/model 信息。
359
+ * - 这里只返回全局模型池视图,不解析项目内本地模型目录。
364
360
  */
365
361
  export async function buildPlatformModelResponse(params: {
366
362
  requestedAgentId: string;
@@ -605,7 +601,7 @@ export async function buildPlatformConfigStatusResponse(params: {
605
601
  return {
606
602
  success: true,
607
603
  selectedAgentId: selectedAgent?.id || "",
608
- selectedAgentName: selectedAgent?.name || "",
609
- items: [...platformChecks, ...agentChecks],
610
- };
604
+ selectedAgentProjectId: selectedAgent?.agentId || "",
605
+ items: [...platformChecks, ...agentChecks],
606
+ };
611
607
  }
@@ -32,6 +32,7 @@ import type {
32
32
  } from "@downcity/agent";
33
33
  import { InstantSystemComposer } from "@/control/instant/InstantSystemComposer.js";
34
34
  import { createRuntimeModel } from "@/model/runtime/CreateRuntimeModel.js";
35
+ import { mergeProcessEnvWithPlatformGlobalEnv } from "@/env/ProcessEnv.js";
35
36
  import type { Logger as AgentLogger } from "@downcity/agent";
36
37
 
37
38
  type InstantSessionRunnerOptions = {
@@ -232,13 +233,14 @@ export class InstantSessionRunner implements PlatformInlineInstantRunner {
232
233
  });
233
234
  const model = await createRuntimeModel({
234
235
  config: {
235
- name: "console-inline-instant-model",
236
+ id: "console_inline_instant_model",
236
237
  version: "1.0.0",
237
238
  execution: {
238
239
  type: "api",
239
240
  modelId,
240
241
  },
241
242
  },
243
+ env: mergeProcessEnvWithPlatformGlobalEnv(process.env),
242
244
  });
243
245
  const compactionComposer = new JsonlSessionCompactionComposer();
244
246
  const systemComposer = new InstantSystemComposer({
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 平台全局环境变量读取与合并模块。
3
+ *
4
+ * 职责说明(中文)
5
+ * - 从平台 store 读取 global env。
6
+ * - 为 city 宿主提供显式 env 合并能力,避免让 `@downcity/agent` 直接依赖 `process.env`。
7
+ *
8
+ * 边界说明(中文)
9
+ * - 这里只处理 global env,不处理项目 `.env`。
10
+ * - 不负责 session 级运行时元信息(例如 `DC_SESSION_ID`)。
11
+ */
12
+
13
+ import { PlatformStore } from "@/platform/store/index.js";
14
+
15
+ /**
16
+ * 读取平台 global env 映射。
17
+ */
18
+ export function readPlatformGlobalEnv(): Record<string, string> {
19
+ const store = new PlatformStore();
20
+ try {
21
+ return store.getEnvMapSync();
22
+ } catch {
23
+ return {};
24
+ } finally {
25
+ store.close();
26
+ }
27
+ }
28
+
29
+ /**
30
+ * 合并平台 global env 到目标环境变量映射。
31
+ *
32
+ * 关键点(中文)
33
+ * - 平台 global env 视为宿主层统一真相,应覆盖基础进程环境中的同名键。
34
+ * - 返回新对象,不直接修改传入参数。
35
+ */
36
+ export function mergeProcessEnvWithPlatformGlobalEnv(
37
+ baseEnv: NodeJS.ProcessEnv = process.env,
38
+ ): NodeJS.ProcessEnv {
39
+ return {
40
+ ...baseEnv,
41
+ ...readPlatformGlobalEnv(),
42
+ };
43
+ }
@@ -55,7 +55,7 @@ export function resolveInvocationToken(params: {
55
55
  *
56
56
  * 关键点(中文)
57
57
  * - shell / task script / ACP 等通用执行面不应默认继承任何 HTTP 鉴权信息。
58
- * - 这样可以强制这些链路优先走 RPC,而不是通过环境变量隐式改走本地 HTTP。
58
+ * - 这样可以避免这些链路因为环境变量而隐式带上本地/远程 HTTP 鉴权。
59
59
  */
60
60
  export function stripInvocationAuthEnv(targetEnv: NodeJS.ProcessEnv): void {
61
61
  delete targetEnv[CLI_AUTH_TOKEN_ENV_KEY];
@@ -54,8 +54,30 @@ type RuntimeModelFactoryInput = {
54
54
  * - 仅用于把 sessionId 透传到 LLM 请求日志元数据。
55
55
  */
56
56
  getSessionRunScope?: () => ModelLogContext | undefined;
57
+ /**
58
+ * 宿主显式注入的运行时 env。
59
+ *
60
+ * 关键点(中文)
61
+ * - 这里只作为 provider apiKey 的回退来源。
62
+ * - 不再从 `downcity.json` 或 provider 配置里解析 `${ENV_KEY}` 占位符。
63
+ */
64
+ env?: Record<string, string> | NodeJS.ProcessEnv;
57
65
  };
58
66
 
67
+ function normalizeRuntimeEnv(
68
+ env: Record<string, string> | NodeJS.ProcessEnv | undefined,
69
+ ): Record<string, string> {
70
+ const resolved: Record<string, string> = {};
71
+ if (!env) return resolved;
72
+ for (const [key, value] of Object.entries(env)) {
73
+ const normalizedKey = String(key || "").trim();
74
+ if (!normalizedKey) continue;
75
+ if (value === undefined || value === null) continue;
76
+ resolved[normalizedKey] = String(value);
77
+ }
78
+ return resolved;
79
+ }
80
+
59
81
  function readProjectExecutionBinding(
60
82
  config: DowncityConfig,
61
83
  ): { type: "api"; modelId: string } | null {
@@ -98,63 +120,58 @@ function resolveProviderDefaultBaseUrl(
98
120
  return undefined;
99
121
  }
100
122
 
101
- function resolveEnvPlaceholder(value: string | undefined): string | undefined {
102
- if (!value) return value;
103
- if (value.startsWith("${") && value.endsWith("}")) {
104
- const envVar = value.slice(2, -1);
105
- return process.env[envVar];
106
- }
107
- return value;
108
- }
109
-
110
- function resolveApiKeyFallback(providerType: LlmProviderType): string | undefined {
123
+ function resolveApiKeyFallback(
124
+ providerType: LlmProviderType,
125
+ env: Record<string, string> | undefined,
126
+ ): string | undefined {
127
+ const runtimeEnv = env || {};
111
128
  if (providerType === "gemini") {
112
129
  return (
113
- process.env.GEMINI_API_KEY ||
114
- process.env.GOOGLE_API_KEY ||
115
- process.env.GOOGLE_GENERATIVE_AI_API_KEY ||
116
- process.env.API_KEY
130
+ runtimeEnv.GEMINI_API_KEY ||
131
+ runtimeEnv.GOOGLE_API_KEY ||
132
+ runtimeEnv.GOOGLE_GENERATIVE_AI_API_KEY ||
133
+ runtimeEnv.API_KEY
117
134
  );
118
135
  }
119
136
  if (providerType === "anthropic") {
120
- return process.env.ANTHROPIC_API_KEY || process.env.API_KEY;
137
+ return runtimeEnv.ANTHROPIC_API_KEY || runtimeEnv.API_KEY;
121
138
  }
122
139
  if (providerType === "deepseek") {
123
140
  return (
124
- process.env.DEEPSEEK_API_KEY ||
125
- process.env.OPENAI_API_KEY ||
126
- process.env.API_KEY
141
+ runtimeEnv.DEEPSEEK_API_KEY ||
142
+ runtimeEnv.OPENAI_API_KEY ||
143
+ runtimeEnv.API_KEY
127
144
  );
128
145
  }
129
146
  if (providerType === "xai") {
130
- return process.env.XAI_API_KEY || process.env.API_KEY;
147
+ return runtimeEnv.XAI_API_KEY || runtimeEnv.API_KEY;
131
148
  }
132
149
  if (providerType === "huggingface") {
133
150
  return (
134
- process.env.HUGGINGFACE_API_KEY ||
135
- process.env.HF_TOKEN ||
136
- process.env.API_KEY
151
+ runtimeEnv.HUGGINGFACE_API_KEY ||
152
+ runtimeEnv.HF_TOKEN ||
153
+ runtimeEnv.API_KEY
137
154
  );
138
155
  }
139
156
  if (providerType === "openrouter") {
140
- return process.env.OPENROUTER_API_KEY || process.env.API_KEY;
157
+ return runtimeEnv.OPENROUTER_API_KEY || runtimeEnv.API_KEY;
141
158
  }
142
159
  if (providerType === "moonshot-cn" || providerType === "moonshot-ai") {
143
160
  return (
144
- process.env.MOONSHOT_API_KEY ||
145
- process.env.KIMI_API_KEY ||
146
- process.env.API_KEY
161
+ runtimeEnv.MOONSHOT_API_KEY ||
162
+ runtimeEnv.KIMI_API_KEY ||
163
+ runtimeEnv.API_KEY
147
164
  );
148
165
  }
149
166
  if (providerType === "kimi-code") {
150
167
  return (
151
- process.env.KIMI_CODE_API_KEY ||
152
- process.env.KIMI_API_KEY ||
153
- process.env.MOONSHOT_API_KEY ||
154
- process.env.API_KEY
168
+ runtimeEnv.KIMI_CODE_API_KEY ||
169
+ runtimeEnv.KIMI_API_KEY ||
170
+ runtimeEnv.MOONSHOT_API_KEY ||
171
+ runtimeEnv.API_KEY
155
172
  );
156
173
  }
157
- return process.env.OPENAI_API_KEY || process.env.API_KEY;
174
+ return runtimeEnv.OPENAI_API_KEY || runtimeEnv.API_KEY;
158
175
  }
159
176
 
160
177
  function normalizeProviderType(value: unknown): LlmProviderType | null {
@@ -262,6 +279,7 @@ export async function createRuntimeModel(
262
279
  input: RuntimeModelFactoryInput,
263
280
  ): Promise<LanguageModel> {
264
281
  const logger = getLogger();
282
+ const runtimeEnv = normalizeRuntimeEnv(input.env);
265
283
  const execution = readProjectExecutionBinding(input.config);
266
284
  if (!execution) {
267
285
  await logger.log("warn", "No agent execution configured");
@@ -300,20 +318,19 @@ export async function createRuntimeModel(
300
318
  throw new Error(`Unsupported LLM provider type: ${providerConfig.type}`);
301
319
  }
302
320
 
303
- const resolvedModel = resolveEnvPlaceholder(modelConfig.name);
304
- if (!resolvedModel || resolvedModel === "${}") {
321
+ const resolvedModel = String(modelConfig.name || "").trim();
322
+ if (!resolvedModel) {
305
323
  await logger.log("warn", "No LLM model name configured");
306
324
  throw new Error("No LLM model name configured");
307
325
  }
308
326
 
309
327
  const resolvedBaseUrl = normalizeOptionalBaseUrl(
310
- resolveEnvPlaceholder(providerConfig.baseUrl) ||
311
- resolveProviderDefaultBaseUrl(providerType),
328
+ providerConfig.baseUrl || resolveProviderDefaultBaseUrl(providerType),
312
329
  );
313
330
 
314
- let resolvedApiKey = resolveEnvPlaceholder(providerConfig.apiKey);
331
+ let resolvedApiKey = String(providerConfig.apiKey || "").trim() || undefined;
315
332
  if (!resolvedApiKey) {
316
- resolvedApiKey = resolveApiKeyFallback(providerType);
333
+ resolvedApiKey = resolveApiKeyFallback(providerType, runtimeEnv);
317
334
  }
318
335
  if (!resolvedApiKey) {
319
336
  await logger.log("warn", "No API Key configured, will use simulation mode");