@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.
- package/README.md +285 -295
- package/dist/backend/src/api/auth-routes.d.ts.map +1 -0
- package/dist/backend/src/api/auth-routes.js.map +1 -0
- package/dist/backend/src/api/config-routes.d.ts +7 -0
- package/dist/backend/src/api/config-routes.d.ts.map +1 -0
- package/dist/{api → backend/src/api}/config-routes.js +125 -13
- package/dist/backend/src/api/config-routes.js.map +1 -0
- package/dist/backend/src/api/health-routes.d.ts.map +1 -0
- package/dist/backend/src/api/health-routes.js.map +1 -0
- package/dist/backend/src/api/hook-routes.d.ts.map +1 -0
- package/dist/backend/src/api/hook-routes.js.map +1 -0
- package/dist/{api → backend/src/api}/instance-routes.d.ts +5 -1
- package/dist/backend/src/api/instance-routes.d.ts.map +1 -0
- package/dist/{api → backend/src/api}/instance-routes.js +5 -1
- package/dist/backend/src/api/instance-routes.js.map +1 -0
- package/dist/backend/src/api/push-routes.d.ts.map +1 -0
- package/dist/backend/src/api/push-routes.js.map +1 -0
- package/dist/{api → backend/src/api}/router.d.ts +7 -1
- package/dist/backend/src/api/router.d.ts.map +1 -0
- package/dist/{api → backend/src/api}/router.js +1 -1
- package/dist/backend/src/api/router.js.map +1 -0
- package/dist/backend/src/api/status-routes.d.ts.map +1 -0
- package/dist/backend/src/api/status-routes.js.map +1 -0
- package/dist/backend/src/attach.d.ts.map +1 -0
- package/dist/{attach.js → backend/src/attach.js} +11 -11
- package/dist/backend/src/attach.js.map +1 -0
- package/dist/backend/src/auth/auth-middleware.d.ts.map +1 -0
- package/dist/backend/src/auth/auth-middleware.js.map +1 -0
- package/dist/backend/src/auth/rate-limiter.d.ts.map +1 -0
- package/dist/backend/src/auth/rate-limiter.js.map +1 -0
- package/dist/backend/src/auth/token-generator.d.ts.map +1 -0
- package/dist/{auth → backend/src/auth}/token-generator.js +1 -1
- package/dist/backend/src/auth/token-generator.js.map +1 -0
- package/dist/{cli-utils.d.ts → backend/src/cli-utils.d.ts} +3 -3
- package/dist/backend/src/cli-utils.d.ts.map +1 -0
- package/dist/{cli-utils.js → backend/src/cli-utils.js} +49 -36
- package/dist/backend/src/cli-utils.js.map +1 -0
- package/dist/backend/src/cli.d.ts +22 -0
- package/dist/backend/src/cli.d.ts.map +1 -0
- package/dist/{cli.js → backend/src/cli.js} +21 -16
- package/dist/backend/src/cli.js.map +1 -0
- package/dist/{config.d.ts → backend/src/config.d.ts} +29 -5
- package/dist/backend/src/config.d.ts.map +1 -0
- package/dist/{config.js → backend/src/config.js} +198 -12
- package/dist/backend/src/config.js.map +1 -0
- package/dist/backend/src/deps/detector.d.ts +18 -0
- package/dist/backend/src/deps/detector.d.ts.map +1 -0
- package/dist/backend/src/deps/detector.js +49 -0
- package/dist/backend/src/deps/detector.js.map +1 -0
- package/dist/backend/src/deps/index.d.ts +14 -0
- package/dist/backend/src/deps/index.d.ts.map +1 -0
- package/dist/backend/src/deps/index.js +219 -0
- package/dist/backend/src/deps/index.js.map +1 -0
- package/dist/backend/src/deps/installer.d.ts +13 -0
- package/dist/backend/src/deps/installer.d.ts.map +1 -0
- package/dist/backend/src/deps/installer.js +113 -0
- package/dist/backend/src/deps/installer.js.map +1 -0
- package/dist/backend/src/deps/platform.d.ts +27 -0
- package/dist/backend/src/deps/platform.d.ts.map +1 -0
- package/dist/backend/src/deps/platform.js +154 -0
- package/dist/backend/src/deps/platform.js.map +1 -0
- package/dist/backend/src/deps/prompt.d.ts +51 -0
- package/dist/backend/src/deps/prompt.d.ts.map +1 -0
- package/dist/backend/src/deps/prompt.js +128 -0
- package/dist/backend/src/deps/prompt.js.map +1 -0
- package/dist/backend/src/deps/types.d.ts +40 -0
- package/dist/backend/src/deps/types.d.ts.map +1 -0
- package/dist/backend/src/deps/types.js +54 -0
- package/dist/backend/src/deps/types.js.map +1 -0
- package/dist/backend/src/hooks/hook-receiver.d.ts +39 -0
- package/dist/backend/src/hooks/hook-receiver.d.ts.map +1 -0
- package/dist/backend/src/hooks/hook-receiver.js +96 -0
- package/dist/backend/src/hooks/hook-receiver.js.map +1 -0
- package/dist/backend/src/hooks/hook-types.d.ts +165 -0
- package/dist/backend/src/hooks/hook-types.d.ts.map +1 -0
- package/dist/backend/src/hooks/hook-types.js +16 -0
- package/dist/backend/src/hooks/hook-types.js.map +1 -0
- package/dist/backend/src/index.d.ts.map +1 -0
- package/dist/{index.js → backend/src/index.js} +27 -32
- package/dist/backend/src/index.js.map +1 -0
- package/dist/backend/src/logger/logger.d.ts.map +1 -0
- package/dist/{logger → backend/src/logger}/logger.js +3 -5
- package/dist/{logger → backend/src/logger}/logger.js.map +1 -1
- package/dist/backend/src/notification/dingtalk-service.d.ts.map +1 -0
- package/dist/{notification → backend/src/notification}/dingtalk-service.js +1 -1
- package/dist/backend/src/notification/dingtalk-service.js.map +1 -0
- package/dist/backend/src/notification/notification-manager.d.ts +44 -0
- package/dist/backend/src/notification/notification-manager.d.ts.map +1 -0
- package/dist/backend/src/notification/notification-manager.js +94 -0
- package/dist/backend/src/notification/notification-manager.js.map +1 -0
- package/dist/backend/src/notification/notification-service-factory.d.ts +67 -0
- package/dist/backend/src/notification/notification-service-factory.d.ts.map +1 -0
- package/dist/backend/src/notification/notification-service-factory.js +146 -0
- package/dist/backend/src/notification/notification-service-factory.js.map +1 -0
- package/dist/backend/src/notification/wechat-work-service.d.ts +24 -0
- package/dist/backend/src/notification/wechat-work-service.d.ts.map +1 -0
- package/dist/backend/src/notification/wechat-work-service.js +88 -0
- package/dist/backend/src/notification/wechat-work-service.js.map +1 -0
- package/dist/backend/src/pty/output-buffer.d.ts.map +1 -0
- package/dist/backend/src/pty/output-buffer.js.map +1 -0
- package/dist/backend/src/pty/pty-manager.d.ts.map +1 -0
- package/dist/backend/src/pty/pty-manager.js.map +1 -0
- package/dist/backend/src/pty/types.d.ts.map +1 -0
- package/dist/{pty → backend/src/pty}/types.js.map +1 -1
- package/dist/backend/src/pty/virtual-pty.d.ts.map +1 -0
- package/dist/backend/src/pty/virtual-pty.js.map +1 -0
- package/dist/backend/src/push/push-service.d.ts.map +1 -0
- package/dist/backend/src/push/push-service.js.map +1 -0
- package/dist/{registry → backend/src/registry}/instance-registry.d.ts +1 -1
- package/dist/backend/src/registry/instance-registry.d.ts.map +1 -0
- package/dist/{registry → backend/src/registry}/instance-registry.js +1 -1
- package/dist/backend/src/registry/instance-registry.js.map +1 -0
- package/dist/backend/src/registry/instance-spawner.d.ts.map +1 -0
- package/dist/{registry → backend/src/registry}/instance-spawner.js +17 -5
- package/dist/backend/src/registry/instance-spawner.js.map +1 -0
- package/dist/backend/src/registry/port-finder.d.ts.map +1 -0
- package/dist/backend/src/registry/port-finder.js.map +1 -0
- package/dist/backend/src/registry/shared-token.d.ts.map +1 -0
- package/dist/backend/src/registry/shared-token.js.map +1 -0
- package/dist/{registry → backend/src/registry}/stop-instances.d.ts +1 -1
- package/dist/backend/src/registry/stop-instances.d.ts.map +1 -0
- package/dist/{registry → backend/src/registry}/stop-instances.js +1 -1
- package/dist/backend/src/registry/stop-instances.js.map +1 -0
- package/dist/{session → backend/src/session}/session-controller.d.ts +21 -6
- package/dist/backend/src/session/session-controller.d.ts.map +1 -0
- package/dist/{session → backend/src/session}/session-controller.js +108 -25
- package/dist/backend/src/session/session-controller.js.map +1 -0
- package/dist/backend/src/terminal/terminal-relay.d.ts.map +1 -0
- package/dist/backend/src/terminal/terminal-relay.js.map +1 -0
- package/dist/backend/src/utils/ansi-filter.d.ts.map +1 -0
- package/dist/backend/src/utils/ansi-filter.js.map +1 -0
- package/dist/backend/src/utils/file-lock.d.ts.map +1 -0
- package/dist/backend/src/utils/file-lock.js.map +1 -0
- package/dist/backend/src/utils/ip-monitor.d.ts.map +1 -0
- package/dist/backend/src/utils/ip-monitor.js.map +1 -0
- package/dist/backend/src/utils/network.d.ts.map +1 -0
- package/dist/backend/src/utils/network.js.map +1 -0
- package/dist/backend/src/utils/qrcode-banner.d.ts.map +1 -0
- package/dist/backend/src/utils/qrcode-banner.js.map +1 -0
- package/dist/backend/src/ws/ws-handler.d.ts.map +1 -0
- package/dist/backend/src/ws/ws-handler.js.map +1 -0
- package/dist/{ws → backend/src/ws}/ws-server.d.ts +1 -1
- package/dist/backend/src/ws/ws-server.d.ts.map +1 -0
- package/dist/{ws → backend/src/ws}/ws-server.js +2 -2
- package/dist/backend/src/ws/ws-server.js.map +1 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/defaults.d.ts.map +1 -0
- package/dist/shared/defaults.js.map +1 -0
- package/{shared-dist → dist/shared}/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/{shared-dist → dist/shared}/index.js +1 -0
- package/dist/shared/index.js.map +1 -0
- package/{shared-dist → dist/shared}/instance.d.ts +13 -0
- package/dist/shared/instance.d.ts.map +1 -0
- package/dist/shared/instance.js.map +1 -0
- package/dist/shared/notification-types.d.ts +85 -0
- package/dist/shared/notification-types.d.ts.map +1 -0
- package/dist/shared/notification-types.js +92 -0
- package/dist/shared/notification-types.js.map +1 -0
- package/{shared-dist → dist/shared}/ws-protocol.d.ts +6 -1
- package/dist/shared/ws-protocol.d.ts.map +1 -0
- package/dist/shared/ws-protocol.js.map +1 -0
- package/frontend-dist/assets/index-DOeBWumG.js +152 -0
- package/frontend-dist/index.html +2 -2
- package/package.json +62 -27
- package/scripts/build.sh +21 -0
- package/scripts/dev.sh +11 -0
- package/scripts/fix-node-pty-permissions.js +47 -0
- package/scripts/git-hooks/pre-commit +258 -0
- package/scripts/stop.sh +5 -0
- package/dist/api/auth-routes.d.ts.map +0 -1
- package/dist/api/auth-routes.js.map +0 -1
- package/dist/api/config-routes.d.ts +0 -4
- package/dist/api/config-routes.d.ts.map +0 -1
- package/dist/api/config-routes.js.map +0 -1
- package/dist/api/health-routes.d.ts.map +0 -1
- package/dist/api/health-routes.js.map +0 -1
- package/dist/api/hook-routes.d.ts.map +0 -1
- package/dist/api/hook-routes.js.map +0 -1
- package/dist/api/instance-routes.d.ts.map +0 -1
- package/dist/api/instance-routes.js.map +0 -1
- package/dist/api/push-routes.d.ts.map +0 -1
- package/dist/api/push-routes.js.map +0 -1
- package/dist/api/router.d.ts.map +0 -1
- package/dist/api/router.js.map +0 -1
- package/dist/api/status-routes.d.ts.map +0 -1
- package/dist/api/status-routes.js.map +0 -1
- package/dist/attach.d.ts.map +0 -1
- package/dist/attach.js.map +0 -1
- package/dist/auth/auth-middleware.d.ts.map +0 -1
- package/dist/auth/auth-middleware.js.map +0 -1
- package/dist/auth/rate-limiter.d.ts.map +0 -1
- package/dist/auth/rate-limiter.js.map +0 -1
- package/dist/auth/token-generator.d.ts.map +0 -1
- package/dist/auth/token-generator.js.map +0 -1
- package/dist/cli-utils.d.ts.map +0 -1
- package/dist/cli-utils.js.map +0 -1
- package/dist/cli.d.ts +0 -21
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/hooks/hook-receiver.d.ts +0 -39
- package/dist/hooks/hook-receiver.d.ts.map +0 -1
- package/dist/hooks/hook-receiver.js +0 -46
- package/dist/hooks/hook-receiver.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger/logger.d.ts.map +0 -1
- package/dist/notification/dingtalk-service.d.ts.map +0 -1
- package/dist/notification/dingtalk-service.js.map +0 -1
- package/dist/pty/output-buffer.d.ts.map +0 -1
- package/dist/pty/output-buffer.js.map +0 -1
- package/dist/pty/pty-manager.d.ts.map +0 -1
- package/dist/pty/pty-manager.js.map +0 -1
- package/dist/pty/types.d.ts.map +0 -1
- package/dist/pty/virtual-pty.d.ts.map +0 -1
- package/dist/pty/virtual-pty.js.map +0 -1
- package/dist/push/push-service.d.ts.map +0 -1
- package/dist/push/push-service.js.map +0 -1
- package/dist/registry/instance-registry.d.ts.map +0 -1
- package/dist/registry/instance-registry.js.map +0 -1
- package/dist/registry/instance-spawner.d.ts.map +0 -1
- package/dist/registry/instance-spawner.js.map +0 -1
- package/dist/registry/port-finder.d.ts.map +0 -1
- package/dist/registry/port-finder.js.map +0 -1
- package/dist/registry/shared-token.d.ts.map +0 -1
- package/dist/registry/shared-token.js.map +0 -1
- package/dist/registry/stop-instances.d.ts.map +0 -1
- package/dist/registry/stop-instances.js.map +0 -1
- package/dist/session/session-controller.d.ts.map +0 -1
- package/dist/session/session-controller.js.map +0 -1
- package/dist/terminal/terminal-relay.d.ts.map +0 -1
- package/dist/terminal/terminal-relay.js.map +0 -1
- package/dist/utils/ansi-filter.d.ts.map +0 -1
- package/dist/utils/ansi-filter.js.map +0 -1
- package/dist/utils/file-lock.d.ts.map +0 -1
- package/dist/utils/file-lock.js.map +0 -1
- package/dist/utils/ip-monitor.d.ts.map +0 -1
- package/dist/utils/ip-monitor.js.map +0 -1
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/pid-file.d.ts +0 -10
- package/dist/utils/pid-file.d.ts.map +0 -1
- package/dist/utils/pid-file.js +0 -30
- package/dist/utils/pid-file.js.map +0 -1
- package/dist/utils/qrcode-banner.d.ts.map +0 -1
- package/dist/utils/qrcode-banner.js.map +0 -1
- package/dist/ws/ws-handler.d.ts.map +0 -1
- package/dist/ws/ws-handler.js.map +0 -1
- package/dist/ws/ws-server.d.ts.map +0 -1
- package/dist/ws/ws-server.js.map +0 -1
- package/frontend-dist/assets/index-BqqB1hYe.js +0 -141
- package/shared-dist/constants.d.ts.map +0 -1
- package/shared-dist/constants.js.map +0 -1
- package/shared-dist/defaults.d.ts.map +0 -1
- package/shared-dist/defaults.js.map +0 -1
- package/shared-dist/index.d.ts.map +0 -1
- package/shared-dist/index.js.map +0 -1
- package/shared-dist/instance.d.ts.map +0 -1
- package/shared-dist/instance.js.map +0 -1
- package/shared-dist/question-utils.d.ts +0 -15
- package/shared-dist/question-utils.d.ts.map +0 -1
- package/shared-dist/question-utils.js +0 -24
- package/shared-dist/question-utils.js.map +0 -1
- package/shared-dist/ws-protocol.d.ts.map +0 -1
- package/shared-dist/ws-protocol.js.map +0 -1
- /package/dist/{api → backend/src/api}/auth-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/auth-routes.js +0 -0
- /package/dist/{api → backend/src/api}/health-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/health-routes.js +0 -0
- /package/dist/{api → backend/src/api}/hook-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/hook-routes.js +0 -0
- /package/dist/{api → backend/src/api}/push-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/push-routes.js +0 -0
- /package/dist/{api → backend/src/api}/status-routes.d.ts +0 -0
- /package/dist/{api → backend/src/api}/status-routes.js +0 -0
- /package/dist/{attach.d.ts → backend/src/attach.d.ts} +0 -0
- /package/dist/{auth → backend/src/auth}/auth-middleware.d.ts +0 -0
- /package/dist/{auth → backend/src/auth}/auth-middleware.js +0 -0
- /package/dist/{auth → backend/src/auth}/rate-limiter.d.ts +0 -0
- /package/dist/{auth → backend/src/auth}/rate-limiter.js +0 -0
- /package/dist/{auth → backend/src/auth}/token-generator.d.ts +0 -0
- /package/dist/{index.d.ts → backend/src/index.d.ts} +0 -0
- /package/dist/{logger → backend/src/logger}/logger.d.ts +0 -0
- /package/dist/{notification → backend/src/notification}/dingtalk-service.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/output-buffer.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/output-buffer.js +0 -0
- /package/dist/{pty → backend/src/pty}/pty-manager.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/pty-manager.js +0 -0
- /package/dist/{pty → backend/src/pty}/types.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/types.js +0 -0
- /package/dist/{pty → backend/src/pty}/virtual-pty.d.ts +0 -0
- /package/dist/{pty → backend/src/pty}/virtual-pty.js +0 -0
- /package/dist/{push → backend/src/push}/push-service.d.ts +0 -0
- /package/dist/{push → backend/src/push}/push-service.js +0 -0
- /package/dist/{registry → backend/src/registry}/instance-spawner.d.ts +0 -0
- /package/dist/{registry → backend/src/registry}/port-finder.d.ts +0 -0
- /package/dist/{registry → backend/src/registry}/port-finder.js +0 -0
- /package/dist/{registry → backend/src/registry}/shared-token.d.ts +0 -0
- /package/dist/{registry → backend/src/registry}/shared-token.js +0 -0
- /package/dist/{terminal → backend/src/terminal}/terminal-relay.d.ts +0 -0
- /package/dist/{terminal → backend/src/terminal}/terminal-relay.js +0 -0
- /package/dist/{utils → backend/src/utils}/ansi-filter.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/ansi-filter.js +0 -0
- /package/dist/{utils → backend/src/utils}/file-lock.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/file-lock.js +0 -0
- /package/dist/{utils → backend/src/utils}/ip-monitor.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/ip-monitor.js +0 -0
- /package/dist/{utils → backend/src/utils}/network.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/network.js +0 -0
- /package/dist/{utils → backend/src/utils}/qrcode-banner.d.ts +0 -0
- /package/dist/{utils → backend/src/utils}/qrcode-banner.js +0 -0
- /package/dist/{ws → backend/src/ws}/ws-handler.d.ts +0 -0
- /package/dist/{ws → backend/src/ws}/ws-handler.js +0 -0
- /package/{shared-dist → dist/shared}/constants.d.ts +0 -0
- /package/{shared-dist → dist/shared}/constants.js +0 -0
- /package/{shared-dist → dist/shared}/defaults.d.ts +0 -0
- /package/{shared-dist → dist/shared}/defaults.js +0 -0
- /package/{shared-dist → dist/shared}/instance.js +0 -0
- /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":"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"}
|
|
@@ -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"}
|