@caoruhua/open-claude-remote 0.1.0 → 0.1.3

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 (322) hide show
  1. package/README.md +285 -295
  2. package/dist/backend/src/api/auth-routes.d.ts.map +1 -0
  3. package/dist/backend/src/api/auth-routes.js.map +1 -0
  4. package/dist/backend/src/api/config-routes.d.ts +7 -0
  5. package/dist/backend/src/api/config-routes.d.ts.map +1 -0
  6. package/dist/{api → backend/src/api}/config-routes.js +125 -13
  7. package/dist/backend/src/api/config-routes.js.map +1 -0
  8. package/dist/backend/src/api/health-routes.d.ts.map +1 -0
  9. package/dist/backend/src/api/health-routes.js.map +1 -0
  10. package/dist/backend/src/api/hook-routes.d.ts.map +1 -0
  11. package/dist/backend/src/api/hook-routes.js.map +1 -0
  12. package/dist/{api → backend/src/api}/instance-routes.d.ts +5 -1
  13. package/dist/backend/src/api/instance-routes.d.ts.map +1 -0
  14. package/dist/{api → backend/src/api}/instance-routes.js +5 -1
  15. package/dist/backend/src/api/instance-routes.js.map +1 -0
  16. package/dist/backend/src/api/push-routes.d.ts.map +1 -0
  17. package/dist/backend/src/api/push-routes.js.map +1 -0
  18. package/dist/{api → backend/src/api}/router.d.ts +7 -1
  19. package/dist/backend/src/api/router.d.ts.map +1 -0
  20. package/dist/{api → backend/src/api}/router.js +1 -1
  21. package/dist/backend/src/api/router.js.map +1 -0
  22. package/dist/backend/src/api/status-routes.d.ts.map +1 -0
  23. package/dist/backend/src/api/status-routes.js.map +1 -0
  24. package/dist/backend/src/attach.d.ts.map +1 -0
  25. package/dist/{attach.js → backend/src/attach.js} +11 -11
  26. package/dist/backend/src/attach.js.map +1 -0
  27. package/dist/backend/src/auth/auth-middleware.d.ts.map +1 -0
  28. package/dist/backend/src/auth/auth-middleware.js.map +1 -0
  29. package/dist/backend/src/auth/rate-limiter.d.ts.map +1 -0
  30. package/dist/backend/src/auth/rate-limiter.js.map +1 -0
  31. package/dist/backend/src/auth/token-generator.d.ts.map +1 -0
  32. package/dist/{auth → backend/src/auth}/token-generator.js +1 -1
  33. package/dist/backend/src/auth/token-generator.js.map +1 -0
  34. package/dist/{cli-utils.d.ts → backend/src/cli-utils.d.ts} +3 -3
  35. package/dist/backend/src/cli-utils.d.ts.map +1 -0
  36. package/dist/{cli-utils.js → backend/src/cli-utils.js} +49 -36
  37. package/dist/backend/src/cli-utils.js.map +1 -0
  38. package/dist/backend/src/cli.d.ts +22 -0
  39. package/dist/backend/src/cli.d.ts.map +1 -0
  40. package/dist/{cli.js → backend/src/cli.js} +21 -16
  41. package/dist/backend/src/cli.js.map +1 -0
  42. package/dist/{config.d.ts → backend/src/config.d.ts} +29 -5
  43. package/dist/backend/src/config.d.ts.map +1 -0
  44. package/dist/{config.js → backend/src/config.js} +198 -12
  45. package/dist/backend/src/config.js.map +1 -0
  46. package/dist/backend/src/deps/detector.d.ts +18 -0
  47. package/dist/backend/src/deps/detector.d.ts.map +1 -0
  48. package/dist/backend/src/deps/detector.js +49 -0
  49. package/dist/backend/src/deps/detector.js.map +1 -0
  50. package/dist/backend/src/deps/index.d.ts +14 -0
  51. package/dist/backend/src/deps/index.d.ts.map +1 -0
  52. package/dist/backend/src/deps/index.js +219 -0
  53. package/dist/backend/src/deps/index.js.map +1 -0
  54. package/dist/backend/src/deps/installer.d.ts +13 -0
  55. package/dist/backend/src/deps/installer.d.ts.map +1 -0
  56. package/dist/backend/src/deps/installer.js +113 -0
  57. package/dist/backend/src/deps/installer.js.map +1 -0
  58. package/dist/backend/src/deps/platform.d.ts +27 -0
  59. package/dist/backend/src/deps/platform.d.ts.map +1 -0
  60. package/dist/backend/src/deps/platform.js +154 -0
  61. package/dist/backend/src/deps/platform.js.map +1 -0
  62. package/dist/backend/src/deps/prompt.d.ts +51 -0
  63. package/dist/backend/src/deps/prompt.d.ts.map +1 -0
  64. package/dist/backend/src/deps/prompt.js +128 -0
  65. package/dist/backend/src/deps/prompt.js.map +1 -0
  66. package/dist/backend/src/deps/types.d.ts +40 -0
  67. package/dist/backend/src/deps/types.d.ts.map +1 -0
  68. package/dist/backend/src/deps/types.js +54 -0
  69. package/dist/backend/src/deps/types.js.map +1 -0
  70. package/dist/backend/src/hooks/hook-receiver.d.ts +39 -0
  71. package/dist/backend/src/hooks/hook-receiver.d.ts.map +1 -0
  72. package/dist/backend/src/hooks/hook-receiver.js +96 -0
  73. package/dist/backend/src/hooks/hook-receiver.js.map +1 -0
  74. package/dist/backend/src/hooks/hook-types.d.ts +165 -0
  75. package/dist/backend/src/hooks/hook-types.d.ts.map +1 -0
  76. package/dist/backend/src/hooks/hook-types.js +16 -0
  77. package/dist/backend/src/hooks/hook-types.js.map +1 -0
  78. package/dist/backend/src/index.d.ts.map +1 -0
  79. package/dist/{index.js → backend/src/index.js} +27 -32
  80. package/dist/backend/src/index.js.map +1 -0
  81. package/dist/backend/src/logger/logger.d.ts.map +1 -0
  82. package/dist/{logger → backend/src/logger}/logger.js +3 -5
  83. package/dist/{logger → backend/src/logger}/logger.js.map +1 -1
  84. package/dist/backend/src/notification/dingtalk-service.d.ts.map +1 -0
  85. package/dist/{notification → backend/src/notification}/dingtalk-service.js +1 -1
  86. package/dist/backend/src/notification/dingtalk-service.js.map +1 -0
  87. package/dist/backend/src/notification/notification-manager.d.ts +44 -0
  88. package/dist/backend/src/notification/notification-manager.d.ts.map +1 -0
  89. package/dist/backend/src/notification/notification-manager.js +94 -0
  90. package/dist/backend/src/notification/notification-manager.js.map +1 -0
  91. package/dist/backend/src/notification/notification-service-factory.d.ts +67 -0
  92. package/dist/backend/src/notification/notification-service-factory.d.ts.map +1 -0
  93. package/dist/backend/src/notification/notification-service-factory.js +146 -0
  94. package/dist/backend/src/notification/notification-service-factory.js.map +1 -0
  95. package/dist/backend/src/notification/wechat-work-service.d.ts +24 -0
  96. package/dist/backend/src/notification/wechat-work-service.d.ts.map +1 -0
  97. package/dist/backend/src/notification/wechat-work-service.js +88 -0
  98. package/dist/backend/src/notification/wechat-work-service.js.map +1 -0
  99. package/dist/backend/src/pty/output-buffer.d.ts.map +1 -0
  100. package/dist/backend/src/pty/output-buffer.js.map +1 -0
  101. package/dist/backend/src/pty/pty-manager.d.ts.map +1 -0
  102. package/dist/backend/src/pty/pty-manager.js.map +1 -0
  103. package/dist/backend/src/pty/types.d.ts.map +1 -0
  104. package/dist/{pty → backend/src/pty}/types.js.map +1 -1
  105. package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -0
  106. package/dist/backend/src/pty/virtual-pty.js.map +1 -0
  107. package/dist/backend/src/push/push-service.d.ts.map +1 -0
  108. package/dist/backend/src/push/push-service.js.map +1 -0
  109. package/dist/{registry → backend/src/registry}/instance-registry.d.ts +1 -1
  110. package/dist/backend/src/registry/instance-registry.d.ts.map +1 -0
  111. package/dist/{registry → backend/src/registry}/instance-registry.js +1 -1
  112. package/dist/backend/src/registry/instance-registry.js.map +1 -0
  113. package/dist/backend/src/registry/instance-spawner.d.ts.map +1 -0
  114. package/dist/{registry → backend/src/registry}/instance-spawner.js +17 -5
  115. package/dist/backend/src/registry/instance-spawner.js.map +1 -0
  116. package/dist/backend/src/registry/port-finder.d.ts.map +1 -0
  117. package/dist/backend/src/registry/port-finder.js.map +1 -0
  118. package/dist/backend/src/registry/shared-token.d.ts.map +1 -0
  119. package/dist/backend/src/registry/shared-token.js.map +1 -0
  120. package/dist/{registry → backend/src/registry}/stop-instances.d.ts +1 -1
  121. package/dist/backend/src/registry/stop-instances.d.ts.map +1 -0
  122. package/dist/{registry → backend/src/registry}/stop-instances.js +1 -1
  123. package/dist/backend/src/registry/stop-instances.js.map +1 -0
  124. package/dist/{session → backend/src/session}/session-controller.d.ts +21 -6
  125. package/dist/backend/src/session/session-controller.d.ts.map +1 -0
  126. package/dist/{session → backend/src/session}/session-controller.js +108 -25
  127. package/dist/backend/src/session/session-controller.js.map +1 -0
  128. package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -0
  129. package/dist/backend/src/terminal/terminal-relay.js.map +1 -0
  130. package/dist/backend/src/utils/ansi-filter.d.ts.map +1 -0
  131. package/dist/backend/src/utils/ansi-filter.js.map +1 -0
  132. package/dist/backend/src/utils/file-lock.d.ts.map +1 -0
  133. package/dist/backend/src/utils/file-lock.js.map +1 -0
  134. package/dist/backend/src/utils/ip-monitor.d.ts.map +1 -0
  135. package/dist/backend/src/utils/ip-monitor.js.map +1 -0
  136. package/dist/backend/src/utils/network.d.ts.map +1 -0
  137. package/dist/backend/src/utils/network.js.map +1 -0
  138. package/dist/backend/src/utils/qrcode-banner.d.ts.map +1 -0
  139. package/dist/backend/src/utils/qrcode-banner.js.map +1 -0
  140. package/dist/backend/src/ws/ws-handler.d.ts.map +1 -0
  141. package/dist/backend/src/ws/ws-handler.js.map +1 -0
  142. package/dist/{ws → backend/src/ws}/ws-server.d.ts +1 -1
  143. package/dist/backend/src/ws/ws-server.d.ts.map +1 -0
  144. package/dist/{ws → backend/src/ws}/ws-server.js +2 -2
  145. package/dist/backend/src/ws/ws-server.js.map +1 -0
  146. package/dist/shared/constants.d.ts.map +1 -0
  147. package/dist/shared/constants.js.map +1 -0
  148. package/dist/shared/defaults.d.ts.map +1 -0
  149. package/dist/shared/defaults.js.map +1 -0
  150. package/{shared-dist → dist/shared}/index.d.ts +1 -0
  151. package/dist/shared/index.d.ts.map +1 -0
  152. package/{shared-dist → dist/shared}/index.js +1 -0
  153. package/dist/shared/index.js.map +1 -0
  154. package/{shared-dist → dist/shared}/instance.d.ts +13 -0
  155. package/dist/shared/instance.d.ts.map +1 -0
  156. package/dist/shared/instance.js.map +1 -0
  157. package/dist/shared/notification-types.d.ts +85 -0
  158. package/dist/shared/notification-types.d.ts.map +1 -0
  159. package/dist/shared/notification-types.js +92 -0
  160. package/dist/shared/notification-types.js.map +1 -0
  161. package/{shared-dist → dist/shared}/ws-protocol.d.ts +6 -1
  162. package/dist/shared/ws-protocol.d.ts.map +1 -0
  163. package/dist/shared/ws-protocol.js.map +1 -0
  164. package/frontend-dist/assets/index-DOeBWumG.js +152 -0
  165. package/frontend-dist/index.html +2 -2
  166. package/package.json +62 -27
  167. package/scripts/build.sh +21 -0
  168. package/scripts/dev.sh +11 -0
  169. package/scripts/fix-node-pty-permissions.js +47 -0
  170. package/scripts/git-hooks/pre-commit +258 -0
  171. package/scripts/stop.sh +5 -0
  172. package/dist/api/auth-routes.d.ts.map +0 -1
  173. package/dist/api/auth-routes.js.map +0 -1
  174. package/dist/api/config-routes.d.ts +0 -4
  175. package/dist/api/config-routes.d.ts.map +0 -1
  176. package/dist/api/config-routes.js.map +0 -1
  177. package/dist/api/health-routes.d.ts.map +0 -1
  178. package/dist/api/health-routes.js.map +0 -1
  179. package/dist/api/hook-routes.d.ts.map +0 -1
  180. package/dist/api/hook-routes.js.map +0 -1
  181. package/dist/api/instance-routes.d.ts.map +0 -1
  182. package/dist/api/instance-routes.js.map +0 -1
  183. package/dist/api/push-routes.d.ts.map +0 -1
  184. package/dist/api/push-routes.js.map +0 -1
  185. package/dist/api/router.d.ts.map +0 -1
  186. package/dist/api/router.js.map +0 -1
  187. package/dist/api/status-routes.d.ts.map +0 -1
  188. package/dist/api/status-routes.js.map +0 -1
  189. package/dist/attach.d.ts.map +0 -1
  190. package/dist/attach.js.map +0 -1
  191. package/dist/auth/auth-middleware.d.ts.map +0 -1
  192. package/dist/auth/auth-middleware.js.map +0 -1
  193. package/dist/auth/rate-limiter.d.ts.map +0 -1
  194. package/dist/auth/rate-limiter.js.map +0 -1
  195. package/dist/auth/token-generator.d.ts.map +0 -1
  196. package/dist/auth/token-generator.js.map +0 -1
  197. package/dist/cli-utils.d.ts.map +0 -1
  198. package/dist/cli-utils.js.map +0 -1
  199. package/dist/cli.d.ts +0 -21
  200. package/dist/cli.d.ts.map +0 -1
  201. package/dist/cli.js.map +0 -1
  202. package/dist/config.d.ts.map +0 -1
  203. package/dist/config.js.map +0 -1
  204. package/dist/hooks/hook-receiver.d.ts +0 -39
  205. package/dist/hooks/hook-receiver.d.ts.map +0 -1
  206. package/dist/hooks/hook-receiver.js +0 -46
  207. package/dist/hooks/hook-receiver.js.map +0 -1
  208. package/dist/index.d.ts.map +0 -1
  209. package/dist/index.js.map +0 -1
  210. package/dist/logger/logger.d.ts.map +0 -1
  211. package/dist/notification/dingtalk-service.d.ts.map +0 -1
  212. package/dist/notification/dingtalk-service.js.map +0 -1
  213. package/dist/pty/output-buffer.d.ts.map +0 -1
  214. package/dist/pty/output-buffer.js.map +0 -1
  215. package/dist/pty/pty-manager.d.ts.map +0 -1
  216. package/dist/pty/pty-manager.js.map +0 -1
  217. package/dist/pty/types.d.ts.map +0 -1
  218. package/dist/pty/virtual-pty.d.ts.map +0 -1
  219. package/dist/pty/virtual-pty.js.map +0 -1
  220. package/dist/push/push-service.d.ts.map +0 -1
  221. package/dist/push/push-service.js.map +0 -1
  222. package/dist/registry/instance-registry.d.ts.map +0 -1
  223. package/dist/registry/instance-registry.js.map +0 -1
  224. package/dist/registry/instance-spawner.d.ts.map +0 -1
  225. package/dist/registry/instance-spawner.js.map +0 -1
  226. package/dist/registry/port-finder.d.ts.map +0 -1
  227. package/dist/registry/port-finder.js.map +0 -1
  228. package/dist/registry/shared-token.d.ts.map +0 -1
  229. package/dist/registry/shared-token.js.map +0 -1
  230. package/dist/registry/stop-instances.d.ts.map +0 -1
  231. package/dist/registry/stop-instances.js.map +0 -1
  232. package/dist/session/session-controller.d.ts.map +0 -1
  233. package/dist/session/session-controller.js.map +0 -1
  234. package/dist/terminal/terminal-relay.d.ts.map +0 -1
  235. package/dist/terminal/terminal-relay.js.map +0 -1
  236. package/dist/utils/ansi-filter.d.ts.map +0 -1
  237. package/dist/utils/ansi-filter.js.map +0 -1
  238. package/dist/utils/file-lock.d.ts.map +0 -1
  239. package/dist/utils/file-lock.js.map +0 -1
  240. package/dist/utils/ip-monitor.d.ts.map +0 -1
  241. package/dist/utils/ip-monitor.js.map +0 -1
  242. package/dist/utils/network.d.ts.map +0 -1
  243. package/dist/utils/network.js.map +0 -1
  244. package/dist/utils/pid-file.d.ts +0 -10
  245. package/dist/utils/pid-file.d.ts.map +0 -1
  246. package/dist/utils/pid-file.js +0 -30
  247. package/dist/utils/pid-file.js.map +0 -1
  248. package/dist/utils/qrcode-banner.d.ts.map +0 -1
  249. package/dist/utils/qrcode-banner.js.map +0 -1
  250. package/dist/ws/ws-handler.d.ts.map +0 -1
  251. package/dist/ws/ws-handler.js.map +0 -1
  252. package/dist/ws/ws-server.d.ts.map +0 -1
  253. package/dist/ws/ws-server.js.map +0 -1
  254. package/frontend-dist/assets/index-BqqB1hYe.js +0 -141
  255. package/shared-dist/constants.d.ts.map +0 -1
  256. package/shared-dist/constants.js.map +0 -1
  257. package/shared-dist/defaults.d.ts.map +0 -1
  258. package/shared-dist/defaults.js.map +0 -1
  259. package/shared-dist/index.d.ts.map +0 -1
  260. package/shared-dist/index.js.map +0 -1
  261. package/shared-dist/instance.d.ts.map +0 -1
  262. package/shared-dist/instance.js.map +0 -1
  263. package/shared-dist/question-utils.d.ts +0 -15
  264. package/shared-dist/question-utils.d.ts.map +0 -1
  265. package/shared-dist/question-utils.js +0 -24
  266. package/shared-dist/question-utils.js.map +0 -1
  267. package/shared-dist/ws-protocol.d.ts.map +0 -1
  268. package/shared-dist/ws-protocol.js.map +0 -1
  269. /package/dist/{api → backend/src/api}/auth-routes.d.ts +0 -0
  270. /package/dist/{api → backend/src/api}/auth-routes.js +0 -0
  271. /package/dist/{api → backend/src/api}/health-routes.d.ts +0 -0
  272. /package/dist/{api → backend/src/api}/health-routes.js +0 -0
  273. /package/dist/{api → backend/src/api}/hook-routes.d.ts +0 -0
  274. /package/dist/{api → backend/src/api}/hook-routes.js +0 -0
  275. /package/dist/{api → backend/src/api}/push-routes.d.ts +0 -0
  276. /package/dist/{api → backend/src/api}/push-routes.js +0 -0
  277. /package/dist/{api → backend/src/api}/status-routes.d.ts +0 -0
  278. /package/dist/{api → backend/src/api}/status-routes.js +0 -0
  279. /package/dist/{attach.d.ts → backend/src/attach.d.ts} +0 -0
  280. /package/dist/{auth → backend/src/auth}/auth-middleware.d.ts +0 -0
  281. /package/dist/{auth → backend/src/auth}/auth-middleware.js +0 -0
  282. /package/dist/{auth → backend/src/auth}/rate-limiter.d.ts +0 -0
  283. /package/dist/{auth → backend/src/auth}/rate-limiter.js +0 -0
  284. /package/dist/{auth → backend/src/auth}/token-generator.d.ts +0 -0
  285. /package/dist/{index.d.ts → backend/src/index.d.ts} +0 -0
  286. /package/dist/{logger → backend/src/logger}/logger.d.ts +0 -0
  287. /package/dist/{notification → backend/src/notification}/dingtalk-service.d.ts +0 -0
  288. /package/dist/{pty → backend/src/pty}/output-buffer.d.ts +0 -0
  289. /package/dist/{pty → backend/src/pty}/output-buffer.js +0 -0
  290. /package/dist/{pty → backend/src/pty}/pty-manager.d.ts +0 -0
  291. /package/dist/{pty → backend/src/pty}/pty-manager.js +0 -0
  292. /package/dist/{pty → backend/src/pty}/types.d.ts +0 -0
  293. /package/dist/{pty → backend/src/pty}/types.js +0 -0
  294. /package/dist/{pty → backend/src/pty}/virtual-pty.d.ts +0 -0
  295. /package/dist/{pty → backend/src/pty}/virtual-pty.js +0 -0
  296. /package/dist/{push → backend/src/push}/push-service.d.ts +0 -0
  297. /package/dist/{push → backend/src/push}/push-service.js +0 -0
  298. /package/dist/{registry → backend/src/registry}/instance-spawner.d.ts +0 -0
  299. /package/dist/{registry → backend/src/registry}/port-finder.d.ts +0 -0
  300. /package/dist/{registry → backend/src/registry}/port-finder.js +0 -0
  301. /package/dist/{registry → backend/src/registry}/shared-token.d.ts +0 -0
  302. /package/dist/{registry → backend/src/registry}/shared-token.js +0 -0
  303. /package/dist/{terminal → backend/src/terminal}/terminal-relay.d.ts +0 -0
  304. /package/dist/{terminal → backend/src/terminal}/terminal-relay.js +0 -0
  305. /package/dist/{utils → backend/src/utils}/ansi-filter.d.ts +0 -0
  306. /package/dist/{utils → backend/src/utils}/ansi-filter.js +0 -0
  307. /package/dist/{utils → backend/src/utils}/file-lock.d.ts +0 -0
  308. /package/dist/{utils → backend/src/utils}/file-lock.js +0 -0
  309. /package/dist/{utils → backend/src/utils}/ip-monitor.d.ts +0 -0
  310. /package/dist/{utils → backend/src/utils}/ip-monitor.js +0 -0
  311. /package/dist/{utils → backend/src/utils}/network.d.ts +0 -0
  312. /package/dist/{utils → backend/src/utils}/network.js +0 -0
  313. /package/dist/{utils → backend/src/utils}/qrcode-banner.d.ts +0 -0
  314. /package/dist/{utils → backend/src/utils}/qrcode-banner.js +0 -0
  315. /package/dist/{ws → backend/src/ws}/ws-handler.d.ts +0 -0
  316. /package/dist/{ws → backend/src/ws}/ws-handler.js +0 -0
  317. /package/{shared-dist → dist/shared}/constants.d.ts +0 -0
  318. /package/{shared-dist → dist/shared}/constants.js +0 -0
  319. /package/{shared-dist → dist/shared}/defaults.d.ts +0 -0
  320. /package/{shared-dist → dist/shared}/defaults.js +0 -0
  321. /package/{shared-dist → dist/shared}/instance.js +0 -0
  322. /package/{shared-dist → dist/shared}/ws-protocol.js +0 -0
@@ -1,12 +1,12 @@
1
1
  import { createServer } from 'node:http';
2
2
  import { resolve, dirname } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
- import { existsSync, readdirSync, unlinkSync, readFileSync } from 'node:fs';
4
+ import { existsSync, readdirSync, unlinkSync } from 'node:fs';
5
5
  import { homedir } from 'node:os';
6
6
  import { randomUUID } from 'node:crypto';
7
7
  import express from 'express';
8
8
  import cors from 'cors';
9
- import { CLAUDE_REMOTE_DIR, SETTINGS_DIR } from '../shared-dist/index.js';
9
+ import { CLAUDE_REMOTE_DIR, SETTINGS_DIR } from '../../shared/index.js';
10
10
  import { loadConfig, createSessionCookieName, createClaudeSettings, extractSettingsFromArgs, saveClaudeSettings, ensureDefaultUserConfig } from './config.js';
11
11
  import { AuthModule } from './auth/auth-middleware.js';
12
12
  import { PtyManager } from './pty/pty-manager.js';
@@ -16,7 +16,8 @@ import { SessionController } from './session/session-controller.js';
16
16
  import { TerminalRelay } from './terminal/terminal-relay.js';
17
17
  import { createApiRouter } from './api/router.js';
18
18
  import { PushService } from './push/push-service.js';
19
- import { DingtalkService } from './notification/dingtalk-service.js';
19
+ import { createNotificationManager } from './notification/notification-manager.js';
20
+ import { createNotificationServiceFactory } from './notification/notification-service-factory.js';
20
21
  import { logger, setInstanceContext } from './logger/logger.js';
21
22
  import { getOrCreateSharedToken } from './registry/shared-token.js';
22
23
  import { findAvailablePort } from './registry/port-finder.js';
@@ -89,27 +90,17 @@ export async function startServer(cliOverrides = {}) {
89
90
  const hookReceiver = new HookReceiver();
90
91
  // 9. Setup Push service
91
92
  const pushService = new PushService(sharedConfigDir);
92
- // 9.5. Setup Dingtalk service (if configured)
93
- const userConfigPath = resolve(sharedConfigDir, 'config.json');
94
- let dingtalkService = null;
95
- try {
96
- if (existsSync(userConfigPath)) {
97
- const userConfigContent = readFileSync(userConfigPath, 'utf-8');
98
- const userConfig = JSON.parse(userConfigContent);
99
- if (userConfig.dingtalk?.webhookUrl) {
100
- dingtalkService = new DingtalkService(userConfig.dingtalk.webhookUrl);
101
- logger.info('Dingtalk notification service initialized');
102
- }
103
- }
104
- }
105
- catch (err) {
106
- logger.warn({ err }, 'Failed to load dingtalk config, skipping');
107
- }
93
+ // 9.1. Create NotificationManager for dynamic enabled status checking
94
+ const notificationManager = createNotificationManager();
95
+ // 9.2. Create NotificationServiceFactory for lazy-loading notification services
96
+ const notificationServiceFactory = createNotificationServiceFactory();
108
97
  // 10. Session controller reference (set after PTY spawn)
109
98
  let sessionController = null;
110
99
  // 10.5. Create Instance Spawner (for creating new instances via API)
111
100
  const instanceSpawner = new InstanceSpawner();
112
- // 11. Mount REST API (with instance routes)
101
+ // 11. Create WebSocket server (needed for API routes)
102
+ const wsServer = new WsServer(httpServer, authModule);
103
+ // 12. Mount REST API (with instance routes)
113
104
  app.use('/api', createApiRouter({
114
105
  authModule,
115
106
  hookReceiver,
@@ -118,15 +109,16 @@ export async function startServer(cliOverrides = {}) {
118
109
  listInstances: () => registry.list(),
119
110
  currentInstanceId: instanceId,
120
111
  instanceSpawner,
112
+ notificationManager,
113
+ notificationServiceFactory,
114
+ wsServer,
121
115
  }));
122
- // 12. Serve frontend static files (if built)
116
+ // 13. Serve frontend static files (if built)
123
117
  const __dirname = dirname(fileURLToPath(import.meta.url));
124
- // 发布包中 frontend-dist dist 同级,开发时在 frontend/dist
125
- const publishFrontendDist = resolve(__dirname, '../frontend-dist');
126
- const devFrontendDist = resolve(__dirname, '../../frontend/dist');
127
- const frontendDist = existsSync(publishFrontendDist)
128
- ? publishFrontendDist
129
- : devFrontendDist;
118
+ // 开发模式 (tsx backend/src/index.ts): __dirname = backend/src/ → ../../frontend-dist
119
+ // 生产构建 (node dist/backend/src/index.js): __dirname = dist/backend/src/ → ../../../frontend-dist
120
+ const isDistBuild = __dirname.includes('/dist/');
121
+ const frontendDist = resolve(__dirname, isDistBuild ? '../../../frontend-dist' : '../../frontend-dist');
130
122
  if (existsSync(frontendDist)) {
131
123
  app.use(express.static(frontendDist));
132
124
  // SPA fallback — skip /api and /ws paths to avoid hijacking backend routes
@@ -141,8 +133,6 @@ export async function startServer(cliOverrides = {}) {
141
133
  else {
142
134
  logger.warn('Frontend dist not found, skipping static file serving');
143
135
  }
144
- // 13. Create WebSocket server
145
- const wsServer = new WsServer(httpServer, authModule);
146
136
  // 14. Spawn PTY with Claude Code CLI
147
137
  const ptyManager = new PtyManager();
148
138
  // 15. Terminal Relay (条件启动,headless 模式跳过)
@@ -151,9 +141,11 @@ export async function startServer(cliOverrides = {}) {
151
141
  // 16. Create Session Controller (with relay for dynamic master switch)
152
142
  sessionController = new SessionController(ptyManager, wsServer, hookReceiver, config.maxBufferLines, relay);
153
143
  sessionController.setPushService(pushService);
154
- if (dingtalkService) {
155
- sessionController.setDingtalkService(dingtalkService);
156
- }
144
+ sessionController.setNotificationManager(notificationManager);
145
+ sessionController.setNotificationServiceFactory(notificationServiceFactory);
146
+ // 设置实例 URL(初始化)
147
+ const instanceUrl = `http://${config.displayIp}:${actualPort}`;
148
+ sessionController.setInstanceUrl(instanceUrl);
157
149
  // 17. Spawn Claude Code with instance-specific hook settings
158
150
  // 检查用户是否传了 --settings 参数,如果有则合并 hooks
159
151
  const extracted = extractSettingsFromArgs(config.claudeArgs);
@@ -190,6 +182,7 @@ export async function startServer(cliOverrides = {}) {
190
182
  cwd: config.claudeCwd,
191
183
  startedAt: new Date().toISOString(),
192
184
  headless: noTerminal,
185
+ claudeArgs: config.claudeArgs.length > 0 ? config.claudeArgs : undefined,
193
186
  });
194
187
  // 18.5. Clean up stale settings files for dead instances
195
188
  try {
@@ -224,6 +217,8 @@ export async function startServer(cliOverrides = {}) {
224
217
  config.displayIp = newIp;
225
218
  // Update registry
226
219
  registry.updateHost(instanceId, newIp);
220
+ // Update instance URL in session controller
221
+ sessionController?.setInstanceUrl(newUrl);
227
222
  // Broadcast to all connected clients
228
223
  wsServer.broadcast({
229
224
  type: 'ip_changed',
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../backend/src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../backend/src/logger/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAuFxB,eAAO,IAAI,MAAM,6BAAiB,CAAC;AAEnC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAErD"}
@@ -1,10 +1,8 @@
1
1
  import pino from 'pino';
2
- import { dirname, resolve } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
2
+ import { resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
4
  import { mkdirSync } from 'node:fs';
5
- const __dirname = dirname(fileURLToPath(import.meta.url));
6
- const projectRoot = resolve(__dirname, '../../..'); // logger/ → src/ → backend/ → root/
7
- const logDir = process.env.LOG_DIR ?? resolve(projectRoot, 'logs');
5
+ const logDir = process.env.LOG_DIR ?? resolve(homedir(), '.claude-remote', 'logs');
8
6
  // Ensure log directory exists
9
7
  try {
10
8
  mkdirSync(logDir, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAE,oCAAoC;AACzF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEnE,8BAA8B;AAC9B,IAAI,CAAC;IACH,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAAC,MAAM,CAAC;IACP,yDAAyD;AAC3D,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC/C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAElD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AAChF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;AAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;AAElD,SAAS,YAAY;IACnB,IAAI,MAAM,EAAE,CAAC;QACX,oCAAoC;QACpC,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,qDAAqD;QACrD,OAAO,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,SAAS,EAAE;gBACT,OAAO,EAAE;oBACP,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;oBAC7E,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;iBAChF;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC;QACzB,2DAA2D;QAC3D,OAAO,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,SAAS,EAAE;gBACT,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,aAAa;wBACrB,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,2CAA2C;wBACxE,KAAK,EAAE,MAAM;qBACd;oBACD;wBACE,MAAM,EAAE,WAAW;wBACnB,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;wBACrC,KAAK,EAAE,MAAM;qBACd;oBACD;wBACE,MAAM,EAAE,WAAW;wBACnB,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;wBACtC,KAAK,EAAE,OAAO;qBACf;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,MAAM;QACb,SAAS,EAAE;YACT,OAAO,EAAE;gBACP;oBACE,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE;oBACrC,KAAK,EAAE,MAAM;iBACd;gBACD;oBACE,MAAM,EAAE,WAAW;oBACnB,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE;oBACtC,KAAK,EAAE,OAAO;iBACf;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,IAAI,MAAM,GAAG,YAAY,EAAE,CAAC;AAEnC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../backend/src/logger/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dingtalk-service.d.ts","sourceRoot":"","sources":["../../../../backend/src/notification/dingtalk-service.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,qBAAa,eAAe;IAGd,OAAO,CAAC,UAAU;IAF9B,OAAO,CAAC,YAAY,CAAuB;gBAEvB,UAAU,EAAE,MAAM;IAItC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;;;;;;OAOG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwDpF"}
@@ -52,7 +52,7 @@ export class DingtalkService {
52
52
  msgtype: 'markdown',
53
53
  markdown: {
54
54
  title,
55
- text: `### ${title}\n\n**工具**: ${tool}\n\n**消息**: ${message}\n\n---\n请及时处理`,
55
+ text: `### ${title}\n\n**Tool**: ${tool}\n\n**Message**: ${message}\n\n---\nPlease respond promptly`,
56
56
  },
57
57
  };
58
58
  const controller = new AbortController();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dingtalk-service.js","sourceRoot":"","sources":["../../../../backend/src/notification/dingtalk-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { NotificationChannel } from '../hooks/hook-types.js';
2
+ /**
3
+ * NotificationManager - 管理通知渠道的启用状态
4
+ *
5
+ * 采用 TTL 缓存策略实现即时生效:
6
+ * - 缓存有效(< 10秒):直接返回缓存值
7
+ * - 缓存过期:重新读取配置文件
8
+ * - 主动刷新:PATCH API 成功后调用 refresh() 立即更新缓存
9
+ */
10
+ export declare class NotificationManager {
11
+ private configPath;
12
+ private cache;
13
+ private readonly TTL_MS;
14
+ constructor(configPath: string);
15
+ /**
16
+ * 检查渠道是否启用
17
+ * - 缓存有效:直接返回
18
+ * - 缓存过期:重新读取配置
19
+ *
20
+ * @param channel 渠道类型
21
+ * @returns 是否启用(未配置默认返回 true)
22
+ */
23
+ isEnabled(channel: NotificationChannel): boolean;
24
+ /**
25
+ * 主动刷新缓存(PATCH API 成功后调用)
26
+ * 确保当前实例立即感知配置变更
27
+ *
28
+ * @param channel 渠道类型
29
+ */
30
+ refresh(channel: NotificationChannel): void;
31
+ /**
32
+ * 从配置文件读取 enabled 状态
33
+ * - 未配置:返回 true(默认启用)
34
+ * - 已配置但未设置 enabled:返回 true
35
+ * - 已配置且 enabled=false:返回 false
36
+ */
37
+ private readEnabledFromConfig;
38
+ }
39
+ /**
40
+ * 创建 NotificationManager 实例
41
+ * 使用默认配置文件路径
42
+ */
43
+ export declare function createNotificationManager(): NotificationManager;
44
+ //# sourceMappingURL=notification-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.d.ts","sourceRoot":"","sources":["../../../../backend/src/notification/notification-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGlE;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,UAAU;IAH9B,OAAO,CAAC,KAAK,CAA2E;IACxF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAEb,UAAU,EAAE,MAAM;IAEtC;;;;;;;OAOG;IACH,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAahD;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAM3C;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;CAsC9B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,mBAAmB,CAG/D"}
@@ -0,0 +1,94 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { CLAUDE_REMOTE_DIR } from '../../../shared/index.js';
5
+ import { logger } from '../logger/logger.js';
6
+ /**
7
+ * NotificationManager - 管理通知渠道的启用状态
8
+ *
9
+ * 采用 TTL 缓存策略实现即时生效:
10
+ * - 缓存有效(< 10秒):直接返回缓存值
11
+ * - 缓存过期:重新读取配置文件
12
+ * - 主动刷新:PATCH API 成功后调用 refresh() 立即更新缓存
13
+ */
14
+ export class NotificationManager {
15
+ configPath;
16
+ cache = new Map();
17
+ TTL_MS = 10_000; // 10秒容错窗口
18
+ constructor(configPath) {
19
+ this.configPath = configPath;
20
+ }
21
+ /**
22
+ * 检查渠道是否启用
23
+ * - 缓存有效:直接返回
24
+ * - 缓存过期:重新读取配置
25
+ *
26
+ * @param channel 渠道类型
27
+ * @returns 是否启用(未配置默认返回 true)
28
+ */
29
+ isEnabled(channel) {
30
+ const now = Date.now();
31
+ const cached = this.cache.get(channel);
32
+ if (cached && now - cached.timestamp < this.TTL_MS) {
33
+ return cached.enabled;
34
+ }
35
+ const enabled = this.readEnabledFromConfig(channel);
36
+ this.cache.set(channel, { enabled, timestamp: now });
37
+ return enabled;
38
+ }
39
+ /**
40
+ * 主动刷新缓存(PATCH API 成功后调用)
41
+ * 确保当前实例立即感知配置变更
42
+ *
43
+ * @param channel 渠道类型
44
+ */
45
+ refresh(channel) {
46
+ const enabled = this.readEnabledFromConfig(channel);
47
+ this.cache.set(channel, { enabled, timestamp: Date.now() });
48
+ logger.info({ channel, enabled }, 'Notification channel cache refreshed');
49
+ }
50
+ /**
51
+ * 从配置文件读取 enabled 状态
52
+ * - 未配置:返回 true(默认启用)
53
+ * - 已配置但未设置 enabled:返回 true
54
+ * - 已配置且 enabled=false:返回 false
55
+ */
56
+ readEnabledFromConfig(channel) {
57
+ try {
58
+ if (!existsSync(this.configPath)) {
59
+ return true; // 未配置文件,默认启用
60
+ }
61
+ const content = readFileSync(this.configPath, 'utf-8');
62
+ const config = JSON.parse(content);
63
+ if (channel === 'dingtalk') {
64
+ // 优先使用新版 notifications 结构,回退到旧版
65
+ const dingtalkConfig = config.notifications?.dingtalk ?? config.dingtalk;
66
+ if (!dingtalkConfig?.webhookUrl) {
67
+ return true; // 未配置,默认启用(不会被调用)
68
+ }
69
+ return dingtalkConfig.enabled ?? true;
70
+ }
71
+ if (channel === 'wechat_work') {
72
+ const wechatConfig = config.notifications?.wechat_work;
73
+ if (!wechatConfig?.sendKey) {
74
+ return true; // 未配置,默认启用(不会被调用)
75
+ }
76
+ return wechatConfig.enabled ?? true;
77
+ }
78
+ return true;
79
+ }
80
+ catch (err) {
81
+ logger.warn({ err, channel, configPath: this.configPath }, 'Failed to read notification enabled status, defaulting to true');
82
+ return true;
83
+ }
84
+ }
85
+ }
86
+ /**
87
+ * 创建 NotificationManager 实例
88
+ * 使用默认配置文件路径
89
+ */
90
+ export function createNotificationManager() {
91
+ const configPath = resolve(homedir(), CLAUDE_REMOTE_DIR, 'config.json');
92
+ return new NotificationManager(configPath);
93
+ }
94
+ //# sourceMappingURL=notification-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-manager.js","sourceRoot":"","sources":["../../../../backend/src/notification/notification-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { NotificationChannel } from '../hooks/hook-types.js';
2
+ import { DingtalkService } from './dingtalk-service.js';
3
+ import { WechatWorkService } from './wechat-work-service.js';
4
+ /**
5
+ * NotificationServiceFactory - 通知服务工厂
6
+ *
7
+ * 采用懒加载 + 缓存策略实现即时生效:
8
+ * - 懒加载:第一次调用 getXxxService() 时创建服务
9
+ * - 缓存:后续调用返回同一实例
10
+ * - 刷新:refresh() 清除缓存,下次调用时重新创建服务(使用新配置)
11
+ *
12
+ * 实现配置即时生效的核心机制:
13
+ * 1. 配置更新 → factory.refresh() 清除缓存
14
+ * 2. 下次发送通知 → getXxxService() 重新读取配置创建新服务
15
+ */
16
+ export declare class NotificationServiceFactory {
17
+ private configPath;
18
+ /** 钉钉服务缓存(undefined = 未缓存,null = 未配置,object = 已配置) */
19
+ private dingtalkServiceCache;
20
+ /** 微信服务缓存(undefined = 未缓存,null = 未配置,object = 已配置) */
21
+ private wechatWorkServiceCache;
22
+ constructor(configPath: string);
23
+ /**
24
+ * 获取钉钉服务实例
25
+ * - 缓存命中:返回缓存实例
26
+ * - 缓存未命中:读取配置创建服务
27
+ *
28
+ * @returns 钉钉服务实例,未配置或无效返回 null
29
+ */
30
+ getDingtalkService(): DingtalkService | null;
31
+ /**
32
+ * 获取微信服务实例
33
+ * - 缓存命中:返回缓存实例
34
+ * - 缓存未命中:读取配置创建服务
35
+ *
36
+ * @returns 微信服务实例,未配置或无效返回 null
37
+ */
38
+ getWechatWorkService(): WechatWorkService | null;
39
+ /**
40
+ * 刷新服务缓存
41
+ * - 清除指定渠道缓存:下次调用 getXxxService() 时重新创建
42
+ * - 清除所有缓存:channel 未指定时清除全部
43
+ *
44
+ * @param channel 可选,指定刷新的渠道
45
+ */
46
+ refresh(channel?: NotificationChannel): void;
47
+ /**
48
+ * 创建钉钉服务实例
49
+ * - 读取配置文件
50
+ * - 验证 webhookUrl
51
+ * - 检查 enabled 状态
52
+ */
53
+ private createDingtalkService;
54
+ /**
55
+ * 创建微信服务实例
56
+ * - 读取配置文件
57
+ * - 验证 sendKey
58
+ * - 检查 enabled 状态
59
+ */
60
+ private createWechatWorkService;
61
+ }
62
+ /**
63
+ * 创建 NotificationServiceFactory 实例
64
+ * 使用默认配置文件路径
65
+ */
66
+ export declare function createNotificationServiceFactory(): NotificationServiceFactory;
67
+ //# sourceMappingURL=notification-service-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service-factory.d.ts","sourceRoot":"","sources":["../../../../backend/src/notification/notification-service-factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D;;;;;;;;;;;GAWG;AACH,qBAAa,0BAA0B;IAMzB,OAAO,CAAC,UAAU;IAL9B,sDAAsD;IACtD,OAAO,CAAC,oBAAoB,CAAiD;IAC7E,sDAAsD;IACtD,OAAO,CAAC,sBAAsB,CAAmD;gBAE7D,UAAU,EAAE,MAAM;IAEtC;;;;;;OAMG;IACH,kBAAkB,IAAI,eAAe,GAAG,IAAI;IAQ5C;;;;;;OAMG;IACH,oBAAoB,IAAI,iBAAiB,GAAG,IAAI;IAQhD;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAY5C;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;CAgChC;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,0BAA0B,CAG7E"}
@@ -0,0 +1,146 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { CLAUDE_REMOTE_DIR } from '../../../shared/index.js';
5
+ import { DingtalkService } from './dingtalk-service.js';
6
+ import { WechatWorkService } from './wechat-work-service.js';
7
+ import { logger } from '../logger/logger.js';
8
+ /**
9
+ * NotificationServiceFactory - 通知服务工厂
10
+ *
11
+ * 采用懒加载 + 缓存策略实现即时生效:
12
+ * - 懒加载:第一次调用 getXxxService() 时创建服务
13
+ * - 缓存:后续调用返回同一实例
14
+ * - 刷新:refresh() 清除缓存,下次调用时重新创建服务(使用新配置)
15
+ *
16
+ * 实现配置即时生效的核心机制:
17
+ * 1. 配置更新 → factory.refresh() 清除缓存
18
+ * 2. 下次发送通知 → getXxxService() 重新读取配置创建新服务
19
+ */
20
+ export class NotificationServiceFactory {
21
+ configPath;
22
+ /** 钉钉服务缓存(undefined = 未缓存,null = 未配置,object = 已配置) */
23
+ dingtalkServiceCache = undefined;
24
+ /** 微信服务缓存(undefined = 未缓存,null = 未配置,object = 已配置) */
25
+ wechatWorkServiceCache = undefined;
26
+ constructor(configPath) {
27
+ this.configPath = configPath;
28
+ }
29
+ /**
30
+ * 获取钉钉服务实例
31
+ * - 缓存命中:返回缓存实例
32
+ * - 缓存未命中:读取配置创建服务
33
+ *
34
+ * @returns 钉钉服务实例,未配置或无效返回 null
35
+ */
36
+ getDingtalkService() {
37
+ if (this.dingtalkServiceCache !== undefined) {
38
+ return this.dingtalkServiceCache;
39
+ }
40
+ this.dingtalkServiceCache = this.createDingtalkService();
41
+ return this.dingtalkServiceCache;
42
+ }
43
+ /**
44
+ * 获取微信服务实例
45
+ * - 缓存命中:返回缓存实例
46
+ * - 缓存未命中:读取配置创建服务
47
+ *
48
+ * @returns 微信服务实例,未配置或无效返回 null
49
+ */
50
+ getWechatWorkService() {
51
+ if (this.wechatWorkServiceCache !== undefined) {
52
+ return this.wechatWorkServiceCache;
53
+ }
54
+ this.wechatWorkServiceCache = this.createWechatWorkService();
55
+ return this.wechatWorkServiceCache;
56
+ }
57
+ /**
58
+ * 刷新服务缓存
59
+ * - 清除指定渠道缓存:下次调用 getXxxService() 时重新创建
60
+ * - 清除所有缓存:channel 未指定时清除全部
61
+ *
62
+ * @param channel 可选,指定刷新的渠道
63
+ */
64
+ refresh(channel) {
65
+ if (!channel || channel === 'dingtalk') {
66
+ this.dingtalkServiceCache = undefined;
67
+ logger.debug({ channel: 'dingtalk' }, 'Dingtalk service cache cleared');
68
+ }
69
+ if (!channel || channel === 'wechat_work') {
70
+ this.wechatWorkServiceCache = undefined;
71
+ logger.debug({ channel: 'wechat_work' }, 'WeChatWork service cache cleared');
72
+ }
73
+ logger.info({ channel: channel ?? 'all' }, 'Notification service cache refreshed');
74
+ }
75
+ /**
76
+ * 创建钉钉服务实例
77
+ * - 读取配置文件
78
+ * - 验证 webhookUrl
79
+ * - 检查 enabled 状态
80
+ */
81
+ createDingtalkService() {
82
+ try {
83
+ if (!existsSync(this.configPath)) {
84
+ return null;
85
+ }
86
+ const content = readFileSync(this.configPath, 'utf-8');
87
+ const config = JSON.parse(content);
88
+ const dingtalkConfig = config.notifications?.dingtalk;
89
+ if (!dingtalkConfig?.webhookUrl) {
90
+ return null;
91
+ }
92
+ // 检查是否禁用
93
+ if (dingtalkConfig.enabled === false) {
94
+ logger.debug('Dingtalk notification is disabled, skipping service creation');
95
+ return null;
96
+ }
97
+ const service = new DingtalkService(dingtalkConfig.webhookUrl);
98
+ logger.info('Dingtalk service created from config');
99
+ return service;
100
+ }
101
+ catch (err) {
102
+ logger.warn({ err, configPath: this.configPath }, 'Failed to create Dingtalk service');
103
+ return null;
104
+ }
105
+ }
106
+ /**
107
+ * 创建微信服务实例
108
+ * - 读取配置文件
109
+ * - 验证 sendKey
110
+ * - 检查 enabled 状态
111
+ */
112
+ createWechatWorkService() {
113
+ try {
114
+ if (!existsSync(this.configPath)) {
115
+ return null;
116
+ }
117
+ const content = readFileSync(this.configPath, 'utf-8');
118
+ const config = JSON.parse(content);
119
+ const wechatConfig = config.notifications?.wechat_work;
120
+ if (!wechatConfig?.sendKey) {
121
+ return null;
122
+ }
123
+ // 检查是否禁用
124
+ if (wechatConfig.enabled === false) {
125
+ logger.debug('WeChat Work notification is disabled, skipping service creation');
126
+ return null;
127
+ }
128
+ const service = new WechatWorkService(wechatConfig.sendKey);
129
+ logger.info('WeChat Work service created from config');
130
+ return service;
131
+ }
132
+ catch (err) {
133
+ logger.warn({ err, configPath: this.configPath }, 'Failed to create WeChat Work service');
134
+ return null;
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * 创建 NotificationServiceFactory 实例
140
+ * 使用默认配置文件路径
141
+ */
142
+ export function createNotificationServiceFactory() {
143
+ const configPath = resolve(homedir(), CLAUDE_REMOTE_DIR, 'config.json');
144
+ return new NotificationServiceFactory(configPath);
145
+ }
146
+ //# sourceMappingURL=notification-service-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-service-factory.js","sourceRoot":"","sources":["../../../../backend/src/notification/notification-service-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 企业微信通知服务(Server酱³ 实现)
3
+ * 使用 SendKey 调用官方 API: https://sctapi.ftqq.com/<sendkey>.send
4
+ */
5
+ export declare class WechatWorkService {
6
+ private validatedApiUrl;
7
+ constructor(sendKey: string);
8
+ /**
9
+ * 验证 SendKey 是否合法
10
+ * - 必须以 SCT 开头
11
+ * - 后面跟随字母数字组合
12
+ */
13
+ private validateSendKey;
14
+ /**
15
+ * 发送微信通知
16
+ * 失败时仅记录日志,不抛出异常
17
+ *
18
+ * @param title 消息标题
19
+ * @param tool 工具名称
20
+ * @param message 详细消息
21
+ */
22
+ sendNotification(title: string, tool: string, message: string): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=wechat-work-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wechat-work-service.d.ts","sourceRoot":"","sources":["../../../../backend/src/notification/wechat-work-service.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAuB;gBAElC,OAAO,EAAE,MAAM;IAM3B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAavB;;;;;;;OAOG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA0DpF"}