agim-cli 1.4.9 → 1.5.1

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 (659) hide show
  1. package/CHANGELOG.md +437 -402
  2. package/README.md +43 -7
  3. package/README.zh-CN.md +42 -7
  4. package/bin/agim_rpc.py +12 -12
  5. package/dist/cli-ui/cmd-handlers.d.ts +25 -4
  6. package/dist/cli-ui/cmd-handlers.d.ts.map +1 -1
  7. package/dist/cli-ui/cmd-handlers.js +315 -59
  8. package/dist/cli-ui/cmd-handlers.js.map +1 -1
  9. package/dist/cli-ui/config-wizard.d.ts +13 -1
  10. package/dist/cli-ui/config-wizard.d.ts.map +1 -1
  11. package/dist/cli-ui/config-wizard.js +120 -48
  12. package/dist/cli-ui/config-wizard.js.map +1 -1
  13. package/dist/cli-ui/doctor.d.ts +15 -0
  14. package/dist/cli-ui/doctor.d.ts.map +1 -0
  15. package/dist/cli-ui/doctor.js +151 -0
  16. package/dist/cli-ui/doctor.js.map +1 -0
  17. package/dist/cli-ui/entry-menu.d.ts +6 -0
  18. package/dist/cli-ui/entry-menu.d.ts.map +1 -1
  19. package/dist/cli-ui/entry-menu.js +67 -30
  20. package/dist/cli-ui/entry-menu.js.map +1 -1
  21. package/dist/cli-ui/env-file.d.ts +4 -4
  22. package/dist/cli-ui/env-file.js +13 -13
  23. package/dist/cli-ui/env-file.js.map +1 -1
  24. package/dist/cli-ui/i18n.d.ts +17 -8
  25. package/dist/cli-ui/i18n.d.ts.map +1 -1
  26. package/dist/cli-ui/i18n.js +39 -21
  27. package/dist/cli-ui/i18n.js.map +1 -1
  28. package/dist/cli-ui/lang-picker.js +1 -1
  29. package/dist/cli-ui/lang-picker.js.map +1 -1
  30. package/dist/cli-ui/paths.d.ts.map +1 -1
  31. package/dist/cli-ui/paths.js +2 -4
  32. package/dist/cli-ui/paths.js.map +1 -1
  33. package/dist/cli-ui/quickstart.d.ts +3 -0
  34. package/dist/cli-ui/quickstart.d.ts.map +1 -0
  35. package/dist/cli-ui/quickstart.js +108 -0
  36. package/dist/cli-ui/quickstart.js.map +1 -0
  37. package/dist/cli-ui/readiness.d.ts +10 -0
  38. package/dist/cli-ui/readiness.d.ts.map +1 -0
  39. package/dist/cli-ui/readiness.js +75 -0
  40. package/dist/cli-ui/readiness.js.map +1 -0
  41. package/dist/cli-ui/service.d.ts +30 -7
  42. package/dist/cli-ui/service.d.ts.map +1 -1
  43. package/dist/cli-ui/service.js +171 -77
  44. package/dist/cli-ui/service.js.map +1 -1
  45. package/dist/cli-ui/tui/app.js +2 -2
  46. package/dist/cli-ui/tui/app.js.map +1 -1
  47. package/dist/cli-ui/tui/index.js +6 -6
  48. package/dist/cli-ui/tui/index.js.map +1 -1
  49. package/dist/cli-ui/tui/mouse-stdin.js +1 -1
  50. package/dist/cli-ui/tui/mouse-stdin.js.map +1 -1
  51. package/dist/cli-ui/tui/stream-reveal.d.ts +2 -2
  52. package/dist/cli-ui/tui/stream-reveal.d.ts.map +1 -1
  53. package/dist/cli-ui/tui/stream-reveal.js +4 -4
  54. package/dist/cli-ui/tui/stream-reveal.js.map +1 -1
  55. package/dist/cli.js +118 -436
  56. package/dist/cli.js.map +1 -1
  57. package/dist/core/a2a-notify.js +5 -5
  58. package/dist/core/a2a-notify.js.map +1 -1
  59. package/dist/core/a2a.d.ts +2 -2
  60. package/dist/core/a2a.d.ts.map +1 -1
  61. package/dist/core/a2a.js +12 -12
  62. package/dist/core/a2a.js.map +1 -1
  63. package/dist/core/access-token.d.ts +1 -1
  64. package/dist/core/access-token.js +7 -7
  65. package/dist/core/access-token.js.map +1 -1
  66. package/dist/core/acp-server.d.ts.map +1 -1
  67. package/dist/core/acp-server.js +21 -7
  68. package/dist/core/acp-server.js.map +1 -1
  69. package/dist/core/admin-allowlist.js +5 -5
  70. package/dist/core/admin-allowlist.js.map +1 -1
  71. package/dist/core/agent-base.d.ts +1 -1
  72. package/dist/core/agent-base.js +3 -3
  73. package/dist/core/agent-base.js.map +1 -1
  74. package/dist/core/agent-cwd.d.ts +13 -6
  75. package/dist/core/agent-cwd.d.ts.map +1 -1
  76. package/dist/core/agent-cwd.js +72 -23
  77. package/dist/core/agent-cwd.js.map +1 -1
  78. package/dist/core/agim-paths.d.ts +1 -4
  79. package/dist/core/agim-paths.d.ts.map +1 -1
  80. package/dist/core/agim-paths.js +18 -35
  81. package/dist/core/agim-paths.js.map +1 -1
  82. package/dist/core/approval-bus.d.ts +4 -4
  83. package/dist/core/approval-bus.d.ts.map +1 -1
  84. package/dist/core/approval-bus.js +14 -14
  85. package/dist/core/approval-bus.js.map +1 -1
  86. package/dist/core/approval-router.js +2 -2
  87. package/dist/core/artifacts.js +3 -3
  88. package/dist/core/artifacts.js.map +1 -1
  89. package/dist/core/ask-user-rpc.js +1 -1
  90. package/dist/core/ask-user-rpc.js.map +1 -1
  91. package/dist/core/audit-log.js +2 -2
  92. package/dist/core/audit-log.js.map +1 -1
  93. package/dist/core/bgjob-reader.d.ts +1 -1
  94. package/dist/core/bgjob-reader.js +4 -4
  95. package/dist/core/bgjob-reader.js.map +1 -1
  96. package/dist/core/commands/approval.js +2 -2
  97. package/dist/core/commands/approval.js.map +1 -1
  98. package/dist/core/commands/builtin.d.ts.map +1 -1
  99. package/dist/core/commands/builtin.js +12 -2
  100. package/dist/core/commands/builtin.js.map +1 -1
  101. package/dist/core/commands/heartbeat.js +2 -2
  102. package/dist/core/commands/heartbeat.js.map +1 -1
  103. package/dist/core/commands/memo.js +1 -1
  104. package/dist/core/commands/memo.js.map +1 -1
  105. package/dist/core/commands/model.d.ts.map +1 -1
  106. package/dist/core/commands/model.js +32 -3
  107. package/dist/core/commands/model.js.map +1 -1
  108. package/dist/core/commands/plan.js +3 -3
  109. package/dist/core/commands/plan.js.map +1 -1
  110. package/dist/core/commands/router-compare.js +3 -3
  111. package/dist/core/commands/router-compare.js.map +1 -1
  112. package/dist/core/commands/service.d.ts.map +1 -1
  113. package/dist/core/commands/service.js +1 -3
  114. package/dist/core/commands/service.js.map +1 -1
  115. package/dist/core/commands/sessions.js +4 -4
  116. package/dist/core/commands/sessions.js.map +1 -1
  117. package/dist/core/commands/skill.js +1 -1
  118. package/dist/core/commands/skill.js.map +1 -1
  119. package/dist/core/commands/stats.js +1 -1
  120. package/dist/core/commands/stats.js.map +1 -1
  121. package/dist/core/commands/web.js +5 -5
  122. package/dist/core/commands/web.js.map +1 -1
  123. package/dist/core/config-schema.js +1 -1
  124. package/dist/core/coord-systems.d.ts +1 -1
  125. package/dist/core/coord-systems.js +4 -4
  126. package/dist/core/coord-systems.js.map +1 -1
  127. package/dist/core/event-bus.d.ts +5 -5
  128. package/dist/core/event-bus.d.ts.map +1 -1
  129. package/dist/core/event-bus.js +3 -3
  130. package/dist/core/event-bus.js.map +1 -1
  131. package/dist/core/feature-flags.d.ts +2 -2
  132. package/dist/core/feature-flags.js +4 -4
  133. package/dist/core/feature-flags.js.map +1 -1
  134. package/dist/core/goal-rpc.js +2 -2
  135. package/dist/core/goal-rpc.js.map +1 -1
  136. package/dist/core/goals.d.ts +1 -1
  137. package/dist/core/goals.js +3 -3
  138. package/dist/core/goals.js.map +1 -1
  139. package/dist/core/heartbeat-store.d.ts +1 -1
  140. package/dist/core/heartbeat-store.d.ts.map +1 -1
  141. package/dist/core/heartbeat-store.js +3 -3
  142. package/dist/core/heartbeat-store.js.map +1 -1
  143. package/dist/core/heartbeat.js +4 -4
  144. package/dist/core/heartbeat.js.map +1 -1
  145. package/dist/core/intent-llm.d.ts +2 -2
  146. package/dist/core/intent-llm.js +5 -5
  147. package/dist/core/intent-llm.js.map +1 -1
  148. package/dist/core/job-board.d.ts +5 -5
  149. package/dist/core/job-board.d.ts.map +1 -1
  150. package/dist/core/job-board.js +17 -17
  151. package/dist/core/job-board.js.map +1 -1
  152. package/dist/core/llm/agent-loop.d.ts +3 -3
  153. package/dist/core/llm/agent-loop.js +14 -14
  154. package/dist/core/llm/agent-loop.js.map +1 -1
  155. package/dist/core/llm/{imhub-dispatcher.d.ts → agim-dispatcher.d.ts} +4 -4
  156. package/dist/core/llm/agim-dispatcher.d.ts.map +1 -0
  157. package/dist/core/llm/{imhub-dispatcher.js → agim-dispatcher.js} +43 -43
  158. package/dist/core/llm/agim-dispatcher.js.map +1 -0
  159. package/dist/core/llm/agim-rpc-server.js +17 -17
  160. package/dist/core/llm/agim-rpc-server.js.map +1 -1
  161. package/dist/core/llm/anthropic-provider.js +2 -1
  162. package/dist/core/llm/anthropic-provider.js.map +1 -1
  163. package/dist/core/llm/auto-compact.d.ts +3 -3
  164. package/dist/core/llm/auto-compact.d.ts.map +1 -1
  165. package/dist/core/llm/auto-compact.js +5 -5
  166. package/dist/core/llm/auto-compact.js.map +1 -1
  167. package/dist/core/llm/builtin-dispatcher.js +3 -3
  168. package/dist/core/llm/builtin-dispatcher.js.map +1 -1
  169. package/dist/core/llm/exec-dispatcher.d.ts +2 -2
  170. package/dist/core/llm/exec-dispatcher.d.ts.map +1 -1
  171. package/dist/core/llm/exec-dispatcher.js +20 -22
  172. package/dist/core/llm/exec-dispatcher.js.map +1 -1
  173. package/dist/core/llm/fs-dispatcher.js +8 -8
  174. package/dist/core/llm/fs-dispatcher.js.map +1 -1
  175. package/dist/core/llm/goal-critic.js +4 -4
  176. package/dist/core/llm/goal-critic.js.map +1 -1
  177. package/dist/core/llm/hallucination-detector.js +2 -2
  178. package/dist/core/llm/hallucination-detector.js.map +1 -1
  179. package/dist/core/llm/mcp-client.d.ts +1 -1
  180. package/dist/core/llm/mcp-client.js +3 -3
  181. package/dist/core/llm/mcp-client.js.map +1 -1
  182. package/dist/core/llm/mcp-registry.js +3 -3
  183. package/dist/core/llm/mcp-registry.js.map +1 -1
  184. package/dist/core/llm/openai-compat-provider.d.ts +1 -1
  185. package/dist/core/llm/openai-compat-provider.js +5 -4
  186. package/dist/core/llm/openai-compat-provider.js.map +1 -1
  187. package/dist/core/llm/provider-base.d.ts +5 -5
  188. package/dist/core/llm/provider-base.d.ts.map +1 -1
  189. package/dist/core/llm/provider-base.js +1 -1
  190. package/dist/core/llm/provider-base.js.map +1 -1
  191. package/dist/core/llm/secrets.d.ts +2 -2
  192. package/dist/core/llm/secrets.d.ts.map +1 -1
  193. package/dist/core/llm/tool-dispatcher.d.ts +1 -1
  194. package/dist/core/llm/web-dispatcher.d.ts +1 -1
  195. package/dist/core/llm/web-dispatcher.js +15 -15
  196. package/dist/core/llm/web-dispatcher.js.map +1 -1
  197. package/dist/core/logger.d.ts +1 -1
  198. package/dist/core/logger.js +3 -3
  199. package/dist/core/logger.js.map +1 -1
  200. package/dist/core/memo-rpc.js +3 -3
  201. package/dist/core/memo-rpc.js.map +1 -1
  202. package/dist/core/memory-consolidate.js +4 -4
  203. package/dist/core/memory-consolidate.js.map +1 -1
  204. package/dist/core/memory-distill.js +4 -4
  205. package/dist/core/memory-distill.js.map +1 -1
  206. package/dist/core/memory-distiller.js +9 -9
  207. package/dist/core/memory-distiller.js.map +1 -1
  208. package/dist/core/memory-vector.js +9 -9
  209. package/dist/core/memory-vector.js.map +1 -1
  210. package/dist/core/memory.js +2 -2
  211. package/dist/core/memory.js.map +1 -1
  212. package/dist/core/memos.js +6 -6
  213. package/dist/core/memos.js.map +1 -1
  214. package/dist/core/message-sink.js +13 -13
  215. package/dist/core/message-sink.js.map +1 -1
  216. package/dist/core/notification-evaluator.d.ts +2 -2
  217. package/dist/core/notification-evaluator.js +4 -4
  218. package/dist/core/notification-evaluator.js.map +1 -1
  219. package/dist/core/onboarding.js +3 -3
  220. package/dist/core/onboarding.js.map +1 -1
  221. package/dist/core/outbox.js +2 -2
  222. package/dist/core/outbox.js.map +1 -1
  223. package/dist/core/persona.d.ts +1 -1
  224. package/dist/core/persona.d.ts.map +1 -1
  225. package/dist/core/persona.js +2 -2
  226. package/dist/core/persona.js.map +1 -1
  227. package/dist/core/plan-history.js +1 -1
  228. package/dist/core/plan-history.js.map +1 -1
  229. package/dist/core/plan-intent.js +5 -5
  230. package/dist/core/plan-intent.js.map +1 -1
  231. package/dist/core/plan-mode-state.d.ts +1 -1
  232. package/dist/core/plan-mode-state.js +4 -4
  233. package/dist/core/plan-mode-state.js.map +1 -1
  234. package/dist/core/push-rpc.d.ts +1 -1
  235. package/dist/core/push-rpc.js +6 -6
  236. package/dist/core/push-rpc.js.map +1 -1
  237. package/dist/core/registry.d.ts +4 -4
  238. package/dist/core/registry.js +10 -10
  239. package/dist/core/registry.js.map +1 -1
  240. package/dist/core/reminders.js +1 -1
  241. package/dist/core/reminders.js.map +1 -1
  242. package/dist/core/restart-flow.d.ts.map +1 -1
  243. package/dist/core/restart-flow.js +5 -7
  244. package/dist/core/restart-flow.js.map +1 -1
  245. package/dist/core/router.d.ts +1 -1
  246. package/dist/core/router.js +5 -5
  247. package/dist/core/router.js.map +1 -1
  248. package/dist/core/schedule.d.ts +2 -2
  249. package/dist/core/schedule.js +4 -4
  250. package/dist/core/schedule.js.map +1 -1
  251. package/dist/core/self-protect.js +3 -3
  252. package/dist/core/self-protect.js.map +1 -1
  253. package/dist/core/sender-allowlist.js +7 -7
  254. package/dist/core/sender-allowlist.js.map +1 -1
  255. package/dist/core/sensitive-paths.d.ts.map +1 -1
  256. package/dist/core/sensitive-paths.js +1 -2
  257. package/dist/core/sensitive-paths.js.map +1 -1
  258. package/dist/core/session.js +2 -2
  259. package/dist/core/session.js.map +1 -1
  260. package/dist/core/skills/builtin/ECC_NOTICE.md +1 -1
  261. package/dist/core/skills/builtin/agim-memory/SKILL.md +1 -1
  262. package/dist/core/skills/builtin/agim-reminders/SKILL.md +2 -2
  263. package/dist/core/skills/builtin/agim-self/SKILL.md +9 -9
  264. package/dist/core/skills/builtin/agim-skill-discovery/SKILL.md +5 -5
  265. package/dist/core/skills/builtin/image-generation/SKILL.md +2 -2
  266. package/dist/core/skills/builtin/long-goal/SKILL.md +7 -7
  267. package/dist/core/skills/builtin/my/SKILL.md +2 -2
  268. package/dist/core/skills/builtin/skill-creator/SKILL.md +2 -2
  269. package/dist/core/skills/loader.d.ts +4 -4
  270. package/dist/core/skills/loader.js +22 -22
  271. package/dist/core/skills/loader.js.map +1 -1
  272. package/dist/core/skills-rpc.js +1 -1
  273. package/dist/core/skills-rpc.js.map +1 -1
  274. package/dist/core/transcribe.js +13 -13
  275. package/dist/core/transcribe.js.map +1 -1
  276. package/dist/core/tunnel.js +1 -1
  277. package/dist/core/tunnel.js.map +1 -1
  278. package/dist/core/types.d.ts +2 -2
  279. package/dist/core/types.d.ts.map +1 -1
  280. package/dist/core/user-coord-prefs.js +1 -1
  281. package/dist/core/user-coord-prefs.js.map +1 -1
  282. package/dist/core/viewer-config.d.ts +8 -8
  283. package/dist/core/viewer-config.js +17 -17
  284. package/dist/core/viewer-config.js.map +1 -1
  285. package/dist/core/viewer-local.js +4 -4
  286. package/dist/core/viewer-local.js.map +1 -1
  287. package/dist/core/viewer-remote.js +1 -1
  288. package/dist/core/viewer-remote.js.map +1 -1
  289. package/dist/plugins/agents/acp/url-guard.d.ts +1 -1
  290. package/dist/plugins/agents/acp/url-guard.js +2 -2
  291. package/dist/plugins/agents/acp/url-guard.js.map +1 -1
  292. package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts +6 -6
  293. package/dist/plugins/agents/antigravity/ensure-mcp-config.d.ts.map +1 -1
  294. package/dist/plugins/agents/antigravity/ensure-mcp-config.js +12 -12
  295. package/dist/plugins/agents/antigravity/ensure-mcp-config.js.map +1 -1
  296. package/dist/plugins/agents/antigravity/index.js +10 -10
  297. package/dist/plugins/agents/antigravity/index.js.map +1 -1
  298. package/dist/plugins/agents/claude-code/index.d.ts +2 -2
  299. package/dist/plugins/agents/claude-code/index.js +16 -16
  300. package/dist/plugins/agents/claude-code/index.js.map +1 -1
  301. package/dist/plugins/agents/claude-code/mcp-approval-server.js +13 -13
  302. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -1
  303. package/dist/plugins/agents/codex/build-mcp-cli-args.d.ts +4 -4
  304. package/dist/plugins/agents/codex/build-mcp-cli-args.js +14 -14
  305. package/dist/plugins/agents/codex/build-mcp-cli-args.js.map +1 -1
  306. package/dist/plugins/agents/codex/index.d.ts +3 -3
  307. package/dist/plugins/agents/codex/index.js +14 -14
  308. package/dist/plugins/agents/codex/index.js.map +1 -1
  309. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts +5 -5
  310. package/dist/plugins/agents/cursor/ensure-mcp-config.d.ts.map +1 -1
  311. package/dist/plugins/agents/cursor/ensure-mcp-config.js +11 -11
  312. package/dist/plugins/agents/cursor/ensure-mcp-config.js.map +1 -1
  313. package/dist/plugins/agents/cursor/index.d.ts +1 -1
  314. package/dist/plugins/agents/cursor/index.js +12 -12
  315. package/dist/plugins/agents/cursor/index.js.map +1 -1
  316. package/dist/plugins/agents/native/index.d.ts +1 -0
  317. package/dist/plugins/agents/native/index.d.ts.map +1 -1
  318. package/dist/plugins/agents/native/index.js +28 -14
  319. package/dist/plugins/agents/native/index.js.map +1 -1
  320. package/dist/plugins/agents/native/tool-registry.d.ts +3 -3
  321. package/dist/plugins/agents/native/tool-registry.d.ts.map +1 -1
  322. package/dist/plugins/agents/native/tool-registry.js +5 -5
  323. package/dist/plugins/agents/native/tool-registry.js.map +1 -1
  324. package/dist/plugins/agents/opencode/ensure-mcp-config.d.ts +1 -1
  325. package/dist/plugins/agents/opencode/ensure-mcp-config.js +9 -9
  326. package/dist/plugins/agents/opencode/ensure-mcp-config.js.map +1 -1
  327. package/dist/plugins/agents/opencode/index.js +3 -3
  328. package/dist/plugins/agents/opencode/index.js.map +1 -1
  329. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +4 -0
  330. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -1
  331. package/dist/plugins/agents/opencode/opencode-http-adapter.js +16 -12
  332. package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -1
  333. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +2 -2
  334. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -1
  335. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +7 -5
  336. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -1
  337. package/dist/plugins/agents/opencode/serve-manager.d.ts +1 -1
  338. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -1
  339. package/dist/plugins/agents/opencode/serve-manager.js +10 -10
  340. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -1
  341. package/dist/plugins/agents/pi-native/factory.d.ts.map +1 -1
  342. package/dist/plugins/agents/pi-native/factory.js +29 -13
  343. package/dist/plugins/agents/pi-native/factory.js.map +1 -1
  344. package/dist/plugins/agents/pi-native/index.d.ts +14 -3
  345. package/dist/plugins/agents/pi-native/index.d.ts.map +1 -1
  346. package/dist/plugins/agents/pi-native/index.js +58 -4
  347. package/dist/plugins/agents/pi-native/index.js.map +1 -1
  348. package/dist/plugins/agents/pi-native/provider-resolver.d.ts +2 -0
  349. package/dist/plugins/agents/pi-native/provider-resolver.d.ts.map +1 -1
  350. package/dist/plugins/agents/pi-native/provider-resolver.js +9 -1
  351. package/dist/plugins/agents/pi-native/provider-resolver.js.map +1 -1
  352. package/dist/plugins/agents/pi-native/tool-bridge.js +1 -1
  353. package/dist/plugins/agents/pi-native/tool-bridge.js.map +1 -1
  354. package/dist/plugins/agents/pi-native/tools.js +4 -4
  355. package/dist/plugins/agents/pi-native/tools.js.map +1 -1
  356. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.d.ts +1 -1
  357. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js +2 -2
  358. package/dist/plugins/messengers/dingtalk/dingtalk-adapter.js.map +1 -1
  359. package/dist/plugins/messengers/email/email-adapter.js +15 -15
  360. package/dist/plugins/messengers/email/email-adapter.js.map +1 -1
  361. package/dist/plugins/messengers/telegram/media-download.d.ts +1 -1
  362. package/dist/plugins/messengers/telegram/media-download.js +4 -4
  363. package/dist/plugins/messengers/telegram/media-download.js.map +1 -1
  364. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +1 -1
  365. package/dist/plugins/messengers/telegram/telegram-adapter.js +3 -3
  366. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -1
  367. package/dist/plugins/messengers/wechat/context-store.js +1 -1
  368. package/dist/plugins/messengers/wechat/context-store.js.map +1 -1
  369. package/dist/plugins/messengers/wechat/ilink-adapter.js +1 -1
  370. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -1
  371. package/dist/plugins/messengers/wechat/ilink-client.js +1 -1
  372. package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -1
  373. package/dist/plugins/messengers/wechat/media-download.js +1 -1
  374. package/dist/plugins/messengers/wechat/media-download.js.map +1 -1
  375. package/dist/scripts/migrate-gcj02-to-wgs84.js +1 -1
  376. package/dist/scripts/migrate-gcj02-to-wgs84.js.map +1 -1
  377. package/dist/web/public/assets/a2a-CTsDMefo.js +7 -0
  378. package/dist/web/public/assets/a2a-CTsDMefo.js.map +1 -0
  379. package/dist/web/public/assets/{activity-BnlFGipw.js → activity-ul8Os7Pz.js} +2 -2
  380. package/dist/web/public/assets/{activity-BnlFGipw.js.map → activity-ul8Os7Pz.js.map} +1 -1
  381. package/dist/web/public/assets/{admins-CH84Rw1d.js → admins-ByMAuquy.js} +3 -3
  382. package/dist/web/public/assets/{admins-CH84Rw1d.js.map → admins-ByMAuquy.js.map} +1 -1
  383. package/dist/web/public/assets/agents-Ds1zyxBj.js +2 -0
  384. package/dist/web/public/assets/agents-Ds1zyxBj.js.map +1 -0
  385. package/dist/web/public/assets/{approvals-DnzjbDR6.js → approvals-DOWlWI7Z.js} +3 -3
  386. package/dist/web/public/assets/{approvals-DnzjbDR6.js.map → approvals-DOWlWI7Z.js.map} +1 -1
  387. package/dist/web/public/assets/{arrow-down-DxlRHrs8.js → arrow-down-7i0xwCI2.js} +2 -2
  388. package/dist/web/public/assets/{arrow-down-DxlRHrs8.js.map → arrow-down-7i0xwCI2.js.map} +1 -1
  389. package/dist/web/public/assets/arrow-right-A889Wof8.js +7 -0
  390. package/dist/web/public/assets/arrow-right-A889Wof8.js.map +1 -0
  391. package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js → arrow-up-Dm0U4-6U.js} +2 -2
  392. package/dist/web/public/assets/{arrow-up-CAiQ2jy-.js.map → arrow-up-Dm0U4-6U.js.map} +1 -1
  393. package/dist/web/public/assets/{asks-DyUQopay.js → asks-DGuBsrJ7.js} +3 -3
  394. package/dist/web/public/assets/{asks-DyUQopay.js.map → asks-DGuBsrJ7.js.map} +1 -1
  395. package/dist/web/public/assets/{audit-BVHTMS82.js → audit-BRXsplJ2.js} +2 -2
  396. package/dist/web/public/assets/{audit-BVHTMS82.js.map → audit-BRXsplJ2.js.map} +1 -1
  397. package/dist/web/public/assets/{bell-D7iS7ctN.js → bell-B-UdeJsp.js} +2 -2
  398. package/dist/web/public/assets/{bell-D7iS7ctN.js.map → bell-B-UdeJsp.js.map} +1 -1
  399. package/dist/web/public/assets/bgjobs-CcRiffyJ.js +2 -0
  400. package/dist/web/public/assets/bgjobs-CcRiffyJ.js.map +1 -0
  401. package/dist/web/public/assets/book-open-CSCq5cjL.js +7 -0
  402. package/dist/web/public/assets/book-open-CSCq5cjL.js.map +1 -0
  403. package/dist/web/public/assets/{brain-CCF25Egu.js → brain-Dl4DF5kX.js} +2 -2
  404. package/dist/web/public/assets/{brain-CCF25Egu.js.map → brain-Dl4DF5kX.js.map} +1 -1
  405. package/dist/web/public/assets/{briefcase-BMLMD8nM.js → briefcase-CeKUkFSq.js} +2 -2
  406. package/dist/web/public/assets/{briefcase-BMLMD8nM.js.map → briefcase-CeKUkFSq.js.map} +1 -1
  407. package/dist/web/public/assets/chat-rLJMdJBk.js +12 -0
  408. package/dist/web/public/assets/chat-rLJMdJBk.js.map +1 -0
  409. package/dist/web/public/assets/{chevron-left-BDO3vw8G.js → chevron-left-01fAFVpo.js} +2 -2
  410. package/dist/web/public/assets/{chevron-left-BDO3vw8G.js.map → chevron-left-01fAFVpo.js.map} +1 -1
  411. package/dist/web/public/assets/{chevron-right-5ZUC2opg.js → chevron-right-CFRb-SM_.js} +3 -3
  412. package/dist/web/public/assets/{chevron-right-5ZUC2opg.js.map → chevron-right-CFRb-SM_.js.map} +1 -1
  413. package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js → circle-check-big-DBg2BD6o.js} +2 -2
  414. package/dist/web/public/assets/{circle-check-big-DHAHqUlS.js.map → circle-check-big-DBg2BD6o.js.map} +1 -1
  415. package/dist/web/public/assets/{circle-x-7VaoZ7dY.js → circle-x-CqFMzO-x.js} +2 -2
  416. package/dist/web/public/assets/{circle-x-7VaoZ7dY.js.map → circle-x-CqFMzO-x.js.map} +1 -1
  417. package/dist/web/public/assets/clipboard-list-lnqdk2_J.js +7 -0
  418. package/dist/web/public/assets/clipboard-list-lnqdk2_J.js.map +1 -0
  419. package/dist/web/public/assets/{clock-ZPVXnd6V.js → clock-4hd1joQe.js} +3 -3
  420. package/dist/web/public/assets/{clock-ZPVXnd6V.js.map → clock-4hd1joQe.js.map} +1 -1
  421. package/dist/web/public/assets/confirm-dialog-BDb0NLny.js +2 -0
  422. package/dist/web/public/assets/{confirm-dialog-CgpJL9oN.js.map → confirm-dialog-BDb0NLny.js.map} +1 -1
  423. package/dist/web/public/assets/{copy-BaZl52tH.js → copy-CD4A7VD8.js} +3 -3
  424. package/dist/web/public/assets/{copy-BaZl52tH.js.map → copy-CD4A7VD8.js.map} +1 -1
  425. package/dist/web/public/assets/dashboard-CG3WiG7h.js +2 -0
  426. package/dist/web/public/assets/dashboard-CG3WiG7h.js.map +1 -0
  427. package/dist/web/public/assets/{data-table-BLYG79TX.js → data-table-BkUshOZz.js} +2 -2
  428. package/dist/web/public/assets/{data-table-BLYG79TX.js.map → data-table-BkUshOZz.js.map} +1 -1
  429. package/dist/web/public/assets/database-lQzk64rV.js +7 -0
  430. package/dist/web/public/assets/database-lQzk64rV.js.map +1 -0
  431. package/dist/web/public/assets/distill-CPurVW3v.js +7 -0
  432. package/dist/web/public/assets/distill-CPurVW3v.js.map +1 -0
  433. package/dist/web/public/assets/{download-bzCepctg.js → download-CVZnHcwj.js} +2 -2
  434. package/dist/web/public/assets/{download-bzCepctg.js.map → download-CVZnHcwj.js.map} +1 -1
  435. package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js +7 -0
  436. package/dist/web/public/assets/dropdown-menu-BNH5SrVb.js.map +1 -0
  437. package/dist/web/public/assets/email-YlI4MWLp.js +7 -0
  438. package/dist/web/public/assets/email-YlI4MWLp.js.map +1 -0
  439. package/dist/web/public/assets/{empty-state-96qpPTNg.js → empty-state-CuiqdZiB.js} +2 -2
  440. package/dist/web/public/assets/{empty-state-96qpPTNg.js.map → empty-state-CuiqdZiB.js.map} +1 -1
  441. package/dist/web/public/assets/{external-link-J4nIlCem.js → external-link-1WPpVvdu.js} +2 -2
  442. package/dist/web/public/assets/{external-link-J4nIlCem.js.map → external-link-1WPpVvdu.js.map} +1 -1
  443. package/dist/web/public/assets/{eye-BvsBLK42.js → eye-BfPyNFzk.js} +2 -2
  444. package/dist/web/public/assets/{eye-BvsBLK42.js.map → eye-BfPyNFzk.js.map} +1 -1
  445. package/dist/web/public/assets/{facts-DMucDXYd.js → facts-xT_24pH8.js} +2 -2
  446. package/dist/web/public/assets/{facts-DMucDXYd.js.map → facts-xT_24pH8.js.map} +1 -1
  447. package/dist/web/public/assets/file-text-BxfdLM0-.js +7 -0
  448. package/dist/web/public/assets/file-text-BxfdLM0-.js.map +1 -0
  449. package/dist/web/public/assets/{goals-B9ETHgL0.js → goals-C8ZQfbhj.js} +3 -3
  450. package/dist/web/public/assets/{goals-B9ETHgL0.js.map → goals-C8ZQfbhj.js.map} +1 -1
  451. package/dist/web/public/assets/health-A2StNEfn.js +2 -0
  452. package/dist/web/public/assets/{health-DLzZ7KHc.js.map → health-A2StNEfn.js.map} +1 -1
  453. package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js → heart-pulse-DXlE9oic.js} +2 -2
  454. package/dist/web/public/assets/{heart-pulse-CVEeD2sz.js.map → heart-pulse-DXlE9oic.js.map} +1 -1
  455. package/dist/web/public/assets/{heartbeat-B1BEBHge.js → heartbeat-ClO5gJrj.js} +3 -3
  456. package/dist/web/public/assets/{heartbeat-B1BEBHge.js.map → heartbeat-ClO5gJrj.js.map} +1 -1
  457. package/dist/web/public/assets/hot-bfTA-V_z.js +7 -0
  458. package/dist/web/public/assets/{hot-Yc7iad0D.js.map → hot-bfTA-V_z.js.map} +1 -1
  459. package/dist/web/public/assets/index-Bi2qWb-u.css +1 -0
  460. package/dist/web/public/assets/index-DCfdN5R7.js +244 -0
  461. package/dist/web/public/assets/index-DCfdN5R7.js.map +1 -0
  462. package/dist/web/public/assets/{injection-Ca-9gbo0.js → injection-omvCR6-p.js} +2 -2
  463. package/dist/web/public/assets/{injection-Ca-9gbo0.js.map → injection-omvCR6-p.js.map} +1 -1
  464. package/dist/web/public/assets/{installed-Zz34apdi.js → installed-DL6r3ktm.js} +4 -9
  465. package/dist/web/public/assets/installed-DL6r3ktm.js.map +1 -0
  466. package/dist/web/public/assets/jobs-Biy5lYd4.js +2 -0
  467. package/dist/web/public/assets/jobs-Biy5lYd4.js.map +1 -0
  468. package/dist/web/public/assets/layout-BLm6NJ3V.js +2 -0
  469. package/dist/web/public/assets/layout-BLm6NJ3V.js.map +1 -0
  470. package/dist/web/public/assets/layout-BTKafRVZ.js +2 -0
  471. package/dist/web/public/assets/layout-BTKafRVZ.js.map +1 -0
  472. package/dist/web/public/assets/layout-Bm-2s2fp.js +2 -0
  473. package/dist/web/public/assets/layout-Bm-2s2fp.js.map +1 -0
  474. package/dist/web/public/assets/layout-DsZ8eR4i.js +2 -0
  475. package/dist/web/public/assets/layout-DsZ8eR4i.js.map +1 -0
  476. package/dist/web/public/assets/{layout-CtDc2i7w.js → layout-sxvovjEH.js} +2 -2
  477. package/dist/web/public/assets/{layout-CtDc2i7w.js.map → layout-sxvovjEH.js.map} +1 -1
  478. package/dist/web/public/assets/llm-JjZDbBvJ.js +37 -0
  479. package/dist/web/public/assets/llm-JjZDbBvJ.js.map +1 -0
  480. package/dist/web/public/assets/loader-circle-DDdmcH0k.js +7 -0
  481. package/dist/web/public/assets/{loader-circle-D8L1w9c1.js.map → loader-circle-DDdmcH0k.js.map} +1 -1
  482. package/dist/web/public/assets/{map-pin--GMunU9n.js → map-pin-C_jAxukI.js} +2 -2
  483. package/dist/web/public/assets/{map-pin--GMunU9n.js.map → map-pin-C_jAxukI.js.map} +1 -1
  484. package/dist/web/public/assets/{mcp-DhnXhO9B.js → mcp-vKajK1F8.js} +3 -3
  485. package/dist/web/public/assets/{mcp-DhnXhO9B.js.map → mcp-vKajK1F8.js.map} +1 -1
  486. package/dist/web/public/assets/memos-DAt4k3DO.js +7 -0
  487. package/dist/web/public/assets/memos-DAt4k3DO.js.map +1 -0
  488. package/dist/web/public/assets/messengers-GYVTFlAj.js +2 -0
  489. package/dist/web/public/assets/messengers-GYVTFlAj.js.map +1 -0
  490. package/dist/web/public/assets/{mobile-CUZ359rQ.js → mobile-VUyTo40E.js} +3 -3
  491. package/dist/web/public/assets/{mobile-CUZ359rQ.js.map → mobile-VUyTo40E.js.map} +1 -1
  492. package/dist/web/public/assets/{network-BBdRdrH_.js → network-BUeWK3bs.js} +2 -2
  493. package/dist/web/public/assets/{network-BBdRdrH_.js.map → network-BUeWK3bs.js.map} +1 -1
  494. package/dist/web/public/assets/outbox-CEE0rwN3.js +2 -0
  495. package/dist/web/public/assets/outbox-CEE0rwN3.js.map +1 -0
  496. package/dist/web/public/assets/overview-BSOZ5gTD.js +12 -0
  497. package/dist/web/public/assets/overview-BSOZ5gTD.js.map +1 -0
  498. package/dist/web/public/assets/overview-COop5K2Y.js +12 -0
  499. package/dist/web/public/assets/overview-COop5K2Y.js.map +1 -0
  500. package/dist/web/public/assets/overview-DeH5ud6d.js +2 -0
  501. package/dist/web/public/assets/overview-DeH5ud6d.js.map +1 -0
  502. package/dist/web/public/assets/{pagination-DcsgDXXM.js → pagination-BBicLzXP.js} +3 -3
  503. package/dist/web/public/assets/{pagination-DcsgDXXM.js.map → pagination-BBicLzXP.js.map} +1 -1
  504. package/dist/web/public/assets/persona-CElXQZ4p.js +2 -0
  505. package/dist/web/public/assets/{persona-ig2ac4mY.js.map → persona-CElXQZ4p.js.map} +1 -1
  506. package/dist/web/public/assets/{plans-Bzbk8eUr.js → plans-Bo5LlLeH.js} +3 -8
  507. package/dist/web/public/assets/plans-Bo5LlLeH.js.map +1 -0
  508. package/dist/web/public/assets/{play-Di1jqulh.js → play-DX5wp4WH.js} +2 -2
  509. package/dist/web/public/assets/{play-Di1jqulh.js.map → play-DX5wp4WH.js.map} +1 -1
  510. package/dist/web/public/assets/{plus-C2zyJ1mF.js → plus-DH4J_YhN.js} +2 -2
  511. package/dist/web/public/assets/{plus-C2zyJ1mF.js.map → plus-DH4J_YhN.js.map} +1 -1
  512. package/dist/web/public/assets/policy-BrgOuDt_.js +2 -0
  513. package/dist/web/public/assets/policy-BrgOuDt_.js.map +1 -0
  514. package/dist/web/public/assets/{qr-code-C-ACsKv_.js → qr-code-YrEuhMPC.js} +2 -2
  515. package/dist/web/public/assets/{qr-code-C-ACsKv_.js.map → qr-code-YrEuhMPC.js.map} +1 -1
  516. package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js → refresh-ccw-DlAd-eTQ.js} +2 -2
  517. package/dist/web/public/assets/{refresh-ccw-7HdadG5V.js.map → refresh-ccw-DlAd-eTQ.js.map} +1 -1
  518. package/dist/web/public/assets/{reminders-BDeiVYTC.js → reminders-DBEE0zXG.js} +3 -3
  519. package/dist/web/public/assets/{reminders-BDeiVYTC.js.map → reminders-DBEE0zXG.js.map} +1 -1
  520. package/dist/web/public/assets/{save-BYFmz9gD.js → save-BDOtZrfp.js} +2 -2
  521. package/dist/web/public/assets/{save-BYFmz9gD.js.map → save-BDOtZrfp.js.map} +1 -1
  522. package/dist/web/public/assets/schedules-DAyhVI8-.js +2 -0
  523. package/dist/web/public/assets/schedules-DAyhVI8-.js.map +1 -0
  524. package/dist/web/public/assets/search-55mtgHrB.js +17 -0
  525. package/dist/web/public/assets/search-55mtgHrB.js.map +1 -0
  526. package/dist/web/public/assets/{search-DxkvV-8p.js → search-CAICU3aU.js} +2 -2
  527. package/dist/web/public/assets/{search-DxkvV-8p.js.map → search-CAICU3aU.js.map} +1 -1
  528. package/dist/web/public/assets/security-CbP4QgVp.js +2 -0
  529. package/dist/web/public/assets/security-CbP4QgVp.js.map +1 -0
  530. package/dist/web/public/assets/server-Dg4e8pvm.js +7 -0
  531. package/dist/web/public/assets/server-Dg4e8pvm.js.map +1 -0
  532. package/dist/web/public/assets/service-gWZa3sup.js +7 -0
  533. package/dist/web/public/assets/service-gWZa3sup.js.map +1 -0
  534. package/dist/web/public/assets/{shield-alert-DXGk9Rak.js → shield-alert-DOKK9EnJ.js} +2 -2
  535. package/dist/web/public/assets/{shield-alert-DXGk9Rak.js.map → shield-alert-DOKK9EnJ.js.map} +1 -1
  536. package/dist/web/public/assets/sparkles-G0QIs9nP.js +7 -0
  537. package/dist/web/public/assets/sparkles-G0QIs9nP.js.map +1 -0
  538. package/dist/web/public/assets/start-D-abhl3q.js +2 -0
  539. package/dist/web/public/assets/start-D-abhl3q.js.map +1 -0
  540. package/dist/web/public/assets/{status-badge-D0nbFSom.js → status-badge-CyLdpsXq.js} +2 -2
  541. package/dist/web/public/assets/{status-badge-D0nbFSom.js.map → status-badge-CyLdpsXq.js.map} +1 -1
  542. package/dist/web/public/assets/{subtasks-DFiAXvDp.js → subtasks-BnEjSGUR.js} +3 -3
  543. package/dist/web/public/assets/{subtasks-DFiAXvDp.js.map → subtasks-BnEjSGUR.js.map} +1 -1
  544. package/dist/web/public/assets/{table-_WsrnZ_T.js → table-sCMZBe_Z.js} +2 -2
  545. package/dist/web/public/assets/{table-_WsrnZ_T.js.map → table-sCMZBe_Z.js.map} +1 -1
  546. package/dist/web/public/assets/terminal-_pXeEjXG.js +7 -0
  547. package/dist/web/public/assets/terminal-_pXeEjXG.js.map +1 -0
  548. package/dist/web/public/assets/{topn-C2PHE4tX.js → topn-D1B-gS1M.js} +3 -3
  549. package/dist/web/public/assets/{topn-C2PHE4tX.js.map → topn-D1B-gS1M.js.map} +1 -1
  550. package/dist/web/public/assets/{trash-2-1Km439fW.js → trash-2-D2x2UPuZ.js} +2 -2
  551. package/dist/web/public/assets/{trash-2-1Km439fW.js.map → trash-2-D2x2UPuZ.js.map} +1 -1
  552. package/dist/web/public/assets/use-a2a-C98e2Via.js +2 -0
  553. package/dist/web/public/assets/use-a2a-C98e2Via.js.map +1 -0
  554. package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js → use-agim-skills-BbuJP3NT.js} +2 -2
  555. package/dist/web/public/assets/{use-agim-skills-COSqZrdH.js.map → use-agim-skills-BbuJP3NT.js.map} +1 -1
  556. package/dist/web/public/assets/use-background-tasks-CwFmOokw.js +2 -0
  557. package/dist/web/public/assets/{use-background-tasks-wCL7jn68.js.map → use-background-tasks-CwFmOokw.js.map} +1 -1
  558. package/dist/web/public/assets/use-jobs-BJjeJ5lh.js +2 -0
  559. package/dist/web/public/assets/use-jobs-BJjeJ5lh.js.map +1 -0
  560. package/dist/web/public/assets/use-memory-CXDwKCco.js +2 -0
  561. package/dist/web/public/assets/{use-memory-B9oRyQC8.js.map → use-memory-CXDwKCco.js.map} +1 -1
  562. package/dist/web/public/assets/use-observability-CY5ZUPrC.js +2 -0
  563. package/dist/web/public/assets/{use-observability-DGkN80qa.js.map → use-observability-CY5ZUPrC.js.map} +1 -1
  564. package/dist/web/public/assets/use-outbox-DT_XWB_7.js +7 -0
  565. package/dist/web/public/assets/use-outbox-DT_XWB_7.js.map +1 -0
  566. package/dist/web/public/assets/use-schedules-D4W8fMwo.js +7 -0
  567. package/dist/web/public/assets/use-schedules-D4W8fMwo.js.map +1 -0
  568. package/dist/web/public/assets/use-settings-DGIjmUX0.js +2 -0
  569. package/dist/web/public/assets/use-settings-DGIjmUX0.js.map +1 -0
  570. package/dist/web/public/assets/use-skills-D2bMM580.js +7 -0
  571. package/dist/web/public/assets/use-skills-D2bMM580.js.map +1 -0
  572. package/dist/web/public/assets/use-vector-BYOFwjU0.js +2 -0
  573. package/dist/web/public/assets/use-vector-BYOFwjU0.js.map +1 -0
  574. package/dist/web/public/assets/use-workspace-CuytyHwb.js +2 -0
  575. package/dist/web/public/assets/{use-workspace-BDXP5XO1.js.map → use-workspace-CuytyHwb.js.map} +1 -1
  576. package/dist/web/public/assets/vector-CL8ezpSR.js +2 -0
  577. package/dist/web/public/assets/vector-CL8ezpSR.js.map +1 -0
  578. package/dist/web/public/assets/viewer-CD0iEfPU.js +7 -0
  579. package/dist/web/public/assets/viewer-CD0iEfPU.js.map +1 -0
  580. package/dist/web/public/assets/workspace-BA1_hso3.js +17 -0
  581. package/dist/web/public/assets/workspace-BA1_hso3.js.map +1 -0
  582. package/dist/web/public/assets/workspaces-DyGLJUgB.js +7 -0
  583. package/dist/web/public/assets/workspaces-DyGLJUgB.js.map +1 -0
  584. package/dist/web/public/index.html +2 -2
  585. package/dist/web/public/loc.html +1 -1
  586. package/dist/web/public/login.html +2 -2
  587. package/dist/web/server.d.ts +2 -5
  588. package/dist/web/server.d.ts.map +1 -1
  589. package/dist/web/server.js +256 -122
  590. package/dist/web/server.js.map +1 -1
  591. package/package.json +2 -3
  592. package/dist/core/llm/imhub-dispatcher.d.ts.map +0 -1
  593. package/dist/core/llm/imhub-dispatcher.js.map +0 -1
  594. package/dist/web/public/assets/a2a-CZxwvgvh.js +0 -7
  595. package/dist/web/public/assets/a2a-CZxwvgvh.js.map +0 -1
  596. package/dist/web/public/assets/agents-CFB4Uj6b.js +0 -7
  597. package/dist/web/public/assets/agents-CFB4Uj6b.js.map +0 -1
  598. package/dist/web/public/assets/bgjobs-BYCQhd_1.js +0 -7
  599. package/dist/web/public/assets/bgjobs-BYCQhd_1.js.map +0 -1
  600. package/dist/web/public/assets/chat-DPkKy5y_.js +0 -17
  601. package/dist/web/public/assets/chat-DPkKy5y_.js.map +0 -1
  602. package/dist/web/public/assets/circle-check-COhM5JsK.js +0 -7
  603. package/dist/web/public/assets/circle-check-COhM5JsK.js.map +0 -1
  604. package/dist/web/public/assets/confirm-dialog-CgpJL9oN.js +0 -2
  605. package/dist/web/public/assets/distill-D9p8O8Jf.js +0 -7
  606. package/dist/web/public/assets/distill-D9p8O8Jf.js.map +0 -1
  607. package/dist/web/public/assets/email-Douv-rZ5.js +0 -7
  608. package/dist/web/public/assets/email-Douv-rZ5.js.map +0 -1
  609. package/dist/web/public/assets/health-DLzZ7KHc.js +0 -2
  610. package/dist/web/public/assets/hot-Yc7iad0D.js +0 -12
  611. package/dist/web/public/assets/index-DY2Zglku.js +0 -209
  612. package/dist/web/public/assets/index-DY2Zglku.js.map +0 -1
  613. package/dist/web/public/assets/index-DknVjPYB.css +0 -1
  614. package/dist/web/public/assets/installed-Zz34apdi.js.map +0 -1
  615. package/dist/web/public/assets/jobs-CtVRpl0r.js +0 -2
  616. package/dist/web/public/assets/jobs-CtVRpl0r.js.map +0 -1
  617. package/dist/web/public/assets/layout-BTCLgkgN.js +0 -2
  618. package/dist/web/public/assets/layout-BTCLgkgN.js.map +0 -1
  619. package/dist/web/public/assets/layout-Cxch59sI.js +0 -2
  620. package/dist/web/public/assets/layout-Cxch59sI.js.map +0 -1
  621. package/dist/web/public/assets/layout-DnANw2Q2.js +0 -2
  622. package/dist/web/public/assets/layout-DnANw2Q2.js.map +0 -1
  623. package/dist/web/public/assets/layout-yIZG87fq.js +0 -2
  624. package/dist/web/public/assets/layout-yIZG87fq.js.map +0 -1
  625. package/dist/web/public/assets/llm-CMMa85Ig.js +0 -27
  626. package/dist/web/public/assets/llm-CMMa85Ig.js.map +0 -1
  627. package/dist/web/public/assets/loader-circle-D8L1w9c1.js +0 -7
  628. package/dist/web/public/assets/memos-DQZc7llR.js +0 -12
  629. package/dist/web/public/assets/memos-DQZc7llR.js.map +0 -1
  630. package/dist/web/public/assets/messengers-DwSmauLs.js +0 -2
  631. package/dist/web/public/assets/messengers-DwSmauLs.js.map +0 -1
  632. package/dist/web/public/assets/outbox-CmN0U35l.js +0 -7
  633. package/dist/web/public/assets/outbox-CmN0U35l.js.map +0 -1
  634. package/dist/web/public/assets/persona-ig2ac4mY.js +0 -2
  635. package/dist/web/public/assets/plans-Bzbk8eUr.js.map +0 -1
  636. package/dist/web/public/assets/policy-yD1c2Pcn.js +0 -2
  637. package/dist/web/public/assets/policy-yD1c2Pcn.js.map +0 -1
  638. package/dist/web/public/assets/schedules-BddzBrxI.js +0 -7
  639. package/dist/web/public/assets/schedules-BddzBrxI.js.map +0 -1
  640. package/dist/web/public/assets/search-B8PlbtLg.js +0 -17
  641. package/dist/web/public/assets/search-B8PlbtLg.js.map +0 -1
  642. package/dist/web/public/assets/security-DpOGp3nS.js +0 -2
  643. package/dist/web/public/assets/security-DpOGp3nS.js.map +0 -1
  644. package/dist/web/public/assets/service-BsY8CaNG.js +0 -7
  645. package/dist/web/public/assets/service-BsY8CaNG.js.map +0 -1
  646. package/dist/web/public/assets/use-background-tasks-wCL7jn68.js +0 -2
  647. package/dist/web/public/assets/use-memory-B9oRyQC8.js +0 -2
  648. package/dist/web/public/assets/use-observability-DGkN80qa.js +0 -2
  649. package/dist/web/public/assets/use-settings-Co-iafXD.js +0 -2
  650. package/dist/web/public/assets/use-settings-Co-iafXD.js.map +0 -1
  651. package/dist/web/public/assets/use-workspace-BDXP5XO1.js +0 -2
  652. package/dist/web/public/assets/vector-BfIEx8xX.js +0 -2
  653. package/dist/web/public/assets/vector-BfIEx8xX.js.map +0 -1
  654. package/dist/web/public/assets/viewer-BPMZkT05.js +0 -12
  655. package/dist/web/public/assets/viewer-BPMZkT05.js.map +0 -1
  656. package/dist/web/public/assets/workspace-BbCchiHE.js +0 -17
  657. package/dist/web/public/assets/workspace-BbCchiHE.js.map +0 -1
  658. package/dist/web/public/assets/workspaces-5HE7pjdA.js +0 -7
  659. package/dist/web/public/assets/workspaces-5HE7pjdA.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  // Web chat server — HTTP + WebSocket for browser-based agent interaction
2
2
  import { createServer } from 'node:http';
3
+ import { createServer as createNetServer } from 'node:net';
3
4
  import { readFileSync, existsSync, readdirSync } from 'node:fs';
4
5
  import { readdir, stat, readFile, writeFile, rename, unlink, realpath, open } from 'node:fs/promises';
5
6
  import { join, dirname, resolve as resolvePath, sep as pathSep, relative as relativePath } from 'node:path';
@@ -109,7 +110,7 @@ function hasForwardedPeerHeaders(req) {
109
110
  function isTrustedLoopbackPeer(req) {
110
111
  if (!isLoopbackPeer(req))
111
112
  return false;
112
- if (isEnvOff('IMHUB_TRUST_LOOPBACK'))
113
+ if (isEnvOff('AGIM_TRUST_LOOPBACK'))
113
114
  return false;
114
115
  // A reverse proxy on the same host makes remote users appear as
115
116
  // 127.0.0.1. Treat forwarded requests as network traffic and require
@@ -183,7 +184,7 @@ function extractToken(req, url) {
183
184
  /** Returns true if the request is authenticated (or auth not required). */
184
185
  function checkAuth(req, res, url) {
185
186
  // 1. Disabled by env → pass through.
186
- if ((process.env.IMHUB_WEB_AUTH || '').toLowerCase() === 'off')
187
+ if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
187
188
  return true;
188
189
  // 2. Trusted loopback → pass through (local CLI / browser-on-same-host).
189
190
  if (isTrustedLoopbackPeer(req))
@@ -242,7 +243,7 @@ function verifyTokenSync(raw) {
242
243
  * - otherwise → 'web:unknown' (request should already have been rejected
243
244
  * by checkAuth — this branch exists for defensive logging). */
244
245
  function getRequestActor(req) {
245
- if ((process.env.IMHUB_WEB_AUTH || '').toLowerCase() === 'off')
246
+ if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
246
247
  return 'web:auth-off';
247
248
  if (isTrustedLoopbackPeer(req))
248
249
  return 'web:loopback';
@@ -266,17 +267,17 @@ function getRequestActor(req) {
266
267
  * can't elevate to control plane (R13 A1).
267
268
  *
268
269
  * Trust order:
269
- * 1. IMHUB_WEB_AUTH=off → admin (operator explicitly disabled auth)
270
+ * 1. AGIM_WEB_AUTH=off → admin (operator explicitly disabled auth)
270
271
  * 2. Trusted loopback → admin (operator on the host)
271
272
  * 3. Bearer token → token.role === 'admin'
272
273
  * 4. Otherwise → not admin
273
274
  *
274
275
  * Note: when no token has been created yet (pre-bootstrap), the
275
276
  * trusted-loopback branch still grants admin so the CLI bootstrap flow
276
- * works. Disable it with IMHUB_TRUST_LOOPBACK=off. Reverse-proxied
277
+ * works. Disable it with AGIM_TRUST_LOOPBACK=off. Reverse-proxied
277
278
  * requests with Forwarded / X-Forwarded-* peer headers never qualify. */
278
279
  function isRequestAdmin(req) {
279
- if ((process.env.IMHUB_WEB_AUTH || '').toLowerCase() === 'off')
280
+ if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
280
281
  return true;
281
282
  if (isTrustedLoopbackPeer(req))
282
283
  return true;
@@ -330,9 +331,44 @@ export function createSerialQueue() {
330
331
  /**
331
332
  * Start the web chat server
332
333
  */
334
+ async function assertPortCanListen(port, bindHost) {
335
+ await new Promise((resolve, reject) => {
336
+ const probe = createNetServer();
337
+ const cleanup = () => {
338
+ probe.off('error', onError);
339
+ probe.off('listening', onListening);
340
+ };
341
+ const onError = (err) => {
342
+ cleanup();
343
+ try {
344
+ probe.close();
345
+ }
346
+ catch { /* not listening */ }
347
+ reject(err);
348
+ };
349
+ const onListening = () => {
350
+ cleanup();
351
+ probe.close(() => resolve());
352
+ };
353
+ probe.once('error', onError);
354
+ probe.once('listening', onListening);
355
+ try {
356
+ probe.listen(port, bindHost);
357
+ }
358
+ catch (err) {
359
+ cleanup();
360
+ try {
361
+ probe.close();
362
+ }
363
+ catch { /* not listening */ }
364
+ reject(err);
365
+ }
366
+ });
367
+ }
333
368
  export async function startWebServer(options) {
334
369
  const port = options.port || DEFAULT_PORT;
335
- const bindHost = process.env.IMHUB_WEB_BIND || '127.0.0.1';
370
+ const bindHost = process.env.AGIM_WEB_BIND || '127.0.0.1';
371
+ await assertPortCanListen(port, bindHost);
336
372
  const clients = new Map();
337
373
  // R9: threadId → tokenId ownership. A WS peer claims a threadId on
338
374
  // first connection (verifyClient already verified the token); later
@@ -344,7 +380,7 @@ export async function startWebServer(options) {
344
380
  // v1.1.10+: token-based auth for the web console.
345
381
  // ─ loopback peers (127.0.0.1 / ::1) bypass auth (local CLI / curl)
346
382
  // ─ public viewer pages (/v/:id, /loc, /l/<token>) remain public
347
- // ─ IMHUB_WEB_AUTH=off disables the gate entirely (for ops with proxy auth)
383
+ // ─ AGIM_WEB_AUTH=off disables the gate entirely (for ops with proxy auth)
348
384
  // On first start, bootstrapIfEmpty() generates a one-time bootstrap token
349
385
  // and prints it to stdout + the logger so the operator finds it in journalctl.
350
386
  const accessTokenModule = await import('../core/access-token.js');
@@ -361,16 +397,16 @@ export async function startWebServer(options) {
361
397
  webLog.warn({
362
398
  event: 'web.auth_disabled_on_public_bind',
363
399
  bind: bindHost,
364
- }, 'IMHUB_WEB_AUTH=off + public bind — auth deliberately off, ensure your reverse proxy handles access control');
400
+ }, 'AGIM_WEB_AUTH=off + public bind — auth deliberately off, ensure your reverse proxy handles access control');
365
401
  }
366
402
  // R13 C2 — when binding to a non-loopback address, the operator
367
403
  // almost certainly intends to put a TLS-terminating reverse proxy
368
404
  // in front of agim. We can't reliably detect from inside whether
369
405
  // that's been done (X-Forwarded-Proto could be forged), so we
370
406
  // surface a one-time banner + audit row at boot. Suppress with
371
- // IMHUB_WEB_TLS_ACK=1 for the operator who's already done the
407
+ // AGIM_WEB_TLS_ACK=1 for the operator who's already done the
372
408
  // checklist and wants quiet logs.
373
- if (isPublicBind && process.env.IMHUB_WEB_TLS_ACK !== '1') {
409
+ if (isPublicBind && process.env.AGIM_WEB_TLS_ACK !== '1') {
374
410
  const banner = [
375
411
  '',
376
412
  '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
@@ -383,7 +419,7 @@ export async function startWebServer(options) {
383
419
  ' any network you do not control.',
384
420
  '',
385
421
  ' Silence this banner once your terminator is verified:',
386
- ' IMHUB_WEB_TLS_ACK=1',
422
+ ' AGIM_WEB_TLS_ACK=1',
387
423
  '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━',
388
424
  '',
389
425
  ].join('\n');
@@ -392,7 +428,7 @@ export async function startWebServer(options) {
392
428
  event: 'web.public_bind_no_tls_ack',
393
429
  bind: bindHost,
394
430
  port,
395
- }, `non-loopback bind without IMHUB_WEB_TLS_ACK=1 — confirm reverse-proxy TLS termination`);
431
+ }, `non-loopback bind without AGIM_WEB_TLS_ACK=1 — confirm reverse-proxy TLS termination`);
396
432
  try {
397
433
  void (async () => {
398
434
  const { logAuditEvent } = await import('../core/audit-log.js');
@@ -411,8 +447,8 @@ export async function startWebServer(options) {
411
447
  event: 'web.auth_mode',
412
448
  bind: bindHost,
413
449
  enabled: isAuthEnabled(),
414
- trustLoopback: !isEnvOff('IMHUB_TRUST_LOOPBACK'),
415
- }, `Web console auth: ${isAuthEnabled() ? 'token-gated' : 'disabled (IMHUB_WEB_AUTH=off)'}`);
450
+ trustLoopback: !isEnvOff('AGIM_TRUST_LOOPBACK'),
451
+ }, `Web console auth: ${isAuthEnabled() ? 'token-gated' : 'disabled (AGIM_WEB_AUTH=off)'}`);
416
452
  // HTTP request handler — static files + REST API
417
453
  const httpServer = createServer(async (req, res) => {
418
454
  const url = new URL(req.url || '/', `http://localhost:${port}`);
@@ -423,7 +459,7 @@ export async function startWebServer(options) {
423
459
  return;
424
460
  // v1.2.72 — v2 SPA is the only web admin. The legacy v1 monolithic
425
461
  // HTML pages (settings.html / tasks.html / reminders.html /
426
- // memos.html / _app.js) have been removed; the `IMHUB_WEB_V2` env
462
+ // memos.html / _app.js) have been removed; the `AGIM_WEB_V2` env
427
463
  // gate is gone — there is no v1 fallback anymore. Operators who
428
464
  // were on the legacy layout flipped over automatically when they
429
465
  // upgraded past 1.2.21 (default switch); the env knob remained as
@@ -591,7 +627,7 @@ export async function startWebServer(options) {
591
627
  // - PC browsers anywhere: WGS-84.
592
628
  // Default to WGS-84 pass-through (matches the most common Chinese
593
629
  // mobile path — WeChat — which was silently miscalibrated before
594
- // the 2026-05-12 fix). iOS users in China set IMHUB_H5_COORDS_GCJ02=1
630
+ // the 2026-05-12 fix). iOS users in China set AGIM_H5_COORDS_GCJ02=1
595
631
  // to restore the GCJ→WGS path. See core/coord-systems.ts.
596
632
  const norm = normalizeIncomingCoords('h5-browser-geolocation', rawLat, rawLng);
597
633
  const lat = norm.lat;
@@ -775,7 +811,7 @@ export async function startWebServer(options) {
775
811
  return;
776
812
  return handleDeleteMemo(req, res, Number.parseInt(memoIdMatch[1], 10));
777
813
  }
778
- // /api/env — read/write SMTP + Baidu AK + IMHUB_WEB_BIND. Values
814
+ // /api/env — read/write SMTP + Baidu AK + AGIM_WEB_BIND. Values
779
815
  // sensitive enough that GET returns them masked (only the last 4 chars
780
816
  // visible) unless an explicit ?reveal=1 is passed. Keep the settings
781
817
  // surface admin-only: even masked values disclose configured providers.
@@ -791,7 +827,7 @@ export async function startWebServer(options) {
791
827
  }
792
828
  // v1.2.67 — Security diagnostics. Surfaces boot-time observations the
793
829
  // Security UI page renders as read-only badges (uid, env file perms,
794
- // bwrap availability, IMHUB_ALLOWED_USERS configured? …).
830
+ // bwrap availability, AGIM_ALLOWED_USERS configured? …).
795
831
  if (url.pathname === '/api/security/diagnostics' && req.method === 'GET') {
796
832
  if (!requireAdmin(req, res))
797
833
  return;
@@ -1174,6 +1210,11 @@ export async function startWebServer(options) {
1174
1210
  if (url.pathname === '/api/service/status' && req.method === 'GET') {
1175
1211
  return handleServiceStatus(res);
1176
1212
  }
1213
+ if (url.pathname === '/api/service/log-tail' && req.method === 'GET') {
1214
+ if (!requireAdmin(req, res))
1215
+ return;
1216
+ return handleServiceLogTail(res, url);
1217
+ }
1177
1218
  if (url.pathname === '/api/service/start' && req.method === 'POST') {
1178
1219
  if (!requireAdmin(req, res))
1179
1220
  return;
@@ -1232,7 +1273,7 @@ export async function startWebServer(options) {
1232
1273
  }
1233
1274
  // Auth-off / trusted-loopback bypass — mirror checkAuth's two short-circuits
1234
1275
  // so dev / local CLI sessions still work without a token.
1235
- if ((process.env.IMHUB_WEB_AUTH || '').toLowerCase() === 'off')
1276
+ if ((process.env.AGIM_WEB_AUTH || '').toLowerCase() === 'off')
1236
1277
  return cb(true);
1237
1278
  if (isTrustedLoopbackPeer(info.req))
1238
1279
  return cb(true);
@@ -1270,9 +1311,9 @@ export async function startWebServer(options) {
1270
1311
  // M3: cap concurrent WS clients so a leaked / shared web token can't OOM
1271
1312
  // the host by opening unbounded connections. Default 100 is generous for
1272
1313
  // a single-user / small-team setup; production multi-tenant should set
1273
- // IMHUB_MAX_WS_CLIENTS to a higher value.
1314
+ // AGIM_MAX_WS_CLIENTS to a higher value.
1274
1315
  const maxWsClients = (() => {
1275
- const raw = process.env.IMHUB_MAX_WS_CLIENTS;
1316
+ const raw = process.env.AGIM_MAX_WS_CLIENTS;
1276
1317
  if (raw) {
1277
1318
  const n = parseInt(raw, 10);
1278
1319
  if (Number.isFinite(n) && n > 0)
@@ -1285,14 +1326,14 @@ export async function startWebServer(options) {
1285
1326
  // token can still spawn N parallel browser tabs / processes and
1286
1327
  // saturate the file-descriptor pool.
1287
1328
  //
1288
- // IMHUB_WS_MAX_PER_IP active connections per IP (default 20)
1289
- // IMHUB_WS_MAX_NEW_PER_IP_PER_MIN new connections per IP per minute (default 30)
1329
+ // AGIM_WS_MAX_PER_IP active connections per IP (default 20)
1330
+ // AGIM_WS_MAX_NEW_PER_IP_PER_MIN new connections per IP per minute (default 30)
1290
1331
  //
1291
1332
  // Trusted loopback bypasses both — local dev / CLI tooling makes many
1292
1333
  // short connections legitimately. Reverse-proxied loopback traffic is
1293
1334
  // still counted as network traffic.
1294
1335
  const wsMaxPerIp = (() => {
1295
- const raw = process.env.IMHUB_WS_MAX_PER_IP;
1336
+ const raw = process.env.AGIM_WS_MAX_PER_IP;
1296
1337
  if (raw) {
1297
1338
  const n = parseInt(raw, 10);
1298
1339
  if (Number.isFinite(n) && n > 0)
@@ -1301,7 +1342,7 @@ export async function startWebServer(options) {
1301
1342
  return 20;
1302
1343
  })();
1303
1344
  const wsMaxNewPerIpPerMin = (() => {
1304
- const raw = process.env.IMHUB_WS_MAX_NEW_PER_IP_PER_MIN;
1345
+ const raw = process.env.AGIM_WS_MAX_NEW_PER_IP_PER_MIN;
1305
1346
  if (raw) {
1306
1347
  const n = parseInt(raw, 10);
1307
1348
  if (Number.isFinite(n) && n > 0)
@@ -1546,10 +1587,34 @@ export async function startWebServer(options) {
1546
1587
  });
1547
1588
  });
1548
1589
  // Default to loopback; operators can opt into LAN/public exposure with
1549
- // IMHUB_WEB_BIND=0.0.0.0 behind their firewall/reverse proxy.
1590
+ // AGIM_WEB_BIND=0.0.0.0 behind their firewall/reverse proxy.
1550
1591
  await new Promise((resolve, reject) => {
1551
- httpServer.on('error', reject);
1552
- httpServer.listen(port, bindHost, () => resolve());
1592
+ const onError = (err) => {
1593
+ httpServer.off('listening', onListening);
1594
+ try {
1595
+ httpServer.close();
1596
+ }
1597
+ catch { /* not listening yet */ }
1598
+ reject(err);
1599
+ };
1600
+ const onListening = () => {
1601
+ httpServer.off('error', onError);
1602
+ resolve();
1603
+ };
1604
+ httpServer.once('error', onError);
1605
+ httpServer.once('listening', onListening);
1606
+ try {
1607
+ httpServer.listen(port, bindHost);
1608
+ }
1609
+ catch (err) {
1610
+ httpServer.off('error', onError);
1611
+ httpServer.off('listening', onListening);
1612
+ try {
1613
+ httpServer.close();
1614
+ }
1615
+ catch { /* not listening yet */ }
1616
+ reject(err);
1617
+ }
1553
1618
  });
1554
1619
  webLog.info({ port, bindHost }, `Chat UI available at http://${bindHost === '0.0.0.0' ? 'localhost' : bindHost}:${port}`);
1555
1620
  // ============================================================
@@ -1700,7 +1765,7 @@ async function handleGetConfig(_req, res) {
1700
1765
  const showGlobalIm = isGlobalImEnabled();
1701
1766
  const showRemoteAgent = isRemoteAgentEnabled();
1702
1767
  // v1.2.69 — IM platform blacklist. When an operator sets
1703
- // IMHUB_PLATFORM_BLACKLIST=telegram,discord (etc.), those platforms
1768
+ // AGIM_PLATFORM_BLACKLIST=telegram,discord (etc.), those platforms
1704
1769
  // are hidden from the admin SPA entirely — credentials still live
1705
1770
  // on disk but the UI shows nothing for that platform AND the
1706
1771
  // registry refuses to register the adapter at boot. Default empty.
@@ -2190,6 +2255,68 @@ async function handleServiceStatus(res) {
2190
2255
  sendJson(res, 500, { error: err instanceof Error ? err.message : String(err) });
2191
2256
  }
2192
2257
  }
2258
+ async function handleServiceLogTail(res, url) {
2259
+ try {
2260
+ const { LOG_FILE } = await import('../cli-ui/service.js');
2261
+ const requestedLines = parseInt(url.searchParams.get('lines') || '120', 10);
2262
+ const lines = Math.min(Math.max(Number.isFinite(requestedLines) ? requestedLines : 120, 20), 500);
2263
+ const maxBytes = 256 * 1024;
2264
+ let st;
2265
+ try {
2266
+ st = await stat(LOG_FILE);
2267
+ }
2268
+ catch (err) {
2269
+ const e = err;
2270
+ if (e.code === 'ENOENT') {
2271
+ sendJson(res, 200, {
2272
+ path: LOG_FILE,
2273
+ exists: false,
2274
+ content: '',
2275
+ lines: 0,
2276
+ truncated: false,
2277
+ size: 0,
2278
+ mtime: null,
2279
+ });
2280
+ return;
2281
+ }
2282
+ throw err;
2283
+ }
2284
+ if (!st.isFile()) {
2285
+ sendJson(res, 400, { error: 'Service log path is not a regular file' });
2286
+ return;
2287
+ }
2288
+ const start = Math.max(0, st.size - maxBytes);
2289
+ const len = st.size - start;
2290
+ let buf;
2291
+ const fd = await open(LOG_FILE, 'r');
2292
+ try {
2293
+ buf = Buffer.alloc(len);
2294
+ const { bytesRead } = await fd.read(buf, 0, len, start);
2295
+ buf = buf.subarray(0, bytesRead);
2296
+ }
2297
+ finally {
2298
+ await fd.close();
2299
+ }
2300
+ let text = buf.toString('utf8');
2301
+ if (start > 0)
2302
+ text = text.replace(/^[^\n]*(\n|$)/, '');
2303
+ const allLines = text.split(/\r?\n/);
2304
+ const selected = allLines.slice(-lines);
2305
+ const content = selected.join('\n');
2306
+ sendJson(res, 200, {
2307
+ path: LOG_FILE,
2308
+ exists: true,
2309
+ content,
2310
+ lines: content ? selected.length : 0,
2311
+ truncated: start > 0 || allLines.length > lines,
2312
+ size: st.size,
2313
+ mtime: st.mtime.toISOString(),
2314
+ });
2315
+ }
2316
+ catch (err) {
2317
+ sendJson(res, 500, { error: err instanceof Error ? err.message : String(err) });
2318
+ }
2319
+ }
2193
2320
  async function handleServiceStart(res) {
2194
2321
  try {
2195
2322
  const { detectService, spawnBackground, reapStrayAgimProcesses } = await import('../cli-ui/service.js');
@@ -2227,7 +2354,7 @@ async function handleServiceStart(res) {
2227
2354
  }
2228
2355
  try {
2229
2356
  const { spawn } = await import('node:child_process');
2230
- const unitName = existsSync('/etc/systemd/system/agim.service') ? 'agim.service' : 'im-hub.service';
2357
+ const unitName = 'agim.service';
2231
2358
  // Detached + fire-and-forget so the HTTP response isn't held
2232
2359
  // for the full systemd activation timeline.
2233
2360
  const child = spawn('systemctl', ['start', unitName], { detached: true, stdio: 'ignore' });
@@ -2261,8 +2388,7 @@ async function handleServiceStop(res) {
2261
2388
  // systemctl stop handles the kill for us — no self-exit needed.
2262
2389
  try {
2263
2390
  const { execSync } = await import('node:child_process');
2264
- // Match service.ts's detection: prefer agim.service, fall back.
2265
- const unitName = existsSync('/etc/systemd/system/agim.service') ? 'agim.service' : 'im-hub.service';
2391
+ const unitName = 'agim.service';
2266
2392
  execSync(`systemctl stop ${unitName}`);
2267
2393
  // R14 §四 — sweep stray pids after systemctl stop, same way
2268
2394
  // restart does pre-stop. systemctl reports success when its
@@ -2345,7 +2471,7 @@ async function handleServiceRestart(res) {
2345
2471
  }
2346
2472
  try {
2347
2473
  const { spawn } = await import('node:child_process');
2348
- const unitName = existsSync('/etc/systemd/system/agim.service') ? 'agim.service' : 'im-hub.service';
2474
+ const unitName = 'agim.service';
2349
2475
  // v1.5 — fire-and-forget. execSync blocked the HTTP response until
2350
2476
  // systemctl had finished stop+start (5-10s), making the web button
2351
2477
  // look frozen to the user. Detach the child so we can ACK the
@@ -2822,82 +2948,82 @@ async function handleDeleteMemo(_req, res, id) {
2822
2948
  }
2823
2949
  // ─── env file (SMTP + Baidu AK + …) ────────────────────────────────────
2824
2950
  const ENV_EDITABLE_KEYS = [
2825
- 'IMHUB_SMTP_HOST', 'IMHUB_SMTP_PORT', 'IMHUB_SMTP_USER', 'IMHUB_SMTP_PASS',
2826
- 'IMHUB_SMTP_FROM', 'IMHUB_SMTP_SECURE',
2827
- 'IMHUB_BAIDU_MAP_AK',
2828
- 'IMHUB_LOC_BASE_URL', 'IMHUB_TZ_OFFSET_HOURS',
2951
+ 'AGIM_SMTP_HOST', 'AGIM_SMTP_PORT', 'AGIM_SMTP_USER', 'AGIM_SMTP_PASS',
2952
+ 'AGIM_SMTP_FROM', 'AGIM_SMTP_SECURE',
2953
+ 'AGIM_BAIDU_MAP_AK',
2954
+ 'AGIM_LOC_BASE_URL', 'AGIM_TZ_OFFSET_HOURS',
2829
2955
  // Safety card toggle — drives the Claude --dangerously-skip-permissions
2830
2956
  // branch in plugins/agents/claude-code/index.ts. Not a secret, plain '1'/'0'.
2831
- 'IMHUB_DANGEROUSLY_SKIP_PERMISSIONS',
2957
+ 'AGIM_DANGEROUSLY_SKIP_PERMISSIONS',
2832
2958
  // Approval Policy card — 'allow' | 'deny' (default deny). Decides what the
2833
2959
  // approval bus does when a tool-use prompt times out with no human reply.
2834
2960
  // Hot-reload: handlePutEnv mutates process.env so approval-bus picks up the
2835
2961
  // new value on the next timer fire, no restart needed.
2836
- 'IMHUB_TIMEOUT_DEFAULT',
2962
+ 'AGIM_TIMEOUT_DEFAULT',
2837
2963
  // v1.2 — IM long-message viewer. Operator sets the public URL pointing at
2838
2964
  // their reverse-proxied agim web port; thresholds tune when routing kicks
2839
2965
  // in. Hot-reload works because viewer-config reads process.env every call.
2840
- 'IMHUB_VIEWER_ENABLED',
2841
- 'IMHUB_VIEWER_PUBLIC_BASE_URL',
2842
- 'IMHUB_VIEWER_CHARS',
2843
- 'IMHUB_VIEWER_LINES',
2844
- 'IMHUB_VIEWER_CODE_LINES',
2845
- 'IMHUB_VIEWER_MAX_PASTES',
2846
- 'IMHUB_VIEWER_TUNNEL_MODE',
2966
+ 'AGIM_VIEWER_ENABLED',
2967
+ 'AGIM_VIEWER_PUBLIC_BASE_URL',
2968
+ 'AGIM_VIEWER_CHARS',
2969
+ 'AGIM_VIEWER_LINES',
2970
+ 'AGIM_VIEWER_CODE_LINES',
2971
+ 'AGIM_VIEWER_MAX_PASTES',
2972
+ 'AGIM_VIEWER_TUNNEL_MODE',
2847
2973
  // v1.2.43 — opt out of community default paste server (viewer.iclaw.host).
2848
- 'IMHUB_VIEWER_NO_DEFAULT_REMOTE',
2974
+ 'AGIM_VIEWER_NO_DEFAULT_REMOTE',
2849
2975
  // v1.1.10 — A2A notification settings (see src/core/a2a-notify.ts).
2850
- 'IMHUB_A2A_TIMEOUT_DEFAULT_MS',
2851
- 'IMHUB_A2A_MAX_TIMEOUT_MS',
2852
- 'IMHUB_A2A_NOTIFY_MODE',
2853
- 'IMHUB_A2A_NOTIFY_MAX_DEPTH',
2854
- 'IMHUB_A2A_HEARTBEAT_MIN',
2976
+ 'AGIM_A2A_TIMEOUT_DEFAULT_MS',
2977
+ 'AGIM_A2A_MAX_TIMEOUT_MS',
2978
+ 'AGIM_A2A_NOTIFY_MODE',
2979
+ 'AGIM_A2A_NOTIFY_MAX_DEPTH',
2980
+ 'AGIM_A2A_HEARTBEAT_MIN',
2855
2981
  // v1.5 — long-term memory (see src/core/memory.ts + persona.ts).
2856
- 'IMHUB_MEMORY_ENABLED',
2982
+ 'AGIM_MEMORY_ENABLED',
2857
2983
  // P1/P2 — dream distillation (background fact extraction; see
2858
2984
  // src/core/memory-distiller.ts).
2859
- 'IMHUB_MEMORY_DISTILL_ENABLED',
2860
- 'IMHUB_MEMORY_DISTILL_SOURCE',
2861
- 'IMHUB_MEMORY_DISTILL_AGENT',
2862
- 'IMHUB_MEMORY_DISTILL_INTERVAL_MS',
2863
- 'IMHUB_MEMORY_DISTILL_FLOOR_MIN',
2864
- 'IMHUB_MEMORY_DISTILL_BATCH_MAX',
2865
- 'IMHUB_MEMORY_DISTILL_MAX_PENDING',
2985
+ 'AGIM_MEMORY_DISTILL_ENABLED',
2986
+ 'AGIM_MEMORY_DISTILL_SOURCE',
2987
+ 'AGIM_MEMORY_DISTILL_AGENT',
2988
+ 'AGIM_MEMORY_DISTILL_INTERVAL_MS',
2989
+ 'AGIM_MEMORY_DISTILL_FLOOR_MIN',
2990
+ 'AGIM_MEMORY_DISTILL_BATCH_MAX',
2991
+ 'AGIM_MEMORY_DISTILL_MAX_PENDING',
2866
2992
  // v1.6 — vector retrieval (opt-in, OFF by default).
2867
- 'IMHUB_MEMORY_VECTOR_BACKEND',
2868
- 'IMHUB_MEMORY_VECTOR_LOCAL_MODEL',
2869
- 'IMHUB_MEMORY_VECTOR_OPENAI_BASE_URL',
2870
- 'IMHUB_MEMORY_VECTOR_OPENAI_MODEL',
2871
- 'IMHUB_MEMORY_VECTOR_OPENAI_API_KEY',
2872
- 'IMHUB_MEMORY_VECTOR_BATCH_SIZE',
2873
- 'IMHUB_MEMORY_VECTOR_HYBRID_WEIGHT',
2993
+ 'AGIM_MEMORY_VECTOR_BACKEND',
2994
+ 'AGIM_MEMORY_VECTOR_LOCAL_MODEL',
2995
+ 'AGIM_MEMORY_VECTOR_OPENAI_BASE_URL',
2996
+ 'AGIM_MEMORY_VECTOR_OPENAI_MODEL',
2997
+ 'AGIM_MEMORY_VECTOR_OPENAI_API_KEY',
2998
+ 'AGIM_MEMORY_VECTOR_BATCH_SIZE',
2999
+ 'AGIM_MEMORY_VECTOR_HYBRID_WEIGHT',
2874
3000
  // v1.2.67 — Security page surfaces these (added in v1.2.58–v1.2.66).
2875
3001
  // Sender allowlist — who can talk to the bot at all.
2876
- 'IMHUB_ALLOWED_USERS',
3002
+ 'AGIM_ALLOWED_USERS',
2877
3003
  // Native fs tools — workspace restriction + per-tool timeout.
2878
- 'IMHUB_NATIVE_FS_RESTRICT',
2879
- 'IMHUB_NATIVE_FS_TIMEOUT_MS',
3004
+ 'AGIM_NATIVE_FS_RESTRICT',
3005
+ 'AGIM_NATIVE_FS_TIMEOUT_MS',
2880
3006
  // Native web tools — SSRF guards.
2881
- 'IMHUB_NATIVE_WEB_ALLOW_PRIVATE',
2882
- 'IMHUB_NATIVE_WEB_SSRF_WHITELIST',
2883
- 'IMHUB_NATIVE_WEB_TIMEOUT_MS',
3007
+ 'AGIM_NATIVE_WEB_ALLOW_PRIVATE',
3008
+ 'AGIM_NATIVE_WEB_SSRF_WHITELIST',
3009
+ 'AGIM_NATIVE_WEB_TIMEOUT_MS',
2884
3010
  // Native exec tool — bwrap sandbox + sub-knobs.
2885
- 'IMHUB_EXEC_SANDBOX',
2886
- 'IMHUB_EXEC_SANDBOX_NET',
2887
- 'IMHUB_EXEC_TIMEOUT_MS',
2888
- 'IMHUB_EXEC_MAX_OUTPUT',
3011
+ 'AGIM_EXEC_SANDBOX',
3012
+ 'AGIM_EXEC_SANDBOX_NET',
3013
+ 'AGIM_EXEC_TIMEOUT_MS',
3014
+ 'AGIM_EXEC_MAX_OUTPUT',
2889
3015
  // Native call_agent per-turn cap.
2890
- 'IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN',
3016
+ 'AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN',
2891
3017
  // v1.2.69 — IM platform blacklist (CSV of platform ids). Default
2892
3018
  // empty (no blocks); listed platforms vanish from web + CLI + are
2893
3019
  // refused at registry.registerMessenger.
2894
- 'IMHUB_PLATFORM_BLACKLIST',
3020
+ 'AGIM_PLATFORM_BLACKLIST',
2895
3021
  // v1.2.126 — web_search provider chain (CSV) + each provider's API
2896
- // key. `IMHUB_WEB_SEARCH_PROVIDERS` orders the fallback chain (e.g.
3022
+ // key. `AGIM_WEB_SEARCH_PROVIDERS` orders the fallback chain (e.g.
2897
3023
  // 'tavily,brave,duckduckgo'); a missing/empty value falls back to
2898
3024
  // DEFAULT_PROVIDER_ORDER in web-dispatcher. The 5 *_API_KEY values
2899
3025
  // gate per-provider availability (duckduckgo needs no key).
2900
- 'IMHUB_WEB_SEARCH_PROVIDERS',
3026
+ 'AGIM_WEB_SEARCH_PROVIDERS',
2901
3027
  'TAVILY_API_KEY',
2902
3028
  'BRAVE_API_KEY',
2903
3029
  'SERPER_API_KEY',
@@ -2907,47 +3033,47 @@ const ENV_EDITABLE_KEYS = [
2907
3033
  // timeout / blank-response retry / length-recovery retry). Hot-
2908
3034
  // reload: each subsystem re-reads process.env on every call, so
2909
3035
  // editing these takes effect without a restart.
2910
- 'IMHUB_NATIVE_TOOL_RESULT_MAX_CHARS',
2911
- 'IMHUB_NATIVE_TOOL_TIMEOUT_MS',
2912
- 'IMHUB_NATIVE_BLANK_RETRY_MAX',
2913
- 'IMHUB_NATIVE_LENGTH_RECOVERY_MAX',
3036
+ 'AGIM_NATIVE_TOOL_RESULT_MAX_CHARS',
3037
+ 'AGIM_NATIVE_TOOL_TIMEOUT_MS',
3038
+ 'AGIM_NATIVE_BLANK_RETRY_MAX',
3039
+ 'AGIM_NATIVE_LENGTH_RECOVERY_MAX',
2914
3040
  // v1.2.127 — A2A sub-agent spawn (depth / timeout / in-process /
2915
3041
  // per-turn cap). All hot-read; flipping in-process to 'off' makes
2916
3042
  // the next call_agent('native', …) reboot via the subprocess CLI
2917
3043
  // adapter instead of the v1.2.121 fast path.
2918
- 'IMHUB_A2A_MAX_DEPTH',
2919
- 'IMHUB_A2A_TIMEOUT_DEFAULT_MS',
2920
- 'IMHUB_NATIVE_CALL_AGENT_IN_PROCESS',
2921
- 'IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN',
3044
+ 'AGIM_A2A_MAX_DEPTH',
3045
+ 'AGIM_A2A_TIMEOUT_DEFAULT_MS',
3046
+ 'AGIM_NATIVE_CALL_AGENT_IN_PROCESS',
3047
+ 'AGIM_NATIVE_CALL_AGENT_MAX_PER_TURN',
2922
3048
  // v1.2.127 — early-stop + critic. Semantic stuck-loop default ON
2923
3049
  // catches the v1.2.122 case (3 different tools, same salient arg).
2924
3050
  // Critic default OFF — opt-in goal-divergence detector.
2925
- 'IMHUB_NATIVE_SEMANTIC_STUCK_LOOP',
2926
- 'IMHUB_NATIVE_CRITIC',
2927
- 'IMHUB_NATIVE_CRITIC_ROLE',
2928
- 'IMHUB_NATIVE_PLAN_MODE',
3051
+ 'AGIM_NATIVE_SEMANTIC_STUCK_LOOP',
3052
+ 'AGIM_NATIVE_CRITIC',
3053
+ 'AGIM_NATIVE_CRITIC_ROLE',
3054
+ 'AGIM_NATIVE_PLAN_MODE',
2929
3055
  // v1.2.135 — auto-enter heuristic + custom phrase list.
2930
- 'IMHUB_PLAN_INTENT_AUTO',
2931
- 'IMHUB_PLAN_INTENT_PHRASES',
3056
+ 'AGIM_PLAN_INTENT_AUTO',
3057
+ 'AGIM_PLAN_INTENT_PHRASES',
2932
3058
  // v1.2.127 — auto-compact 4 sliders (OpenHands Condenser pattern).
2933
3059
  // KEEP_FIRST defaults to 1 since v1.2.125 (original user goal at idx 0).
2934
- 'IMHUB_NATIVE_COMPACT_TRIGGER_CHARS',
2935
- 'IMHUB_NATIVE_COMPACT_KEEP_TURNS',
2936
- 'IMHUB_NATIVE_COMPACT_KEEP_FIRST',
2937
- 'IMHUB_NATIVE_COMPACT_SUMMARY_CHARS',
3060
+ 'AGIM_NATIVE_COMPACT_TRIGGER_CHARS',
3061
+ 'AGIM_NATIVE_COMPACT_KEEP_TURNS',
3062
+ 'AGIM_NATIVE_COMPACT_KEEP_FIRST',
3063
+ 'AGIM_NATIVE_COMPACT_SUMMARY_CHARS',
2938
3064
  // v1.2.127 — streaming + iteration cap. STREAM_PARTIAL default ON
2939
3065
  // preserves partial assistant text on IM's 30-min hard timeout.
2940
- 'IMHUB_NATIVE_STREAM_PARTIAL',
2941
- 'IMHUB_NATIVE_AGENT_MAX_ITER',
3066
+ 'AGIM_NATIVE_STREAM_PARTIAL',
3067
+ 'AGIM_NATIVE_AGENT_MAX_ITER',
2942
3068
  // v1.2.138 — first-token retry on transient stream errors (terminated /
2943
3069
  // ECONNRESET / fetch failed / socket hang up). Default retries once.
2944
- 'IMHUB_NATIVE_FIRSTTOKEN_RETRY_MAX',
2945
- 'IMHUB_NATIVE_FIRSTTOKEN_RETRY_DELAY_MS',
3070
+ 'AGIM_NATIVE_FIRSTTOKEN_RETRY_MAX',
3071
+ 'AGIM_NATIVE_FIRSTTOKEN_RETRY_DELAY_MS',
2946
3072
  ];
2947
3073
  const SECRET_KEYS = new Set([
2948
- 'IMHUB_SMTP_PASS',
2949
- 'IMHUB_BAIDU_MAP_AK',
2950
- 'IMHUB_MEMORY_VECTOR_OPENAI_API_KEY',
3074
+ 'AGIM_SMTP_PASS',
3075
+ 'AGIM_BAIDU_MAP_AK',
3076
+ 'AGIM_MEMORY_VECTOR_OPENAI_API_KEY',
2951
3077
  // v1.2.126 — web search keys are bearer tokens / API keys, so
2952
3078
  // they're masked on GET and refused if echoed back on PUT.
2953
3079
  'TAVILY_API_KEY',
@@ -3002,10 +3128,10 @@ async function handleSecurityDiagnostics(_req, res) {
3002
3128
  // (process.env, which is what runtime sees) without round-tripping
3003
3129
  // through the env file.
3004
3130
  liveEnv: {
3005
- IMHUB_EXEC_SANDBOX: process.env.IMHUB_EXEC_SANDBOX ?? null,
3006
- IMHUB_NATIVE_FS_RESTRICT: process.env.IMHUB_NATIVE_FS_RESTRICT ?? null,
3007
- IMHUB_TIMEOUT_DEFAULT: process.env.IMHUB_TIMEOUT_DEFAULT ?? null,
3008
- IMHUB_DANGEROUSLY_SKIP_PERMISSIONS: process.env.IMHUB_DANGEROUSLY_SKIP_PERMISSIONS ?? null,
3131
+ AGIM_EXEC_SANDBOX: process.env.AGIM_EXEC_SANDBOX ?? null,
3132
+ AGIM_NATIVE_FS_RESTRICT: process.env.AGIM_NATIVE_FS_RESTRICT ?? null,
3133
+ AGIM_TIMEOUT_DEFAULT: process.env.AGIM_TIMEOUT_DEFAULT ?? null,
3134
+ AGIM_DANGEROUSLY_SKIP_PERMISSIONS: process.env.AGIM_DANGEROUSLY_SKIP_PERMISSIONS ?? null,
3009
3135
  },
3010
3136
  },
3011
3137
  });
@@ -3100,9 +3226,9 @@ async function handleEmailTest(req, res) {
3100
3226
  // Drain body even though we don't use it, so the connection doesn't
3101
3227
  // stall under keep-alive.
3102
3228
  await readBody(req, res);
3103
- const host = process.env.IMHUB_SMTP_HOST?.trim();
3104
- const user = process.env.IMHUB_SMTP_USER?.trim();
3105
- const pass = process.env.IMHUB_SMTP_PASS;
3229
+ const host = process.env.AGIM_SMTP_HOST?.trim();
3230
+ const user = process.env.AGIM_SMTP_USER?.trim();
3231
+ const pass = process.env.AGIM_SMTP_PASS;
3106
3232
  if (!host || !user || !pass) {
3107
3233
  sendError(res, 400, 'EMAIL_NOT_CONFIGURED', {
3108
3234
  message: 'SMTP not configured (host / user / pass required)',
@@ -3110,10 +3236,10 @@ async function handleEmailTest(req, res) {
3110
3236
  });
3111
3237
  return;
3112
3238
  }
3113
- const portRaw = process.env.IMHUB_SMTP_PORT?.trim();
3239
+ const portRaw = process.env.AGIM_SMTP_PORT?.trim();
3114
3240
  const portNum = portRaw ? Number.parseInt(portRaw, 10) : 465;
3115
3241
  const port = Number.isFinite(portNum) && portNum > 0 && portNum <= 65535 ? portNum : 465;
3116
- const secureRaw = process.env.IMHUB_SMTP_SECURE?.trim().toLowerCase();
3242
+ const secureRaw = process.env.AGIM_SMTP_SECURE?.trim().toLowerCase();
3117
3243
  const secure = secureRaw !== undefined
3118
3244
  ? (secureRaw === '1' || secureRaw === 'true' || secureRaw === 'yes')
3119
3245
  : port === 465;
@@ -3989,7 +4115,7 @@ async function handleSkillsList(_req, res) {
3989
4115
  // install still happens via the skillhub CLI on the host (see docs).
3990
4116
  //
3991
4117
  // Enterprise / air-gapped deployments can disable this endpoint via
3992
- // `IMHUB_SKILLHUB_ENABLED=0`. When disabled, the API returns a stub
4118
+ // `AGIM_SKILLHUB_ENABLED=0`. When disabled, the API returns a stub
3993
4119
  // shape `{ disabled: true, items: [] }` so the UI can show "disabled
3994
4120
  // by enterprise policy" without breaking the page. This is the only
3995
4121
  // product-default outbound call to a non-IM domain, so the toggle
@@ -3997,7 +4123,7 @@ async function handleSkillsList(_req, res) {
3997
4123
  let remoteHotCache = null;
3998
4124
  const REMOTE_HOT_TTL_MS = 5 * 60_000;
3999
4125
  function isSkillhubEnabled() {
4000
- const v = (process.env.IMHUB_SKILLHUB_ENABLED ?? '1').trim().toLowerCase();
4126
+ const v = (process.env.AGIM_SKILLHUB_ENABLED ?? '1').trim().toLowerCase();
4001
4127
  return v !== '0' && v !== 'false' && v !== 'no' && v !== 'off';
4002
4128
  }
4003
4129
  async function handleSkillsRemoteHot(_req, res) {
@@ -4006,7 +4132,7 @@ async function handleSkillsRemoteHot(_req, res) {
4006
4132
  // so the SPA can render "disabled" copy without a network error
4007
4133
  // toast. Status 200 because this is a deliberate operator choice,
4008
4134
  // not a transient failure.
4009
- sendJson(res, 200, { disabled: true, items: [], reason: 'IMHUB_SKILLHUB_ENABLED=0' });
4135
+ sendJson(res, 200, { disabled: true, items: [], reason: 'AGIM_SKILLHUB_ENABLED=0' });
4010
4136
  return;
4011
4137
  }
4012
4138
  try {
@@ -4484,10 +4610,18 @@ async function handleWorkspaceFileWrite(req, res, url) {
4484
4610
  throw err;
4485
4611
  }
4486
4612
  const finalSt = await stat(target);
4613
+ const savedPath = relativePath(base, target);
4614
+ if (savedPath === 'MEMORY.md') {
4615
+ try {
4616
+ const { ensureAgentMemoryLink } = await import('../core/agent-cwd.js');
4617
+ await ensureAgentMemoryLink(agent);
4618
+ }
4619
+ catch { /* best-effort: memory file itself was saved successfully */ }
4620
+ }
4487
4621
  sendJson(res, 200, {
4488
4622
  ok: true,
4489
4623
  agent,
4490
- path: relativePath(base, target),
4624
+ path: savedPath,
4491
4625
  size: finalSt.size,
4492
4626
  mtime: finalSt.mtime.toISOString(),
4493
4627
  });
@@ -5448,14 +5582,14 @@ function sendToClient(ws, data) {
5448
5582
  *
5449
5583
  * Polls every 50 ms — node's `ws` doesn't emit a `drain` event we can hook,
5450
5584
  * but the buffered amount drops monotonically once the kernel ACKs flush.
5451
- * Bounded by IMHUB_WS_BACKPRESSURE_TIMEOUT_MS (default 5 s) so a frozen
5585
+ * Bounded by AGIM_WS_BACKPRESSURE_TIMEOUT_MS (default 5 s) so a frozen
5452
5586
  * client can't wedge the agent's chunk producer indefinitely.
5453
5587
  */
5454
5588
  async function awaitWsDrain(ws) {
5455
5589
  if (ws.bufferedAmount < WS_BACKPRESSURE_HIGHWATER_BYTES)
5456
5590
  return;
5457
5591
  const timeoutMs = (() => {
5458
- const raw = process.env.IMHUB_WS_BACKPRESSURE_TIMEOUT_MS;
5592
+ const raw = process.env.AGIM_WS_BACKPRESSURE_TIMEOUT_MS;
5459
5593
  if (raw) {
5460
5594
  const n = parseInt(raw, 10);
5461
5595
  if (Number.isFinite(n) && n > 0)