@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
|
@@ -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
|
|
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 '
|
|
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 {
|
|
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.
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
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.
|
|
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
|
-
//
|
|
116
|
+
// 13. Serve frontend static files (if built)
|
|
123
117
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
const frontendDist =
|
|
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
|
-
|
|
155
|
-
|
|
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 {
|
|
3
|
-
import {
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
4
|
import { mkdirSync } from 'node:fs';
|
|
5
|
-
const
|
|
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":["
|
|
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
|
|
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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAmB;IAIV;IAHZ,KAAK,GAAG,IAAI,GAAG,EAAgE,CAAC;IACvE,MAAM,GAAG,MAAM,CAAC,CAAC,UAAU;IAE5C,YAAoB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;IAAG,CAAC;IAE1C;;;;;;;OAOG;IACH,SAAS,CAAC,OAA4B;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,OAA4B;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,sCAAsC,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACK,qBAAqB,CAAC,OAA4B;QACxD,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,CAAC,aAAa;YAC5B,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAMhC,CAAC;YAEF,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC3B,gCAAgC;gBAChC,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;gBACzE,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;oBAChC,OAAO,IAAI,CAAC,CAAC,kBAAkB;gBACjC,CAAC;gBACD,OAAO,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC;YACxC,CAAC;YAED,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;gBAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;gBACvD,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC,CAAC,kBAAkB;gBACjC,CAAC;gBACD,OAAO,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC;YACtC,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,gEAAgE,CAAC,CAAC;YAC7H,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACxE,OAAO,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -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"}
|