im-hub-pro 0.2.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +497 -0
  3. package/README.zh-CN.md +496 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +921 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/core/acp-server.d.ts +8 -0
  9. package/dist/core/acp-server.d.ts.map +1 -0
  10. package/dist/core/acp-server.js +266 -0
  11. package/dist/core/acp-server.js.map +1 -0
  12. package/dist/core/agent-base.d.ts +94 -0
  13. package/dist/core/agent-base.d.ts.map +1 -0
  14. package/dist/core/agent-base.js +374 -0
  15. package/dist/core/agent-base.js.map +1 -0
  16. package/dist/core/agent-cwd.d.ts +45 -0
  17. package/dist/core/agent-cwd.d.ts.map +1 -0
  18. package/dist/core/agent-cwd.js +178 -0
  19. package/dist/core/agent-cwd.js.map +1 -0
  20. package/dist/core/agent-cwd.test.d.ts +2 -0
  21. package/dist/core/agent-cwd.test.d.ts.map +1 -0
  22. package/dist/core/agent-cwd.test.js +149 -0
  23. package/dist/core/agent-cwd.test.js.map +1 -0
  24. package/dist/core/approval-bus.d.ts +232 -0
  25. package/dist/core/approval-bus.d.ts.map +1 -0
  26. package/dist/core/approval-bus.js +703 -0
  27. package/dist/core/approval-bus.js.map +1 -0
  28. package/dist/core/approval-bus.synthetic.test.d.ts +2 -0
  29. package/dist/core/approval-bus.synthetic.test.d.ts.map +1 -0
  30. package/dist/core/approval-bus.synthetic.test.js +182 -0
  31. package/dist/core/approval-bus.synthetic.test.js.map +1 -0
  32. package/dist/core/approval-bus.test.d.ts +2 -0
  33. package/dist/core/approval-bus.test.d.ts.map +1 -0
  34. package/dist/core/approval-bus.test.js +537 -0
  35. package/dist/core/approval-bus.test.js.map +1 -0
  36. package/dist/core/approval-router.d.ts +95 -0
  37. package/dist/core/approval-router.d.ts.map +1 -0
  38. package/dist/core/approval-router.js +450 -0
  39. package/dist/core/approval-router.js.map +1 -0
  40. package/dist/core/approval-router.test.d.ts +2 -0
  41. package/dist/core/approval-router.test.d.ts.map +1 -0
  42. package/dist/core/approval-router.test.js +413 -0
  43. package/dist/core/approval-router.test.js.map +1 -0
  44. package/dist/core/audit-log.d.ts +55 -0
  45. package/dist/core/audit-log.d.ts.map +1 -0
  46. package/dist/core/audit-log.js +203 -0
  47. package/dist/core/audit-log.js.map +1 -0
  48. package/dist/core/bgjob-reader.d.ts +65 -0
  49. package/dist/core/bgjob-reader.d.ts.map +1 -0
  50. package/dist/core/bgjob-reader.js +212 -0
  51. package/dist/core/bgjob-reader.js.map +1 -0
  52. package/dist/core/bgjob-reader.test.d.ts +2 -0
  53. package/dist/core/bgjob-reader.test.d.ts.map +1 -0
  54. package/dist/core/bgjob-reader.test.js +178 -0
  55. package/dist/core/bgjob-reader.test.js.map +1 -0
  56. package/dist/core/circuit-breaker.d.ts +37 -0
  57. package/dist/core/circuit-breaker.d.ts.map +1 -0
  58. package/dist/core/circuit-breaker.js +115 -0
  59. package/dist/core/circuit-breaker.js.map +1 -0
  60. package/dist/core/commands/agent.d.ts +4 -0
  61. package/dist/core/commands/agent.d.ts.map +1 -0
  62. package/dist/core/commands/agent.js +21 -0
  63. package/dist/core/commands/agent.js.map +1 -0
  64. package/dist/core/commands/approval.d.ts +3 -0
  65. package/dist/core/commands/approval.d.ts.map +1 -0
  66. package/dist/core/commands/approval.js +44 -0
  67. package/dist/core/commands/approval.js.map +1 -0
  68. package/dist/core/commands/approval.test.d.ts +2 -0
  69. package/dist/core/commands/approval.test.d.ts.map +1 -0
  70. package/dist/core/commands/approval.test.js +85 -0
  71. package/dist/core/commands/approval.test.js.map +1 -0
  72. package/dist/core/commands/audit.d.ts +3 -0
  73. package/dist/core/commands/audit.d.ts.map +1 -0
  74. package/dist/core/commands/audit.js +84 -0
  75. package/dist/core/commands/audit.js.map +1 -0
  76. package/dist/core/commands/builtin.d.ts +3 -0
  77. package/dist/core/commands/builtin.d.ts.map +1 -0
  78. package/dist/core/commands/builtin.js +26 -0
  79. package/dist/core/commands/builtin.js.map +1 -0
  80. package/dist/core/commands/job.d.ts +3 -0
  81. package/dist/core/commands/job.d.ts.map +1 -0
  82. package/dist/core/commands/job.js +195 -0
  83. package/dist/core/commands/job.js.map +1 -0
  84. package/dist/core/commands/model.d.ts +9 -0
  85. package/dist/core/commands/model.d.ts.map +1 -0
  86. package/dist/core/commands/model.js +183 -0
  87. package/dist/core/commands/model.js.map +1 -0
  88. package/dist/core/commands/plan.d.ts +3 -0
  89. package/dist/core/commands/plan.d.ts.map +1 -0
  90. package/dist/core/commands/plan.js +75 -0
  91. package/dist/core/commands/plan.js.map +1 -0
  92. package/dist/core/commands/plan.test.d.ts +2 -0
  93. package/dist/core/commands/plan.test.d.ts.map +1 -0
  94. package/dist/core/commands/plan.test.js +122 -0
  95. package/dist/core/commands/plan.test.js.map +1 -0
  96. package/dist/core/commands/router.d.ts +3 -0
  97. package/dist/core/commands/router.d.ts.map +1 -0
  98. package/dist/core/commands/router.js +71 -0
  99. package/dist/core/commands/router.js.map +1 -0
  100. package/dist/core/commands/schedule.d.ts +3 -0
  101. package/dist/core/commands/schedule.d.ts.map +1 -0
  102. package/dist/core/commands/schedule.js +123 -0
  103. package/dist/core/commands/schedule.js.map +1 -0
  104. package/dist/core/commands/sessions.d.ts +3 -0
  105. package/dist/core/commands/sessions.d.ts.map +1 -0
  106. package/dist/core/commands/sessions.js +88 -0
  107. package/dist/core/commands/sessions.js.map +1 -0
  108. package/dist/core/commands/stats.d.ts +3 -0
  109. package/dist/core/commands/stats.d.ts.map +1 -0
  110. package/dist/core/commands/stats.js +73 -0
  111. package/dist/core/commands/stats.js.map +1 -0
  112. package/dist/core/commands/think.d.ts +3 -0
  113. package/dist/core/commands/think.d.ts.map +1 -0
  114. package/dist/core/commands/think.js +28 -0
  115. package/dist/core/commands/think.js.map +1 -0
  116. package/dist/core/commands/workspaces.d.ts +3 -0
  117. package/dist/core/commands/workspaces.d.ts.map +1 -0
  118. package/dist/core/commands/workspaces.js +47 -0
  119. package/dist/core/commands/workspaces.js.map +1 -0
  120. package/dist/core/config-schema.d.ts +58 -0
  121. package/dist/core/config-schema.d.ts.map +1 -0
  122. package/dist/core/config-schema.js +63 -0
  123. package/dist/core/config-schema.js.map +1 -0
  124. package/dist/core/cron.d.ts +29 -0
  125. package/dist/core/cron.d.ts.map +1 -0
  126. package/dist/core/cron.js +184 -0
  127. package/dist/core/cron.js.map +1 -0
  128. package/dist/core/event-bus.d.ts +80 -0
  129. package/dist/core/event-bus.d.ts.map +1 -0
  130. package/dist/core/event-bus.js +62 -0
  131. package/dist/core/event-bus.js.map +1 -0
  132. package/dist/core/intent-llm.d.ts +27 -0
  133. package/dist/core/intent-llm.d.ts.map +1 -0
  134. package/dist/core/intent-llm.js +170 -0
  135. package/dist/core/intent-llm.js.map +1 -0
  136. package/dist/core/intent.d.ts +12 -0
  137. package/dist/core/intent.d.ts.map +1 -0
  138. package/dist/core/intent.js +187 -0
  139. package/dist/core/intent.js.map +1 -0
  140. package/dist/core/job-board.d.ts +84 -0
  141. package/dist/core/job-board.d.ts.map +1 -0
  142. package/dist/core/job-board.js +379 -0
  143. package/dist/core/job-board.js.map +1 -0
  144. package/dist/core/logger.d.ts +6 -0
  145. package/dist/core/logger.d.ts.map +1 -0
  146. package/dist/core/logger.js +54 -0
  147. package/dist/core/logger.js.map +1 -0
  148. package/dist/core/metrics.d.ts +55 -0
  149. package/dist/core/metrics.d.ts.map +1 -0
  150. package/dist/core/metrics.js +291 -0
  151. package/dist/core/metrics.js.map +1 -0
  152. package/dist/core/onboarding.d.ts +94 -0
  153. package/dist/core/onboarding.d.ts.map +1 -0
  154. package/dist/core/onboarding.js +426 -0
  155. package/dist/core/onboarding.js.map +1 -0
  156. package/dist/core/onboarding.test.d.ts +2 -0
  157. package/dist/core/onboarding.test.d.ts.map +1 -0
  158. package/dist/core/onboarding.test.js +112 -0
  159. package/dist/core/onboarding.test.js.map +1 -0
  160. package/dist/core/rate-limiter.d.ts +44 -0
  161. package/dist/core/rate-limiter.d.ts.map +1 -0
  162. package/dist/core/rate-limiter.js +115 -0
  163. package/dist/core/rate-limiter.js.map +1 -0
  164. package/dist/core/registry.d.ts +32 -0
  165. package/dist/core/registry.d.ts.map +1 -0
  166. package/dist/core/registry.js +122 -0
  167. package/dist/core/registry.js.map +1 -0
  168. package/dist/core/router.d.ts +41 -0
  169. package/dist/core/router.d.ts.map +1 -0
  170. package/dist/core/router.js +431 -0
  171. package/dist/core/router.js.map +1 -0
  172. package/dist/core/schedule.d.ts +65 -0
  173. package/dist/core/schedule.d.ts.map +1 -0
  174. package/dist/core/schedule.js +316 -0
  175. package/dist/core/schedule.js.map +1 -0
  176. package/dist/core/session-subtasks.test.d.ts +2 -0
  177. package/dist/core/session-subtasks.test.d.ts.map +1 -0
  178. package/dist/core/session-subtasks.test.js +88 -0
  179. package/dist/core/session-subtasks.test.js.map +1 -0
  180. package/dist/core/session.d.ts +182 -0
  181. package/dist/core/session.d.ts.map +1 -0
  182. package/dist/core/session.js +774 -0
  183. package/dist/core/session.js.map +1 -0
  184. package/dist/core/sqlite-helper.d.ts +37 -0
  185. package/dist/core/sqlite-helper.d.ts.map +1 -0
  186. package/dist/core/sqlite-helper.js +79 -0
  187. package/dist/core/sqlite-helper.js.map +1 -0
  188. package/dist/core/transcribe.d.ts +25 -0
  189. package/dist/core/transcribe.d.ts.map +1 -0
  190. package/dist/core/transcribe.js +217 -0
  191. package/dist/core/transcribe.js.map +1 -0
  192. package/dist/core/transcribe.test.d.ts +2 -0
  193. package/dist/core/transcribe.test.d.ts.map +1 -0
  194. package/dist/core/transcribe.test.js +163 -0
  195. package/dist/core/transcribe.test.js.map +1 -0
  196. package/dist/core/types.d.ts +352 -0
  197. package/dist/core/types.d.ts.map +1 -0
  198. package/dist/core/types.js +3 -0
  199. package/dist/core/types.js.map +1 -0
  200. package/dist/core/workspace.d.ts +67 -0
  201. package/dist/core/workspace.d.ts.map +1 -0
  202. package/dist/core/workspace.js +113 -0
  203. package/dist/core/workspace.js.map +1 -0
  204. package/dist/index.d.ts +5 -0
  205. package/dist/index.d.ts.map +1 -0
  206. package/dist/index.js +6 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/plugins/agents/acp/acp-adapter.d.ts +16 -0
  209. package/dist/plugins/agents/acp/acp-adapter.d.ts.map +1 -0
  210. package/dist/plugins/agents/acp/acp-adapter.js +49 -0
  211. package/dist/plugins/agents/acp/acp-adapter.js.map +1 -0
  212. package/dist/plugins/agents/acp/acp-client.d.ts +32 -0
  213. package/dist/plugins/agents/acp/acp-client.d.ts.map +1 -0
  214. package/dist/plugins/agents/acp/acp-client.js +175 -0
  215. package/dist/plugins/agents/acp/acp-client.js.map +1 -0
  216. package/dist/plugins/agents/acp/discovery.d.ts +19 -0
  217. package/dist/plugins/agents/acp/discovery.d.ts.map +1 -0
  218. package/dist/plugins/agents/acp/discovery.js +109 -0
  219. package/dist/plugins/agents/acp/discovery.js.map +1 -0
  220. package/dist/plugins/agents/acp/index.d.ts +4 -0
  221. package/dist/plugins/agents/acp/index.d.ts.map +1 -0
  222. package/dist/plugins/agents/acp/index.js +4 -0
  223. package/dist/plugins/agents/acp/index.js.map +1 -0
  224. package/dist/plugins/agents/acp/types.d.ts +62 -0
  225. package/dist/plugins/agents/acp/types.d.ts.map +1 -0
  226. package/dist/plugins/agents/acp/types.js +5 -0
  227. package/dist/plugins/agents/acp/types.js.map +1 -0
  228. package/dist/plugins/agents/claude-code/adapter.test.d.ts +2 -0
  229. package/dist/plugins/agents/claude-code/adapter.test.d.ts.map +1 -0
  230. package/dist/plugins/agents/claude-code/adapter.test.js +195 -0
  231. package/dist/plugins/agents/claude-code/adapter.test.js.map +1 -0
  232. package/dist/plugins/agents/claude-code/index.d.ts +25 -0
  233. package/dist/plugins/agents/claude-code/index.d.ts.map +1 -0
  234. package/dist/plugins/agents/claude-code/index.js +184 -0
  235. package/dist/plugins/agents/claude-code/index.js.map +1 -0
  236. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts +42 -0
  237. package/dist/plugins/agents/claude-code/mcp-approval-server.d.ts.map +1 -0
  238. package/dist/plugins/agents/claude-code/mcp-approval-server.js +235 -0
  239. package/dist/plugins/agents/claude-code/mcp-approval-server.js.map +1 -0
  240. package/dist/plugins/agents/claude-code/mcp-approval-server.test.d.ts +2 -0
  241. package/dist/plugins/agents/claude-code/mcp-approval-server.test.d.ts.map +1 -0
  242. package/dist/plugins/agents/claude-code/mcp-approval-server.test.js +188 -0
  243. package/dist/plugins/agents/claude-code/mcp-approval-server.test.js.map +1 -0
  244. package/dist/plugins/agents/codex/adapter.test.d.ts +2 -0
  245. package/dist/plugins/agents/codex/adapter.test.d.ts.map +1 -0
  246. package/dist/plugins/agents/codex/adapter.test.js +192 -0
  247. package/dist/plugins/agents/codex/adapter.test.js.map +1 -0
  248. package/dist/plugins/agents/codex/index.d.ts +37 -0
  249. package/dist/plugins/agents/codex/index.d.ts.map +1 -0
  250. package/dist/plugins/agents/codex/index.js +254 -0
  251. package/dist/plugins/agents/codex/index.js.map +1 -0
  252. package/dist/plugins/agents/copilot/index.d.ts +35 -0
  253. package/dist/plugins/agents/copilot/index.d.ts.map +1 -0
  254. package/dist/plugins/agents/copilot/index.js +182 -0
  255. package/dist/plugins/agents/copilot/index.js.map +1 -0
  256. package/dist/plugins/agents/opencode/adapter.test.d.ts +2 -0
  257. package/dist/plugins/agents/opencode/adapter.test.d.ts.map +1 -0
  258. package/dist/plugins/agents/opencode/adapter.test.js +139 -0
  259. package/dist/plugins/agents/opencode/adapter.test.js.map +1 -0
  260. package/dist/plugins/agents/opencode/http-adapter.test.d.ts +2 -0
  261. package/dist/plugins/agents/opencode/http-adapter.test.d.ts.map +1 -0
  262. package/dist/plugins/agents/opencode/http-adapter.test.js +492 -0
  263. package/dist/plugins/agents/opencode/http-adapter.test.js.map +1 -0
  264. package/dist/plugins/agents/opencode/index.d.ts +5 -0
  265. package/dist/plugins/agents/opencode/index.d.ts.map +1 -0
  266. package/dist/plugins/agents/opencode/index.js +30 -0
  267. package/dist/plugins/agents/opencode/index.js.map +1 -0
  268. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts +138 -0
  269. package/dist/plugins/agents/opencode/opencode-http-adapter.d.ts.map +1 -0
  270. package/dist/plugins/agents/opencode/opencode-http-adapter.js +549 -0
  271. package/dist/plugins/agents/opencode/opencode-http-adapter.js.map +1 -0
  272. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts +24 -0
  273. package/dist/plugins/agents/opencode/opencode-stdio-adapter.d.ts.map +1 -0
  274. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js +103 -0
  275. package/dist/plugins/agents/opencode/opencode-stdio-adapter.js.map +1 -0
  276. package/dist/plugins/agents/opencode/serve-manager.d.ts +27 -0
  277. package/dist/plugins/agents/opencode/serve-manager.d.ts.map +1 -0
  278. package/dist/plugins/agents/opencode/serve-manager.js +190 -0
  279. package/dist/plugins/agents/opencode/serve-manager.js.map +1 -0
  280. package/dist/plugins/messengers/discord/discord-adapter.d.ts +22 -0
  281. package/dist/plugins/messengers/discord/discord-adapter.d.ts.map +1 -0
  282. package/dist/plugins/messengers/discord/discord-adapter.js +241 -0
  283. package/dist/plugins/messengers/discord/discord-adapter.js.map +1 -0
  284. package/dist/plugins/messengers/discord/discord-adapter.test.d.ts +2 -0
  285. package/dist/plugins/messengers/discord/discord-adapter.test.d.ts.map +1 -0
  286. package/dist/plugins/messengers/discord/discord-adapter.test.js +332 -0
  287. package/dist/plugins/messengers/discord/discord-adapter.test.js.map +1 -0
  288. package/dist/plugins/messengers/discord/index.d.ts +4 -0
  289. package/dist/plugins/messengers/discord/index.d.ts.map +1 -0
  290. package/dist/plugins/messengers/discord/index.js +4 -0
  291. package/dist/plugins/messengers/discord/index.js.map +1 -0
  292. package/dist/plugins/messengers/discord/markdown-to-discord.d.ts +11 -0
  293. package/dist/plugins/messengers/discord/markdown-to-discord.d.ts.map +1 -0
  294. package/dist/plugins/messengers/discord/markdown-to-discord.js +59 -0
  295. package/dist/plugins/messengers/discord/markdown-to-discord.js.map +1 -0
  296. package/dist/plugins/messengers/discord/types.d.ts +9 -0
  297. package/dist/plugins/messengers/discord/types.d.ts.map +1 -0
  298. package/dist/plugins/messengers/discord/types.js +3 -0
  299. package/dist/plugins/messengers/discord/types.js.map +1 -0
  300. package/dist/plugins/messengers/feishu/card-builder.d.ts +23 -0
  301. package/dist/plugins/messengers/feishu/card-builder.d.ts.map +1 -0
  302. package/dist/plugins/messengers/feishu/card-builder.js +89 -0
  303. package/dist/plugins/messengers/feishu/card-builder.js.map +1 -0
  304. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts +33 -0
  305. package/dist/plugins/messengers/feishu/feishu-adapter.d.ts.map +1 -0
  306. package/dist/plugins/messengers/feishu/feishu-adapter.js +195 -0
  307. package/dist/plugins/messengers/feishu/feishu-adapter.js.map +1 -0
  308. package/dist/plugins/messengers/feishu/feishu-client.d.ts +44 -0
  309. package/dist/plugins/messengers/feishu/feishu-client.d.ts.map +1 -0
  310. package/dist/plugins/messengers/feishu/feishu-client.js +120 -0
  311. package/dist/plugins/messengers/feishu/feishu-client.js.map +1 -0
  312. package/dist/plugins/messengers/feishu/feishu-dedup.test.d.ts +2 -0
  313. package/dist/plugins/messengers/feishu/feishu-dedup.test.d.ts.map +1 -0
  314. package/dist/plugins/messengers/feishu/feishu-dedup.test.js +70 -0
  315. package/dist/plugins/messengers/feishu/feishu-dedup.test.js.map +1 -0
  316. package/dist/plugins/messengers/feishu/index.d.ts +4 -0
  317. package/dist/plugins/messengers/feishu/index.d.ts.map +1 -0
  318. package/dist/plugins/messengers/feishu/index.js +4 -0
  319. package/dist/plugins/messengers/feishu/index.js.map +1 -0
  320. package/dist/plugins/messengers/feishu/types.d.ts +113 -0
  321. package/dist/plugins/messengers/feishu/types.d.ts.map +1 -0
  322. package/dist/plugins/messengers/feishu/types.js +4 -0
  323. package/dist/plugins/messengers/feishu/types.js.map +1 -0
  324. package/dist/plugins/messengers/telegram/index.d.ts +4 -0
  325. package/dist/plugins/messengers/telegram/index.d.ts.map +1 -0
  326. package/dist/plugins/messengers/telegram/index.js +4 -0
  327. package/dist/plugins/messengers/telegram/index.js.map +1 -0
  328. package/dist/plugins/messengers/telegram/markdown-to-html.d.ts +5 -0
  329. package/dist/plugins/messengers/telegram/markdown-to-html.d.ts.map +1 -0
  330. package/dist/plugins/messengers/telegram/markdown-to-html.js +186 -0
  331. package/dist/plugins/messengers/telegram/markdown-to-html.js.map +1 -0
  332. package/dist/plugins/messengers/telegram/media-download.d.ts +51 -0
  333. package/dist/plugins/messengers/telegram/media-download.d.ts.map +1 -0
  334. package/dist/plugins/messengers/telegram/media-download.js +224 -0
  335. package/dist/plugins/messengers/telegram/media-download.js.map +1 -0
  336. package/dist/plugins/messengers/telegram/media-download.test.d.ts +2 -0
  337. package/dist/plugins/messengers/telegram/media-download.test.d.ts.map +1 -0
  338. package/dist/plugins/messengers/telegram/media-download.test.js +125 -0
  339. package/dist/plugins/messengers/telegram/media-download.test.js.map +1 -0
  340. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts +62 -0
  341. package/dist/plugins/messengers/telegram/telegram-adapter.d.ts.map +1 -0
  342. package/dist/plugins/messengers/telegram/telegram-adapter.js +653 -0
  343. package/dist/plugins/messengers/telegram/telegram-adapter.js.map +1 -0
  344. package/dist/plugins/messengers/telegram/types.d.ts +47 -0
  345. package/dist/plugins/messengers/telegram/types.d.ts.map +1 -0
  346. package/dist/plugins/messengers/telegram/types.js +3 -0
  347. package/dist/plugins/messengers/telegram/types.js.map +1 -0
  348. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts +68 -0
  349. package/dist/plugins/messengers/wechat/ilink-adapter.d.ts.map +1 -0
  350. package/dist/plugins/messengers/wechat/ilink-adapter.js +483 -0
  351. package/dist/plugins/messengers/wechat/ilink-adapter.js.map +1 -0
  352. package/dist/plugins/messengers/wechat/ilink-client.d.ts +66 -0
  353. package/dist/plugins/messengers/wechat/ilink-client.d.ts.map +1 -0
  354. package/dist/plugins/messengers/wechat/ilink-client.js +288 -0
  355. package/dist/plugins/messengers/wechat/ilink-client.js.map +1 -0
  356. package/dist/plugins/messengers/wechat/ilink-types.d.ts +173 -0
  357. package/dist/plugins/messengers/wechat/ilink-types.d.ts.map +1 -0
  358. package/dist/plugins/messengers/wechat/ilink-types.js +12 -0
  359. package/dist/plugins/messengers/wechat/ilink-types.js.map +1 -0
  360. package/dist/utils/backoff.d.ts +35 -0
  361. package/dist/utils/backoff.d.ts.map +1 -0
  362. package/dist/utils/backoff.js +59 -0
  363. package/dist/utils/backoff.js.map +1 -0
  364. package/dist/utils/cross-platform.d.ts +26 -0
  365. package/dist/utils/cross-platform.d.ts.map +1 -0
  366. package/dist/utils/cross-platform.js +58 -0
  367. package/dist/utils/cross-platform.js.map +1 -0
  368. package/dist/utils/message-split.d.ts +14 -0
  369. package/dist/utils/message-split.d.ts.map +1 -0
  370. package/dist/utils/message-split.js +65 -0
  371. package/dist/utils/message-split.js.map +1 -0
  372. package/dist/utils/safe-equal.d.ts +2 -0
  373. package/dist/utils/safe-equal.d.ts.map +1 -0
  374. package/dist/utils/safe-equal.js +11 -0
  375. package/dist/utils/safe-equal.js.map +1 -0
  376. package/dist/web/public/_app.js +196 -0
  377. package/dist/web/public/index.html +935 -0
  378. package/dist/web/public/settings.html +1181 -0
  379. package/dist/web/public/tasks.html +1827 -0
  380. package/dist/web/server.d.ts +11 -0
  381. package/dist/web/server.d.ts.map +1 -0
  382. package/dist/web/server.js +1820 -0
  383. package/dist/web/server.js.map +1 -0
  384. package/package.json +73 -0
@@ -0,0 +1,84 @@
1
+ // /audit command — query recent agent invocations
2
+ import { queryInvocations, getStats } from '../audit-log.js';
3
+ function formatDuration(ms) {
4
+ if (ms < 1000)
5
+ return `${ms}ms`;
6
+ if (ms < 60000)
7
+ return `${(ms / 1000).toFixed(1)}s`;
8
+ return `${Math.round(ms / 60000)}min`;
9
+ }
10
+ function formatCost(c) {
11
+ if (c === 0)
12
+ return '-';
13
+ return `$${c.toFixed(4)}`;
14
+ }
15
+ export async function handleAuditCommand(args, ctx) {
16
+ const parts = args.trim().split(/\s+/).filter(Boolean);
17
+ const opts = { limit: 10 };
18
+ let userOverrideAttempted = false;
19
+ for (const p of parts) {
20
+ if (p.startsWith('agent='))
21
+ opts.agent = p.slice(6);
22
+ else if (p.startsWith('platform='))
23
+ opts.platform = p.slice(9);
24
+ else if (p.startsWith('user=')) {
25
+ // H5: a user can't query another user's audit log via this command.
26
+ // We accept the syntax (so existing scripts don't choke) but will
27
+ // overwrite the value below to the caller's own userId. The flag lets
28
+ // us include a one-line note in the response so misuse is visible
29
+ // instead of silently rewritten.
30
+ const requested = p.slice(5);
31
+ if (ctx.userId && requested && requested !== ctx.userId) {
32
+ userOverrideAttempted = true;
33
+ }
34
+ else {
35
+ opts.userId = requested;
36
+ }
37
+ }
38
+ else if (p.startsWith('intent='))
39
+ opts.intent = p.slice(7);
40
+ else if (p.startsWith('days=')) {
41
+ const n = parseInt(p.slice(5), 10);
42
+ if (Number.isFinite(n) && n > 0)
43
+ opts.days = n;
44
+ }
45
+ else {
46
+ const n = parseInt(p, 10);
47
+ if (Number.isFinite(n) && n > 0)
48
+ opts.limit = Math.min(n, 1000);
49
+ }
50
+ }
51
+ // Default to caller's own userId. Leaves ctx.userId === undefined paths
52
+ // (REST / ACP / web) unrestricted, matching every other command's policy.
53
+ if (ctx.userId) {
54
+ opts.userId = ctx.userId;
55
+ }
56
+ const rows = queryInvocations(opts);
57
+ const stats = getStats();
58
+ if (rows.length === 0) {
59
+ const note = userOverrideAttempted
60
+ ? '\n\n⚠️ user=<other> 已忽略:审计查询仅展示自己的调用记录。'
61
+ : '';
62
+ return '📊 暂无审计记录。' + note;
63
+ }
64
+ const lines = rows.map((r) => {
65
+ const icon = r.success ? '✅' : '❌';
66
+ const intentTag = r.intent && r.intent !== 'default' ? ` ⟨${r.intent}⟩` : '';
67
+ return `${icon} \`${r.trace_id.slice(0, 8)}\` ${r.platform}/${r.agent}${intentTag} · ${formatDuration(r.duration_ms)} ← ${r.prompt_len}c → ${r.response_len}c · ${formatCost(r.cost)}`;
68
+ });
69
+ const overrideNote = userOverrideAttempted
70
+ ? '\n\n⚠️ user=<other> 已忽略:审计查询仅展示自己的调用记录。'
71
+ : '';
72
+ return `📊 **最近 ${rows.length} 次调用**
73
+
74
+ ${lines.join('\n')}
75
+
76
+ 总计: ${stats.total} 次 · 总花费 ${formatCost(stats.totalCost)}
77
+ ${Object.entries(stats.byAgent).map(([k, v]) => ` ${k}: ${v} 次`).join('\n')}${overrideNote}
78
+
79
+ /audit <n> 最近 n 条
80
+ /audit agent=opencode 按 agent 过滤
81
+ /audit intent=topic 按路由原因过滤 (explicit / topic / keyword / sticky / fallback)
82
+ /audit days=7 最近 7 天`;
83
+ }
84
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/core/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handleBuiltInCommand(command: 'start' | 'status' | 'help' | 'agents' | 'new', ctx: RouteContext): Promise<string>;
3
+ //# sourceMappingURL=builtin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin.d.ts","sourceRoot":"","sources":["../../../src/core/commands/builtin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EACvD,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
@@ -0,0 +1,26 @@
1
+ // Built-in commands: /start /status /help /agents /new
2
+ import { registry } from '../registry.js';
3
+ import { sessionManager } from '../session.js';
4
+ export async function handleBuiltInCommand(command, ctx) {
5
+ switch (command) {
6
+ case 'start':
7
+ return `👋 Welcome to IM Hub!\n\nI'm your AI assistant hub. Send me a message and I'll route it to the right AI agent.\n\nUse /help to see available commands.\nUse /agents to list available AI agents.`;
8
+ case 'status':
9
+ return `📊 IM hub Status\n\nPlatform: Connected\nAgent: Ready\n\nSend a message to start!`;
10
+ case 'help':
11
+ return `📖 IM hub Commands\n\nBuilt-in Commands:\n/agents - List available agents\n/new - Start a new conversation (clear history)\n/status - Show connection status\n/audit [n] - View recent invocations\n/approval - List/clear in-session auto-allow rules (alias /auto)\n/plan on|off - Toggle plan (read-only) mode for the active agent\n/<agent> <prompt> - Switch to agent and send prompt\n\nAgent Commands:\n/test - Run tests\n/review - Code review\n/commit - Commit changes\n/push - Push to remote\n/diff - Show changes\n/shell - Execute shell commands\n/bug - Find and fix bugs\n/explain - Explain code\n\nExample: /claude explain this code`;
12
+ case 'agents':
13
+ const agents = registry.listAgents();
14
+ if (agents.length === 0) {
15
+ return '⚠️ No agents registered yet.';
16
+ }
17
+ return `🤖 Available Agents\n\n${agents.map(a => `• ${a}`).join('\n')}\n\nUse /<agent> to switch.`;
18
+ case 'new':
19
+ const session = await sessionManager.resetConversation(ctx.platform, ctx.channelId, ctx.threadId);
20
+ if (session) {
21
+ return `🆕 New conversation started with ${session.agent}.\n\nPrevious context has been cleared.`;
22
+ }
23
+ return `🆕 Ready to start a new conversation.\n\nSend a message to begin.`;
24
+ }
25
+ }
26
+ //# sourceMappingURL=builtin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../../src/core/commands/builtin.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAuD,EACvD,GAAiB;IAEjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,kMAAkM,CAAA;QAE3M,KAAK,QAAQ;YACX,OAAO,mFAAmF,CAAA;QAE5F,KAAK,MAAM;YACT,OAAO,4nBAA4nB,CAAA;QAEroB,KAAK,QAAQ;YACX,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAA;YACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,8BAA8B,CAAA;YACvC,CAAC;YACD,OAAO,0BAA0B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAA;QAEpG,KAAK,KAAK;YACR,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;YACjG,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,oCAAoC,OAAO,CAAC,KAAK,yCAAyC,CAAA;YACnG,CAAC;YACD,OAAO,mEAAmE,CAAA;IAC9E,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handleJobCommand(args: string, ctx: RouteContext): Promise<string | AsyncGenerator<string>>;
3
+ //# sourceMappingURL=job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/core/commands/job.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAchD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAyK1C"}
@@ -0,0 +1,195 @@
1
+ // /job (also /task) commands — create and manage persisted async jobs with subtask sessions
2
+ import { registry } from '../registry.js';
3
+ import { sessionManager } from '../session.js';
4
+ import { AgentBase } from '../agent-base.js';
5
+ import { createJob, getJob, listJobs, cancelJob, runJob, getJobStats } from '../job-board.js';
6
+ import { workspaceRegistry } from '../workspace.js';
7
+ function formatJob(j) {
8
+ const icon = { pending: '⏳', running: '🔄', completed: '✅', failed: '❌', cancelled: '🚫' }[j.status] || '❓';
9
+ const ts = new Date(j.created_at + 'Z').toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });
10
+ const preview = j.prompt.substring(0, 50) + (j.prompt.length > 50 ? '...' : '');
11
+ return `${icon} #${j.id} ${j.agent}: ${preview} [${j.status}] · ${ts}`;
12
+ }
13
+ export async function handleJobCommand(args, ctx) {
14
+ const parts = args.trim().split(/\s+/).filter(Boolean);
15
+ const sub = parts[0] || 'list';
16
+ const rest = parts.slice(1).join(' ');
17
+ // Per-user scoping: when ctx.userId is set (the IM-driven path), every read /
18
+ // mutate is restricted to rows whose creator_id matches OR is '' (legacy).
19
+ // When userId is unset (REST/system caller via the same handler) all rows
20
+ // are visible — that's the historical behavior.
21
+ const ownerOpts = ctx.userId ? { creatorId: ctx.userId } : {};
22
+ switch (sub) {
23
+ case 'list':
24
+ case 'ls': {
25
+ const filter = parts[1];
26
+ const jobs = listJobs(10, filter, ownerOpts);
27
+ if (!jobs.length)
28
+ return '📋 暂无任务。\n\n使用 /job create <agent> <prompt> 创建新任务。';
29
+ const stats = getJobStats();
30
+ return `📋 **任务列表** (总 ${stats.total} · 待 ${stats.pending} · 运行 ${stats.running} · 完 ${stats.completed} · 败 ${stats.failed})
31
+
32
+ ${jobs.map(formatJob).join('\n')}
33
+
34
+ /job create <agent> <prompt> 创建
35
+ /job check <id> 查看详情
36
+ /job cancel <id> 取消
37
+ /job run <id> 立即运行`;
38
+ }
39
+ case 'create':
40
+ case 'c': {
41
+ if (!rest)
42
+ return '用法: /job create <agent> <prompt>\n\n例如: /job create opencode 分析这段代码的性能问题';
43
+ const spaceIdx = rest.indexOf(' ');
44
+ if (spaceIdx < 0)
45
+ return '用法: /job create <agent> <prompt>\n\n请提供 agent 名称和任务内容。';
46
+ const agentName = rest.slice(0, spaceIdx);
47
+ const prompt = rest.slice(spaceIdx + 1).trim();
48
+ if (!prompt)
49
+ return '请提供任务内容。';
50
+ const agent = registry.findAgent(agentName);
51
+ if (!agent)
52
+ return `❌ Agent "${agentName}" not found.`;
53
+ // M6: workspace whitelist applies to direct command paths too. Without
54
+ // this, a member of a workspace whose `agents: ['opencode']` whitelist
55
+ // allows only opencode could still smuggle in a `/job create claude-code`.
56
+ const ws = workspaceRegistry.resolve(ctx.userId || 'unknown');
57
+ if (!ws.hasAgent(agent.name)) {
58
+ return `❌ Agent "${agent.name}" 不在 workspace "${ws.name}" 的白名单内。`;
59
+ }
60
+ const id = createJob(agent.name, prompt, {
61
+ creatorId: ctx.userId || '',
62
+ workspaceId: ws.id,
63
+ });
64
+ return `✅ 任务 #${id} 已创建
65
+
66
+ Agent: ${agent.name}
67
+ 状态: 待执行
68
+
69
+ 使用 /job run ${id} 开始执行,或 /job list 查看所有任务。`;
70
+ }
71
+ case 'check':
72
+ case 'get':
73
+ case 'g': {
74
+ const id = parseInt(parts[1] || '', 10);
75
+ if (isNaN(id))
76
+ return '用法: /job check <id>';
77
+ const job = getJob(id, ownerOpts);
78
+ if (!job)
79
+ return `❌ 未找到任务 #${id}。`;
80
+ const statusLabel = { pending: '⏳ 待执行', running: '🔄 运行中', completed: '✅ 已完成', failed: '❌ 失败', cancelled: '🚫 已取消' };
81
+ let msg = `📋 **任务 #${job.id}**
82
+
83
+ Agent: ${job.agent}
84
+ 状态: ${statusLabel[job.status] || job.status}
85
+ 创建: ${job.created_at}`;
86
+ if (job.completed_at)
87
+ msg += `\n完成: ${job.completed_at}`;
88
+ msg += `\n\n内容: ${job.prompt}`;
89
+ if (job.result)
90
+ msg += `\n\n---\n结果:\n${job.result.length > 500 ? job.result.slice(0, 500) + '...' : job.result}`;
91
+ if (job.error)
92
+ msg += `\n\n错误: ${job.error}`;
93
+ if (job.status === 'completed')
94
+ msg += `\n\n/job run ${job.id} 重新执行`;
95
+ if (job.status === 'pending')
96
+ msg += `\n\n/job run ${job.id} 开始执行`;
97
+ return msg;
98
+ }
99
+ case 'run':
100
+ case 'r': {
101
+ const id = parseInt(parts[1] || '', 10);
102
+ if (isNaN(id))
103
+ return '用法: /job run <id>';
104
+ const job = getJob(id, ownerOpts);
105
+ if (!job)
106
+ return `❌ 未找到任务 #${id}。`;
107
+ if (job.status === 'running')
108
+ return `🔄 任务 #${id} 已在运行中。`;
109
+ const agent = registry.findAgent(job.agent);
110
+ if (!agent)
111
+ return `❌ Agent "${job.agent}" not found.`;
112
+ // Fire and forget with signal support for cancellation
113
+ const isAgentBaseAgent = agent instanceof AgentBase;
114
+ runJob(id, async function* (j, logger, signal) {
115
+ if (isAgentBaseAgent) {
116
+ const ba = agent;
117
+ const result = await ba.spawnAndCollect(j.prompt, signal);
118
+ if (result)
119
+ yield result;
120
+ }
121
+ else {
122
+ const generator = agent.sendPrompt(`job-${j.id}`, j.prompt, []);
123
+ for await (const chunk of generator) {
124
+ if (signal.aborted)
125
+ break;
126
+ yield chunk;
127
+ }
128
+ }
129
+ }, ctx.logger).catch(() => { });
130
+ return `🔄 任务 #${id} 已开始运行。
131
+
132
+ 使用 /job check ${id} 查看结果。`;
133
+ }
134
+ case 'cancel':
135
+ case 'x': {
136
+ const id = parseInt(parts[1] || '', 10);
137
+ if (isNaN(id))
138
+ return '用法: /job cancel <id>';
139
+ if (cancelJob(id, ownerOpts))
140
+ return `🚫 任务 #${id} 已取消。`;
141
+ return `❌ 无法取消任务 #${id}。可能不存在、已结束、或不是你创建的任务。`;
142
+ }
143
+ case 'switch':
144
+ case 'sw': {
145
+ const arg = parts[1];
146
+ if (!arg)
147
+ return '用法: /job switch <id> 或 /job switch main';
148
+ if (arg === 'main' || arg === '0') {
149
+ await sessionManager.setActiveSubtask(ctx.platform, ctx.channelId, ctx.threadId, null);
150
+ return '✅ 已返回主会话。';
151
+ }
152
+ const id = parseInt(arg, 10);
153
+ if (isNaN(id))
154
+ return '用法: /job switch <id> 或 /job switch main';
155
+ const job = getJob(id, ownerOpts);
156
+ if (!job)
157
+ return `❌ 未找到任务 #${id}。`;
158
+ await sessionManager.setActiveSubtask(ctx.platform, ctx.channelId, ctx.threadId, id);
159
+ // Also create/update subtask metadata in session
160
+ await sessionManager.updateSubtask(ctx.platform, ctx.channelId, ctx.threadId, id, {
161
+ id, agent: job.agent, prompt: job.prompt,
162
+ status: 'running', createdAt: new Date(),
163
+ });
164
+ return `✅ 已进入任务 #${id} 的会话 (${job.agent})。\n\n直接发送消息继续对话。\n/job switch main 返回主会话。`;
165
+ }
166
+ case 'collect':
167
+ case 'cl': {
168
+ const id = parseInt(parts[1] || '', 10);
169
+ if (isNaN(id))
170
+ return '用法: /job collect <id>';
171
+ const job = getJob(id, ownerOpts);
172
+ if (!job)
173
+ return `❌ 未找到任务 #${id}。`;
174
+ if (!job.result)
175
+ return `⚠️ 任务 #${id} (${job.status}) 暂无结果。`;
176
+ // Summarize via main agent
177
+ const existingSession = await sessionManager.getExistingSession(ctx.platform, ctx.channelId, ctx.threadId);
178
+ const mainAgent = existingSession?.agent || ctx.defaultAgent;
179
+ const agent = registry.findAgent(mainAgent);
180
+ if (!agent)
181
+ return `❌ Agent "${mainAgent}" not found.`;
182
+ const summaryPrompt = `Review and summarize this task result from ${job.agent}:\n\n---\n${job.result}\n---\n\nProvide a concise summary.`;
183
+ ctx.logger.info({ event: 'task.collect', taskId: id, agent: mainAgent });
184
+ // Return the generator — caller will stream
185
+ const generator = agent.sendPrompt(`collect-${id}`, summaryPrompt, []);
186
+ return (async function* () {
187
+ for await (const chunk of generator)
188
+ yield chunk;
189
+ })();
190
+ }
191
+ default:
192
+ return '用法: /job [list|create|check|run|cancel|switch|collect]\n\n也支持 /task 作为 /job 的别名。';
193
+ }
194
+ }
195
+ //# sourceMappingURL=job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/core/commands/job.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handleModelCommand(args: string, ctx: RouteContext): Promise<string>;
3
+ declare function invalidateModelCache(): void;
4
+ /** Test-only diagnostic: clear caches between cases. */
5
+ export declare const _internal: {
6
+ invalidateModelCache: typeof invalidateModelCache;
7
+ };
8
+ export {};
9
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/core/commands/model.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAoBhD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BzF;AA+FD,iBAAS,oBAAoB,IAAI,IAAI,CAGpC;AAuDD,wDAAwD;AACxD,eAAO,MAAM,SAAS;;CAA2B,CAAA"}
@@ -0,0 +1,183 @@
1
+ // /model [name|#N] + /models [filter|refresh] — model switching & listing
2
+ //
3
+ // Currently only the opencode adapter ships variants/models that the
4
+ // router can switch between, so this command is opencode-scoped. When
5
+ // the active agent isn't opencode we surface a friendly "not supported"
6
+ // message instead of querying the wrong CLI.
7
+ import { spawn } from 'child_process';
8
+ import { sessionManager } from '../session.js';
9
+ const SUPPORTED_AGENT = 'opencode';
10
+ const MODEL_LIST_TTL_MS = 5 * 60 * 1000; // 5 minutes — picks up newly-added models
11
+ function sessionKey(ctx) {
12
+ // Mirrors SessionManager's key shape so the cached numbered list lives
13
+ // alongside the actual session state (no userId mismatch in groups).
14
+ return `${ctx.platform}:${ctx.channelId}:${ctx.threadId}`;
15
+ }
16
+ function parseModelArgs(args) {
17
+ const p = args.trim().split(/\s+/);
18
+ return { sub: p[0] || '', rest: p.slice(1).join(' ') };
19
+ }
20
+ /** Per-session cache: last /models ordered result, indexed from 1 */
21
+ const sessionModelIndex = new Map();
22
+ export async function handleModelCommand(args, ctx) {
23
+ const { sub, rest } = parseModelArgs(args);
24
+ // /model refresh — force re-query the underlying CLI (M-5)
25
+ if (sub === 'refresh') {
26
+ invalidateModelCache();
27
+ return '✅ 模型缓存已清空。下次 /models 将重新查询。';
28
+ }
29
+ // Determine which agent the active session is using; fall back to default
30
+ const session = await sessionManager.getExistingSession(ctx.platform, ctx.channelId, ctx.threadId);
31
+ const activeAgent = session?.agent || ctx.defaultAgent;
32
+ if (activeAgent !== SUPPORTED_AGENT) {
33
+ return `ℹ️ \`/model\` 仅在 \`${SUPPORTED_AGENT}\` 下可用,当前 agent: \`${activeAgent}\`。\n\n切换到 opencode:/oc 或 /opencode`;
34
+ }
35
+ // /models or /models <filter> — list all models
36
+ if (sub === 'list') {
37
+ return handleModelList(rest, ctx);
38
+ }
39
+ // /model (no args) — show current model
40
+ if (args.trim() === '') {
41
+ return handleModelCurrent(ctx);
42
+ }
43
+ // /model <name|#N> — switch model (by full name, short name, or index)
44
+ return handleModelSwitch(args.trim(), ctx);
45
+ }
46
+ /** /models — list available models with optional filter, numbered */
47
+ async function handleModelList(filter, ctx) {
48
+ const models = await getModelList();
49
+ const defaultModel = await resolveDefaultModel();
50
+ const lowered = filter.toLowerCase();
51
+ const filtered = lowered ? models.filter(m => m.toLowerCase().includes(lowered)) : models;
52
+ if (filtered.length === 0) {
53
+ if (filter)
54
+ return `🔍 没有匹配 "${filter}" 的模型。`;
55
+ return `⚠️ 未能获取模型列表。请确认 opencode 已安装且配置了模型。`;
56
+ }
57
+ const session = await sessionManager.getOrCreateSession(ctx.platform, ctx.channelId, ctx.threadId, ctx.defaultAgent);
58
+ const current = session?.model || defaultModel;
59
+ // Build a flat indexed list for /model #N lookup
60
+ let idx = 1;
61
+ const flat = [];
62
+ const groups = new Map();
63
+ for (const m of filtered) {
64
+ const parts = m.split('/');
65
+ const prov = parts.length >= 2 ? parts.slice(0, -1).join('/') : m;
66
+ const short = m.split('/').pop();
67
+ if (!groups.has(prov))
68
+ groups.set(prov, []);
69
+ groups.get(prov).push({ num: idx, short, full: m });
70
+ flat.push({ num: idx, full: m });
71
+ idx++;
72
+ }
73
+ // Cache indexed list keyed identically to SessionManager.
74
+ sessionModelIndex.set(sessionKey(ctx), flat.map(f => f.full));
75
+ let msg = `📋 模型列表 (${filtered.length})\n\n`;
76
+ for (const [prov, list] of groups) {
77
+ msg += `**${prov}**\n`;
78
+ for (const { num, short, full } of list) {
79
+ const tag = full === current ? ' ⭐' : '';
80
+ msg += ` ${String(num).padStart(3, ' ')}. \`${short}\`${tag}\n`;
81
+ }
82
+ }
83
+ msg += `\n当前: \`${current}\` ⭐\n/model <全名> 或 /model #序号 切换\n/models refresh 强制刷新缓存`;
84
+ return msg;
85
+ }
86
+ /** /model — show currently selected model */
87
+ async function handleModelCurrent(ctx) {
88
+ const session = await sessionManager.getOrCreateSession(ctx.platform, ctx.channelId, ctx.threadId, ctx.defaultAgent);
89
+ const defaultModel = await resolveDefaultModel();
90
+ const current = session?.model || defaultModel;
91
+ return `🧠 当前模型: \`${current}\`\n\n使用 /model <全名> 或 /model #序号 切换\n使用 /models 查看所有模型`;
92
+ }
93
+ /** /model <name|#N> — switch to a different model */
94
+ async function handleModelSwitch(input, ctx) {
95
+ // Check if input is an index reference #N or just N
96
+ const indexMatch = input.match(/^#?(\d+)$/);
97
+ if (indexMatch) {
98
+ const num = parseInt(indexMatch[1], 10);
99
+ const cached = sessionModelIndex.get(sessionKey(ctx));
100
+ if (!cached || cached.length === 0) {
101
+ return `⚠️ 没有缓存的模型列表。请先 /models 查看,再用 /model #序号 切换。`;
102
+ }
103
+ if (num < 1 || num > cached.length) {
104
+ return `⚠️ 序号 ${num} 无效。可用范围: 1 - ${cached.length}\n\n先 /models 查看完整列表。`;
105
+ }
106
+ const model = cached[num - 1];
107
+ await sessionManager.getOrCreateSession(ctx.platform, ctx.channelId, ctx.threadId, ctx.defaultAgent);
108
+ await sessionManager.patchSession(ctx.platform, ctx.channelId, ctx.threadId, { model });
109
+ return `✅ 模型已切换: \`${model}\``;
110
+ }
111
+ // Check if input is a short name (no /) but looks like a model name
112
+ if (!input.includes('/')) {
113
+ return `⚠️ 模型格式: provider/model\n例: /model deepseek/deepseek-v4-pro\n或: /model #5 (序号切换)\n\n先 /models 查看`;
114
+ }
115
+ const models = await getModelList();
116
+ const exactMatch = models.find(m => m === input || m.endsWith('/' + input));
117
+ if (!exactMatch && models.length > 0) {
118
+ return `⚠️ 模型 "${input}" 不在列表中。\n\n先 /models 查看可用模型。`;
119
+ }
120
+ const resolved = exactMatch || input;
121
+ await sessionManager.getOrCreateSession(ctx.platform, ctx.channelId, ctx.threadId, ctx.defaultAgent);
122
+ await sessionManager.patchSession(ctx.platform, ctx.channelId, ctx.threadId, { model: resolved });
123
+ return `✅ 模型已切换: \`${resolved}\``;
124
+ }
125
+ let modelListCache = null;
126
+ let defaultModelCache = null;
127
+ function invalidateModelCache() {
128
+ modelListCache = null;
129
+ defaultModelCache = null;
130
+ }
131
+ function getModelList() {
132
+ return new Promise((resolve) => {
133
+ if (modelListCache && Date.now() - modelListCache.ts < MODEL_LIST_TTL_MS) {
134
+ return resolve(modelListCache.value);
135
+ }
136
+ const proc = spawn('opencode', ['models'], { stdio: ['ignore', 'pipe', 'pipe'] });
137
+ let out = '';
138
+ proc.stdout.on('data', d => out += d.toString());
139
+ proc.on('close', () => {
140
+ const lines = out.trim().split('\n').filter(Boolean);
141
+ modelListCache = { value: lines, ts: Date.now() };
142
+ resolve(lines);
143
+ });
144
+ proc.on('error', () => resolve([]));
145
+ });
146
+ }
147
+ /** Resolve opencode's actual default model name */
148
+ async function resolveDefaultModel() {
149
+ if (defaultModelCache && Date.now() - defaultModelCache.ts < MODEL_LIST_TTL_MS) {
150
+ return defaultModelCache.value;
151
+ }
152
+ // Read opencode.json to find the first configured model as the default
153
+ try {
154
+ const { readFile } = await import('fs/promises');
155
+ const { homedir } = await import('os');
156
+ const { join } = await import('path');
157
+ const configPath = join(homedir(), '.config', 'opencode', 'opencode.json');
158
+ const raw = await readFile(configPath, 'utf-8');
159
+ const config = JSON.parse(raw);
160
+ const provider = config.provider;
161
+ if (provider) {
162
+ for (const [, p] of Object.entries(provider)) {
163
+ if (p.models && typeof p.models === 'object') {
164
+ const keys = Object.keys(p.models);
165
+ if (keys.length > 0) {
166
+ defaultModelCache = { value: keys[0], ts: Date.now() };
167
+ return keys[0];
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ catch { /* fall through */ }
174
+ const models = await getModelList();
175
+ if (models.length > 0) {
176
+ defaultModelCache = { value: models[0], ts: Date.now() };
177
+ return models[0];
178
+ }
179
+ return 'unknown';
180
+ }
181
+ /** Test-only diagnostic: clear caches between cases. */
182
+ export const _internal = { invalidateModelCache };
183
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/core/commands/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RouteContext } from '../router.js';
2
+ export declare function handlePlanCommand(args: string, ctx: RouteContext): Promise<string>;
3
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/core/commands/plan.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAahD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDxF"}