@openclaw-china/shared 0.1.33 → 0.1.35
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/package.json +1 -1
- package/src/cli/index.ts +1 -0
- package/src/cli/install-hint.ts +95 -0
package/package.json
CHANGED
package/src/cli/index.ts
CHANGED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { ChannelId } from "./china-setup.js";
|
|
2
|
+
|
|
3
|
+
type LoggerLike = {
|
|
4
|
+
info?: (message: string) => void;
|
|
5
|
+
warn?: (message: string) => void;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type ChinaInstallHintApiLike = {
|
|
9
|
+
logger?: LoggerLike;
|
|
10
|
+
config?: unknown;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const PROJECT_REPO = "https://github.com/BytePioneer-AI/moltbot-china";
|
|
15
|
+
const INSTALL_SETUP_COMMAND = "openclaw china setup";
|
|
16
|
+
const START_GATEWAY_COMMAND = "openclaw gateway --port 18789 --verbose";
|
|
17
|
+
const ANSI_RESET = "\u001b[0m";
|
|
18
|
+
const ANSI_BOLD = "\u001b[1m";
|
|
19
|
+
const ANSI_LINK = "\u001b[1;4;96m";
|
|
20
|
+
const ANSI_BORDER = "\u001b[92m";
|
|
21
|
+
const SUPPORTED_CHANNELS: readonly ChannelId[] = [
|
|
22
|
+
"dingtalk",
|
|
23
|
+
"feishu-china",
|
|
24
|
+
"wecom",
|
|
25
|
+
"wecom-app",
|
|
26
|
+
"qqbot",
|
|
27
|
+
];
|
|
28
|
+
const CHINA_INSTALL_HINT_SHOWN_KEY = Symbol.for("@openclaw-china/china-install-hint-shown");
|
|
29
|
+
|
|
30
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
31
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function hasAnyEnabledChinaChannel(config: unknown): boolean {
|
|
35
|
+
if (!isRecord(config)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const channels = config.channels;
|
|
40
|
+
if (!isRecord(channels)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return SUPPORTED_CHANNELS.some((channelId) => {
|
|
45
|
+
const channelConfig = channels[channelId];
|
|
46
|
+
return isRecord(channelConfig) && channelConfig.enabled === true;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function hasShownInstallHint(): boolean {
|
|
51
|
+
const root = globalThis as Record<PropertyKey, unknown>;
|
|
52
|
+
return root[CHINA_INSTALL_HINT_SHOWN_KEY] === true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function markInstallHintShown(): void {
|
|
56
|
+
const root = globalThis as Record<PropertyKey, unknown>;
|
|
57
|
+
root[CHINA_INSTALL_HINT_SHOWN_KEY] = true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function showChinaInstallHint(api: ChinaInstallHintApiLike): void {
|
|
61
|
+
if (hasShownInstallHint() || hasAnyEnabledChinaChannel(api.config)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
markInstallHintShown();
|
|
65
|
+
|
|
66
|
+
const lines = [
|
|
67
|
+
`${ANSI_BORDER}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${ANSI_RESET}`,
|
|
68
|
+
" OpenClaw China Channels 已就绪!",
|
|
69
|
+
`${ANSI_BORDER}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${ANSI_RESET}`,
|
|
70
|
+
"",
|
|
71
|
+
"项目仓库:",
|
|
72
|
+
` ${ANSI_LINK}${PROJECT_REPO}${ANSI_RESET}`,
|
|
73
|
+
"",
|
|
74
|
+
"⭐ 如果这个项目对你有帮助,请给我们一个 Star!⭐",
|
|
75
|
+
"",
|
|
76
|
+
"下一步(配置引导):",
|
|
77
|
+
" 1. 运行交互式配置向导",
|
|
78
|
+
` ${ANSI_BOLD}${INSTALL_SETUP_COMMAND}${ANSI_RESET}`,
|
|
79
|
+
" 2. 按提示填写渠道凭据并保存配置",
|
|
80
|
+
" 3. 启动网关并观察日志",
|
|
81
|
+
` ${START_GATEWAY_COMMAND}`,
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
if (api.logger?.info) {
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
api.logger.info(line);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (api.logger?.warn) {
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
api.logger.warn(line);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|