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,203 @@
1
+ // Audit log — lightweight invocation tracking via SQLite
2
+ //
3
+ // Schema: one row per agent invocation with trace id, user, platform, cost, duration etc.
4
+ // Reuses the traceId from structured logging.
5
+ import { homedir } from 'os';
6
+ import { join } from 'path';
7
+ import { logger as rootLogger } from './logger.js';
8
+ import { recordInvocation, recordAuditPruneFailure } from './metrics.js';
9
+ import { eventBus } from './event-bus.js';
10
+ import { createSqliteHelper } from './sqlite-helper.js';
11
+ const log = rootLogger.child({ component: 'audit-log' });
12
+ const AUDIT_DB = join(homedir(), '.im-hub', 'audit.db');
13
+ /** Default number of days to keep audit rows. Override via env. */
14
+ function resolveRetentionDays() {
15
+ const raw = process.env.IM_HUB_AUDIT_RETENTION_DAYS;
16
+ if (raw) {
17
+ const n = parseInt(raw, 10);
18
+ if (Number.isFinite(n) && n > 0)
19
+ return n;
20
+ }
21
+ return 30;
22
+ }
23
+ /** How often to run the retention sweep (epoch-ms). 0 disables. */
24
+ const RETENTION_SWEEP_INTERVAL_MS = 6 * 60 * 60 * 1000; // 6 hours
25
+ let sweepTimer = null;
26
+ const helper = createSqliteHelper({
27
+ file: AUDIT_DB,
28
+ component: 'audit-log',
29
+ logger: rootLogger,
30
+ schema: `
31
+ CREATE TABLE IF NOT EXISTS invocations (
32
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
33
+ trace_id TEXT NOT NULL,
34
+ ts TEXT NOT NULL DEFAULT (datetime('now')),
35
+ user_id TEXT NOT NULL DEFAULT '',
36
+ platform TEXT NOT NULL DEFAULT '',
37
+ agent TEXT NOT NULL,
38
+ intent TEXT NOT NULL DEFAULT 'default',
39
+ prompt_len INTEGER NOT NULL DEFAULT 0,
40
+ response_len INTEGER NOT NULL DEFAULT 0,
41
+ duration_ms INTEGER NOT NULL DEFAULT 0,
42
+ cost REAL NOT NULL DEFAULT 0.0,
43
+ success INTEGER NOT NULL DEFAULT 1,
44
+ error TEXT
45
+ );
46
+ CREATE INDEX IF NOT EXISTS idx_inv_ts ON invocations(ts);
47
+ CREATE INDEX IF NOT EXISTS idx_inv_agent ON invocations(agent);
48
+ CREATE INDEX IF NOT EXISTS idx_inv_trace ON invocations(trace_id);
49
+ CREATE INDEX IF NOT EXISTS idx_inv_user ON invocations(user_id);
50
+ CREATE INDEX IF NOT EXISTS idx_inv_platform ON invocations(platform);
51
+ CREATE INDEX IF NOT EXISTS idx_inv_intent ON invocations(intent);
52
+ `,
53
+ init: (d) => {
54
+ pruneExpired(d);
55
+ if (RETENTION_SWEEP_INTERVAL_MS > 0 && sweepTimer === null) {
56
+ sweepTimer = setInterval(() => {
57
+ const live = helper.get();
58
+ if (live)
59
+ pruneExpired(live);
60
+ }, RETENTION_SWEEP_INTERVAL_MS);
61
+ if (typeof sweepTimer === 'object' && sweepTimer && 'unref' in sweepTimer) {
62
+ sweepTimer.unref();
63
+ }
64
+ }
65
+ },
66
+ });
67
+ function getDb() {
68
+ return helper.get();
69
+ }
70
+ export function logInvocation(rec) {
71
+ // Always update in-memory metrics first so /api/metrics works even when
72
+ // the SQLite layer is degraded (e.g. bun runtime, disk full).
73
+ recordInvocation({
74
+ agent: rec.agent,
75
+ intent: rec.intent,
76
+ platform: rec.platform,
77
+ durationMs: rec.durationMs,
78
+ cost: rec.cost,
79
+ success: rec.success,
80
+ });
81
+ // Real-time fan-out for the dashboard's SSE consumer. Best-effort —
82
+ // event-bus swallows listener errors so a buggy subscriber can't break
83
+ // the audit hot path.
84
+ eventBus.publish({
85
+ type: 'audit',
86
+ ts: new Date().toISOString(),
87
+ agent: rec.agent,
88
+ intent: rec.intent,
89
+ platform: rec.platform,
90
+ durationMs: rec.durationMs,
91
+ cost: rec.cost,
92
+ success: rec.success,
93
+ traceId: rec.traceId,
94
+ userId: rec.userId,
95
+ });
96
+ const d = getDb();
97
+ if (!d)
98
+ return;
99
+ try {
100
+ const stmt = d.prepare(`
101
+ INSERT INTO invocations (trace_id, user_id, platform, agent, intent, prompt_len, response_len, duration_ms, cost, success, error)
102
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
103
+ `);
104
+ stmt.run(rec.traceId, rec.userId, rec.platform, rec.agent, rec.intent, rec.promptLen, rec.responseLen, rec.durationMs, rec.cost, rec.success ? 1 : 0, rec.error || null);
105
+ }
106
+ catch {
107
+ // Best-effort logging; never fail the request because of audit IO
108
+ }
109
+ }
110
+ export function queryInvocations(opts = {}) {
111
+ const d = getDb();
112
+ if (!d)
113
+ return [];
114
+ const conditions = [];
115
+ const params = [];
116
+ if (opts.agent) {
117
+ conditions.push('agent = ?');
118
+ params.push(opts.agent);
119
+ }
120
+ if (opts.platform) {
121
+ conditions.push('platform = ?');
122
+ params.push(opts.platform);
123
+ }
124
+ if (opts.userId) {
125
+ conditions.push('user_id = ?');
126
+ params.push(opts.userId);
127
+ }
128
+ if (opts.intent) {
129
+ conditions.push('intent = ?');
130
+ params.push(opts.intent);
131
+ }
132
+ if (opts.days && Number.isFinite(opts.days) && opts.days > 0) {
133
+ conditions.push("ts >= datetime('now', ?)");
134
+ params.push(`-${Math.floor(opts.days)} days`);
135
+ }
136
+ const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
137
+ const rawLimit = opts.limit;
138
+ const limit = Number.isFinite(rawLimit) && rawLimit > 0 ? Math.min(Math.floor(rawLimit), 1000) : 20;
139
+ try {
140
+ return d.prepare(`SELECT * FROM invocations ${where} ORDER BY ts DESC LIMIT ?`)
141
+ .all(...params, limit);
142
+ }
143
+ catch {
144
+ return [];
145
+ }
146
+ }
147
+ /**
148
+ * Delete rows older than the retention window. Returns number of deleted
149
+ * rows so callers / tests can assert behavior.
150
+ */
151
+ export function pruneExpired(d = getDb()) {
152
+ if (!d)
153
+ return 0;
154
+ const days = resolveRetentionDays();
155
+ try {
156
+ const info = d.prepare("DELETE FROM invocations WHERE ts < datetime('now', ?)")
157
+ .run(`-${days} days`);
158
+ if (info.changes > 0) {
159
+ log.info({ event: 'audit-log.pruned', deleted: info.changes, days }, `Pruned ${info.changes} audit row(s) older than ${days}d`);
160
+ }
161
+ return info.changes;
162
+ }
163
+ catch (err) {
164
+ const msg = err instanceof Error ? err.message : String(err);
165
+ log.warn({ event: 'audit-log.prune.failed', error: msg }, 'audit-log retention sweep failed');
166
+ // M7: surface as Prometheus counter so a stuck retention loop becomes
167
+ // observable beyond a stderr warn line. Alert on any non-zero rate.
168
+ recordAuditPruneFailure();
169
+ return 0;
170
+ }
171
+ }
172
+ /** Stop the periodic retention sweep (used by tests and graceful shutdown). */
173
+ export function stopRetentionSweep() {
174
+ if (sweepTimer) {
175
+ clearInterval(sweepTimer);
176
+ sweepTimer = null;
177
+ }
178
+ }
179
+ /** Close the underlying SQLite handle. Pairs with stopRetentionSweep on
180
+ * graceful shutdown so WAL is checkpointed cleanly (L2). */
181
+ export function closeAuditDb() {
182
+ helper.close();
183
+ }
184
+ export function getStats() {
185
+ const d = getDb();
186
+ if (!d)
187
+ return { total: 0, byAgent: {}, totalCost: 0 };
188
+ try {
189
+ const total = d.prepare('SELECT COUNT(*) as n FROM invocations').get().n;
190
+ const rows = d.prepare('SELECT agent, COUNT(*) as n, SUM(cost) as total_cost FROM invocations GROUP BY agent').all();
191
+ const byAgent = {};
192
+ let totalCost = 0;
193
+ for (const r of rows) {
194
+ byAgent[r.agent] = r.n;
195
+ totalCost += r.total_cost || 0;
196
+ }
197
+ return { total, byAgent, totalCost };
198
+ }
199
+ catch {
200
+ return { total: 0, byAgent: {}, totalCost: 0 };
201
+ }
202
+ }
203
+ //# sourceMappingURL=audit-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log.js","sourceRoot":"","sources":["../../src/core/audit-log.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,0FAA0F;AAC1F,8CAA8C;AAG9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAA;AAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAEvD,mEAAmE;AACnE,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAA;IACnD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,mEAAmE;AACnE,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAE,UAAU;AAElE,IAAI,UAAU,GAA0C,IAAI,CAAA;AAE5D,MAAM,MAAM,GAAG,kBAAkB,CAAC;IAChC,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;GAsBP;IACD,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACV,YAAY,CAAC,CAAC,CAAC,CAAA;QACf,IAAI,2BAA2B,GAAG,CAAC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC3D,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAA;gBACzB,IAAI,IAAI;oBAAE,YAAY,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC,EAAE,2BAA2B,CAAC,CAAA;YAC/B,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBACzE,UAAoC,CAAC,KAAK,EAAE,CAAA;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,SAAS,KAAK;IACZ,OAAO,MAAM,CAAC,GAAG,EAAE,CAAA;AACrB,CAAC;AAgBD,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC5C,wEAAwE;IACxE,8DAA8D;IAC9D,gBAAgB,CAAC;QACf,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAA;IAEF,oEAAoE;IACpE,uEAAuE;IACvE,sBAAsB;IACtB,QAAQ,CAAC,OAAO,CAAC;QACf,IAAI,EAAE,OAAO;QACb,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,KAAK,EAAE,CAAA;IACjB,IAAI,CAAC,CAAC;QAAE,OAAM;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC;;;KAGtB,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EACnE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,EACxD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC;AA2BD,MAAM,UAAU,gBAAgB,CAAC,OAAkB,EAAE;IACnD,MAAM,CAAC,GAAG,KAAK,EAAE,CAAA;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IACjB,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,MAAM,GAAc,EAAE,CAAA;IAE5B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAAC,CAAC;IACzE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAAC,CAAC;IAClF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC7D,UAAU,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAC3C,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAA;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAErG,IAAI,CAAC;QACH,OAAO,CAAC,CAAC,OAAO,CAAC,6BAA6B,KAAK,2BAA2B,CAAC;aAC5E,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAoB,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAuB,KAAK,EAAG;IAC1D,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAChB,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAA;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,uDAAuD,CAAC;aAC5E,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,CAAA;QACvB,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EACjE,UAAU,IAAI,CAAC,OAAO,4BAA4B,IAAI,GAAG,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5D,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAA;QAC7F,sEAAsE;QACtE,oEAAoE;QACpE,uBAAuB,EAAE,CAAA;QACzB,OAAO,CAAC,CAAA;IACV,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB;IAChC,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,CAAC,UAAU,CAAC,CAAA;QACzB,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;AACH,CAAC;AAED;6DAC6D;AAC7D,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,KAAK,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,CAAC,GAAG,KAAK,EAAE,CAAA;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IACtD,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAA;QAC3F,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,sFAAsF,CAAC,CAAC,GAAG,EAAoE,CAAA;QACtL,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACtB,SAAS,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,65 @@
1
+ export interface BgjobRoot {
2
+ /** Stable identifier for the UI: 'claude', 'opencode', or basename of custom path. */
3
+ id: string;
4
+ /** Filesystem path. */
5
+ path: string;
6
+ /** Pretty label for display. */
7
+ label: string;
8
+ }
9
+ export interface BgjobSummary {
10
+ id: string;
11
+ name: string;
12
+ status: string;
13
+ pid: number | null;
14
+ started_at: string | null;
15
+ ended_at: string | null;
16
+ exit_code: number | null;
17
+ restart_generation: number;
18
+ /** Source root id (e.g. 'claude' or 'opencode') — useful when caller mixes roots. */
19
+ rootId: string;
20
+ }
21
+ export interface BgjobDetail extends BgjobSummary {
22
+ cmd: string[];
23
+ workdir: string | null;
24
+ out_dir: string | null;
25
+ log_path: string | null;
26
+ resources: {
27
+ cpu_time?: number;
28
+ rss_kb?: number;
29
+ state?: string;
30
+ } | null;
31
+ /** Tail of log.txt (last `tailLines` lines). */
32
+ log_tail: string | null;
33
+ }
34
+ /**
35
+ * Resolve the configured roots. Reads env IMHUB_BGJOB_ROOTS — comma-separated
36
+ * absolute paths, optionally with id prefix `id=path`. Falls back to the two
37
+ * defaults so a fresh install just works.
38
+ */
39
+ export declare function resolveRoots(): BgjobRoot[];
40
+ /**
41
+ * List all bgjobs under one root, newest first by started_at.
42
+ *
43
+ * If <root>/index.json exists we use that as the authoritative ID set;
44
+ * otherwise we fall back to scanning subdirectories that look like job IDs.
45
+ * Both paths read each job's meta.json for status — index.json itself does
46
+ * not record status.
47
+ */
48
+ export declare function listJobsForRoot(root: BgjobRoot): Promise<BgjobSummary[]>;
49
+ /**
50
+ * Get full detail for one job, including a tail of its log file. Returns null
51
+ * if the id isn't found in this root.
52
+ */
53
+ export declare function getJobDetail(root: BgjobRoot, id: string, tailLines?: number): Promise<BgjobDetail | null>;
54
+ /**
55
+ * Convenience: list jobs across every configured root. Each item carries its
56
+ * `rootId` so the UI can render or filter. Concurrency is per-root so a slow
57
+ * filesystem on one root doesn't block another.
58
+ */
59
+ export declare function listAllJobs(): Promise<{
60
+ root: BgjobRoot;
61
+ jobs: BgjobSummary[];
62
+ }[]>;
63
+ /** Resolve one root by id. Returns null if not configured. */
64
+ export declare function findRoot(rootId: string): BgjobRoot | null;
65
+ //# sourceMappingURL=bgjob-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bgjob-reader.d.ts","sourceRoot":"","sources":["../../src/core/bgjob-reader.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,SAAS;IACxB,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAA;IACV,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,qFAAqF;IACrF,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,gDAAgD;IAChD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAQD;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAqB1C;AA0BD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA+B9E;AA4BD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,EACV,SAAS,SAAM,GACd,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAiB7B;AAuCD;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,YAAY,EAAE,CAAA;CAAE,EAAE,CAAC,CAUxF;AAED,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEzD"}
@@ -0,0 +1,212 @@
1
+ // bgjob-reader — read-only view into the bgjob directories used by Claude Code
2
+ // and opencode. Format documented in /root/.claude/CLAUDE.md and the wrapper at
3
+ // /root/.config/opencode/scripts/bgjob.
4
+ //
5
+ // Layout per root:
6
+ // <root>/
7
+ // index.json { jobs: [{id, name, started_at}, ...] }
8
+ // <id>/meta.json { id, name, cmd[], status, pid, started_at, ended_at, exit_code, ... }
9
+ // <id>/log.txt merged stdout+stderr
10
+ //
11
+ // We read these files directly (no Python wrapper subprocess). The wrapper is
12
+ // the source of truth for writes; we are strictly the read side.
13
+ //
14
+ // Multiple roots are supported (claude / opencode are isolated by design).
15
+ // Configurable via env IMHUB_BGJOB_ROOTS — comma-separated absolute paths.
16
+ import { readFile, readdir, stat } from 'fs/promises';
17
+ import { homedir } from 'os';
18
+ import { join, isAbsolute, resolve, basename } from 'path';
19
+ import { logger as rootLogger } from './logger.js';
20
+ const log = rootLogger.child({ component: 'bgjob-reader' });
21
+ const DEFAULT_ROOTS = [
22
+ { id: 'claude', path: join(homedir(), '.claude', 'bgjobs'), label: 'Claude Code' },
23
+ { id: 'opencode', path: join(homedir(), '.config', 'opencode', 'bgjobs'), label: 'opencode' },
24
+ { id: 'codex', path: join(homedir(), '.codex', 'bgjobs'), label: 'Codex' },
25
+ ];
26
+ /**
27
+ * Resolve the configured roots. Reads env IMHUB_BGJOB_ROOTS — comma-separated
28
+ * absolute paths, optionally with id prefix `id=path`. Falls back to the two
29
+ * defaults so a fresh install just works.
30
+ */
31
+ export function resolveRoots() {
32
+ const raw = process.env.IMHUB_BGJOB_ROOTS;
33
+ if (!raw || !raw.trim())
34
+ return DEFAULT_ROOTS;
35
+ const out = [];
36
+ for (const part of raw.split(',').map((s) => s.trim()).filter(Boolean)) {
37
+ const eq = part.indexOf('=');
38
+ let id, path;
39
+ if (eq > 0) {
40
+ id = part.slice(0, eq).trim();
41
+ path = part.slice(eq + 1).trim();
42
+ }
43
+ else {
44
+ path = part;
45
+ id = basename(path) || path;
46
+ }
47
+ if (!isAbsolute(path)) {
48
+ log.warn({ part }, 'IMHUB_BGJOB_ROOTS entry must be absolute, ignoring');
49
+ continue;
50
+ }
51
+ out.push({ id, path: resolve(path), label: id });
52
+ }
53
+ return out.length ? out : DEFAULT_ROOTS;
54
+ }
55
+ function safeJsonParse(s) {
56
+ try {
57
+ return JSON.parse(s);
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * List all bgjobs under one root, newest first by started_at.
65
+ *
66
+ * If <root>/index.json exists we use that as the authoritative ID set;
67
+ * otherwise we fall back to scanning subdirectories that look like job IDs.
68
+ * Both paths read each job's meta.json for status — index.json itself does
69
+ * not record status.
70
+ */
71
+ export async function listJobsForRoot(root) {
72
+ let jobIds = [];
73
+ try {
74
+ const idxRaw = await readFile(join(root.path, 'index.json'), 'utf-8');
75
+ const idx = safeJsonParse(idxRaw);
76
+ if (idx?.jobs?.length)
77
+ jobIds = idx.jobs.map((j) => j.id || '').filter(Boolean);
78
+ }
79
+ catch {
80
+ // Missing index.json — try directory scan as fallback. This also handles
81
+ // the case where a wrapper hasn't been run yet but stale dirs exist.
82
+ try {
83
+ const entries = await readdir(root.path, { withFileTypes: true });
84
+ jobIds = entries.filter((e) => e.isDirectory()).map((e) => e.name);
85
+ }
86
+ catch (err) {
87
+ log.debug({ root: root.id, err: err.message }, 'bgjob root not accessible');
88
+ return [];
89
+ }
90
+ }
91
+ const out = [];
92
+ for (const id of jobIds) {
93
+ const meta = await readMeta(root, id);
94
+ if (!meta)
95
+ continue;
96
+ out.push(metaToSummary(root, meta));
97
+ }
98
+ // newest first by started_at; fallback to id (lexical, contains timestamp prefix)
99
+ out.sort((a, b) => {
100
+ const ta = a.started_at || a.id;
101
+ const tb = b.started_at || b.id;
102
+ return tb.localeCompare(ta);
103
+ });
104
+ return out;
105
+ }
106
+ async function readMeta(root, id) {
107
+ // Defense in depth: ID is from a trusted file but we still reject path
108
+ // separators so a malformed entry can't escape the root.
109
+ if (id.includes('/') || id.includes('\\') || id === '..' || id === '.')
110
+ return null;
111
+ try {
112
+ const raw = await readFile(join(root.path, id, 'meta.json'), 'utf-8');
113
+ return safeJsonParse(raw);
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ }
119
+ function metaToSummary(root, meta) {
120
+ return {
121
+ id: meta.id || '',
122
+ name: meta.name || '',
123
+ status: meta.status || 'unknown',
124
+ pid: typeof meta.pid === 'number' ? meta.pid : null,
125
+ started_at: meta.started_at ?? null,
126
+ ended_at: meta.ended_at ?? null,
127
+ exit_code: typeof meta.exit_code === 'number' ? meta.exit_code : null,
128
+ restart_generation: typeof meta.restart_generation === 'number' ? meta.restart_generation : 0,
129
+ rootId: root.id,
130
+ };
131
+ }
132
+ /**
133
+ * Get full detail for one job, including a tail of its log file. Returns null
134
+ * if the id isn't found in this root.
135
+ */
136
+ export async function getJobDetail(root, id, tailLines = 200) {
137
+ const meta = await readMeta(root, id);
138
+ if (!meta)
139
+ return null;
140
+ const summary = metaToSummary(root, meta);
141
+ const logPath = meta.log || join(root.path, id, 'log.txt');
142
+ const logTail = await readLogTail(logPath, tailLines);
143
+ return {
144
+ ...summary,
145
+ cmd: Array.isArray(meta.cmd) ? meta.cmd : [],
146
+ workdir: meta.workdir || null,
147
+ out_dir: meta.out_dir || null,
148
+ log_path: logPath,
149
+ resources: meta.resources || null,
150
+ log_tail: logTail,
151
+ };
152
+ }
153
+ async function readLogTail(path, lines) {
154
+ try {
155
+ const st = await stat(path);
156
+ if (!st.isFile())
157
+ return null;
158
+ // Cheap implementation: read whole file then slice. log.txt typically caps
159
+ // at ~MB; for huge logs the wrapper rotates. If a job balloons the file
160
+ // we still want responsiveness, so cap read at 2MB.
161
+ const MAX_BYTES = 2 * 1024 * 1024;
162
+ if (st.size > MAX_BYTES) {
163
+ const fd = await import('fs/promises').then((m) => m.open(path, 'r'));
164
+ try {
165
+ const buf = Buffer.alloc(MAX_BYTES);
166
+ await fd.read(buf, 0, MAX_BYTES, st.size - MAX_BYTES);
167
+ const text = buf.toString('utf-8');
168
+ // Drop the first (likely partial) line so we don't show a fragment.
169
+ const nl = text.indexOf('\n');
170
+ const tail = nl >= 0 ? text.slice(nl + 1) : text;
171
+ return takeLastLines(tail, lines, true);
172
+ }
173
+ finally {
174
+ await fd.close();
175
+ }
176
+ }
177
+ const text = await readFile(path, 'utf-8');
178
+ return takeLastLines(text, lines, false);
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ function takeLastLines(text, n, truncatedHead) {
185
+ const all = text.split('\n');
186
+ // Drop trailing empty line(s) for cleaner output
187
+ while (all.length && all[all.length - 1] === '')
188
+ all.pop();
189
+ const slice = all.slice(-n).join('\n');
190
+ return truncatedHead ? '…(truncated)\n' + slice : slice;
191
+ }
192
+ /**
193
+ * Convenience: list jobs across every configured root. Each item carries its
194
+ * `rootId` so the UI can render or filter. Concurrency is per-root so a slow
195
+ * filesystem on one root doesn't block another.
196
+ */
197
+ export async function listAllJobs() {
198
+ const roots = resolveRoots();
199
+ const results = await Promise.all(roots.map(async (root) => ({
200
+ root,
201
+ jobs: await listJobsForRoot(root).catch((err) => {
202
+ log.warn({ root: root.id, err: err.message }, 'bgjob list failed');
203
+ return [];
204
+ }),
205
+ })));
206
+ return results;
207
+ }
208
+ /** Resolve one root by id. Returns null if not configured. */
209
+ export function findRoot(rootId) {
210
+ return resolveRoots().find((r) => r.id === rootId) ?? null;
211
+ }
212
+ //# sourceMappingURL=bgjob-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bgjob-reader.js","sourceRoot":"","sources":["../../src/core/bgjob-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bgjob-reader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bgjob-reader.test.d.ts","sourceRoot":"","sources":["../../src/core/bgjob-reader.test.ts"],"names":[],"mappings":""}