@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
@@ -0,0 +1,128 @@
1
+ /**
2
+ * 交互式确认模块
3
+ */
4
+ import * as readline from 'node:readline';
5
+ import { DEPENDENCIES } from './types.js';
6
+ /**
7
+ * 显示安装确认提示
8
+ * @returns true 表示用户确认安装,false 表示取消
9
+ */
10
+ export async function promptInstall(options) {
11
+ const dep = DEPENDENCIES[options.name];
12
+ // 无 TTY 时自动确认(CI 环境)
13
+ if (!process.stdin.isTTY) {
14
+ return true;
15
+ }
16
+ // 构建提示内容
17
+ const lines = [
18
+ `${dep.displayName} is required but not installed.`,
19
+ '',
20
+ 'Install method:',
21
+ ];
22
+ for (const cmd of options.installCommands) {
23
+ lines.push(` ${cmd.command} ${cmd.args.join(' ')}`);
24
+ }
25
+ lines.push('');
26
+ lines.push(`Press Enter to install, or Ctrl+C to cancel:`);
27
+ // 计算边框宽度
28
+ const maxLineLength = Math.max(...lines.map((l) => l.length));
29
+ const boxWidth = maxLineLength + 4;
30
+ const border = '─'.repeat(boxWidth);
31
+ // 输出提示框
32
+ process.stderr.write(`\n┌${border}┐\n`);
33
+ for (const line of lines) {
34
+ process.stderr.write(`│ ${line.padEnd(boxWidth - 2)} │\n`);
35
+ }
36
+ process.stderr.write(`└${border}┘\n`);
37
+ // 等待用户按 Enter 或 Ctrl+C
38
+ return new Promise((resolve) => {
39
+ const rl = readline.createInterface({
40
+ input: process.stdin,
41
+ output: process.stderr,
42
+ });
43
+ // 处理 Ctrl+C (SIGINT)
44
+ const handleSigint = () => {
45
+ rl.close();
46
+ process.stderr.write('\nInstallation cancelled.\n');
47
+ resolve(false);
48
+ };
49
+ process.once('SIGINT', handleSigint);
50
+ rl.question('', () => {
51
+ process.off('SIGINT', handleSigint);
52
+ rl.close();
53
+ resolve(true); // Enter 继续安装
54
+ });
55
+ // 处理 readline 关闭事件(用户按 Ctrl+D 等)
56
+ rl.on('close', () => {
57
+ process.off('SIGINT', handleSigint);
58
+ // readline closed without question callback (e.g. Ctrl+D / EOF)
59
+ resolve(false);
60
+ });
61
+ });
62
+ }
63
+ /**
64
+ * 显示安装失败提示,提供手动安装帮助
65
+ */
66
+ export function showManualInstallHelp(name, helpUrl) {
67
+ const dep = DEPENDENCIES[name];
68
+ process.stderr.write(`\n[ERROR] Cannot auto-install ${dep.displayName} on this system.\n`);
69
+ process.stderr.write(`Please install manually: ${helpUrl}\n`);
70
+ }
71
+ /**
72
+ * 显示安装开始信息
73
+ */
74
+ export function showInstallStart(name) {
75
+ const dep = DEPENDENCIES[name];
76
+ process.stderr.write(`\n[Installing ${dep.displayName}...]\n`);
77
+ }
78
+ /**
79
+ * 显示命令执行信息
80
+ */
81
+ export function showCommand(cmd, args) {
82
+ process.stderr.write(`> ${cmd} ${args.join(' ')}\n`);
83
+ }
84
+ /**
85
+ * 显示步骤成功
86
+ */
87
+ export function showStepSuccess(message = 'Done') {
88
+ process.stderr.write(` ✓ ${message}\n`);
89
+ }
90
+ /**
91
+ * 显示步骤失败
92
+ */
93
+ export function showStepFailure(message = 'Failed') {
94
+ process.stderr.write(` ✗ ${message}\n`);
95
+ }
96
+ /**
97
+ * 显示检测状态
98
+ */
99
+ export function showCheckStatus(name, installed, version) {
100
+ const dep = DEPENDENCIES[name];
101
+ if (installed) {
102
+ process.stderr.write(` ✓ ${dep.displayName} ${version ?? 'installed'}\n`);
103
+ }
104
+ else {
105
+ process.stderr.write(` ✗ ${dep.displayName} not found\n`);
106
+ }
107
+ }
108
+ /**
109
+ * 显示依赖检测开始
110
+ */
111
+ export function showCheckStart() {
112
+ process.stderr.write('Checking dependencies...\n');
113
+ }
114
+ /**
115
+ * 显示所有依赖就绪
116
+ */
117
+ export function showAllReady() {
118
+ process.stderr.write('\nAll dependencies ready. Starting server...\n\n');
119
+ }
120
+ /**
121
+ * 显示依赖安装失败
122
+ */
123
+ export function showInstallFailed(failed) {
124
+ process.stderr.write('\n[ERROR] Failed to install required dependencies.\n');
125
+ process.stderr.write('Please install manually and try again.\n');
126
+ process.stderr.write(`Missing: ${failed.join(', ')}\n`);
127
+ }
128
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../backend/src/deps/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,YAAY,EAA4C,MAAM,YAAY,CAAC;AAQpF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,qBAAqB;IACrB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS;IACT,MAAM,KAAK,GAAG;QACZ,GAAG,GAAG,CAAC,WAAW,iCAAiC;QACnD,EAAE;QACF,iBAAiB;KAClB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAE3D,SAAS;IACT,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,aAAa,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpC,QAAQ;IACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;IAEtC,uBAAuB;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACpD,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAErC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE;YACnB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa;QAC9B,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpC,gEAAgE;YAChE,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAoB,EACpB,OAAe;IAEf,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,WAAW,oBAAoB,CAAC,CAAC;IAC3F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,OAAO,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,CAAC,WAAW,QAAQ,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,IAAc;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,MAAM;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,QAAQ;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAoB,EACpB,SAAkB,EAClB,OAAgB;IAEhB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,WAAW,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,WAAW,cAAc,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAwB;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 依赖检测与安装模块 - 类型定义
3
+ */
4
+ export type DependencyName = 'node' | 'pnpm' | 'claude';
5
+ export interface InstallCommand {
6
+ command: string;
7
+ args: string[];
8
+ description?: string;
9
+ timeout?: number;
10
+ }
11
+ export interface DependencyInfo {
12
+ name: DependencyName;
13
+ displayName: string;
14
+ checkCommand: string;
15
+ checkArgs: string[];
16
+ versionRegex: RegExp;
17
+ minVersion?: string;
18
+ installCommands?: InstallCommand[];
19
+ helpUrl: string;
20
+ }
21
+ export interface CheckResult {
22
+ installed: boolean;
23
+ version?: string;
24
+ }
25
+ export interface InstallResult {
26
+ success: boolean;
27
+ version?: string;
28
+ error?: Error;
29
+ }
30
+ export interface EnsureDepsResult {
31
+ allInstalled: boolean;
32
+ installed: DependencyName[];
33
+ failed: DependencyName[];
34
+ }
35
+ export declare const DEPENDENCIES: Record<DependencyName, DependencyInfo>;
36
+ /**
37
+ * 解析版本字符串的主版本号
38
+ */
39
+ export declare function parseMajorVersion(version: string): number;
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../backend/src/deps/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CA0C/D,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 依赖检测与安装模块 - 类型定义
3
+ */
4
+ export const DEPENDENCIES = {
5
+ node: {
6
+ name: 'node',
7
+ displayName: 'Node.js',
8
+ checkCommand: 'node',
9
+ checkArgs: ['--version'],
10
+ versionRegex: /^v?(\d+\.\d+\.\d+)/,
11
+ minVersion: '20',
12
+ helpUrl: 'https://nodejs.org/',
13
+ },
14
+ pnpm: {
15
+ name: 'pnpm',
16
+ displayName: 'pnpm',
17
+ checkCommand: 'pnpm',
18
+ checkArgs: ['--version'],
19
+ versionRegex: /^(\d+\.\d+\.\d+)/m,
20
+ minVersion: '9', // required for node-linker=hoisted default
21
+ installCommands: [
22
+ { command: 'corepack', args: ['enable'], timeout: 10000 },
23
+ {
24
+ command: 'corepack',
25
+ args: ['prepare', 'pnpm@latest', '--activate'],
26
+ timeout: 60000,
27
+ },
28
+ ],
29
+ helpUrl: 'https://pnpm.io/installation',
30
+ },
31
+ claude: {
32
+ name: 'claude',
33
+ displayName: 'Claude CLI',
34
+ checkCommand: 'claude',
35
+ checkArgs: ['--version'],
36
+ versionRegex: /^(\d+\.\d+\.\d+)/m,
37
+ installCommands: [
38
+ {
39
+ command: 'pnpm',
40
+ args: ['add', '-g', '@anthropic-ai/claude-code'],
41
+ timeout: 180000,
42
+ },
43
+ ],
44
+ helpUrl: 'https://docs.anthropic.com/en/docs/claude-code',
45
+ },
46
+ };
47
+ /**
48
+ * 解析版本字符串的主版本号
49
+ */
50
+ export function parseMajorVersion(version) {
51
+ const match = version.match(/^v?(\d+)/);
52
+ return match ? parseInt(match[1], 10) : 0;
53
+ }
54
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../backend/src/deps/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuCH,MAAM,CAAC,MAAM,YAAY,GAA2C;IAClE,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,SAAS;QACtB,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,YAAY,EAAE,oBAAoB;QAClC,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,qBAAqB;KAC/B;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,MAAM;QACnB,YAAY,EAAE,MAAM;QACpB,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,YAAY,EAAE,mBAAmB;QACjC,UAAU,EAAE,GAAG,EAAE,2CAA2C;QAC5D,eAAe,EAAE;YACf,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;YACzD;gBACE,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC;gBAC9C,OAAO,EAAE,KAAK;aACf;SACF;QACD,OAAO,EAAE,8BAA8B;KACxC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,YAAY;QACzB,YAAY,EAAE,QAAQ;QACtB,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,YAAY,EAAE,mBAAmB;QACjC,eAAe,EAAE;YACf;gBACE,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,2BAA2B,CAAC;gBAChD,OAAO,EAAE,MAAM;aAChB;SACF;QACD,OAAO,EAAE,gDAAgD;KAC1D;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { type HookPayload, type HookNotification, type TaskCompletedData } from './hook-types.js';
3
+ /**
4
+ * Structured result from processHook.
5
+ */
6
+ export interface HookResult {
7
+ type: 'notification' | 'action' | 'ignored';
8
+ notification?: HookNotification;
9
+ action?: {
10
+ type: 'task_completed';
11
+ data: TaskCompletedData;
12
+ };
13
+ }
14
+ /**
15
+ * Receives and parses Hook HTTP POST from Claude Code.
16
+ * Emits 'notification' events for user attention events.
17
+ * Emits 'task_completed' events when Claude finishes responding.
18
+ */
19
+ export declare class HookReceiver extends EventEmitter {
20
+ /**
21
+ * Process an incoming hook payload.
22
+ */
23
+ processHook(payload: HookPayload): HookResult;
24
+ /**
25
+ * 处理通知事件
26
+ */
27
+ private handleNotification;
28
+ /**
29
+ * 处理任务完成事件
30
+ * 不发送通知,而是触发 task_completed 事件以便 SessionController 更新状态
31
+ */
32
+ private handleStop;
33
+ /**
34
+ * 从消息中提取工具名
35
+ * Pattern: "Claude needs your permission to use <ToolName>"
36
+ */
37
+ private extractToolFromMessage;
38
+ }
39
+ //# sourceMappingURL=hook-receiver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-receiver.d.ts","sourceRoot":"","sources":["../../../../backend/src/hooks/hook-receiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAIvB,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,gBAAgB,CAAC;QACvB,IAAI,EAAE,iBAAiB,CAAC;KACzB,CAAC;CACH;AAeD;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU;IAsB7C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+C1B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAUlB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAK/B"}
@@ -0,0 +1,96 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { logger } from '../logger/logger.js';
3
+ import { HookEventType, } from './hook-types.js';
4
+ // 需要发送所有渠道通知的事件类型
5
+ const ALL_CHANNELS = ['websocket', 'push', 'dingtalk', 'wechat_work'];
6
+ // 需要处理的 Notification 类型
7
+ const INTERACTIVE_NOTIFICATION_TYPES = [
8
+ 'permission_prompt',
9
+ 'idle_prompt',
10
+ 'elicitation_dialog',
11
+ ];
12
+ // Pattern: "Claude needs your permission to use <ToolName>"
13
+ const PERMISSION_TOOL_RE = /permission to use (\S+)$/;
14
+ /**
15
+ * Receives and parses Hook HTTP POST from Claude Code.
16
+ * Emits 'notification' events for user attention events.
17
+ * Emits 'task_completed' events when Claude finishes responding.
18
+ */
19
+ export class HookReceiver extends EventEmitter {
20
+ /**
21
+ * Process an incoming hook payload.
22
+ */
23
+ processHook(payload) {
24
+ logger.info({ eventName: payload.hook_event_name }, 'Hook received');
25
+ switch (payload.hook_event_name) {
26
+ case 'Notification':
27
+ return this.handleNotification(payload);
28
+ case 'Stop':
29
+ return this.handleStop(payload);
30
+ default:
31
+ logger.debug({ eventName: payload.hook_event_name }, 'Hook event type not handled');
32
+ return { type: 'ignored' };
33
+ }
34
+ }
35
+ /**
36
+ * 处理通知事件
37
+ */
38
+ handleNotification(payload) {
39
+ const { notification_type, message, title } = payload;
40
+ // 仅处理需要用户交互的通知类型
41
+ if (!INTERACTIVE_NOTIFICATION_TYPES.includes(notification_type)) {
42
+ logger.debug({ notificationType: notification_type }, 'Non-interactive notification ignored');
43
+ return { type: 'ignored' };
44
+ }
45
+ // 从消息中提取工具名
46
+ const toolName = this.extractToolFromMessage(message) || 'claude';
47
+ // 根据通知类型生成标题
48
+ let notificationTitle;
49
+ switch (notification_type) {
50
+ case 'permission_prompt':
51
+ notificationTitle = title || 'Approval Required';
52
+ break;
53
+ case 'idle_prompt':
54
+ notificationTitle = title || 'Claude Waiting for Input';
55
+ break;
56
+ case 'elicitation_dialog':
57
+ notificationTitle = title || 'Waiting for Your Response';
58
+ break;
59
+ default:
60
+ notificationTitle = title || 'Claude Notification';
61
+ }
62
+ const notification = {
63
+ eventType: HookEventType.NOTIFICATION,
64
+ channels: ALL_CHANNELS,
65
+ tool: toolName,
66
+ title: notificationTitle,
67
+ message,
68
+ };
69
+ logger.info({ tool: toolName, notificationType: notification_type }, 'Notification event processed');
70
+ this.emit('notification', notification);
71
+ return { type: 'notification', notification };
72
+ }
73
+ /**
74
+ * 处理任务完成事件
75
+ * 不发送通知,而是触发 task_completed 事件以便 SessionController 更新状态
76
+ */
77
+ handleStop(payload) {
78
+ const data = {
79
+ lastMessage: payload.last_assistant_message,
80
+ };
81
+ logger.info('Stop event received, emitting task_completed');
82
+ this.emit('task_completed', data);
83
+ return { type: 'ignored' };
84
+ }
85
+ /**
86
+ * 从消息中提取工具名
87
+ * Pattern: "Claude needs your permission to use <ToolName>"
88
+ */
89
+ extractToolFromMessage(message) {
90
+ if (!message)
91
+ return null;
92
+ const match = PERMISSION_TOOL_RE.exec(message);
93
+ return match ? match[1] : null;
94
+ }
95
+ }
96
+ //# sourceMappingURL=hook-receiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-receiver.js","sourceRoot":"","sources":["../../../../backend/src/hooks/hook-receiver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Claude Code Hook Payload 类型定义
3
+ * 参考: https://code.claude.com/docs/en/hooks
4
+ */
5
+ export type HookEventName = 'SessionStart' | 'UserPromptSubmit' | 'PreToolUse' | 'PostToolUse' | 'PostToolUseFailure' | 'Notification' | 'SubagentStart' | 'SubagentStop' | 'Stop' | 'PreCompact';
6
+ /**
7
+ * Notification 事件的通知类型
8
+ * - permission_prompt: 需要权限审批
9
+ * - idle_prompt: Claude 空闲等待输入
10
+ * - auth_success: 认证成功
11
+ * - elicitation_dialog: 用户问题对话框
12
+ */
13
+ export type NotificationType = 'permission_prompt' | 'idle_prompt' | 'auth_success' | 'elicitation_dialog';
14
+ export interface BaseHookPayload {
15
+ /** 当前会话标识 */
16
+ session_id?: string;
17
+ /** 会话 JSON 文件路径 */
18
+ transcript_path?: string;
19
+ /** hook 调用时的工作目录 */
20
+ cwd?: string;
21
+ /** 当前权限模式 */
22
+ permission_mode?: string;
23
+ /** 事件名称 */
24
+ hook_event_name: HookEventName;
25
+ /** 允许其他字段 */
26
+ [key: string]: unknown;
27
+ }
28
+ /** SessionStart: 会话开始或恢复 */
29
+ export interface SessionStartPayload extends BaseHookPayload {
30
+ hook_event_name: 'SessionStart';
31
+ /** 会话启动方式 */
32
+ source?: 'startup' | 'resume' | 'clear' | 'compact';
33
+ /** 模型标识 */
34
+ model?: string;
35
+ /** agent 类型(如果以 --agent 启动) */
36
+ agent_type?: string;
37
+ }
38
+ /** UserPromptSubmit: 用户提交 prompt */
39
+ export interface UserPromptSubmitPayload extends BaseHookPayload {
40
+ hook_event_name: 'UserPromptSubmit';
41
+ /** 用户提交的文本 */
42
+ prompt: string;
43
+ }
44
+ /** PreToolUse: 工具调用前 */
45
+ export interface PreToolUsePayload extends BaseHookPayload {
46
+ hook_event_name: 'PreToolUse';
47
+ /** 工具名称 */
48
+ tool_name: string;
49
+ /** 工具输入参数 */
50
+ tool_input: Record<string, unknown>;
51
+ /** 工具调用 ID */
52
+ tool_use_id: string;
53
+ }
54
+ /** PostToolUse: 工具调用成功 */
55
+ export interface PostToolUsePayload extends BaseHookPayload {
56
+ hook_event_name: 'PostToolUse';
57
+ /** 工具名称 */
58
+ tool_name: string;
59
+ /** 工具输入参数 */
60
+ tool_input: Record<string, unknown>;
61
+ /** 工具响应结果 */
62
+ tool_response: unknown;
63
+ /** 工具调用 ID */
64
+ tool_use_id: string;
65
+ }
66
+ /** PostToolUseFailure: 工具调用失败 */
67
+ export interface PostToolUseFailurePayload extends BaseHookPayload {
68
+ hook_event_name: 'PostToolUseFailure';
69
+ /** 工具名称 */
70
+ tool_name: string;
71
+ /** 工具输入参数 */
72
+ tool_input: Record<string, unknown>;
73
+ /** 错误描述 */
74
+ error: string;
75
+ /** 是否为用户中断 */
76
+ is_interrupt?: boolean;
77
+ /** 工具调用 ID */
78
+ tool_use_id?: string;
79
+ }
80
+ /** Notification: 通知事件 */
81
+ export interface NotificationPayload extends BaseHookPayload {
82
+ hook_event_name: 'Notification';
83
+ /** 通知消息 */
84
+ message: string;
85
+ /** 通知标题 */
86
+ title?: string;
87
+ /** 通知类型 */
88
+ notification_type: NotificationType;
89
+ }
90
+ /** SubagentStart: 子 agent 启动 */
91
+ export interface SubagentStartPayload extends BaseHookPayload {
92
+ hook_event_name: 'SubagentStart';
93
+ /** 子 agent 唯一标识 */
94
+ agent_id: string;
95
+ /** agent 类型名称 */
96
+ agent_type: string;
97
+ }
98
+ /** SubagentStop: 子 agent 结束 */
99
+ export interface SubagentStopPayload extends BaseHookPayload {
100
+ hook_event_name: 'SubagentStop';
101
+ /** 是否已有 stop hook 激活 */
102
+ stop_hook_active?: boolean;
103
+ /** 子 agent 唯一标识 */
104
+ agent_id: string;
105
+ /** agent 类型名称 */
106
+ agent_type: string;
107
+ /** 子 agent 的 transcript 路径 */
108
+ agent_transcript_path?: string;
109
+ /** 最后一条 assistant 消息 */
110
+ last_assistant_message?: string;
111
+ }
112
+ /** Stop: 主 agent 响应完成 */
113
+ export interface StopPayload extends BaseHookPayload {
114
+ hook_event_name: 'Stop';
115
+ /** 是否已有 stop hook 激活 */
116
+ stop_hook_active: boolean;
117
+ /** 最后一条 assistant 消息 */
118
+ last_assistant_message?: string;
119
+ }
120
+ /** PreCompact: 压缩前 */
121
+ export interface PreCompactPayload extends BaseHookPayload {
122
+ hook_event_name: 'PreCompact';
123
+ /** 触发方式 */
124
+ trigger: 'manual' | 'auto';
125
+ /** 自定义指令 */
126
+ custom_instructions?: string;
127
+ }
128
+ export type HookPayload = SessionStartPayload | UserPromptSubmitPayload | PreToolUsePayload | PostToolUsePayload | PostToolUseFailurePayload | NotificationPayload | SubagentStartPayload | SubagentStopPayload | StopPayload | PreCompactPayload;
129
+ /**
130
+ * 通知事件类型(用于 HookNotification)
131
+ */
132
+ export declare enum HookEventType {
133
+ /** 通知事件(permission_prompt, idle_prompt, elicitation_dialog 等) */
134
+ NOTIFICATION = "notification"
135
+ }
136
+ /**
137
+ * 通知渠道类型
138
+ */
139
+ export type NotificationChannel = 'websocket' | 'push' | 'dingtalk' | 'wechat_work';
140
+ /**
141
+ * 扩展的通知结构
142
+ * 用于 HookReceiver 向 SessionController 传递通知信息
143
+ */
144
+ export interface HookNotification {
145
+ /** 事件类型 */
146
+ eventType: HookEventType;
147
+ /** 发送渠道列表 */
148
+ channels: NotificationChannel[];
149
+ /** 相关工具名称 */
150
+ tool: string;
151
+ /** 通知标题 */
152
+ title: string;
153
+ /** 通知消息 */
154
+ message: string;
155
+ /** 额外详情 */
156
+ detail?: string;
157
+ }
158
+ /**
159
+ * 任务完成事件数据
160
+ */
161
+ export interface TaskCompletedData {
162
+ /** 最后一条消息 */
163
+ lastMessage?: string;
164
+ }
165
+ //# sourceMappingURL=hook-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-types.d.ts","sourceRoot":"","sources":["../../../../backend/src/hooks/hook-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Claude Code Hook Payload 类型定义
3
+ * 参考: https://code.claude.com/docs/en/hooks
4
+ */
5
+ // ==============================
6
+ // 通知相关类型
7
+ // ==============================
8
+ /**
9
+ * 通知事件类型(用于 HookNotification)
10
+ */
11
+ export var HookEventType;
12
+ (function (HookEventType) {
13
+ /** 通知事件(permission_prompt, idle_prompt, elicitation_dialog 等) */
14
+ HookEventType["NOTIFICATION"] = "notification";
15
+ })(HookEventType || (HookEventType = {}));
16
+ //# sourceMappingURL=hook-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-types.js","sourceRoot":"","sources":["../../../../backend/src/hooks/hook-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwLH,iCAAiC;AACjC,SAAS;AACT,iCAAiC;AAEjC;;GAEG;AACH,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,iEAAiE;IACjE,8CAA6B,CAAA;AAC/B,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../backend/src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAmI,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAmBjL,wBAAsB,WAAW,CAAC,YAAY,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoWhF"}